D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
home
/
sadaunjx
/
sada-now.com
/
allbackup
/
Filename :
importbuddy.php
back
Copy
<?php /* ImportBuddy Restore & Migration Tool - iThemes.com * @author Dustin Bolton * * ATTENTION: IF YOU ARE READING THIS WHILE TRYING TO LOAD IMPORTBUDDY TO RESTORE YOUR SITE: * Your server is not properly handling PHP files. Contact your hosting provider to fix this. * Notify them that PHP files are not executing and instead are outputting their code contents. * * <!-- * */ define( 'PB_PASSWORD', 'b66c7f04c571960d86c1c4a32e590186' ); // Update this portion with the hashed password to override a forgotten password. $php_minimum = '5.1'; // User's PHP must be equal or newer to this version. $ignore_not_writable = false; // Set to true to ignore is_writable() returning false on this directory. Useful for servers lying about the writable status of the directory. //error_reporting( E_ALL ); if ( version_compare( PHP_VERSION, $php_minimum ) < 0 ) { die( 'ERROR #9013. See <a href="http://ithemes.com/codex/page/BackupBuddy:_Error_Codes#9013">this codex page for details</a>. Sorry! PHP version ' . $php_minimum . ' or newer is required for BackupBuddy to properly run. You are running PHP version ' . PHP_VERSION . '.' ); } global $importbuddy_file; $importbuddy_file = basename( __FILE__ ); // filename of importbuddy.php (or whatever it is named). global $wp_version; $wp_version = '4.4'; // Spoof a version for new wp-db class. $abspath = rtrim( dirname( __FILE__ ), '\\/' ) . '/'; define( 'ABSPATH', $abspath ); define( 'WP_CONTENT_DIR', $abspath . 'wp-content' ); define( 'PB_BB_VERSION', '8.0.1.8 (downloaded 2020-11-19T19:07:44+00:00)' ); // Used by wpdb class. define('DB_CHARSET', 'utf8'); // Default only. Overriden later if needed. define('DB_COLLATE', ''); // Default only. Overriden alter if needed. @date_default_timezone_set( @date_default_timezone_get() ); // Prevents date() from throwing a warning if the default timezone has not been set. Run prior to any file_exists()! // Try to put an index.htm file in place during import to help prevent against file browsing. Only do if not a defined step OR a non-numeric defined step OR a defined numeric step < 5. if ( ( ! isset( $_GET['step'] ) ) || ( isset( $_GET['step'] ) && !is_numeric( $_GET['step'] ) ) || ( isset( $_GET['step'] ) && is_numeric( $_GET['step'] ) && ( $_GET['step'] < 5 ) ) ) { if ( ( ! file_exists( ABSPATH . 'index.htm' ) ) && ( ! file_exists( ABSPATH . 'index.php' ) ) ) { @file_put_contents( ABSPATH . 'index.htm', '<html></html>' ); } } // If inside BB install then die. Else unpack importbuddy if needed. if ( @file_exists( @dirname( @dirname( __FILE__ ) ) . '/backupbuddy.php' ) ) { die( '<html>Access Denied</html>' ); } // Unpack importbuddy files into importbuddy directory. Does this when importbuddy directory does not exist OR if now request GET or POST params are sent (aka the first page only). if ( ! file_exists( ABSPATH . 'importbuddy' ) || ( ( count( $_GET ) == 0 ) && ( count( $_POST ) == 0 ) ) ) { // Make sure this file is complete and contains all the packed data to the end before proceeding. if ( false === strpos( file_get_contents( __FILE__ ), '###PACKDATA' . ',END' ) ) { // Concat here so we don't false positive on this line when searching. die( 'ERROR: It appears your `' . __FILE__ . '` file is incomplete. It may have not finished downloading or uploading completely. Please try re-downloading the script from within BackupBuddy in WordPress (do not just copy the file from the plugin directory) and re-uploading it.' ); } $unpack_importbuddy = true; if ( file_exists( ABSPATH . 'importbuddy' ) ) { // ImportBuddy directory already exists. We may need to re-unpack it if this file has been updated since. $signature = @file_get_contents( ABSPATH . 'importbuddy/_signature.php' ); $signature = trim( str_replace( '<?php die(); ?>', '', $signature ) ); if ( md5( PB_BB_VERSION . PB_PASSWORD ) != $signature ) { // Signature mismatch. We will need to delete and unpack again to update. //echo '<!-- unlinking existing importbuddy directory. -->'; 5.1.0.10: Broke causing headers already sent error due to auth. recursive_unlink( ABSPATH . 'importbuddy' ); } else { $unpack_importbuddy = false; } } if ( true === $unpack_importbuddy ) { unpack_importbuddy( $ignore_not_writable ); @file_put_contents( ABSPATH . 'importbuddy/_signature.php', '<?php die(); ?>' . md5( PB_BB_VERSION . PB_PASSWORD ) ); // Create a hash of this ImportBuddy version & password. On accessing importbuddy.php's authentication page all importbuddy files will be freshly unpacked if the importbuddy.php version and/or password mismatches to allow users to just replace importbuddy.php to upgrade ImportBuddy or password. } } // Database wrapper. require_once( ABSPATH . 'importbuddy/classes/wp-db.php' ); global $wpdb; //$wpdb = new wpdb(); if ( isset( $_GET['api'] ) && ( $_GET['api'] != '' ) ) { // API ACCESS if ( $_GET['api'] == 'ping' ) { die( 'pong' ); } else { die( 'Unknown API access action.' ); } } else { // NORMAL ACCESS. if ( !file_exists( ABSPATH . 'importbuddy/init.php' ) ) { die( 'Error: Unable to find file `' . ABSPATH . 'importbuddy/init.php`. Make sure that you downloaded this script from within BackupBuddy. Copying importbuddy files from inside the plugin directory is not sufficient as many file additions are made on demand.' ); } else { require_once( ABSPATH . 'importbuddy/init.php' ); } } function recursive_unlink( $path ) { return is_file($path)? @unlink($path): array_map('recursive_unlink',glob($path.'/*'))==@rmdir($path); } /** * unpack_importbuddy() * * Unpacks required files encoded in importbuddy.php into stand-alone files. * * @return null */ function unpack_importbuddy( $ignore_not_writable = false ) { if ( ( ! is_writable( ABSPATH ) ) && ( false === $ignore_not_writable ) ) { echo 'Error #224834. This directory, `' . ABSPATH . '`, is not write enabled according to the server. Please verify proper write permissions to continue. If this persists, contact your web hosting provider and tell them that is_writable("' . ABSPATH . '") returns FALSE in PHP.'; die(); } else { $unpack_file = ''; $handle = @fopen( __FILE__, 'r' ); if ( $handle ) { while ( ( $buffer = fgets( $handle ) ) !== false ) { if ( substr( $buffer, 0, 11 ) == '###PACKDATA' ) { $packdata_commands = explode( ',', trim( $buffer ) ); array_shift( $packdata_commands ); if ( $packdata_commands[0] == 'BEGIN' ) { // Start packed data. } elseif ( $packdata_commands[0] == 'FILE_START' ) { $unpack_file = $packdata_commands[2]; } elseif ( $packdata_commands[0] == 'FILE_END' ) { $unpack_file = ''; } elseif ( $packdata_commands[0] == 'END' ) { return; } } else { if ( $unpack_file != '' ) { if ( !is_dir( dirname( ABSPATH . $unpack_file ) ) ) { $mkdir_result = mkdir( dirname( ABSPATH . $unpack_file ), 0777, true ); // second param makes recursive. if ( $mkdir_result === false ) { echo 'Error #54455. Unable to mkdir `' . dirname( ABSPATH . $unpack_file ) . '`<br>'; } } $fileput_result = file_put_contents( ABSPATH . $unpack_file, base64_decode( $buffer ) ); if ( $fileput_result === false ) { echo 'Error #65656. Unable to put file contents to `' . ABSPATH . $unpack_file . '`.<br>'; } } } } if ( !feof( $handle ) ) { echo "Error: unexpected fgets() fail.<br>"; } fclose( $handle ); } else { echo 'ERROR #54455: Unable to open `' . __FILE__ . '` file for reading in packaged data.<br>'; } } } die(); ?> <?php /* ###PACKDATA,BEGIN ###PACKDATA,FILE_START,/_importbuddy/importbuddy/.htaccess,importbuddy/.htaccess ###PACKDATA,FILE_END,/_importbuddy/importbuddy/.htaccess,importbuddy/.htaccess ###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.htm,importbuddy/index.htm PGh0bWw+PC9odG1sPg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.htm,importbuddy/index.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.html,importbuddy/index.html PGh0bWw+PC9odG1sPg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.html,importbuddy/index.html ###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.php,importbuddy/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.php,importbuddy/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/init.php,importbuddy/init.php PD9waHAKLyoqCiAqCiAqCVBsdWdpbiBOYW1lOiBJbXBvcnRCdWRkeQogKglQbHVnaW4gVVJJOiBodHRwOi8vaXRoZW1lcy5jb20vCiAqCURlc2NyaXB0aW9uOiBCYWNrdXBCdWRkeSBJbXBvcnRlcgogKglAc2luY2UgMS4wLjIKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqCiAqCUluc3RhbGxhdGlvbjoKICogCiAqCTEuIERvd25sb2FkIGFuZCB1bnppcCB0aGUgbGF0ZXN0IHJlbGVhc2UgemlwIGZpbGUuCiAqCTIuIElmIHlvdSB1c2UgdGhlIFdvcmRQcmVzcyBwbHVnaW4gdXBsb2FkZXIgdG8gaW5zdGFsbCB0aGlzIHBsdWdpbiBza2lwIHRvIHN0ZXAgNC4KICoJMy4gVXBsb2FkIHRoZSBlbnRpcmUgcGx1Z2luIGRpcmVjdG9yeSB0byB5b3VyIGAvd3AtY29udGVudC9wbHVnaW5zL2AgZGlyZWN0b3J5LgogKgk0LiBBY3RpdmF0ZSB0aGUgcGx1Z2luIHRocm91Z2ggdGhlICdQbHVnaW5zJyBtZW51IGluIFdvcmRQcmVzcyBBZG1pbmlzdHJhdGlvbi4KICogCiAqCVVzYWdlOgogKiAKICoJMS4gTmF2aWdhdGUgdG8gdGhlIG5ldyBwbHVnaW4gbWVudSBpbiB0aGUgV29yZHByZXNzIEFkbWluaXN0cmF0aW9uIFBhbmVsLgogKgogKglOT1RFOiBETyBOT1QgRURJVCBUSElTIE9SIEFOWSBPVEhFUiBQTFVHSU4gRklMRVMuIE5PIFVTRVItQ09ORklHVVJBQkxFIE9QVElPTlMgV0lUSElOLgogKi8KCmVycm9yX3JlcG9ydGluZyggRV9FUlJPUiB8IEVfV0FSTklORyB8IEVfUEFSU0UgfCBFX05PVElDRSApOyAvLyBISUdICmRlZmluZSggJ1BCX1NUQU5EQUxPTkUnLCB0cnVlICk7CmRlZmluZSggJ1BCX0lNUE9SVEJVRERZJywgdHJ1ZSApOwoKJHBsdWdpbmJ1ZGR5X3NldHRpbmdzID0gYXJyYXkoCgkJCQknc2x1ZycJCQkJCQk9PgkJJ2JhY2t1cGJ1ZGR5JywKCQkJCSdwaHBfbWluaW11bScJCQkJPT4JCSc1LjInLAoJCQkJJ3NlcmllcycJCQkJCT0+CQknJywKCQkJCSdyZW1vdGVfYXBpJwkJCQk9PgkJJzAnLCAvLyBTZXQgdG8gMSBieSBzdGF0ZSBmb3IgZGVwbG95bWVudHMuCgkJCQknZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnCT0+CQlhcnJheSgpLCAvLyBEZWZhdWx0IHN0YXRlIHRvIG92ZXJyaWRlIHRoZSBtYWluIGRlZmF1bHRzLiBHb29kIGZvciBhdXRvbWF0aW5nIGltcG9ydHMuIEFwcGxpZWQgb3ZlciBkZWZhdWx0cyBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHJlc3RvcmUgY2xhc3MuCgkJCQknZGVmYXVsdF9vcHRpb25zJwkJCT0+CQlhcnJheSgKCQkJCQkJCQkJCQkJCQknYmJfdmVyc2lvbicJCQkJPT4JUEJfQkJfVkVSU0lPTiwJLy8gQkIgdmVyc2lvbiB0byBiZSBmaWxsZWQgaW4gb24gZG93bmxvYWQuCgkJCQkJCQkJCQkJCQkJJ2JhY2t1cF9kaXJlY3RvcnknCQkJPT4JJycsCgkJCQkJCQkJCQkJCQkJJ2xvZ19sZXZlbCcJCQkJCT0+CTAsIC8vIE5vIGxvbmdlciB1c2luZyB0aGlzIG1ldGhvZCBmb3IgaGFuZGxpbmcgbG9nZ2luZy4gc3RhdHVzKCkgbWV0aG9kIGFsd2F5cyBsb2dzIGFsbCBpZiBpbXBvcnRidWRkeS4KCQkJCQkJCQkJCQkJCSksCgkJCQknbW9kdWxlcycJCQkJCT0+CQlhcnJheSgKCQkJCQkJCQkJCQkJCQkndXBkYXRlcicJCQkJPT4JZmFsc2UsCQkJCQkJLy8gTG9hZCBQbHVnaW5CdWRkeSBhdXRvbWF0aWMgdXBncmFkZXMuCgkJCQkJCQkJCQkJCQkJJ2ZpbGVzeXN0ZW0nCQkJPT4JdHJ1ZSwJCQkJCQkvLyBGaWxlIHN5c3RlbSBoZWxwZXIgbWV0aG9kcy4KCQkJCQkJCQkJCQkJCQknZm9ybWF0JwkJCQk9Pgl0cnVlLAkJCQkJCS8vIFRleHQgLyBkYXRhIGZvcm1hdHRpbmcgaGVscGVyIG1ldGhvZHMuCgkJCQkJCQkJCQkJCQkpCgkJCSk7CgoKCi8vICRzZXR0aW5ncyBpcyBleHBlY3RlZCB0byBiZSBwb3B1bGF0ZWQgcHJpb3IgdG8gaW5jbHVkaW5nIFBsdWdpbkJ1ZGR5IGZyYW1ld29yay4gRG8gbm90IGVkaXQgYmVsb3cuCnJlcXVpcmUoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL3BsdWdpbmJ1ZGR5L19wbHVnaW5idWRkeS5waHAnICk7Cg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/init.php,importbuddy/init.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_admin.php,importbuddy/init_admin.php PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWQoKTsKCi8vICoqKioqKioqKiogQUNUSU9OUyAoYWRtaW4pICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBBSkFYIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIERBU0hCT0FSRCAoYWRtaW4pICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBGSUxURVJTIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIFBBR0VTIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIExJQlJBUklFUyAmIENMQVNTRVMgKGFkbWluKSAqKioqKioqKioqCnJlcXVpcmVfb25jZSggJ2NsYXNzZXMvY29yZS5waHAnICk7CgpyZXF1aXJlX29uY2UoICdjbGFzc2VzL2ltcG9ydC5waHAnICk7CnBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10gPSBuZXcgcGJfYmFja3VwYnVkZHlfaW1wb3J0KCk7CgoKLy8gKioqKioqKioqKiBPVEhFUiAoYWRtaW4pICoqKioqKioqKioKCgoKPz4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_admin.php,importbuddy/init_admin.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_global.php,importbuddy/init_global.php PD9waHAKaWYgKCAhIGNsYXNzX2V4aXN0cyggJ2JhY2t1cGJ1ZGR5X2NvcmUnICkgKSB7CglyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2NvcmUucGhwJyApOwp9CnJlcXVpcmVfb25jZSggQUJTUEFUSCAuICdpbXBvcnRidWRkeS9jbGFzc2VzL2F1dGgucGhwJyApOwoKLy8gSWYgdmVyaWZpY2F0aW9uIGNvZGUgcGFzc2VkIHRoZW4gYXV0aGVudGljYXRlIGVhcmx5LgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlzcGxheV9tb2RlJyApID09ICdlbWJlZCcgKSB7CglBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7Cn0KCmdsb2JhbCAkaW1wb3J0YnVkZHlfZmlsZTsKJGltcG9ydF9zZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCgovLyBDcmVhdGUgU1RBVEUgZmlsZSBmcm9tIElOSSBmaWxlIChpZiBleGlzdHMpLgovKgppZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0X3NlcmlhbCAuICcuaW5pJyApICkgewoJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQb3NzaWJsZSBpbXBvcnRidWRkeSAuaW5pIGZpbGUgZm9yIGF1dG8tbG9hZGluZyBzZXR0aW5ncyBmb3VuZCBhdCBgJyAuIEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRfc2VyaWFsIC4gJy5pbmknIC4gJ2AuJyApOwoJJGluaSA9IHBhcnNlX2luaV9maWxlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0X3NlcmlhbCAuICcuaW5pJywgdHJ1ZSApOwoJCgllY2hvICc8YnI+PGJyPjxicj48YnI+PHByZT4nOwoJcHJpbnRfciggJGluaSApOwoJZWNobyAnPC9wcmU+JzsKCWlmICggaXNzZXQoICRpbmlbJ3R5cGUnXSApICkgeyAvLyBJZiB0eXBlIGlzIHNldCB0aGVuIGFzc3VtZSBpdCBtYXkgYmUgYSB2YWxpZCBpbmkgZmlsZSBmb3IgaW1wb3J0YnVkZHkgYW5kIHVzZSBpdC4KCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvbmZpcm1lZCBpbXBvcnRidWRkeSAuaW5pIGZpbGUgZm9yIGF1dG8tbG9hZGluZyBzZXR0aW5ncyBmb3VuZC4nICk7CgkJCgkJJG92ZXJyaWRlX3N0YXRlX2ZpbGUgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0X3NlcmlhbCAuICctc3RhdGUucGhwJzsKCQlpZiAoIGZpbGVfZXhpc3RzKCAkb3ZlcnJpZGVfc3RhdGVfZmlsZSApICkgewoJCQlAdW5saW5rKCAkb3ZlcnJpZGVfc3RhdGVfZmlsZSApOwoJCX0KCQlpZiAoIGZhbHNlID09PSBmaWxlX3B1dF9jb250ZW50cyggJG92ZXJyaWRlX3N0YXRlX2ZpbGUsICI8P3BocCBkaWUoJ0FjY2VzcyBEZW5pZWQuJyk7IC8vIDwhLS0gPz5cbiIgLiBiYXNlNjRfZW5jb2RlKCBzZXJpYWxpemUoICRpbmkgKSApICkgKSB7CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0ODkzNDgzNDogVW5hYmxlIHRvIHdyaXRlIHN0YXRlIGZpbGUgYCcgLiAkb3ZlcnJpZGVfc3RhdGVfZmlsZSAuICdgIGZyb20gaW5pIGRhdGEuIENoZWNrIHBlcm1pc3Npb25zLicgKTsKCQl9Cgl9Cn0KKi8KCgppZiAoICcnICE9ICRpbXBvcnRfc2VyaWFsICkgeyAvLyBpbXBvcnRidWRkeSBoYXMgYSBzZXJpYWwuIExvb2sgZm9yIGEgZGVmYXVsdCBzdGF0ZSBmaWxlIHRoYXQgbWF0Y2hlcy4KCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddID0gJGltcG9ydF9zZXJpYWw7CglwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0X3NlcmlhbCAuICctc3RhdGUucGhwJyApICkgeyAvLyBEZWZhdWx0IHN0YXRlIGV4aXN0cy4KCQkKCQkvLyBJZiBhbiBvdmVycmlkaW5nIHN0YXRlIGZpbGUgZXhpc3RzIHRoZW4gbG9hZCBpdCBvdmVyIHRoZSBjdXJyZW50IHN0YXRlLgoJCSRvdmVycmlkZV9zdGF0ZV9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydF9zZXJpYWwgLiAnLXN0YXRlLnBocCc7CgkJaWYgKCBmaWxlX2V4aXN0cyggJG92ZXJyaWRlX3N0YXRlX2ZpbGUgKSApIHsKCQkJJHN0YXRlZGF0YSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkb3ZlcnJpZGVfc3RhdGVfZmlsZSApOwoJCQkvLyBVbnNlcmlhbGl6ZSBkYXRhOyBJZiBpdCBmYWlscyBpdCB0aGVuIGRlY29kZXMgdGhlIG9ic2N1ZmF0ZWQgZGF0YSB0aGVuIHVuc2VyaWFsaXplcyBpdC4uCgkJCWlmICggISBpc19zZXJpYWxpemVkKCAkc3RhdGVkYXRhICkgfHwgKCBmYWxzZSA9PT0gKCAkcmV0dXJuID0gdW5zZXJpYWxpemUoICRzdGF0ZWRhdGEgKSApICkgKSB7CgkJCQkvLyBTa2lwIGZpcnN0IGxpbmUuCgkJCQkkc2Vjb25kX2xpbmVfcG9zID0gc3RycG9zKCAkc3RhdGVkYXRhLCAiXG4iICkgKyAxOwoJCQkJJHN0YXRlZGF0YSA9IHN1YnN0ciggJHN0YXRlZGF0YSwgJHNlY29uZF9saW5lX3BvcyApOwoJCQkJLy8gRGVjb2RlIGJhY2sgaW50byBhbiBhcnJheS4KCQkJCSRzdGF0ZWRhdGEgPSB1bnNlcmlhbGl6ZSggYmFzZTY0X2RlY29kZSggJHN0YXRlZGF0YSApICk7CgkJCX0KCQkJaWYgKCBpc19hcnJheSggJHN0YXRlZGF0YSApICkgeyAvLyBWYWxpZCBjb250ZW50LgoJCQkJLy8gTm9ybWFsaXplIFVSTHM6CgkJCQlpZiAoIGlzc2V0KCAkc3RhdGVkYXRhWydzaXRldXJsJ10gKSApIHsKCQkJCQkkc3RhdGVkYXRhWydzaXRldXJsJ10gPSBydHJpbSggJHN0YXRlZGF0YVsnc2l0ZXVybCddLCAnLycgKTsKCQkJCX0KCQkJCWlmICggaXNzZXQoICRzdGF0ZWRhdGFbJ2hvbWV1cmwnXSApICkgewoJCQkJCSRzdGF0ZWRhdGFbJ2hvbWV1cmwnXSA9IHJ0cmltKCAkc3RhdGVkYXRhWydob21ldXJsJ10sICcvJyApOwoJCQkJfQoJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2FkZWQgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZSBzdGF0ZSBmaWxlIGRhdGEgYW5kIGdhdmUgaXQgcHJpb3JpdHkgb3ZlciBjdXJyZW50IHN0YXRlLiBGaWxlOiBgJyAuICRvdmVycmlkZV9zdGF0ZV9maWxlIC4gJ2AuJyApOwoJCQkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddID0gJHN0YXRlZGF0YTsKCQkJCS8vcHJpbnRfciggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQl9IGVsc2UgewoJCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdEZWZhdWx0IHN0YXRlIG92ZXJ3cml0ZSBmaWxlIGZvdW5kIGJ1dCB1bmFibGUgdG8gYWNjZXNzIGl0LicgKTsKCQkJfQoJCX0KCQkKCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3ZlcnJpZGUgc3RhdGUgZmlsZSBub3QgZm91bmQgYXQgYCcgLiAkb3ZlcnJpZGVfc3RhdGVfZmlsZSAuICdgLiBTa2lwcGluZy4nICk7Cgl9CgkKfQoKLy8gSGFuZGxlIEFQSSBjYWxscyBpZiBiYWNrdXBidWRkeV9hcGlfa2V5IGlzIHBvc3RlZC4gSWYgYW55dGhpbmcgZmFpbHMgc2VjdXJpdHkgY2hlY2tzIHByZXRlbmQgbm90aGluZyBhdCBhbGwgaGFwcGVuZWQuCmlmICggJycgIT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnYmFja3VwYnVkZHlfYXBpX2tleScgKSApIHsgLy8gUmVtb3RlIEFQSSBhY2Nlc3MuCglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9hcGknXVsna2V5cyddICkgJiYgKCBjb3VudCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfYXBpJ11bJ2tleXMnXSApID4gMCApICkgeyAvLyBSZW1vdGUgQVBJIGVuYWJsZWQgYW5kIDEgb3IgbW9yZSBrZXlzIGRlZmluZWQuCgkJaW5jbHVkZSggJ2NsYXNzZXMvcmVtb3RlX2FwaS5waHAnICk7CgkJYmFja3VwYnVkZHlfcmVtb3RlX2FwaTo6bG9jYWxDYWxsKCAkc2VjdXJlID0gdHJ1ZSwgJGltcG9ydGJ1ZGR5ID0gdHJ1ZSApOwoJCWRpZSgpOwoJfQp9CgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlzcGxheV9tb2RlJyApID09ICdlbWJlZCcgKSB7CglwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc3BsYXlfbW9kZSddID0gJ2VtYmVkJzsKCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7Cn0KCi8vICoqKioqKioqKiogQUNUSU9OUyAoZ2xvYmFsKSAqKioqKioqKioqCgoKCi8vICoqKioqKioqKiogQUpBWCAoZ2xvYmFsKSAqKioqKioqKioqCgoKCi8vICoqKioqKioqKiogQ1JPTiAoZ2xvYmFsKSAqKioqKioqKioqCgoKCi8vICoqKioqKioqKiogRklMVEVSUyAoZ2xvYmFsKSAqKioqKioqKioqCgoKCi8vICoqKioqKioqKiogV0lER0VUUyAoZ2xvYmFsKSAqKioqKioqKioqCgoKCj8+ ###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_global.php,importbuddy/init_global.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_public.php,importbuddy/init_public.php PD9waHAKCgoKLy8gKioqKioqKioqKiBBQ1RJT05TIChwdWJsaWMpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBBSkFYIChwdWJsaWMpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBGSUxURVJTIChwdWJsaWMpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBTSE9SVENPREVTIChwdWJsaWMpICoqKioqKioqKioKCgoKPz4K ###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_public.php,importbuddy/init_public.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/license.txt,importbuddy/license.txt CQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKCiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAogICAgICAgICAgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCgogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KCgkJCSAgICBQcmVhbWJsZQoKICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCmZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwp1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5CnRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwp5b3VyIHByb2dyYW1zLCB0b28uCgogIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQpoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCnRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAppZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAppbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCgogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgpUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQpkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCgogIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0CnlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCnNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKcmlnaHRzLgoKICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCigyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCmRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCgogIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCnRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCnNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQp3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwp0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAphdXRob3JzJyByZXB1dGF0aW9ucy4KCiAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQpwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCnByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQpwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgoKICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAptb2RpZmljYXRpb24gZm9sbG93LgoKCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCgogIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LApyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgp0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KCkFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90CmNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQppcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgpXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KCiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCnNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQpjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCmNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwphbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCmFsb25nIHdpdGggdGhlIFByb2dyYW0uCgpZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KCiAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgpvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCmRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQphYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgoKICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwogICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KCiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQogICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCiAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CiAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCiAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCiAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQogICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgogICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CiAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCiAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKClRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCnRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CmRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZApvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgpUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKeW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCmV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgoKSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQp3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KCiAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCnVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgpTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CgogICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQogICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCiAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKCiAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQogICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCiAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCgogICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCiAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQogICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAogICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCgpUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCmNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55CmFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwpjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCnNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQphbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQpmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQpvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAppdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCgpJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCmFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCmRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdApjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgoKICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdApvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgpIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaApwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCgogIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdApzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgpkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwp0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KCiAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQpvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCnRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KdGhpcyBMaWNlbnNlLgoKICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CmluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCmNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdApleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdApkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCkxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudApsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CmFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgp0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCnJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCgpJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwphcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgpjaXJjdW1zdGFuY2VzLgoKSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQpwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQpzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCmludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwppbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAp0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdApzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCnRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAppbXBvc2UgdGhhdCBjaG9pY2UuCgpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCgogIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCmNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQpvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCm1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwp0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCmNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwp0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KCiAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0Kc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwplaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCnRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbi4KCiAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQpwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCnRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZApvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KCgkJCSAgICBOTyBXQVJSQU5UWQoKICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCk9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwpUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFClBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLApSRVBBSVIgT1IgQ09SUkVDVElPTi4KCiAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SClJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCklOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwpPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEClRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQpZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgpQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgoKCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwoK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/license.txt,importbuddy/license.txt ###PACKDATA,FILE_START,/_importbuddy/importbuddy/readme.txt,importbuddy/readme.txt ICogV2Vic2l0ZTogaHR0cDovL2l0aGVtZXMuY29tCiAqCiAqIEluc3RhbGxhdGlvbjoKICogCiAqIDEuIERvd25sb2FkIGFuZCB1bnppcCB0aGUgbGF0ZXN0IHJlbGVhc2UgemlwIGZpbGUKICogMi4gSWYgeW91IHVzZSB0aGUgV29yZFByZXNzIHBsdWdpbiB1cGxvYWRlciB0byBpbnN0YWxsIHRoaXMgcGx1Z2luIHNraXAgdG8gc3RlcCA0LgogKiAzLiBVcGxvYWQgdGhlIGVudGlyZSBwbHVnaW4gZGlyZWN0b3J5IHRvIHlvdXIgYC93cC1jb250ZW50L3BsdWdpbnMvYCBkaXJlY3RvcnkKICogNC4gQWN0aXZhdGUgdGhlIHBsdWdpbiB0aHJvdWdoIHRoZSAnUGx1Z2lucycgbWVudSBpbiBXb3JkUHJlc3MgQWRtaW5pc3RyYXRpb24KICogCiAqIFVzYWdlOgogKiAKICogMS4gTmF2aWdhdGUgdG8gdGhlIG5ldyBtZW51IGZvciB0aGlzIHBsdWdpbiBpbiB0aGUgV29yZHByZXNzIEFkbWluaXN0cmF0aW9uIFBhbmVsCiAqIDIuIFNlbGVjdCAnR2V0dGluZyBTdGFydGVkJyBmb3IgaW5zdHJ1Y3Rpb25zIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgogKg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/readme.txt,importbuddy/readme.txt ###PACKDATA,FILE_START,/_importbuddy/importbuddy/sample.ini,importbuddy/sample.ini OyBEZWZhdWx0IHZhbHVlcyBjYW4gYmUgc2VlbiBpbjogaW1wb3J0YnVkZHkvY2xhc3Nlcy9yZXN0b3JlLnBocCAob3IgYmFja3VwYnVkZHkvY2xhc3Nlcy9yZXN0b3JlLnBocCkgaW4gdGhlIF9fY29uc3RydWN0KCkgZnVuY3Rpb24sIHdoZXJlICR0aGlzLT5fc3RhdGUgaXMgZmlyc3Qgc2V0LgoKdHlwZSA9IHJlc3RvcmUKYXJjaGl2ZSA9IGJhY2t1cC1iYWNrdXBidWRkeS1YWFhYWFhYWFhYWC56aXAKc2l0ZXVybCA9IGh0dHA6Ly9maW5hbHVybC5jb20KaG9tZXVybCA9IGh0dHA6Ly9maW5hbHVybC5jb20KcmVzdG9yZUZpbGVzID0gdHJ1ZQpyZXN0b3JlRGF0YWJhc2UgPSB0cnVlCm1pZ3JhdGVIdGFjY2VzcyA9IHRydWUKCjsgQm90aCBvZiB0aGVzZSBtdXN0IGJlIHRydWUgd2hlbiB1c2luZyAuaW5pIGZpbGUuCmluaW1vZGUgPSB0cnVlCmF1dG9BZHZhbmNlID0gdHJ1ZQoKW2RhdGFiYXNlU2V0dGluZ3NdCnNlcnZlciA9IGxvY2FsaG9zdApkYXRhYmFzZSA9IGRhdGFiYXNlX25hbWUKdXNlcm5hbWUgPSBkYXRhYmFzZV91c2VyCnBhc3N3b3JkID0gZGF0YWJhc2VfcGFzc3dvcmQKcHJlZml4ID0gd3BfCnJlbmFtZVByZWZpeCA9IHRydWUKd2lwZVByZWZpeCA9IGZhbHNlCndpcGVEYXRhYmFzZSA9IGZhbHNlCgpbY2xlYW51cF0KZGVsZXRlQXJjaGl2ZSA9IGZhbHNlCmRlbGV0ZVRlbXBGaWxlcyA9IHRydWUKZGVsZXRlSW1wb3J0QnVkZHkgPSBmYWxzZQpzZXRfYmxvZ19wdWJsaWMgPSAKZGVsZXRlSW1wb3J0QnVkZHlEaXJlY3RvcnkgPSB0cnVlCmRlbGV0ZUltcG9ydExvZyA9IHRydWUK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/sample.ini,importbuddy/sample.ini ###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/auth.php,importbuddy/classes/auth.php PD9waHAKY2xhc3MgQXV0aCB7CgkKCWNvbnN0IE1BWF9MT0dJTl9BVFRFTVBUU19BTExPV0VEID0gNDsgLy8gTWF4aW11bSBudW1iZXIgb2YgaW52YWxpZCBsb2dpbiBhdHRlbXB0cyBiZWZvcmUgbG9ja2luZyBpbXBvcnRidWRkeS4KCWNvbnN0IFJFU0VUX0RFRkFVTFRTX09OX0lOVkFMSURfTE9HSU4gPSBmYWxzZTsgLy8gV2hldGhlciBvciBub3QgcmVzZXQgYWxsIHNldHRpbmdzL29wdGlvbnMgYmFjayB0byBkZWZhdWx0cyBvbiBsb2dpbiBmYWlsdXJlLgoJY29uc3QgQ09PS0lFX0VYUElSQVRJT04gPSA4NjQwMDsgLy8gTnVtYmVyIG9mIHNlY29uZHMgYW4gaW1wb3J0YnVkZHkgY29va2llIGlzIHZhbGlkIGZvci4KCXByaXZhdGUgc3RhdGljICRfYXV0aGVudGljYXRlZCA9IGZhbHNlOyAvLyBXaGV0aGVyIHVzZXIgaXMgdmFsaWRseSBhdXRoZW50aWNhdGVkIG9yIG5vdC4KCXByaXZhdGUgc3RhdGljICRfY2hlY2tlZCA9IGZhbHNlOyAvLyBXaGV0aGVyIGNoZWNrKCkgaGFzIGJlZW4gcnVuIHlldC4KCQoJCgkKCS8qIGNoZWNrKCkKCSAqCgkgKiBDaGVjayBhdXRoZW50aWNhdGlvbiBiYXNlZCBvbiBmb3JtIGRhdGEgc3VibWl0dGVkLiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgcnVuIG9uY2UuIFVzZSBpc19hdXRoZW50aWNhdGVkKCkgdG8gZGV0ZXJtaW5lIGF1dGggc3RhdHVzLgoJICoKCSAqIEBwYXJhbQlmb3JjZV9jaGVjawkJYm9vbAlJZiB0cnVlIHRoZW4gd2lsbCByZS1jaGVjayBldmVuIGlmIGNoZWNrKCkgaGFzIGFscmVhZHkgYmVlbiBydW4gdGhpcyBzZXNzaW9uLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVjayggJGZvcmNlX2NoZWNrID0gZmFsc2UgKSB7CgkJCgkJaWYgKCAoIHRydWUgPT09IHNlbGY6OiRfY2hlY2tlZCApICYmICggJGZvcmNlX2NoZWNrID09PSBmYWxzZSApICkgeyAvLyBTa2lwIGNoZWNraW5nIGlmIGFscmVhZHkgc2tpcHBlZCB1bmxlc3MgZm9yY2luZy4KCQkJcmV0dXJuIHNlbGY6OmlzX2F1dGhlbnRpY2F0ZWQoKTsKCQl9CgkJCgkJJGxvZ2luX2F0dGVtcHRfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvX2xvZ2luX2F0dGVtcHRzLnBocCc7CgkJJGxvZ2luX2F0dGVtcHRzID0gMTsKCQlpZiAoIGZpbGVfZXhpc3RzKCAkbG9naW5fYXR0ZW1wdF9maWxlICkgKSB7CgkJCSRsb2dpbl9hdHRlbXB0cyA9IEBmaWxlX2dldF9jb250ZW50cyggJGxvZ2luX2F0dGVtcHRfZmlsZSApOwoJCX0KCQlpZiAoIGZhbHNlICE9PSAkbG9naW5fYXR0ZW1wdHMgKSB7CgkJCSRsb2dpbl9hdHRlbXB0cyA9IHRyaW0oIHN0cl9yZXBsYWNlKCAnPD9waHAgZGllKCk7ID8+JywgJycsICRsb2dpbl9hdHRlbXB0cyApICk7CgkJCWlmICggJGxvZ2luX2F0dGVtcHRzID4gc2VsZjo6TUFYX0xPR0lOX0FUVEVNUFRTX0FMTE9XRUQgKSB7CgkJCQlkaWUoICdBY2Nlc3MgRGVuaWVkLiBNYXhpbXVtIGxvZ2luIGF0dGVtcHRzIGV4Y2VlZGVkLiBZb3UgbXVzdCBkZWxldGUgdGhlIGZpbGUgIl9sb2dpbl9hdHRlbXB0cy5waHAiIGluIHRoZSBpbXBvcnRidWRkeSBkaXJlY3Rvcnkgb24geW91ciBzZXJ2ZXIgdG8gdW5sb2NrIHRoaXMgSW1wb3J0QnVkZHkgdG8gYWxsb3cgaXQgdG8gY29udGludWUuJyApOwoJCQl9CgkJfQoJCQoJCSRhY3R1YWxfcGFzc19oYXNoID0gUEJfUEFTU1dPUkQ7CgkJaWYgKCAoICcjUEFTU1dPUkQjJyA9PSAkYWN0dWFsX3Bhc3NfaGFzaCApIHx8ICggJycgPT0gJGFjdHVhbF9wYXNzX2hhc2ggKSApIHsgZGllKCAnRXJyb3IgIzg0NTc4NDU5NzQ1LiBBIHBhc3N3b3JkIG11c3QgYmUgc2V0IHRvIGFjY2VzcyBJbXBvcnRCdWRkeS4gUGxlYXNlIGRvd25sb2FkIGEgZnJlc2ggY29weSBhZnRlciBjb25maWd1cmluZyB5b3VyIEltcG9ydEJ1ZGR5IHBhc3N3b3JkLicgKTsgfQoJCQoJCWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncGFzc3dvcmQnICkgIT0gJycgKSB7CgkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSBtZDUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICk7CgkJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgewoJCQkkc3VwcGxpZWRfcGFzc19oYXNoID0gbWQ1KCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Bhc3N3b3JkJyApICk7CgkJfSBlbHNlIHsKCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3YnICkgIT0gJycgKSB7IC8vIEhhc2ggc3VibWl0dGVkIGJ5IG1hZ2ljIG1pZ3JhdGlvbi4KCQkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3YnICk7CgkJCX0gZWxzZSB7IC8vIE5vcm1hbCBmb3JtIHN1Ym1pdHRlZCBoYXNoLgoJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYXNzX2hhc2gnICkgIT0gJycgKSB7CgkJCQkJJHN1cHBsaWVkX3Bhc3NfaGFzaCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3NfaGFzaCcgKTsKCQkJCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncGJfYmFja3VwYnVkZHlfcGFzc19oYXNoJyApICE9ICcnICkgewoJCQkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYl9iYWNrdXBidWRkeV9wYXNzX2hhc2gnICk7CgkJCQl9IGVsc2UgewoJCQkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSAnJzsKCQkJCX0KCQkJfQoJCX0KCQkKCQlpZiAoICRzdXBwbGllZF9wYXNzX2hhc2ggPT0gJGFjdHVhbF9wYXNzX2hhc2ggKSB7CgkJCXNlbGY6OiRfYXV0aGVudGljYXRlZCA9IHRydWU7CgkJCXNldGNvb2tpZSggJ2ltcG9ydGJ1ZGR5X2xvZ2luJywgbWQ1KCBQQl9QQVNTV09SRCAuICdiYWRnZXJzJyApLCAoIHRpbWUoKSsgc2VsZjo6Q09PS0lFX0VYUElSQVRJT04gKSApOwoJCX0gZWxzZWlmICggaXNzZXQoICRfQ09PS0lFWydpbXBvcnRidWRkeV9sb2dpbiddICkgJiYgKCAkX0NPT0tJRVsnaW1wb3J0YnVkZHlfbG9naW4nXSAhPSAnJyApICYmICggJF9DT09LSUVbJ2ltcG9ydGJ1ZGR5X2xvZ2luJ10gPT0gbWQ1KCBQQl9QQVNTV09SRCAuICdiYWRnZXJzJyApICkgKSB7CgkJCXNlbGY6OiRfYXV0aGVudGljYXRlZCA9IHRydWU7CgkJCXNldGNvb2tpZSggJ2ltcG9ydGJ1ZGR5X2xvZ2luJywgbWQ1KCBQQl9QQVNTV09SRCAuICdiYWRnZXJzJyApLCAoIHRpbWUoKSArIHNlbGY6OkNPT0tJRV9FWFBJUkFUSU9OICkgKTsKCQl9IGVsc2UgeyAvLyBJbmNvcnJlY3QgaGFzaC4gUmVzZXQgc2V0dGluZ3MgJiB0cmFjayBhdHRlbXB0cy4KCQkJaWYgKCAnJyAhPSAkc3VwcGxpZWRfcGFzc19oYXNoICkgeyAvLyBEb250IGNvdW50IGJsYW5rIGhhc2ggYXMgYW4gYXR0ZW1wdC4KCQkJCWlmICggdHJ1ZSA9PT0gc2VsZjo6UkVTRVRfREVGQVVMVFNfT05fSU5WQUxJRF9MT0dJTiApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6cmVzZXRfZGVmYXVsdHMoKTsKCQkJCX0KCQkJCWlmICggZmFsc2UgIT09ICRsb2dpbl9hdHRlbXB0cyApIHsKCQkJCQlnbG9iYWwgJHBiX2xvZ2luX2F0dGVtcHRzOwoJCQkJCSRwYl9sb2dpbl9hdHRlbXB0cyA9ICRsb2dpbl9hdHRlbXB0czsKCQkJCQlAZmlsZV9wdXRfY29udGVudHMoICRsb2dpbl9hdHRlbXB0X2ZpbGUsICc8P3BocCBkaWUoKTsgPz4nIC4gKCAkbG9naW5fYXR0ZW1wdHMgKyAxICkgKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlzZWxmOjokX2NoZWNrZWQgPSB0cnVlOwoJCQoJCXJldHVybiBzZWxmOjokX2F1dGhlbnRpY2F0ZWQ7CgkJCgl9IC8vIEVuZCBjaGVjaygpLgoJCgkKCQoJLyogaXNfYXV0aGVudGljYXRlZCgpCgkgKgoJICogRGV0ZXJtaW5lIHdoZXRoZXIgdXNlciBpcyBmdWxseSBhdXRoZW50aWNhdGVkIG9yIG5vdC4KCSAqCgkgKiBAcmV0dXJuCQlib29sCQlUcnVlIGlmIGZ1bGx5IGF1dGhlbnRpY2F0ZWQsIG90aGVyd2lzZSBmYWxzZS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfYXV0aGVudGljYXRlZCgpIHsKCQkKCQlyZXR1cm4gc2VsZjo6JF9hdXRoZW50aWNhdGVkOwoJCQoJfSAvLyBFbmQgYXV0aGVudGljYXRlZCgpLgoJCgkKCQoJLyogcmVxdWlyZV9hdXRoZW50aWNhdGlvbigpCgkgKgoJICogUmVxdWlyZXMgdmFsaWQgYXV0aGVudGljYXRpb24gdG8gYWxsb3cgcHJvY2VlZGluZy4gZGllKCkgaWYgbm90IGxvZ2dlZCBpbi4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVxdWlyZV9hdXRoZW50aWNhdGlvbigpIHsKCQkKCQkvLyBDaGVjayBpZiBwcmV2aW91c2x5IGF1dGhlZCBhbHJlYWR5IHRoaXMgc2Vzc2lvbi4KCQlpZiAoIHRydWUgPT09IHNlbGY6OmlzX2F1dGhlbnRpY2F0ZWQoKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCQoJCXNlbGY6OmNoZWNrKCk7CgkJaWYgKCB0cnVlID09PSBzZWxmOjppc19hdXRoZW50aWNhdGVkKCkgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCWRpZSggJ0FjY2VzcyBEZW5pZWQuIFlvdSBtdXN0IGxvZyBpbiBmaXJzdC4gUGxlYXNlIHJldHVybiB0byB0aGUgPGEgaHJlZj0iaW1wb3J0YnVkZHkucGhwIj5pbXBvcnRidWRkeS5waHAgaG9tZXBhZ2U8L2E+IGF1dGhlbnRpY2F0ZS4nICk7CgkJfQoJCQoJfSAvLyBFbmQgcmVxdWlyZV9hdXRob3JpemF0aW9uKCk7CgkKfSAvLyBFbmQgY2xhc3MuCgoK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/auth.php,importbuddy/classes/auth.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/index.php,importbuddy/classes/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/index.php,importbuddy/classes/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/test-db.php,importbuddy/classes/test-db.php PD9waHAKLyoqCiAqIEJhY2t1cEJ1ZGR5IEltcG9ydEJ1ZGR5IGNsYXNzIGZvciB0ZXN0aW5nIERCIHBlcm1pc3Npb25zCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqIEBzdWJwYWNrYWdlIEltcG9ydEJ1ZGR5CiAqIEBzaW5jZSA2LjQuMC4xMwogKi8KCi8qKgogKiBEQiBQZXJtaXNzaW9uIFRlc3RzCiAqCiAqIEBwYWNrYWdlIEJhY2t1cEJ1ZGR5CiAqIEBzdWJwYWNrYWdlIEltcG9ydEJ1ZGR5CiAqIEBzaW5jZSA2LjQuMC4xMwogKi8KY2xhc3MgaW1wb3J0YnVkZHlfdGVzdF9kYnsKCgkvKioKCSAqIERCIENyZWRlbnRpYWxzIHBhc3NlZCB2aWEgZm9ybQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByaXZhdGUgJGNyZWRzID0gYXJyYXkoKTsKCgkvKioKCSAqIFdvcmRQcmVzcyBEYXRhYmFzZSBDbGFzcwoJICoKCSAqIEBzaW5jZSA2LjQuMC4xMwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgb2JqZWN0CgkgKi8KCXZhciAkd3BkYjsKCgkvKioKCSAqIEBzaW5jZSA2LjQuMC4xMwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICR0ZXN0cyA9IGFycmF5KCk7CgoJLyoqCgkgKiBDbGFzcyBjb25zdHJ1Y3RvciBzZXRzIHVwIHRoZSBlbnZpcm9ubWVudAoJICoKCSAqIEBzaW5jZSA2LjQuMC4xMwoJICoKCSAqIEByZXR1cm4gdm9pZAoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCgkJLy8gUmVnaXN0ZXIgdGhlIHRlc3RzCgkJJHRoaXMtPnJlZ2lzdGVyX3Rlc3RzKCk7CgoJCS8vIEdyYWIgdGhlIERCIGNyZWRlbnRpYWxzIGZyb20gUE9TVAoJCSRjcmVkcyAgICAgICAgICAgICA9IGFycmF5KCk7CgkJJGNyZWRzWydzZXJ2ZXInXSAgID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2VydmVyJyApOwoJCSRjcmVkc1sndXNlcm5hbWUnXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3VzZXJuYW1lJyApOwoJCSRjcmVkc1sncGFzc3dvcmQnXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApOwoJCSRjcmVkc1snZGF0YWJhc2UnXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2RhdGFiYXNlJyApOwoJCSRjcmVkc1sncHJlZml4J10gICA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ByZWZpeCcgKTsKCgkJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbGwgdGhlIGZpZWxkcywgZGllIHdpdGggZXJyb3IKCQlpZiAoICggJycgPT0gJGNyZWRzWydzZXJ2ZXInXSApIHx8ICggJycgPT0gJGNyZWRzWyd1c2VybmFtZSddICkgfHwgKCAnJyA9PSAkY3JlZHNbJ2RhdGFiYXNlJ10gKSB8fCAoICcnID09ICRjcmVkc1sncHJlZml4J10gKSApIHsKCQkJJHRoaXMtPnRlc3RzWydvdmVyYWxsX2Vycm9yJ10gPSAnT25lIG9yIG1vcmUgZGF0YWJhc2Ugc2V0dGluZ3Mgd2FzIGxlZnQgYmxhbmsuIEFsbCBmaWVsZHMgZXhjZXB0IG9wdGlvbmFsIHBhc3N3b3JkIGFyZSByZXF1aXJlZC4nOwoJCQlkaWUoIGpzb25fZW5jb2RlKCAkdGhpcy0+dGVzdHMgKSApOwoJCX0KCgkJJHRoaXMtPmNyZWRzID0gJGNyZWRzOwoKCQkvLyBSdW4gdGhlIHRlc3RzLCBvbmUgYXQgYSB0aW1lCgkJJHRoaXMtPnJ1bl90ZXN0cygpOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgYXJyYXkgb2YgdGVzdHMgdGhhdCB3ZSB3aWxsIHJ1biB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIHJlZ2lzdGVyX3Rlc3RzKCkgewoKCQkvLyBUZXN0cyB2YXJpYWJsZXMgdG8gcG9wdWxhdGUgd2l0aCByZXN1bHRzLgoJCSR0aGlzLT50ZXN0cyA9IGFycmF5KAoJCQknY29ubmVjdCcgICAgICAgICAgICAgICA9PiBmYWxzZSwgICAvLyBBYmxlIHRvIGNvbm5lY3QgJiBsb2dpbiB0byBkYiBzZXJ2ZXI/CgkJCSdjb25uZWN0X2Vycm9yJyAgICAgICAgID0+ICcnLCAgICAgIC8vIG15c3FsIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gY29ubmVjdCAmIGxvZ2luIChpZiBhbnkpLgoJCQknc2VsZWN0ZGInICAgICAgICAgICAgICA9PiBmYWxzZSwgICAvLyBBYmxlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2U/CgkJCSdzZWxlY3RkYl9lcnJvcicgICAgICAgID0+ICcnLCAgICAgIC8vIG15c3FsIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gc2VsZWN0aW5nIChpZiBhbnkpLgoJCQknY3JlYXRlZHJvcHRhYmxlJyAgICAgICA9PiBmYWxzZSwgICAvLyBhYmlsaXR5IHRvIENSRUFURSBhIG5ldyB0YWJsZSAoYW5kIGRlbGV0ZSBpdCkuCgkJCSdjcmVhdGVkcm9wdGFibGVfZXJyb3InID0+ICcnLCAgICAgIC8vIGNyZWF0ZSB0YWJsZSBteXNxbCBlcnJvciAoaWYgYW55KS4KCQkJJ3ByZWZpeCcgICAgICAgICAgICAgICAgPT4gZmFsc2UsICAgLy8gV2hldGhlciBvciBub3QgcHJlZml4IG1lZXRzIHRoZSBiYXJlIG1pbmltdW0gdG8gYmUgYWNjZXB0ZWQuCgkJCSdwcmVmaXhfZXhpc3RzJyAgICAgICAgID0+IHRydWUsICAgIC8vIFdvcmRQcmVzcyB0YWJsZXMgbWF0Y2hpbmcgcHJlZml4IGZvdW5kPwoJCQkncHJlZml4X3dhcm4nICAgICAgICAgICA9PiB0cnVlLCAgICAvLyBXYXJuIGlmIHByZWZpeCBvZiBhIGJhZCBmb3JtYXQuCgkJCSdvdmVyYWxsX2Vycm9yJyAgICAgICAgID0+ICcnLCAgICAgIC8vIE92ZXJhbGwgZXJyb3Igb2YgdGhlIHRlc3QuIElmIG1pc3NpbmcgZmllbGRzIHRoZW4gdGhpcyB3aWxsIGJlIHdoYXQgZXJyb3JzIGFib3V0IG1pc3NpbmcgZmllbGQocykuCgkJKTsKCX0KCgkvKioKCSAqIFVzZXMgdGhlIHRlc3RzIGFycmF5IHRvIGNhbGwgdGVzdHMgaW5kaXZpZHVhbGx5CgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIHJ1bl90ZXN0cygpIHsKCQkvLyBMb29wIHRocm91Z2ggYXJyYXkgb2YgdGVzdHMsIG9ubHkgY2FsbGluZyBvbmVzIHdoZXJlIGZ1bmN0aW9uIGV4aXN0cwoJCWZvcmVhY2ggKCAkdGhpcy0+dGVzdHMgYXMgJHRlc3QgPT4gJHJlc3VsdCApIHsKCQkJaWYgKCBpc19jYWxsYWJsZSggYXJyYXkoICR0aGlzLCAndGVzdF8nIC4gJHRlc3QgKSApICYmIGVtcHR5KCAkdGhpcy0+dGVzdHNbJHRlc3RdICkgKSB7CgkJCQljYWxsX3VzZXJfZnVuYyggYXJyYXkoICR0aGlzLCAndGVzdF8nIC4gJHRlc3QgKSApOwoJCQl9CgkJfQoKCQlkaWUoIGpzb25fZW5jb2RlKCAkdGhpcy0+dGVzdHMgKSApOwoJfQoKCS8qKgoJICogVGVzdCBmb3IgREIgQ29ubmVjdCBhbmQgREIgU2VsZWN0CgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCSBmdW5jdGlvbiB0ZXN0X2Nvbm5lY3QoKSB7CgkJcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvd3AtZGIucGhwJyApOwoJCWdsb2JhbCAkd3BkYjsKCQkkdGhpcy0+d3BkYiA9IG5ldyB3cGRiKCAkdGhpcy0+Y3JlZHNbJ3VzZXJuYW1lJ10sICR0aGlzLT5jcmVkc1sncGFzc3dvcmQnXSwgJHRoaXMtPmNyZWRzWydkYXRhYmFzZSddLCAkdGhpcy0+Y3JlZHNbJ3NlcnZlciddICk7CgkJaWYgKCAoIGZhbHNlID09PSAkdGhpcy0+d3BkYi0+ZGJoICkgfHwgKCBudWxsID09PSAkdGhpcy0+d3BkYi0+ZGJoICkgKXsKCQkJaWYgKCBlbXB0eSggJHRoaXMtPndwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCSRteXNxbF9lcnJvciA9IEBteXNxbF9lcnJvciggJHRoaXMtPndwZGItPmRiaCApOwoJCQl9IGVsc2UgewoJCQkJJG15c3FsX2Vycm9yID0gQG15c3FsaV9lcnJvciggJHRoaXMtPndwZGItPmRiaCApOwoJCQl9CgkJCSR0aGlzLT50ZXN0c1snY29ubmVjdF9lcnJvciddID0gJ1VuYWJsZSB0byBjb25uZWN0IHRvIGRhdGFiYXNlIHNlcnZlciBhbmQvb3Igc2VsZWN0IHRoZSBkYXRhYmFzZS4gRGV0YWlsczogYCcgLiAkbXlzcWxfZXJyb3IgLiAnYC4nOwoJCQlkaWUoIGpzb25fZW5jb2RlKCAkdGhpcy0+dGVzdHMgKSApOwoJCX0KCQkkdGhpcy0+dGVzdHNbJ2Nvbm5lY3QnXSA9IHRydWU7CgkJJHRoaXMtPnRlc3RzWydzZWxlY3RkYiddID0gdHJ1ZTsKCX0KCgkvKioKCSAqIFRlc3RzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBhbmQgZHJvcCBhIHRhYmxlCgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIHRlc3RfY3JlYXRlZHJvcHRhYmxlKCkgewoJCS8vIE1ha2Ugc3VyZSB3ZSd2ZSBhbHJlYWR5IGNvbm5lY3RlZC4gVGhpcyBzaG91bGQgbmV2ZXIgcnVuIHVubGVzcyBzb21lb25lIGNhbGxzIGl0IG1hbnVhbGx5IGFnYWluLgoJCWlmICggZW1wdHkoICR0aGlzLT50ZXN0c1snY29ubmVjdCddICkgKSB7CgkJCSR0aGlzLT50ZXN0X2Nvbm5lY3QoKTsKCQl9CgoJCS8vIEVzY2FwZSBwcmVmaXggbWFudWFsbHkgc2luY2Ugd2UgY2FuJ3QgdXNlICR3cGRiLT5wcmVmaXggYW5kICR3cGRiLT5wcmVwYXJlIGFkZHMgc2luZ2xlIHF1b3RlcwoJCWlmICggZW1wdHkoICR0aGlzLT53cGRiLT51c2VfbXlzcWxpICkgKSB7CgkJCSRwcmVmaXggPSBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoICR0aGlzLT5jcmVkc1sncHJlZml4J10gKTsKCQl9IGVsc2UgewoJCQkkcHJlZml4ID0gbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZyggJHRoaXMtPndwZGItPmRiaCwgJHRoaXMtPmNyZWRzWydwcmVmaXgnXSApOwoJCX0KCgkJLy8gVHJ5IHRvIGRyb3AgdGVzdCB0YWJsZSBpbiBldmVudCBwcmV2aW91cyBhdHRlbXB0IGZhaWxlZC4gTm90IGEgcGFydCBvZiB0aGUgdGVzdC4gTk9URTogVGhpcyB0aHJvd3MgYW4gZXJyb3IgdG8gdGhlIFBIUCBlcnJvciBsb2cgaWYgd3BkYiBsb2dnaW5nIGVuYWJsZWQgdW5sZXNzIGVycm9ycyBhcmUgc3VwcHJlc3NlZC4KCQkkdGhpcy0+d3BkYi0+c3VwcHJlc3NfZXJyb3JzKCB0cnVlICk7IC8vIEhpZGUgZXJyb3JzIGlmIHRoaXMgdGVzdCBmYWlscyBzaW5jZSB3ZSBoYXZlIGxvZ2dpbmcgb24gYnkgZGVmYXVsdC4KCQkkZHJvcF90ZXN0X3RhYmxlID0gJ0RST1AgVEFCTEUgJyAuICRwcmVmaXggLiAnYnVkZHlfdGVzdCc7CgkJJHRoaXMtPndwZGItPnF1ZXJ5KCAkZHJvcF90ZXN0X3RhYmxlICk7CgkJJHRoaXMtPndwZGItPnN1cHByZXNzX2Vycm9ycyggZmFsc2UgKTsKCgkJLy8gQXR0ZW1wdCB0byBjcmVhdGUgdGhlIHRlc3QgdGFibGUKCQkkY3JlYXRlX3Rlc3RfdGFibGUgPSAnQ1JFQVRFIFRBQkxFICcgLiAkcHJlZml4IC4gJ2J1ZGR5X3Rlc3QgKGlkIElOVCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCBQUklNQVJZIEtFWSk7JzsKCQlpZiAoIEZBTFNFICE9PSAkdGhpcy0+d3BkYi0+cXVlcnkoICRjcmVhdGVfdGVzdF90YWJsZSApICkgewoJCQkvLyBEcm9wIHRlbXAgdGVzdCB0YWJsZSB3ZSBjcmVhdGVkIGJlZm9yZSB3ZSBkZWNsYXJlIHN1Y2Nlc3MuCgkJCWlmICggRkFMU0UgIT09ICR0aGlzLT53cGRiLT5xdWVyeSggJGRyb3BfdGVzdF90YWJsZSApICkgewoJCQkJJHRoaXMtPnRlc3RzWydjcmVhdGVkcm9wdGFibGUnXSA9IHRydWU7CgkJCX0gZWxzZSB7IC8vIGRyb3AgZmFpbGVkLgoJCQkJaWYgKCBlbXB0eSggJHRoaXMtPndwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCQkkbXlzcWxfZXJybm8gPSBteXNxbF9lcnJubyggJHRoaXMtPndwZGItPmRiaCApOwoJCQkJfSBlbHNlIHsKCQkJCQkkbXlzcWxfZXJybm8gPSBteXNxbGlfZXJybm8oICR0aGlzLT53cGRiLT5kYmggKTsKCQkJCX0KCQkJCSR0aGlzLT50ZXN0c1snY3JlYXRlZHJvcHRhYmxlX2Vycm9yJ10gPSAnVW5hYmxlIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgdGFibGUuICcgLiAkdGhpcy0+d3BkYi0+bGFzdF9lcnJvciAuICcgLSBFcnJvck5vOiBgJyAuICRteXNxbF9lcnJubyAuICdgLic7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBUZXN0cyBmb3IgZXhpc3RpbmcgdGFibGVzIHdpdGggdGhlIHNhbWUgcHJlZml4CgkgKgoJICogQHNpbmNlIDYuNC4wLjEzCgkgKgoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIHRlc3RfcHJlZml4KCkgewoJCS8vIE1ha2Ugc3VyZSB3ZSd2ZSBhbHJlYWR5IGNvbm5lY3RlZC4gVGhpcyBzaG91bGQgbmV2ZXIgYmUgdHJ1ZS4KCQlpZiAoIGVtcHR5KCAkdGhpcy0+dGVzdHNbJ2Nvbm5lY3QnXSApICkgewoJCQkkdGhpcy0+dGVzdF9jb25uZWN0KCk7CgkJfQoKICAgICAgICAvLyBXb3JkUHJlc3MgdGFibGVzIGV4aXN0IG1hdGNoaW5nIHByZWZpeD8KICAgICAgICAkcHJlZml4X2V4aXN0c19zcWwgPSAkdGhpcy0+d3BkYi0+cHJlcGFyZSggIlNIT1cgVEFCTEVTIExJS0UgJyVzJzsiLCBzdHJfcmVwbGFjZSggJ18nLCAnXF8nLCAkdGhpcy0+Y3JlZHNbJ3ByZWZpeCddICkgLiAiJSIgKTsKCQkkcmVzdWx0ICAgICAgICAgICAgPSAkdGhpcy0+d3BkYi0+Z2V0X3Jlc3VsdHMoICRwcmVmaXhfZXhpc3RzX3NxbCApOwoJCWlmICggZW1wdHkoICRyZXN1bHQgKSApIHsgLy8gV29yZFByZXNzIHByZWZpeCBkb2VzIG5vdCBleGlzdAogICAgICAgICAgICAkdGhpcy0+dGVzdHNbJ3ByZWZpeF9leGlzdHMnXSA9IGZhbHNlOwogICAgICAgIH0KCgkJLy8gTWFrZSBzdXJlIHByZWZpeCBtZWV0cyB3cCBzdGFuZGFyZHMKCQlpZiAoICEgcHJlZ19tYXRjaCgnfFteYS16MC05X118aScsICR0aGlzLT5jcmVkc1sncHJlZml4J10gKSApIHsgLy8gUHJlZml4IG1lZXRzIFdQIHN0YW5kYXJkcwoJCQkkdGhpcy0+dGVzdHNbJ3ByZWZpeCddID0gdHJ1ZTsKCQkJaWYgKCBwcmVnX21hdGNoKCcvXlthLXowLTldK18kL2knLCAkdGhpcy0+Y3JlZHNbJ3ByZWZpeCddICkgKSB7IC8vIFByZWZpeCBwYXNzZXMgd2l0aCBubyB3YXJuaW5nLgoJCQkJJHRoaXMtPnRlc3RzWydwcmVmaXhfd2FybiddID0gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+dGVzdHNbJ3ByZWZpeF93YXJuJ10gPSB0cnVlOwoJCQl9CgkJfQoKCX0KfQo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/test-db.php,importbuddy/classes/test-db.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/wp-db.php,importbuddy/classes/wp-db.php PD9waHAKLy8gd3BkLWRiLnBocCBtb2RpZmllZCBmb3IgQkIgdjYuMC4wLjYgdG8gc3RvcmUgc2V0IGNoYXJzZXQgaW4gJHdwZGItPmNoYXJzZXQgZm9yIHV0Zm1iNCBoYW5kbGluZyB3aXRoIG15c3FsYnVkZHkgaW4gc2V0X2NoYXJ0c2V0KCkuCi8vIE5PVEU6IEEgY29weSBvZiB0aGlzIGZpbGUgaXMgZHJvcHBlZCBpbnRvIF9yb2xsYmFja191bmRvLnBocC4KCgoKLyoqCiAqIFdvcmRQcmVzcyBEQiBDbGFzcwogKgogKiBPcmlnaW5hbCBjb2RlIGZyb20ge0BsaW5rIGh0dHA6Ly9waHAuanVzdGludmluY2VudC5jb20gSnVzdGluIFZpbmNlbnQgKGp1c3RpbkB2aXN1bmV0LmllKX0KICoKICogQHBhY2thZ2UgV29yZFByZXNzCiAqIEBzdWJwYWNrYWdlIERhdGFiYXNlCiAqIEBzaW5jZSAwLjcxCiAqLwoKLyoqCiAqIEBzaW5jZSAwLjcxCiAqLwpkZWZpbmUoICdFWlNRTF9WRVJTSU9OJywgJ1dQMS4yNScgKTsKCi8qKgogKiBAc2luY2UgMC43MQogKi8KZGVmaW5lKCAnT0JKRUNUJywgJ09CSkVDVCcgKTsKZGVmaW5lKCAnb2JqZWN0JywgJ09CSkVDVCcgKTsgLy8gQmFjayBjb21wYXQuCgovKioKICogQHNpbmNlIDIuNS4wCiAqLwpkZWZpbmUoICdPQkpFQ1RfSycsICdPQkpFQ1RfSycgKTsKCi8qKgogKiBAc2luY2UgMC43MQogKi8KZGVmaW5lKCAnQVJSQVlfQScsICdBUlJBWV9BJyApOwoKLyoqCiAqIEBzaW5jZSAwLjcxCiAqLwpkZWZpbmUoICdBUlJBWV9OJywgJ0FSUkFZX04nICk7CgovKioKICogV29yZFByZXNzIERhdGFiYXNlIEFjY2VzcyBBYnN0cmFjdGlvbiBPYmplY3QKICoKICogSXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSB0aGlzIGNsYXNzIHdpdGggeW91ciBvd24KICogYnkgc2V0dGluZyB0aGUgJHdwZGIgZ2xvYmFsIHZhcmlhYmxlIGluIHdwLWNvbnRlbnQvZGIucGhwCiAqIGZpbGUgdG8geW91ciBjbGFzcy4gVGhlIHdwZGIgY2xhc3Mgd2lsbCBzdGlsbCBiZSBpbmNsdWRlZCwKICogc28geW91IGNhbiBleHRlbmQgaXQgb3Igc2ltcGx5IHVzZSB5b3VyIG93bi4KICoKICogQGxpbmsgaHR0cHM6Ly9jb2RleC53b3JkcHJlc3Mub3JnL0Z1bmN0aW9uX1JlZmVyZW5jZS93cGRiX0NsYXNzCiAqCiAqIEBwYWNrYWdlIFdvcmRQcmVzcwogKiBAc3VicGFja2FnZSBEYXRhYmFzZQogKiBAc2luY2UgMC43MQogKi8KY2xhc3Mgd3BkYiB7CgoJLyoqCgkgKiBXaGV0aGVyIHRvIHNob3cgU1FML0RCIGVycm9ycy4KCSAqCgkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHNob3cgZXJyb3JzIGlmIGJvdGggV1BfREVCVUcgYW5kIFdQX0RFQlVHX0RJU1BMQVkKCSAqIGV2YWx1YXRlZCB0byB0cnVlLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYm9vbAoJICovCgl2YXIgJHNob3dfZXJyb3JzID0gZmFsc2U7CgoJLyoqCgkgKiBXaGV0aGVyIHRvIHN1cHByZXNzIGVycm9ycyBkdXJpbmcgdGhlIERCIGJvb3RzdHJhcHBpbmcuCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2luY2UgMi41LjAKCSAqIEB2YXIgYm9vbAoJICovCgl2YXIgJHN1cHByZXNzX2Vycm9ycyA9IGZhbHNlOwoKCS8qKgoJICogVGhlIGxhc3QgZXJyb3IgZHVyaW5nIHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRsYXN0X2Vycm9yID0gJyc7CgoJLyoqCgkgKiBBbW91bnQgb2YgcXVlcmllcyBtYWRlCgkgKgoJICogQHNpbmNlIDEuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJcHVibGljICRudW1fcXVlcmllcyA9IDA7CgoJLyoqCgkgKiBDb3VudCBvZiByb3dzIHJldHVybmVkIGJ5IHByZXZpb3VzIHF1ZXJ5CgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGludAoJICovCglwdWJsaWMgJG51bV9yb3dzID0gMDsKCgkvKioKCSAqIENvdW50IG9mIGFmZmVjdGVkIHJvd3MgYnkgcHJldmlvdXMgcXVlcnkKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJHJvd3NfYWZmZWN0ZWQgPSAwOwoKCS8qKgoJICogVGhlIElEIGdlbmVyYXRlZCBmb3IgYW4gQVVUT19JTkNSRU1FTlQgY29sdW1uIGJ5IHRoZSBwcmV2aW91cyBxdWVyeSAodXN1YWxseSBJTlNFUlQpLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJcHVibGljICRpbnNlcnRfaWQgPSAwOwoKCS8qKgoJICogTGFzdCBxdWVyeSBtYWRlCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGxhc3RfcXVlcnk7CgoJLyoqCgkgKiBSZXN1bHRzIG9mIHRoZSBsYXN0IHF1ZXJ5IG1hZGUKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5fG51bGwKCSAqLwoJdmFyICRsYXN0X3Jlc3VsdDsKCgkvKioKCSAqIE15U1FMIHJlc3VsdCwgd2hpY2ggaXMgZWl0aGVyIGEgcmVzb3VyY2Ugb3IgYm9vbGVhbi4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgbWl4ZWQKCSAqLwoJcHJvdGVjdGVkICRyZXN1bHQ7CgoJLyoqCgkgKiBDYWNoZWQgY29sdW1uIGluZm8sIGZvciBzYW5pdHkgY2hlY2tpbmcgZGF0YSBiZWZvcmUgaW5zZXJ0aW5nCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBhcnJheQoJICovCglwcm90ZWN0ZWQgJGNvbF9tZXRhID0gYXJyYXkoKTsKCgkvKioKCSAqIENhbGN1bGF0ZWQgY2hhcmFjdGVyIHNldHMgb24gdGFibGVzCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBhcnJheQoJICovCglwcm90ZWN0ZWQgJHRhYmxlX2NoYXJzZXQgPSBhcnJheSgpOwoKCS8qKgoJICogV2hldGhlciB0ZXh0IGZpZWxkcyBpbiB0aGUgY3VycmVudCBxdWVyeSBuZWVkIHRvIGJlIHNhbml0eSBjaGVja2VkLgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYm9vbAoJICovCglwcm90ZWN0ZWQgJGNoZWNrX2N1cnJlbnRfcXVlcnkgPSB0cnVlOwoKCS8qKgoJICogRmxhZyB0byBlbnN1cmUgd2UgZG9uJ3QgcnVuIGludG8gcmVjdXJzaW9uIHByb2JsZW1zIHdoZW4gY2hlY2tpbmcgdGhlIGNvbGxhdGlvbi4KCSAqCgkgKiBAc2luY2UgNC4yLjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSB3cGRiOjpjaGVja19zYWZlX2NvbGxhdGlvbigpCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSAkY2hlY2tpbmdfY29sbGF0aW9uID0gZmFsc2U7CgoJLyoqCgkgKiBTYXZlZCBpbmZvIG9uIHRoZSB0YWJsZSBjb2x1bW4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJvdGVjdGVkICRjb2xfaW5mbzsKCgkvKioKCSAqIFNhdmVkIHF1ZXJpZXMgdGhhdCB3ZXJlIGV4ZWN1dGVkCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRxdWVyaWVzOwoKCS8qKgoJICogVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXRyeSByZWNvbm5lY3RpbmcgYmVmb3JlIGR5aW5nLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEBzZWUgd3BkYjo6Y2hlY2tfY29ubmVjdGlvbigpCgkgKiBAdmFyIGludAoJICovCglwcm90ZWN0ZWQgJHJlY29ubmVjdF9yZXRyaWVzID0gNTsKCgkvKioKCSAqIFdvcmRQcmVzcyB0YWJsZSBwcmVmaXgKCSAqCgkgKiBZb3UgY2FuIHNldCB0aGlzIHRvIGhhdmUgbXVsdGlwbGUgV29yZFByZXNzIGluc3RhbGxhdGlvbnMKCSAqIGluIGEgc2luZ2xlIGRhdGFiYXNlLiBUaGUgc2Vjb25kIHJlYXNvbiBpcyBmb3IgcG9zc2libGUKCSAqIHNlY3VyaXR5IHByZWNhdXRpb25zLgoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkcHJlZml4ID0gJyc7CgoJLyoqCgkgKiBXb3JkUHJlc3MgYmFzZSB0YWJsZSBwcmVmaXguCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJIHB1YmxpYyAkYmFzZV9wcmVmaXg7CgoJLyoqCgkgKiBXaGV0aGVyIHRoZSBkYXRhYmFzZSBxdWVyaWVzIGFyZSByZWFkeSB0byBzdGFydCBleGVjdXRpbmcuCgkgKgoJICogQHNpbmNlIDIuMy4yCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYm9vbAoJICovCgl2YXIgJHJlYWR5ID0gZmFsc2U7CgoJLyoqCgkgKiBCbG9nIElELgoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgaW50CgkgKi8KCXB1YmxpYyAkYmxvZ2lkID0gMDsKCgkvKioKCSAqIFNpdGUgSUQuCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJcHVibGljICRzaXRlaWQgPSAwOwoKCS8qKgoJICogTGlzdCBvZiBXb3JkUHJlc3MgcGVyLWJsb2cgdGFibGVzCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzZWUgd3BkYjo6dGFibGVzKCkKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICR0YWJsZXMgPSBhcnJheSggJ3Bvc3RzJywgJ2NvbW1lbnRzJywgJ2xpbmtzJywgJ29wdGlvbnMnLCAncG9zdG1ldGEnLAoJCSd0ZXJtcycsICd0ZXJtX3RheG9ub215JywgJ3Rlcm1fcmVsYXRpb25zaGlwcycsICd0ZXJtbWV0YScsICdjb21tZW50bWV0YScgKTsKCgkvKioKCSAqIExpc3Qgb2YgZGVwcmVjYXRlZCBXb3JkUHJlc3MgdGFibGVzCgkgKgoJICogY2F0ZWdvcmllcywgcG9zdDJjYXQsIGFuZCBsaW5rMmNhdCB3ZXJlIGRlcHJlY2F0ZWQgaW4gMi4zLjAsIGRiIHZlcnNpb24gNTUzOQoJICoKCSAqIEBzaW5jZSAyLjkuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIHdwZGI6OnRhYmxlcygpCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkb2xkX3RhYmxlcyA9IGFycmF5KCAnY2F0ZWdvcmllcycsICdwb3N0MmNhdCcsICdsaW5rMmNhdCcgKTsKCgkvKioKCSAqIExpc3Qgb2YgV29yZFByZXNzIGdsb2JhbCB0YWJsZXMKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSB3cGRiOjp0YWJsZXMoKQoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGdsb2JhbF90YWJsZXMgPSBhcnJheSggJ3VzZXJzJywgJ3VzZXJtZXRhJyApOwoKCS8qKgoJICogTGlzdCBvZiBNdWx0aXNpdGUgZ2xvYmFsIHRhYmxlcwoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIHdwZGI6OnRhYmxlcygpCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkbXNfZ2xvYmFsX3RhYmxlcyA9IGFycmF5KCAnYmxvZ3MnLCAnc2lnbnVwcycsICdzaXRlJywgJ3NpdGVtZXRhJywKCQknc2l0ZWNhdGVnb3JpZXMnLCAncmVnaXN0cmF0aW9uX2xvZycsICdibG9nX3ZlcnNpb25zJyApOwoKCS8qKgoJICogV29yZFByZXNzIENvbW1lbnRzIHRhYmxlCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjb21tZW50czsKCgkvKioKCSAqIFdvcmRQcmVzcyBDb21tZW50IE1ldGFkYXRhIHRhYmxlCgkgKgoJICogQHNpbmNlIDIuOS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjb21tZW50bWV0YTsKCgkvKioKCSAqIFdvcmRQcmVzcyBMaW5rcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkbGlua3M7CgoJLyoqCgkgKiBXb3JkUHJlc3MgT3B0aW9ucyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkb3B0aW9uczsKCgkvKioKCSAqIFdvcmRQcmVzcyBQb3N0IE1ldGFkYXRhIHRhYmxlCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRwb3N0bWV0YTsKCgkvKioKCSAqIFdvcmRQcmVzcyBQb3N0cyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkcG9zdHM7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVGVybXMgdGFibGUKCSAqCgkgKiBAc2luY2UgMi4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHRlcm1zOwoKCS8qKgoJICogV29yZFByZXNzIFRlcm0gUmVsYXRpb25zaGlwcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkdGVybV9yZWxhdGlvbnNoaXBzOwoKCS8qKgoJICogV29yZFByZXNzIFRlcm0gVGF4b25vbXkgdGFibGUKCSAqCgkgKiBAc2luY2UgMi4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHRlcm1fdGF4b25vbXk7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVGVybSBNZXRhIHRhYmxlLgoJICoKCSAqIEBzaW5jZSA0LjQuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkdGVybW1ldGE7CgoJLyoKCSAqIEdsb2JhbCBhbmQgTXVsdGlzaXRlIHRhYmxlcwoJICovCgoJLyoqCgkgKiBXb3JkUHJlc3MgVXNlciBNZXRhZGF0YSB0YWJsZQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkdXNlcm1ldGE7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVXNlcnMgdGFibGUKCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHVzZXJzOwoKCS8qKgoJICogTXVsdGlzaXRlIEJsb2dzIHRhYmxlCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRibG9nczsKCgkvKioKCSAqIE11bHRpc2l0ZSBCbG9nIFZlcnNpb25zIHRhYmxlCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRibG9nX3ZlcnNpb25zOwoKCS8qKgoJICogTXVsdGlzaXRlIFJlZ2lzdHJhdGlvbiBMb2cgdGFibGUKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHJlZ2lzdHJhdGlvbl9sb2c7CgoJLyoqCgkgKiBNdWx0aXNpdGUgU2lnbnVwcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2lnbnVwczsKCgkvKioKCSAqIE11bHRpc2l0ZSBTaXRlcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2l0ZTsKCgkvKioKCSAqIE11bHRpc2l0ZSBTaXRld2lkZSBUZXJtcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2l0ZWNhdGVnb3JpZXM7CgoJLyoqCgkgKiBNdWx0aXNpdGUgU2l0ZSBNZXRhZGF0YSB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkc2l0ZW1ldGE7CgoJLyoqCgkgKiBGb3JtYXQgc3BlY2lmaWVycyBmb3IgREIgY29sdW1ucy4gQ29sdW1ucyBub3QgbGlzdGVkIGhlcmUgZGVmYXVsdCB0byAlcy4gSW5pdGlhbGl6ZWQgZHVyaW5nIFdQIGxvYWQuCgkgKgoJICogS2V5cyBhcmUgY29sdW1uIG5hbWVzLCB2YWx1ZXMgYXJlIGZvcm1hdCB0eXBlczogJ0lEJyA9PiAnJWQnCgkgKgoJICogQHNpbmNlIDIuOC4wCgkgKiBAc2VlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSB3cGRiOjppbnNlcnQoKQoJICogQHNlZSB3cGRiOjp1cGRhdGUoKQoJICogQHNlZSB3cGRiOjpkZWxldGUoKQoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkZmllbGRfdHlwZXMgPSBhcnJheSgpOwoKCS8qKgoJICogRGF0YWJhc2UgdGFibGUgY29sdW1ucyBjaGFyc2V0CgkgKgoJICogQHNpbmNlIDIuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjaGFyc2V0OwoKCS8qKgoJICogRGF0YWJhc2UgdGFibGUgY29sdW1ucyBjb2xsYXRlCgkgKgoJICogQHNpbmNlIDIuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRjb2xsYXRlOwoKCS8qKgoJICogRGF0YWJhc2UgVXNlcm5hbWUKCSAqCgkgKiBAc2luY2UgMi45LjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGRidXNlcjsKCgkvKioKCSAqIERhdGFiYXNlIFBhc3N3b3JkCgkgKgoJICogQHNpbmNlIDMuMS4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRkYnBhc3N3b3JkOwoKCS8qKgoJICogRGF0YWJhc2UgTmFtZQoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkZGJuYW1lOwoKCS8qKgoJICogRGF0YWJhc2UgSG9zdAoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkZGJob3N0OwoKCS8qKgoJICogRGF0YWJhc2UgSGFuZGxlCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGRiaDsKCgkvKioKCSAqIEEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBxdWVyeS9nZXRfcm93L2dldF92YXIgY2FsbAoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkZnVuY19jYWxsOwoKCS8qKgoJICogV2hldGhlciBNeVNRTCBpcyB1c2VkIGFzIHRoZSBkYXRhYmFzZSBlbmdpbmUuCgkgKgoJICogU2V0IGluIFdQREI6OmRiX2Nvbm5lY3QoKSB0byB0cnVlLCBieSBkZWZhdWx0LiBUaGlzIGlzIHVzZWQgd2hlbiBjaGVja2luZwoJICogYWdhaW5zdCB0aGUgcmVxdWlyZWQgTXlTUUwgdmVyc2lvbiBmb3IgV29yZFByZXNzLiBOb3JtYWxseSwgYSByZXBsYWNlbWVudAoJICogZGF0YWJhc2UgZHJvcC1pbiAoZGIucGhwKSB3aWxsIHNraXAgdGhlc2UgY2hlY2tzLCBidXQgc2V0dGluZyB0aGlzIHRvIHRydWUKCSAqIHdpbGwgZm9yY2UgdGhlIGNoZWNrcyB0byBvY2N1ci4KCSAqCgkgKiBAc2luY2UgMy4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHVibGljICRpc19teXNxbCA9IG51bGw7CgoJLyoqCgkgKiBBIGxpc3Qgb2YgaW5jb21wYXRpYmxlIFNRTCBtb2Rlcy4KCSAqCgkgKiBAc2luY2UgMy45LjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByb3RlY3RlZCAkaW5jb21wYXRpYmxlX21vZGVzID0gYXJyYXkoICdOT19aRVJPX0RBVEUnLCAnT05MWV9GVUxMX0dST1VQX0JZJywKCQknU1RSSUNUX1RSQU5TX1RBQkxFUycsICdTVFJJQ1RfQUxMX1RBQkxFUycsICdUUkFESVRJT05BTCcgKTsKCgkvKioKCSAqIFdoZXRoZXIgdG8gdXNlIG15c3FsaSBvdmVyIG15c3FsLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHJpdmF0ZSAkdXNlX215c3FsaSA9IGZhbHNlOwoKCS8qKgoJICogV2hldGhlciB3ZSd2ZSBtYW5hZ2VkIHRvIHN1Y2Nlc3NmdWxseSBjb25uZWN0IGF0IHNvbWUgcG9pbnQKCSAqCgkgKiBAc2luY2UgMy45LjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBib29sCgkgKi8KCXByaXZhdGUgJGhhc19jb25uZWN0ZWQgPSBmYWxzZTsKCgkvKioKCSAqIENvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgYW5kIHNlbGVjdHMgYSBkYXRhYmFzZQoJICoKCSAqIFBIUDUgc3R5bGUgY29uc3RydWN0b3IgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQSFA1LiBEb2VzCgkgKiB0aGUgYWN0dWFsIHNldHRpbmcgdXAgb2YgdGhlIGNsYXNzIHByb3BlcnRpZXMgYW5kIGNvbm5lY3Rpb24KCSAqIHRvIHRoZSBkYXRhYmFzZS4KCSAqCgkgKiBAbGluayBodHRwczovL2NvcmUudHJhYy53b3JkcHJlc3Mub3JnL3RpY2tldC8zMzU0CgkgKiBAc2luY2UgMi4wLjgKCSAqCgkgKiBAZ2xvYmFsIHN0cmluZyAkd3BfdmVyc2lvbgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRidXNlciAgICAgTXlTUUwgZGF0YWJhc2UgdXNlcgoJICogQHBhcmFtIHN0cmluZyAkZGJwYXNzd29yZCBNeVNRTCBkYXRhYmFzZSBwYXNzd29yZAoJICogQHBhcmFtIHN0cmluZyAkZGJuYW1lICAgICBNeVNRTCBkYXRhYmFzZSBuYW1lCgkgKiBAcGFyYW0gc3RyaW5nICRkYmhvc3QgICAgIE15U1FMIGRhdGFiYXNlIGhvc3QKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZGJ1c2VyLCAkZGJwYXNzd29yZCwgJGRibmFtZSwgJGRiaG9zdCApIHsKCQlyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbiggYXJyYXkoICR0aGlzLCAnX19kZXN0cnVjdCcgKSApOwoKCQlpZiAoIFdQX0RFQlVHICYmIFdQX0RFQlVHX0RJU1BMQVkgKQoJCQkkdGhpcy0+c2hvd19lcnJvcnMoKTsKCgkJLyogVXNlIGV4dC9teXNxbGkgaWYgaXQgZXhpc3RzIGFuZDoKCQkgKiAgLSBXUF9VU0VfRVhUX01ZU1FMIGlzIGRlZmluZWQgYXMgZmFsc2UsIG9yCgkJICogIC0gV2UgYXJlIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBXb3JkUHJlc3MsIG9yCgkJICogIC0gV2UgYXJlIHJ1bm5pbmcgUEhQIDUuNSBvciBncmVhdGVyLCBvcgoJCSAqICAtIGV4dC9teXNxbCBpcyBub3QgbG9hZGVkLgoJCSAqLwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbXlzcWxpX2Nvbm5lY3QnICkgKSB7CgkJCWlmICggZGVmaW5lZCggJ1dQX1VTRV9FWFRfTVlTUUwnICkgKSB7CgkJCQkkdGhpcy0+dXNlX215c3FsaSA9ICEgV1BfVVNFX0VYVF9NWVNRTDsKCQkJfSBlbHNlaWYgKCB2ZXJzaW9uX2NvbXBhcmUoIHBocHZlcnNpb24oKSwgJzUuNScsICc+PScgKSB8fCAhIGZ1bmN0aW9uX2V4aXN0cyggJ215c3FsX2Nvbm5lY3QnICkgKSB7CgkJCQkkdGhpcy0+dXNlX215c3FsaSA9IHRydWU7CgkJCX0gZWxzZWlmICggZmFsc2UgIT09IHN0cnBvcyggJEdMT0JBTFNbJ3dwX3ZlcnNpb24nXSwgJy0nICkgKSB7CgkJCQkkdGhpcy0+dXNlX215c3FsaSA9IHRydWU7CgkJCX0KCQl9CgoJCSR0aGlzLT5kYnVzZXIgPSAkZGJ1c2VyOwoJCSR0aGlzLT5kYnBhc3N3b3JkID0gJGRicGFzc3dvcmQ7CgkJJHRoaXMtPmRibmFtZSA9ICRkYm5hbWU7CgkJJHRoaXMtPmRiaG9zdCA9ICRkYmhvc3Q7CgoJCS8vIHdwLWNvbmZpZy5waHAgY3JlYXRpb24gd2lsbCBtYW51YWxseSBjb25uZWN0IHdoZW4gcmVhZHkuCgkJaWYgKCBkZWZpbmVkKCAnV1BfU0VUVVBfQ09ORklHJyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkkdGhpcy0+ZGJfY29ubmVjdCgpOwoJfQoKCS8qKgoJICogUEhQNSBzdHlsZSBkZXN0cnVjdG9yIGFuZCB3aWxsIHJ1biB3aGVuIGRhdGFiYXNlIG9iamVjdCBpcyBkZXN0cm95ZWQuCgkgKgoJICogQHNlZSB3cGRiOjpfX2NvbnN0cnVjdCgpCgkgKiBAc2luY2UgMi4wLjgKCSAqIEByZXR1cm4gdHJ1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFBIUDUgc3R5bGUgbWFnaWMgZ2V0dGVyLCB1c2VkIHRvIGxhenktbG9hZCBleHBlbnNpdmUgZGF0YS4KCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFRoZSBwcml2YXRlIG1lbWJlciB0byBnZXQsIGFuZCBvcHRpb25hbGx5IHByb2Nlc3MKCSAqIEByZXR1cm4gbWl4ZWQgVGhlIHByaXZhdGUgbWVtYmVyCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2dldCggJG5hbWUgKSB7CgkJaWYgKCAnY29sX2luZm8nID09PSAkbmFtZSApCgkJCSR0aGlzLT5sb2FkX2NvbF9pbmZvKCk7CgoJCXJldHVybiAkdGhpcy0+JG5hbWU7Cgl9CgoJLyoqCgkgKiBNYWdpYyBmdW5jdGlvbiwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoJICoKCSAqIEBzaW5jZSAzLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIFRoZSBwcml2YXRlIG1lbWJlciB0byBzZXQKCSAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fc2V0KCAkbmFtZSwgJHZhbHVlICkgewoJCSRwcm90ZWN0ZWRfbWVtYmVycyA9IGFycmF5KAoJCQknY29sX21ldGEnLAoJCQkndGFibGVfY2hhcnNldCcsCgkJCSdjaGVja19jdXJyZW50X3F1ZXJ5JywKCQkpOwoJCWlmICggIGluX2FycmF5KCAkbmFtZSwgJHByb3RlY3RlZF9tZW1iZXJzLCB0cnVlICkgKSB7CgkJCXJldHVybjsKCQl9CgkJJHRoaXMtPiRuYW1lID0gJHZhbHVlOwoJfQoKCS8qKgoJICogTWFnaWMgZnVuY3Rpb24sIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBUaGUgcHJpdmF0ZSBtZW1iZXIgdG8gY2hlY2sKCSAqCgkgKiBAcmV0dXJuIGJvb2wgSWYgdGhlIG1lbWJlciBpcyBzZXQgb3Igbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2lzc2V0KCAkbmFtZSApIHsKCQlyZXR1cm4gaXNzZXQoICR0aGlzLT4kbmFtZSApOwoJfQoKCS8qKgoJICogTWFnaWMgZnVuY3Rpb24sIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBUaGUgcHJpdmF0ZSBtZW1iZXIgdG8gdW5zZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdW5zZXQoICRuYW1lICkgewoJCXVuc2V0KCAkdGhpcy0+JG5hbWUgKTsKCX0KCgkvKioKCSAqIFNldCAkdGhpcy0+Y2hhcnNldCBhbmQgJHRoaXMtPmNvbGxhdGUKCSAqCgkgKiBAc2luY2UgMy4xLjAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGluaXRfY2hhcnNldCgpIHsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cygnaXNfbXVsdGlzaXRlJykgJiYgaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSR0aGlzLT5jaGFyc2V0ID0gJ3V0ZjgnOwoJCQlpZiAoIGRlZmluZWQoICdEQl9DT0xMQVRFJyApICYmIERCX0NPTExBVEUgKSB7CgkJCQkkdGhpcy0+Y29sbGF0ZSA9IERCX0NPTExBVEU7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+Y29sbGF0ZSA9ICd1dGY4X2dlbmVyYWxfY2knOwoJCQl9CgkJfSBlbHNlaWYgKCBkZWZpbmVkKCAnREJfQ09MTEFURScgKSApIHsKCQkJJHRoaXMtPmNvbGxhdGUgPSBEQl9DT0xMQVRFOwoJCX0KCgkJaWYgKCBkZWZpbmVkKCAnREJfQ0hBUlNFVCcgKSApIHsKCQkJJHRoaXMtPmNoYXJzZXQgPSBEQl9DSEFSU0VUOwoJCX0KCgkJaWYgKCAoICR0aGlzLT51c2VfbXlzcWxpICYmICEgKCAkdGhpcy0+ZGJoIGluc3RhbmNlb2YgbXlzcWxpICkgKSB8fCBlbXB0eSggJHRoaXMtPmRiaCApICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoICd1dGY4JyA9PT0gJHRoaXMtPmNoYXJzZXQgJiYgJHRoaXMtPmhhc19jYXAoICd1dGY4bWI0JyApICkgewoJCQkkdGhpcy0+Y2hhcnNldCA9ICd1dGY4bWI0JzsKCQl9CgoJCWlmICggJ3V0ZjhtYjQnID09PSAkdGhpcy0+Y2hhcnNldCAmJiAoICEgJHRoaXMtPmNvbGxhdGUgfHwgc3RyaXBvcyggJHRoaXMtPmNvbGxhdGUsICd1dGY4XycgKSA9PT0gMCApICkgewoJCQkkdGhpcy0+Y29sbGF0ZSA9ICd1dGY4bWI0X3VuaWNvZGVfY2knOwoJCX0KCX0KCQoJCgkvLyBCYWNrdXBCdWRkeSBtb2RpZmllZCB0byBzdG9yZSBjaGFydHNldCBhbmQgY29sbGF0ZSBpbiBjbGFzcy4KCS8qKgoJICogU2V0cyB0aGUgY29ubmVjdGlvbidzIGNoYXJhY3RlciBzZXQuCgkgKgoJICogQHNpbmNlIDMuMS4wCgkgKgoJICogQHBhcmFtIHJlc291cmNlICRkYmggICAgIFRoZSByZXNvdXJjZSBnaXZlbiBieSBteXNxbF9jb25uZWN0CgkgKiBAcGFyYW0gc3RyaW5nICAgJGNoYXJzZXQgT3B0aW9uYWwuIFRoZSBjaGFyYWN0ZXIgc2V0LiBEZWZhdWx0IG51bGwuCgkgKiBAcGFyYW0gc3RyaW5nICAgJGNvbGxhdGUgT3B0aW9uYWwuIFRoZSBjb2xsYXRpb24uIERlZmF1bHQgbnVsbC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jaGFyc2V0KCAkZGJoLCAkY2hhcnNldCA9IG51bGwsICRjb2xsYXRlID0gbnVsbCApIHsKCQlpZiAoICEgaXNzZXQoICRjaGFyc2V0ICkgKQoJCQkkY2hhcnNldCA9ICR0aGlzLT5jaGFyc2V0OwoJCWlmICggISBpc3NldCggJGNvbGxhdGUgKSApCgkJCSRjb2xsYXRlID0gJHRoaXMtPmNvbGxhdGU7CgkJaWYgKCAkdGhpcy0+aGFzX2NhcCggJ2NvbGxhdGlvbicgKSAmJiAhIGVtcHR5KCAkY2hhcnNldCApICkgewoJCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdteXNxbGlfc2V0X2NoYXJzZXQnICkgJiYgJHRoaXMtPmhhc19jYXAoICdzZXRfY2hhcnNldCcgKSApIHsKCQkJCQlteXNxbGlfc2V0X2NoYXJzZXQoICRkYmgsICRjaGFyc2V0ICk7CgkJCQl9IGVsc2UgewoJCQkJCSRxdWVyeSA9ICR0aGlzLT5wcmVwYXJlKCAnU0VUIE5BTUVTICVzJywgJGNoYXJzZXQgKTsKCQkJCQlpZiAoICEgZW1wdHkoICRjb2xsYXRlICkgKQoJCQkJCQkkcXVlcnkgLj0gJHRoaXMtPnByZXBhcmUoICcgQ09MTEFURSAlcycsICRjb2xsYXRlICk7CgkJCQkJbXlzcWxpX3F1ZXJ5KCAkZGJoLCAkcXVlcnkgKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbXlzcWxfc2V0X2NoYXJzZXQnICkgJiYgJHRoaXMtPmhhc19jYXAoICdzZXRfY2hhcnNldCcgKSApIHsKCQkJCQlteXNxbF9zZXRfY2hhcnNldCggJGNoYXJzZXQsICRkYmggKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHF1ZXJ5ID0gJHRoaXMtPnByZXBhcmUoICdTRVQgTkFNRVMgJXMnLCAkY2hhcnNldCApOwoJCQkJCWlmICggISBlbXB0eSggJGNvbGxhdGUgKSApCgkJCQkJCSRxdWVyeSAuPSAkdGhpcy0+cHJlcGFyZSggJyBDT0xMQVRFICVzJywgJGNvbGxhdGUgKTsKCQkJCQlteXNxbF9xdWVyeSggJHF1ZXJ5LCAkZGJoICk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJJHRoaXMtPmNoYXJzZXQgPSAkY2hhcnNldDsKCQkkdGhpcy0+Y29sbGF0ZSA9ICRjb2xsYXRlOwoJfQoKCS8qKgoJICogQ2hhbmdlIHRoZSBjdXJyZW50IFNRTCBtb2RlLCBhbmQgZW5zdXJlIGl0cyBXb3JkUHJlc3MgY29tcGF0aWJpbGl0eS4KCSAqCgkgKiBJZiBubyBtb2RlcyBhcmUgcGFzc2VkLCBpdCB3aWxsIGVuc3VyZSB0aGUgY3VycmVudCBNeVNRTCBzZXJ2ZXIKCSAqIG1vZGVzIGFyZSBjb21wYXRpYmxlLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICoKCSAqIEBwYXJhbSBhcnJheSAkbW9kZXMgT3B0aW9uYWwuIEEgbGlzdCBvZiBTUUwgbW9kZXMgdG8gc2V0LgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3NxbF9tb2RlKCAkbW9kZXMgPSBhcnJheSgpICkgewoJCWlmICggZW1wdHkoICRtb2RlcyApICkgewoJCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkJJHJlcyA9IG15c3FsaV9xdWVyeSggJHRoaXMtPmRiaCwgJ1NFTEVDVCBAQFNFU1NJT04uc3FsX21vZGUnICk7CgkJCX0gZWxzZSB7CgkJCQkkcmVzID0gbXlzcWxfcXVlcnkoICdTRUxFQ1QgQEBTRVNTSU9OLnNxbF9tb2RlJywgJHRoaXMtPmRiaCApOwoJCQl9CgoJCQlpZiAoIGVtcHR5KCAkcmVzICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCQkkbW9kZXNfYXJyYXkgPSBteXNxbGlfZmV0Y2hfYXJyYXkoICRyZXMgKTsKCQkJCWlmICggZW1wdHkoICRtb2Rlc19hcnJheVswXSApICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCSRtb2Rlc19zdHIgPSAkbW9kZXNfYXJyYXlbMF07CgkJCX0gZWxzZSB7CgkJCQkkbW9kZXNfc3RyID0gbXlzcWxfcmVzdWx0KCAkcmVzLCAwICk7CgkJCX0KCgkJCWlmICggZW1wdHkoICRtb2Rlc19zdHIgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJJG1vZGVzID0gZXhwbG9kZSggJywnLCAkbW9kZXNfc3RyICk7CgkJfQoKCQkkbW9kZXMgPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoICRtb2RlcywgQ0FTRV9VUFBFUiApOwoKCQkvKioKCQkgKiBGaWx0ZXIgdGhlIGxpc3Qgb2YgaW5jb21wYXRpYmxlIFNRTCBtb2RlcyB0byBleGNsdWRlLgoJCSAqCgkJICogQHNpbmNlIDMuOS4wCgkJICoKCQkgKiBAcGFyYW0gYXJyYXkgJGluY29tcGF0aWJsZV9tb2RlcyBBbiBhcnJheSBvZiBpbmNvbXBhdGlibGUgbW9kZXMuCgkJICovCgkJJGluY29tcGF0aWJsZV9tb2RlcyA9IChhcnJheSkgYXBwbHlfZmlsdGVycyggJ2luY29tcGF0aWJsZV9zcWxfbW9kZXMnLCAkdGhpcy0+aW5jb21wYXRpYmxlX21vZGVzICk7CgoJCWZvcmVhY2ggKCAkbW9kZXMgYXMgJGkgPT4gJG1vZGUgKSB7CgkJCWlmICggaW5fYXJyYXkoICRtb2RlLCAkaW5jb21wYXRpYmxlX21vZGVzICkgKSB7CgkJCQl1bnNldCggJG1vZGVzWyAkaSBdICk7CgkJCX0KCQl9CgoJCSRtb2Rlc19zdHIgPSBpbXBsb2RlKCAnLCcsICRtb2RlcyApOwoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQlteXNxbGlfcXVlcnkoICR0aGlzLT5kYmgsICJTRVQgU0VTU0lPTiBzcWxfbW9kZT0nJG1vZGVzX3N0ciciICk7CgkJfSBlbHNlIHsKCQkJbXlzcWxfcXVlcnkoICJTRVQgU0VTU0lPTiBzcWxfbW9kZT0nJG1vZGVzX3N0ciciLCAkdGhpcy0+ZGJoICk7CgkJfQoJfQoKCS8qKgoJICogU2V0cyB0aGUgdGFibGUgcHJlZml4IGZvciB0aGUgV29yZFByZXNzIHRhYmxlcy4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwcmVmaXggICAgICAgICAgQWxwaGFudW1lcmljIG5hbWUgZm9yIHRoZSBuZXcgcHJlZml4LgoJICogQHBhcmFtIGJvb2wgICAkc2V0X3RhYmxlX25hbWVzIE9wdGlvbmFsLiBXaGV0aGVyIHRoZSB0YWJsZSBuYW1lcywgZS5nLiB3cGRiOjokcG9zdHMsIHNob3VsZCBiZSB1cGRhdGVkIG9yIG5vdC4KCSAqIEByZXR1cm4gc3RyaW5nfFdQX0Vycm9yIE9sZCBwcmVmaXggb3IgV1BfRXJyb3Igb24gZXJyb3IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9wcmVmaXgoICRwcmVmaXgsICRzZXRfdGFibGVfbmFtZXMgPSB0cnVlICkgewoKCQlpZiAoIHByZWdfbWF0Y2goICd8W15hLXowLTlfXXxpJywgJHByZWZpeCApICkKCQkJcmV0dXJuIG5ldyBXUF9FcnJvcignaW52YWxpZF9kYl9wcmVmaXgnLCAnSW52YWxpZCBkYXRhYmFzZSBwcmVmaXgnICk7CgoJCSRvbGRfcHJlZml4ID0gaXNfbXVsdGlzaXRlKCkgPyAnJyA6ICRwcmVmaXg7CgoJCWlmICggaXNzZXQoICR0aGlzLT5iYXNlX3ByZWZpeCApICkKCQkJJG9sZF9wcmVmaXggPSAkdGhpcy0+YmFzZV9wcmVmaXg7CgoJCSR0aGlzLT5iYXNlX3ByZWZpeCA9ICRwcmVmaXg7CgoJCWlmICggJHNldF90YWJsZV9uYW1lcyApIHsKCQkJZm9yZWFjaCAoICR0aGlzLT50YWJsZXMoICdnbG9iYWwnICkgYXMgJHRhYmxlID0+ICRwcmVmaXhlZF90YWJsZSApCgkJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoKCQkJaWYgKCBpc19tdWx0aXNpdGUoKSAmJiBlbXB0eSggJHRoaXMtPmJsb2dpZCApICkKCQkJCXJldHVybiAkb2xkX3ByZWZpeDsKCgkJCSR0aGlzLT5wcmVmaXggPSAkdGhpcy0+Z2V0X2Jsb2dfcHJlZml4KCk7CgoJCQlmb3JlYWNoICggJHRoaXMtPnRhYmxlcyggJ2Jsb2cnICkgYXMgJHRhYmxlID0+ICRwcmVmaXhlZF90YWJsZSApCgkJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoKCQkJZm9yZWFjaCAoICR0aGlzLT50YWJsZXMoICdvbGQnICkgYXMgJHRhYmxlID0+ICRwcmVmaXhlZF90YWJsZSApCgkJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoJCX0KCQlyZXR1cm4gJG9sZF9wcmVmaXg7Cgl9CgoJLyoqCgkgKiBTZXRzIGJsb2cgaWQuCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBpbnQgJGJsb2dfaWQKCSAqIEBwYXJhbSBpbnQgJHNpdGVfaWQgT3B0aW9uYWwuCgkgKiBAcmV0dXJuIGludCBwcmV2aW91cyBibG9nIGlkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfYmxvZ19pZCggJGJsb2dfaWQsICRzaXRlX2lkID0gMCApIHsKCQlpZiAoICEgZW1wdHkoICRzaXRlX2lkICkgKQoJCQkkdGhpcy0+c2l0ZWlkID0gJHNpdGVfaWQ7CgoJCSRvbGRfYmxvZ19pZCAgPSAkdGhpcy0+YmxvZ2lkOwoJCSR0aGlzLT5ibG9naWQgPSAkYmxvZ19pZDsKCgkJJHRoaXMtPnByZWZpeCA9ICR0aGlzLT5nZXRfYmxvZ19wcmVmaXgoKTsKCgkJZm9yZWFjaCAoICR0aGlzLT50YWJsZXMoICdibG9nJyApIGFzICR0YWJsZSA9PiAkcHJlZml4ZWRfdGFibGUgKQoJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoKCQlmb3JlYWNoICggJHRoaXMtPnRhYmxlcyggJ29sZCcgKSBhcyAkdGFibGUgPT4gJHByZWZpeGVkX3RhYmxlICkKCQkJJHRoaXMtPiR0YWJsZSA9ICRwcmVmaXhlZF90YWJsZTsKCgkJcmV0dXJuICRvbGRfYmxvZ19pZDsKCX0KCgkvKioKCSAqIEdldHMgYmxvZyBwcmVmaXguCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAcGFyYW0gaW50ICRibG9nX2lkIE9wdGlvbmFsLgoJICogQHJldHVybiBzdHJpbmcgQmxvZyBwcmVmaXguCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfYmxvZ19wcmVmaXgoICRibG9nX2lkID0gbnVsbCApIHsKCQlpZiAoIGlzX211bHRpc2l0ZSgpICkgewoJCQlpZiAoIG51bGwgPT09ICRibG9nX2lkICkKCQkJCSRibG9nX2lkID0gJHRoaXMtPmJsb2dpZDsKCQkJJGJsb2dfaWQgPSAoaW50KSAkYmxvZ19pZDsKCQkJaWYgKCBkZWZpbmVkKCAnTVVMVElTSVRFJyApICYmICggMCA9PSAkYmxvZ19pZCB8fCAxID09ICRibG9nX2lkICkgKQoJCQkJcmV0dXJuICR0aGlzLT5iYXNlX3ByZWZpeDsKCQkJZWxzZQoJCQkJcmV0dXJuICR0aGlzLT5iYXNlX3ByZWZpeCAuICRibG9nX2lkIC4gJ18nOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkdGhpcy0+YmFzZV9wcmVmaXg7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyBhbiBhcnJheSBvZiBXb3JkUHJlc3MgdGFibGVzLgoJICoKCSAqIEFsc28gYWxsb3dzIGZvciB0aGUgQ1VTVE9NX1VTRVJfVEFCTEUgYW5kIENVU1RPTV9VU0VSX01FVEFfVEFCTEUgdG8KCSAqIG92ZXJyaWRlIHRoZSBXb3JkUHJlc3MgdXNlcnMgYW5kIHVzZXJtZXRhIHRhYmxlcyB0aGF0IHdvdWxkIG90aGVyd2lzZQoJICogYmUgZGV0ZXJtaW5lZCBieSB0aGUgcHJlZml4LgoJICoKCSAqIFRoZSBzY29wZSBhcmd1bWVudCBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKCSAqCgkgKiAnYWxsJyAtIHJldHVybnMgJ2FsbCcgYW5kICdnbG9iYWwnIHRhYmxlcy4gTm8gb2xkIHRhYmxlcyBhcmUgcmV0dXJuZWQuCgkgKiAnYmxvZycgLSByZXR1cm5zIHRoZSBibG9nLWxldmVsIHRhYmxlcyBmb3IgdGhlIHF1ZXJpZWQgYmxvZy4KCSAqICdnbG9iYWwnIC0gcmV0dXJucyB0aGUgZ2xvYmFsIHRhYmxlcyBmb3IgdGhlIGluc3RhbGxhdGlvbiwgcmV0dXJuaW5nIG11bHRpc2l0ZSB0YWJsZXMgb25seSBpZiBydW5uaW5nIG11bHRpc2l0ZS4KCSAqICdtc19nbG9iYWwnIC0gcmV0dXJucyB0aGUgbXVsdGlzaXRlIGdsb2JhbCB0YWJsZXMsIHJlZ2FyZGxlc3MgaWYgY3VycmVudCBpbnN0YWxsYXRpb24gaXMgbXVsdGlzaXRlLgoJICogJ29sZCcgLSByZXR1cm5zIHRhYmxlcyB3aGljaCBhcmUgZGVwcmVjYXRlZC4KCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEB1c2VzIHdwZGI6OiR0YWJsZXMKCSAqIEB1c2VzIHdwZGI6OiRvbGRfdGFibGVzCgkgKiBAdXNlcyB3cGRiOjokZ2xvYmFsX3RhYmxlcwoJICogQHVzZXMgd3BkYjo6JG1zX2dsb2JhbF90YWJsZXMKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzY29wZSAgIE9wdGlvbmFsLiBDYW4gYmUgYWxsLCBnbG9iYWwsIG1zX2dsb2JhbCwgYmxvZywgb3Igb2xkIHRhYmxlcy4gRGVmYXVsdHMgdG8gYWxsLgoJICogQHBhcmFtIGJvb2wgICAkcHJlZml4ICBPcHRpb25hbC4gV2hldGhlciB0byBpbmNsdWRlIHRhYmxlIHByZWZpeGVzLiBEZWZhdWx0IHRydWUuIElmIGJsb2cKCSAqICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IGlzIHJlcXVlc3RlZCwgdGhlbiB0aGUgY3VzdG9tIHVzZXJzIGFuZCB1c2VybWV0YSB0YWJsZXMgd2lsbCBiZSBtYXBwZWQuCgkgKiBAcGFyYW0gaW50ICAgICRibG9nX2lkIE9wdGlvbmFsLiBUaGUgYmxvZ19pZCB0byBwcmVmaXguIERlZmF1bHRzIHRvIHdwZGI6OiRibG9naWQuIFVzZWQgb25seSB3aGVuIHByZWZpeCBpcyByZXF1ZXN0ZWQuCgkgKiBAcmV0dXJuIGFycmF5IFRhYmxlIG5hbWVzLiBXaGVuIGEgcHJlZml4IGlzIHJlcXVlc3RlZCwgdGhlIGtleSBpcyB0aGUgdW5wcmVmaXhlZCB0YWJsZSBuYW1lLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdGFibGVzKCAkc2NvcGUgPSAnYWxsJywgJHByZWZpeCA9IHRydWUsICRibG9nX2lkID0gMCApIHsKCQlzd2l0Y2ggKCAkc2NvcGUgKSB7CgkJCWNhc2UgJ2FsbCcgOgoJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+Z2xvYmFsX3RhYmxlcywgJHRoaXMtPnRhYmxlcyApOwoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSApCgkJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGFibGVzLCAkdGhpcy0+bXNfZ2xvYmFsX3RhYmxlcyApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2Jsb2cnIDoKCQkJCSR0YWJsZXMgPSAkdGhpcy0+dGFibGVzOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2dsb2JhbCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5nbG9iYWxfdGFibGVzOwoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSApCgkJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGFibGVzLCAkdGhpcy0+bXNfZ2xvYmFsX3RhYmxlcyApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ21zX2dsb2JhbCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5tc19nbG9iYWxfdGFibGVzOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ29sZCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5vbGRfdGFibGVzOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQgOgoJCQkJcmV0dXJuIGFycmF5KCk7CgkJfQoKCQlpZiAoICRwcmVmaXggKSB7CgkJCWlmICggISAkYmxvZ19pZCApCgkJCQkkYmxvZ19pZCA9ICR0aGlzLT5ibG9naWQ7CgkJCSRibG9nX3ByZWZpeCA9ICR0aGlzLT5nZXRfYmxvZ19wcmVmaXgoICRibG9nX2lkICk7CgkJCSRiYXNlX3ByZWZpeCA9ICR0aGlzLT5iYXNlX3ByZWZpeDsKCQkJJGdsb2JhbF90YWJsZXMgPSBhcnJheV9tZXJnZSggJHRoaXMtPmdsb2JhbF90YWJsZXMsICR0aGlzLT5tc19nbG9iYWxfdGFibGVzICk7CgkJCWZvcmVhY2ggKCAkdGFibGVzIGFzICRrID0+ICR0YWJsZSApIHsKCQkJCWlmICggaW5fYXJyYXkoICR0YWJsZSwgJGdsb2JhbF90YWJsZXMgKSApCgkJCQkJJHRhYmxlc1sgJHRhYmxlIF0gPSAkYmFzZV9wcmVmaXggLiAkdGFibGU7CgkJCQllbHNlCgkJCQkJJHRhYmxlc1sgJHRhYmxlIF0gPSAkYmxvZ19wcmVmaXggLiAkdGFibGU7CgkJCQl1bnNldCggJHRhYmxlc1sgJGsgXSApOwoJCQl9CgoJCQlpZiAoIGlzc2V0KCAkdGFibGVzWyd1c2VycyddICkgJiYgZGVmaW5lZCggJ0NVU1RPTV9VU0VSX1RBQkxFJyApICkKCQkJCSR0YWJsZXNbJ3VzZXJzJ10gPSBDVVNUT01fVVNFUl9UQUJMRTsKCgkJCWlmICggaXNzZXQoICR0YWJsZXNbJ3VzZXJtZXRhJ10gKSAmJiBkZWZpbmVkKCAnQ1VTVE9NX1VTRVJfTUVUQV9UQUJMRScgKSApCgkJCQkkdGFibGVzWyd1c2VybWV0YSddID0gQ1VTVE9NX1VTRVJfTUVUQV9UQUJMRTsKCQl9CgoJCXJldHVybiAkdGFibGVzOwoJfQoKCS8qKgoJICogU2VsZWN0cyBhIGRhdGFiYXNlIHVzaW5nIHRoZSBjdXJyZW50IGRhdGFiYXNlIGNvbm5lY3Rpb24uCgkgKgoJICogVGhlIGRhdGFiYXNlIG5hbWUgd2lsbCBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRhdGFiYXNlCgkgKiBjb25uZWN0aW9uLiBPbiBmYWlsdXJlLCB0aGUgZXhlY3V0aW9uIHdpbGwgYmFpbCBhbmQgZGlzcGxheSBhbiBEQiBlcnJvci4KCSAqCgkgKiBAc2luY2UgMC43MQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICRkYiAgTXlTUUwgZGF0YWJhc2UgbmFtZQoJICogQHBhcmFtIHJlc291cmNlfG51bGwgJGRiaCBPcHRpb25hbCBsaW5rIGlkZW50aWZpZXIuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZWxlY3QoICRkYiwgJGRiaCA9IG51bGwgKSB7CgkJaWYgKCBpc19udWxsKCRkYmgpICkKCQkJJGRiaCA9ICR0aGlzLT5kYmg7CgoJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCSRzdWNjZXNzID0gQG15c3FsaV9zZWxlY3RfZGIoICRkYmgsICRkYiApOwoJCX0gZWxzZSB7CgkJCSRzdWNjZXNzID0gQG15c3FsX3NlbGVjdF9kYiggJGRiLCAkZGJoICk7CgkJfQoJCWlmICggISAkc3VjY2VzcyApIHsKCQkJJHRoaXMtPnJlYWR5ID0gZmFsc2U7CgkJCWlmICggISBkaWRfYWN0aW9uKCAndGVtcGxhdGVfcmVkaXJlY3QnICkgKSB7CgkJCQl3cF9sb2FkX3RyYW5zbGF0aW9uc19lYXJseSgpOwoKCQkJCSRtZXNzYWdlID0gJzxoMT4nIC4gX18oICdDYW4mIzgyMTc7dCBzZWxlY3QgZGF0YWJhc2UnICkgLiAiPC9oMT5cbiI7CgoJCQkJJG1lc3NhZ2UgLj0gJzxwPicgLiBzcHJpbnRmKAoJCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogZGF0YWJhc2UgbmFtZSAqLwoJCQkJCV9fKCAnV2Ugd2VyZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIHNlcnZlciAod2hpY2ggbWVhbnMgeW91ciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaXMgb2theSkgYnV0IG5vdCBhYmxlIHRvIHNlbGVjdCB0aGUgJXMgZGF0YWJhc2UuJyApLAoJCQkJCSc8Y29kZT4nIC4gaHRtbHNwZWNpYWxjaGFycyggJGRiLCBFTlRfUVVPVEVTICkgLiAnPC9jb2RlPicKCQkJCSkgLiAiPC9wPlxuIjsKCgkJCQkkbWVzc2FnZSAuPSAiPHVsPlxuIjsKCQkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIGl0IGV4aXN0cz8nICkgLiAiPC9saT5cbiI7CgoJCQkJJG1lc3NhZ2UgLj0gJzxsaT4nIC4gc3ByaW50ZigKCQkJCQkvKiB0cmFuc2xhdG9yczogMTogZGF0YWJhc2UgdXNlciwgMjogZGF0YWJhc2UgbmFtZSAqLwoJCQkJCV9fKCAnRG9lcyB0aGUgdXNlciAlMSRzIGhhdmUgcGVybWlzc2lvbiB0byB1c2UgdGhlICUyJHMgZGF0YWJhc2U/JyApLAoJCQkJCSc8Y29kZT4nIC4gaHRtbHNwZWNpYWxjaGFycyggJHRoaXMtPmRidXNlciwgRU5UX1FVT1RFUyApICAuICc8L2NvZGU+JywKCQkJCQknPGNvZGU+JyAuIGh0bWxzcGVjaWFsY2hhcnMoICRkYiwgRU5UX1FVT1RFUyApIC4gJzwvY29kZT4nCgkJCQkpIC4gIjwvbGk+XG4iOwoKCQkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIHNwcmludGYoCgkJCQkJLyogdHJhbnNsYXRvcnM6ICVzOiBkYXRhYmFzZSBuYW1lICovCgkJCQkJX18oICdPbiBzb21lIHN5c3RlbXMgdGhlIG5hbWUgb2YgeW91ciBkYXRhYmFzZSBpcyBwcmVmaXhlZCB3aXRoIHlvdXIgdXNlcm5hbWUsIHNvIGl0IHdvdWxkIGJlIGxpa2UgPGNvZGU+dXNlcm5hbWVfJTEkczwvY29kZT4uIENvdWxkIHRoYXQgYmUgdGhlIHByb2JsZW0/JyApLAoJCQkJCWh0bWxzcGVjaWFsY2hhcnMoICRkYiwgRU5UX1FVT1RFUyApCgkJCQkpLiAiPC9saT5cbiI7CgoJCQkJJG1lc3NhZ2UgLj0gIjwvdWw+XG4iOwoKCQkJCSRtZXNzYWdlIC49ICc8cD4nIC4gc3ByaW50ZigKCQkJCQkvKiB0cmFuc2xhdG9yczogJXM6IHN1cHBvcnQgZm9ydW1zIFVSTCAqLwoJCQkJCV9fKCAnSWYgeW91IGRvbiYjODIxNzt0IGtub3cgaG93IHRvIHNldCB1cCBhIGRhdGFiYXNlIHlvdSBzaG91bGQgPHN0cm9uZz5jb250YWN0IHlvdXIgaG9zdDwvc3Ryb25nPi4gSWYgYWxsIGVsc2UgZmFpbHMgeW91IG1heSBmaW5kIGhlbHAgYXQgdGhlIDxhIGhyZWY9IiVzIj5Xb3JkUHJlc3MgU3VwcG9ydCBGb3J1bXM8L2E+LicgKSwKCQkJCQlfXyggJ2h0dHBzOi8vd29yZHByZXNzLm9yZy9zdXBwb3J0LycgKQoJCQkJKSAuICI8L3A+XG4iOwoKCQkJCSR0aGlzLT5iYWlsKCAkbWVzc2FnZSwgJ2RiX3NlbGVjdF9mYWlsJyApOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogRG8gbm90IHVzZSwgZGVwcmVjYXRlZC4KCSAqCgkgKiBVc2UgZXNjX3NxbCgpIG9yIHdwZGI6OnByZXBhcmUoKSBpbnN0ZWFkLgoJICoKCSAqIEBzaW5jZSAyLjguMAoJICogQGRlcHJlY2F0ZWQgMy42LjAgVXNlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSB3cGRiOjpwcmVwYXJlCgkgKiBAc2VlIGVzY19zcWwoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyaW5nCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglmdW5jdGlvbiBfd2Vha19lc2NhcGUoICRzdHJpbmcgKSB7CgkJaWYgKCBmdW5jX251bV9hcmdzKCkgPT09IDEgJiYgZnVuY3Rpb25fZXhpc3RzKCAnX2RlcHJlY2F0ZWRfZnVuY3Rpb24nICkgKQoJCQlfZGVwcmVjYXRlZF9mdW5jdGlvbiggX19NRVRIT0RfXywgJzMuNicsICd3cGRiOjpwcmVwYXJlKCkgb3IgZXNjX3NxbCgpJyApOwoJCXJldHVybiBhZGRzbGFzaGVzKCAkc3RyaW5nICk7Cgl9CgoJLyoqCgkgKiBSZWFsIGVzY2FwZSwgdXNpbmcgbXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygpIG9yIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygpCgkgKgoJICogQHNlZSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCkKCSAqIEBzZWUgbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCkKCSAqIEBzaW5jZSAyLjguMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKgoJICogQHBhcmFtICBzdHJpbmcgJHN0cmluZyB0byBlc2NhcGUKCSAqIEByZXR1cm4gc3RyaW5nIGVzY2FwZWQKCSAqLwoJZnVuY3Rpb24gX3JlYWxfZXNjYXBlKCAkc3RyaW5nICkgewoJCWlmICggJHRoaXMtPmRiaCApIHsKCQkJaWYgKCAkdGhpcy0+dXNlX215c3FsaSApIHsKCQkJCXJldHVybiBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCAkdGhpcy0+ZGJoLCAkc3RyaW5nICk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCAkc3RyaW5nLCAkdGhpcy0+ZGJoICk7CgkJCX0KCQl9CgoJCSRjbGFzcyA9IGdldF9jbGFzcyggJHRoaXMgKTsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ19fJyApICkgewoJCQkvKiB0cmFuc2xhdG9yczogJXM6IGRhdGFiYXNlIGFjY2VzcyBhYnN0cmFjdGlvbiBjbGFzcywgdXN1YWxseSB3cGRiIG9yIGEgY2xhc3MgZXh0ZW5kaW5nIHdwZGIgKi8KCQkJX2RvaW5nX2l0X3dyb25nKCAkY2xhc3MsIHNwcmludGYoIF9fKCAnJXMgbXVzdCBzZXQgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZvciB1c2Ugd2l0aCBlc2NhcGluZy4nICksICRjbGFzcyApLCBFX1VTRVJfTk9USUNFICk7CgkJfSBlbHNlIHsKCQkJX2RvaW5nX2l0X3dyb25nKCAkY2xhc3MsIHNwcmludGYoICclcyBtdXN0IHNldCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gZm9yIHVzZSB3aXRoIGVzY2FwaW5nLicsICRjbGFzcyApLCBFX1VTRVJfTk9USUNFICk7CgkJfQoJCXJldHVybiBhZGRzbGFzaGVzKCAkc3RyaW5nICk7Cgl9CgoJLyoqCgkgKiBFc2NhcGUgZGF0YS4gV29ya3Mgb24gYXJyYXlzLgoJICoKCSAqIEB1c2VzIHdwZGI6Ol9yZWFsX2VzY2FwZSgpCgkgKiBAc2luY2UgIDIuOC4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqCgkgKiBAcGFyYW0gIHN0cmluZ3xhcnJheSAkZGF0YQoJICogQHJldHVybiBzdHJpbmd8YXJyYXkgZXNjYXBlZAoJICovCglmdW5jdGlvbiBfZXNjYXBlKCAkZGF0YSApIHsKCQlpZiAoIGlzX2FycmF5KCAkZGF0YSApICkgewoJCQlmb3JlYWNoICggJGRhdGEgYXMgJGsgPT4gJHYgKSB7CgkJCQlpZiAoIGlzX2FycmF5KCR2KSApCgkJCQkJJGRhdGFbJGtdID0gJHRoaXMtPl9lc2NhcGUoICR2ICk7CgkJCQllbHNlCgkJCQkJJGRhdGFbJGtdID0gJHRoaXMtPl9yZWFsX2VzY2FwZSggJHYgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRkYXRhID0gJHRoaXMtPl9yZWFsX2VzY2FwZSggJGRhdGEgKTsKCQl9CgoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIERvIG5vdCB1c2UsIGRlcHJlY2F0ZWQuCgkgKgoJICogVXNlIGVzY19zcWwoKSBvciB3cGRiOjpwcmVwYXJlKCkgaW5zdGVhZC4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGRlcHJlY2F0ZWQgMy42LjAgVXNlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgZXNjX3NxbCgpCgkgKgoJICogQHBhcmFtIG1peGVkICRkYXRhCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlc2NhcGUoICRkYXRhICkgewoJCWlmICggZnVuY19udW1fYXJncygpID09PSAxICYmIGZ1bmN0aW9uX2V4aXN0cyggJ19kZXByZWNhdGVkX2Z1bmN0aW9uJyApICkKCQkJX2RlcHJlY2F0ZWRfZnVuY3Rpb24oIF9fTUVUSE9EX18sICczLjYnLCAnd3BkYjo6cHJlcGFyZSgpIG9yIGVzY19zcWwoKScgKTsKCQlpZiAoIGlzX2FycmF5KCAkZGF0YSApICkgewoJCQlmb3JlYWNoICggJGRhdGEgYXMgJGsgPT4gJHYgKSB7CgkJCQlpZiAoIGlzX2FycmF5KCAkdiApICkKCQkJCQkkZGF0YVska10gPSAkdGhpcy0+ZXNjYXBlKCAkdiwgJ3JlY3Vyc2l2ZScgKTsKCQkJCWVsc2UKCQkJCQkkZGF0YVska10gPSAkdGhpcy0+X3dlYWtfZXNjYXBlKCAkdiwgJ2ludGVybmFsJyApOwoJCQl9CgkJfSBlbHNlIHsKCQkJJGRhdGEgPSAkdGhpcy0+X3dlYWtfZXNjYXBlKCAkZGF0YSwgJ2ludGVybmFsJyApOwoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogRXNjYXBlcyBjb250ZW50IGJ5IHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW9uIGludG8gdGhlIGRhdGFiYXNlLCBmb3Igc2VjdXJpdHkKCSAqCgkgKiBAdXNlcyB3cGRiOjpfcmVhbF9lc2NhcGUoKQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyB0byBlc2NhcGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVzY2FwZV9ieV9yZWYoICYkc3RyaW5nICkgewoJCWlmICggISBpc19mbG9hdCggJHN0cmluZyApICkKCQkJJHN0cmluZyA9ICR0aGlzLT5fcmVhbF9lc2NhcGUoICRzdHJpbmcgKTsKCX0KCgkvKioKCSAqIFByZXBhcmVzIGEgU1FMIHF1ZXJ5IGZvciBzYWZlIGV4ZWN1dGlvbi4gVXNlcyBzcHJpbnRmKCktbGlrZSBzeW50YXguCgkgKgoJICogVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIGluIHRoZSBxdWVyeSBmb3JtYXQgc3RyaW5nOgoJICogICAlZCAoaW50ZWdlcikKCSAqICAgJWYgKGZsb2F0KQoJICogICAlcyAoc3RyaW5nKQoJICogICAlJSAobGl0ZXJhbCBwZXJjZW50YWdlIHNpZ24gLSBubyBhcmd1bWVudCBuZWVkZWQpCgkgKgoJICogQWxsIG9mICVkLCAlZiwgYW5kICVzIGFyZSB0byBiZSBsZWZ0IHVucXVvdGVkIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZXkgbmVlZCBhbiBhcmd1bWVudCBwYXNzZWQgZm9yIHRoZW0uCgkgKiBMaXRlcmFscyAoJSkgYXMgcGFydHMgb2YgdGhlIHF1ZXJ5IG11c3QgYmUgcHJvcGVybHkgd3JpdHRlbiBhcyAlJS4KCSAqCgkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgYSBzbWFsbCBzdWJzZXQgb2YgdGhlIHNwcmludGYgc3ludGF4OyBpdCBvbmx5IHN1cHBvcnRzICVkIChpbnRlZ2VyKSwgJWYgKGZsb2F0KSwgYW5kICVzIChzdHJpbmcpLgoJICogRG9lcyBub3Qgc3VwcG9ydCBzaWduLCBwYWRkaW5nLCBhbGlnbm1lbnQsIHdpZHRoIG9yIHByZWNpc2lvbiBzcGVjaWZpZXJzLgoJICogRG9lcyBub3Qgc3VwcG9ydCBhcmd1bWVudCBudW1iZXJpbmcvc3dhcHBpbmcuCgkgKgoJICogTWF5IGJlIGNhbGxlZCBsaWtlIHtAbGluayBodHRwOi8vcGhwLm5ldC9zcHJpbnRmIHNwcmludGYoKX0gb3IgbGlrZSB7QGxpbmsgaHR0cDovL3BocC5uZXQvdnNwcmludGYgdnNwcmludGYoKX0uCgkgKgoJICogQm90aCAlZCBhbmQgJXMgc2hvdWxkIGJlIGxlZnQgdW5xdW90ZWQgaW4gdGhlIHF1ZXJ5IHN0cmluZy4KCSAqCgkgKiAgICAgd3BkYjo6cHJlcGFyZSggIlNFTEVDVCAqIEZST00gYHRhYmxlYCBXSEVSRSBgY29sdW1uYCA9ICVzIEFORCBgZmllbGRgID0gJWQiLCAnZm9vJywgMTMzNyApCgkgKiAgICAgd3BkYjo6cHJlcGFyZSggIlNFTEVDVCBEQVRFX0ZPUk1BVChgZmllbGRgLCAnJSVjJykgRlJPTSBgdGFibGVgIFdIRVJFIGBjb2x1bW5gID0gJXMiLCAnZm9vJyApOwoJICoKCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L3NwcmludGYgRGVzY3JpcHRpb24gb2Ygc3ludGF4LgoJICogQHNpbmNlIDIuMy4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAgICAgICRxdWVyeSAgICBRdWVyeSBzdGF0ZW1lbnQgd2l0aCBzcHJpbnRmKCktbGlrZSBwbGFjZWhvbGRlcnMKCSAqIEBwYXJhbSBhcnJheXxtaXhlZCAkYXJncyAgICAgVGhlIGFycmF5IG9mIHZhcmlhYmxlcyB0byBzdWJzdGl0dXRlIGludG8gdGhlIHF1ZXJ5J3MgcGxhY2Vob2xkZXJzIGlmIGJlaW5nIGNhbGxlZCBsaWtlCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBodHRwOi8vcGhwLm5ldC92c3ByaW50ZiB2c3ByaW50ZigpfSwgb3IgdGhlIGZpcnN0IHZhcmlhYmxlIHRvIHN1YnN0aXR1dGUgaW50byB0aGUgcXVlcnkncyBwbGFjZWhvbGRlcnMgaWYKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgY2FsbGVkIGxpa2Uge0BsaW5rIGh0dHA6Ly9waHAubmV0L3NwcmludGYgc3ByaW50ZigpfS4KCSAqIEBwYXJhbSBtaXhlZCAgICAgICAkYXJncywuLi4gZnVydGhlciB2YXJpYWJsZXMgdG8gc3Vic3RpdHV0ZSBpbnRvIHRoZSBxdWVyeSdzIHBsYWNlaG9sZGVycyBpZiBiZWluZyBjYWxsZWQgbGlrZQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgaHR0cDovL3BocC5uZXQvc3ByaW50ZiBzcHJpbnRmKCl9LgoJICogQHJldHVybiBzdHJpbmd8dm9pZCBTYW5pdGl6ZWQgcXVlcnkgc3RyaW5nLCBpZiB0aGVyZSBpcyBhIHF1ZXJ5IHRvIHByZXBhcmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCAkcXVlcnksICRhcmdzICkgewoJCWlmICggaXNfbnVsbCggJHF1ZXJ5ICkgKQoJCQlyZXR1cm47CgoJCS8vIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGZvb2xwcm9vZiAtLSBidXQgaXQgd2lsbCBjYXRjaCBvYnZpb3VzbHkgaW5jb3JyZWN0IHVzYWdlLgoJCWlmICggc3RycG9zKCAkcXVlcnksICclJyApID09PSBmYWxzZSApIHsKCQkJX2RvaW5nX2l0X3dyb25nKCAnd3BkYjo6cHJlcGFyZScsIHNwcmludGYoIF9fKCAnVGhlIHF1ZXJ5IGFyZ3VtZW50IG9mICVzIG11c3QgaGF2ZSBhIHBsYWNlaG9sZGVyLicgKSwgJ3dwZGI6OnByZXBhcmUoKScgKSwgJzMuOScgKTsKCQl9CgoJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCWFycmF5X3NoaWZ0KCAkYXJncyApOwoJCS8vIElmIGFyZ3Mgd2VyZSBwYXNzZWQgYXMgYW4gYXJyYXkgKGFzIGluIHZzcHJpbnRmKSwgbW92ZSB0aGVtIHVwCgkJaWYgKCBpc3NldCggJGFyZ3NbMF0gKSAmJiBpc19hcnJheSgkYXJnc1swXSkgKQoJCQkkYXJncyA9ICRhcmdzWzBdOwoJCSRxdWVyeSA9IHN0cl9yZXBsYWNlKCAiJyVzJyIsICclcycsICRxdWVyeSApOyAvLyBpbiBjYXNlIHNvbWVvbmUgbWlzdGFrZW5seSBhbHJlYWR5IHNpbmdsZXF1b3RlZCBpdAoJCSRxdWVyeSA9IHN0cl9yZXBsYWNlKCAnIiVzIicsICclcycsICRxdWVyeSApOyAvLyBkb3VibGVxdW90ZSB1bnF1b3RpbmcKCQkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoICd8KD88ISUpJWZ8JyAsICclRicsICRxdWVyeSApOyAvLyBGb3JjZSBmbG9hdHMgdG8gYmUgbG9jYWxlIHVuYXdhcmUKCQkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoICd8KD88ISUpJXN8JywgIiclcyciLCAkcXVlcnkgKTsgLy8gcXVvdGUgdGhlIHN0cmluZ3MsIGF2b2lkaW5nIGVzY2FwZWQgc3RyaW5ncyBsaWtlICUlcwoJCWFycmF5X3dhbGsoICRhcmdzLCBhcnJheSggJHRoaXMsICdlc2NhcGVfYnlfcmVmJyApICk7CgkJcmV0dXJuIEB2c3ByaW50ZiggJHF1ZXJ5LCAkYXJncyApOwoJfQoKCS8qKgoJICogRmlyc3QgaGFsZiBvZiBlc2NhcGluZyBmb3IgTElLRSBzcGVjaWFsIGNoYXJhY3RlcnMgJSBhbmQgXyBiZWZvcmUgcHJlcGFyaW5nIGZvciBNeVNRTC4KCSAqCgkgKiBVc2UgdGhpcyBvbmx5IGJlZm9yZSB3cGRiOjpwcmVwYXJlKCkgb3IgZXNjX3NxbCgpLiAgUmV2ZXJzaW5nIHRoZSBvcmRlciBpcyB2ZXJ5IGJhZCBmb3Igc2VjdXJpdHkuCgkgKgoJICogRXhhbXBsZSBQcmVwYXJlZCBTdGF0ZW1lbnQ6CgkgKiAgJHdpbGQgPSAnJSc7CgkgKiAgJGZpbmQgPSAnb25seSA0MyUgb2YgcGxhbmV0cyc7CgkgKiAgJGxpa2UgPSAkd2lsZCAuICR3cGRiLT5lc2NfbGlrZSggJGZpbmQgKSAuICR3aWxkOwoJICogICRzcWwgID0gJHdwZGItPnByZXBhcmUoICJTRUxFQ1QgKiBGUk9NICR3cGRiLT5wb3N0cyBXSEVSRSBwb3N0X2NvbnRlbnQgTElLRSAlcyIsICRsaWtlICk7CgkgKgoJICogRXhhbXBsZSBFc2NhcGUgQ2hhaW46CgkgKiAgJHNxbCAgPSBlc2Nfc3FsKCAkd3BkYi0+ZXNjX2xpa2UoICRpbnB1dCApICk7CgkgKgoJICogQHNpbmNlIDQuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRleHQgVGhlIHJhdyB0ZXh0IHRvIGJlIGVzY2FwZWQuIFRoZSBpbnB1dCB0eXBlZCBieSB0aGUgdXNlciBzaG91bGQgaGF2ZSBubwoJICogICAgICAgICAgICAgICAgICAgICBleHRyYSBvciBkZWxldGVkIHNsYXNoZXMuCgkgKiBAcmV0dXJuIHN0cmluZyBUZXh0IGluIHRoZSBmb3JtIG9mIGEgTElLRSBwaHJhc2UuIFRoZSBvdXRwdXQgaXMgbm90IFNRTCBzYWZlLiBDYWxsICR3cGRiOjpwcmVwYXJlKCkKCSAqICAgICAgICAgICAgICAgIG9yIHJlYWxfZXNjYXBlIG5leHQuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlc2NfbGlrZSggJHRleHQgKSB7CgkJcmV0dXJuIGFkZGNzbGFzaGVzKCAkdGV4dCwgJ18lXFwnICk7Cgl9CgoJLyoqCgkgKiBQcmludCBTUUwvREIgZXJyb3IuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBnbG9iYWwgYXJyYXkgJEVaU1FMX0VSUk9SIFN0b3JlcyBlcnJvciBpbmZvcm1hdGlvbiBvZiBxdWVyeSBhbmQgZXJyb3Igc3RyaW5nCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBlcnJvciB0byBkaXNwbGF5CgkgKiBAcmV0dXJuIGZhbHNlfHZvaWQgRmFsc2UgaWYgdGhlIHNob3dpbmcgb2YgZXJyb3JzIGlzIGRpc2FibGVkLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcHJpbnRfZXJyb3IoICRzdHIgPSAnJyApIHsKCQlnbG9iYWwgJEVaU1FMX0VSUk9SOwoKCQlpZiAoICEkc3RyICkgewoJCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkJJHN0ciA9IG15c3FsaV9lcnJvciggJHRoaXMtPmRiaCApOwoJCQl9IGVsc2UgewoJCQkJJHN0ciA9IG15c3FsX2Vycm9yKCAkdGhpcy0+ZGJoICk7CgkJCX0KCQl9CgkJJEVaU1FMX0VSUk9SW10gPSBhcnJheSggJ3F1ZXJ5JyA9PiAkdGhpcy0+bGFzdF9xdWVyeSwgJ2Vycm9yX3N0cicgPT4gJHN0ciApOwoKCQlpZiAoICR0aGlzLT5zdXBwcmVzc19lcnJvcnMgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgoJCWlmICggJGNhbGxlciA9ICR0aGlzLT5nZXRfY2FsbGVyKCkgKQoJCQkkZXJyb3Jfc3RyID0gc3ByaW50ZiggX18oICdXb3JkUHJlc3MgZGF0YWJhc2UgZXJyb3IgJTEkcyBmb3IgcXVlcnkgJTIkcyBtYWRlIGJ5ICUzJHMnICksICRzdHIsICR0aGlzLT5sYXN0X3F1ZXJ5LCAkY2FsbGVyICk7CgkJZWxzZQoJCQkkZXJyb3Jfc3RyID0gc3ByaW50ZiggX18oICdXb3JkUHJlc3MgZGF0YWJhc2UgZXJyb3IgJTEkcyBmb3IgcXVlcnkgJTIkcycgKSwgJHN0ciwgJHRoaXMtPmxhc3RfcXVlcnkgKTsKCgkJZXJyb3JfbG9nKCAkZXJyb3Jfc3RyICk7CgoJCS8vIEFyZSB3ZSBzaG93aW5nIGVycm9ycz8KCQlpZiAoICEgJHRoaXMtPnNob3dfZXJyb3JzICkKCQkJcmV0dXJuIGZhbHNlOwoKCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciB0aGVuIHRha2Ugbm90ZSBvZiBpdAoJCWlmICggaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSRtc2cgPSBzcHJpbnRmKAoJCQkJIiVzIFslc11cbiVzXG4iLAoJCQkJX18oICdXb3JkUHJlc3MgZGF0YWJhc2UgZXJyb3I6JyApLAoJCQkJJHN0ciwKCQkJCSR0aGlzLT5sYXN0X3F1ZXJ5CgkJCSk7CgoJCQlpZiAoIGRlZmluZWQoICdFUlJPUkxPR0ZJTEUnICkgKSB7CgkJCQllcnJvcl9sb2coICRtc2csIDMsIEVSUk9STE9HRklMRSApOwoJCQl9CgkJCWlmICggZGVmaW5lZCggJ0RJRU9OREJFUlJPUicgKSApIHsKCQkJCXdwX2RpZSggJG1zZyApOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHN0ciAgID0gaHRtbHNwZWNpYWxjaGFycyggJHN0ciwgRU5UX1FVT1RFUyApOwoJCQkkcXVlcnkgPSBodG1sc3BlY2lhbGNoYXJzKCAkdGhpcy0+bGFzdF9xdWVyeSwgRU5UX1FVT1RFUyApOwoKCQkJcHJpbnRmKAoJCQkJJzxkaXYgaWQ9ImVycm9yIj48cCBjbGFzcz0id3BkYmVycm9yIj48c3Ryb25nPiVzPC9zdHJvbmc+IFslc108YnIgLz48Y29kZT4lczwvY29kZT48L3A+PC9kaXY+JywKCQkJCV9fKCAnV29yZFByZXNzIGRhdGFiYXNlIGVycm9yOicgKSwKCQkJCSRzdHIsCgkJCQkkcXVlcnkKCQkJKTsKCQl9Cgl9CgoJLyoqCgkgKiBFbmFibGVzIHNob3dpbmcgb2YgZGF0YWJhc2UgZXJyb3JzLgoJICoKCSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSB0byBlbmFibGUgc2hvd2luZyBvZiBlcnJvcnMuCgkgKiB3cGRiOjpoaWRlX2Vycm9ycygpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgZm9yIGhpZGluZyBvZiBlcnJvcnMuIEhvd2V2ZXIsCgkgKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBzaG93aW5nIG9mIGRhdGFiYXNlCgkgKiBlcnJvcnMuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBzZWUgd3BkYjo6aGlkZV9lcnJvcnMoKQoJICoKCSAqIEBwYXJhbSBib29sICRzaG93IFdoZXRoZXIgdG8gc2hvdyBvciBoaWRlIGVycm9ycwoJICogQHJldHVybiBib29sIE9sZCB2YWx1ZSBmb3Igc2hvd2luZyBlcnJvcnMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzaG93X2Vycm9ycyggJHNob3cgPSB0cnVlICkgewoJCSRlcnJvcnMgPSAkdGhpcy0+c2hvd19lcnJvcnM7CgkJJHRoaXMtPnNob3dfZXJyb3JzID0gJHNob3c7CgkJcmV0dXJuICRlcnJvcnM7Cgl9CgoJLyoqCgkgKiBEaXNhYmxlcyBzaG93aW5nIG9mIGRhdGFiYXNlIGVycm9ycy4KCSAqCgkgKiBCeSBkZWZhdWx0IGRhdGFiYXNlIGVycm9ycyBhcmUgbm90IHNob3duLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAc2VlIHdwZGI6OnNob3dfZXJyb3JzKCkKCSAqCgkgKiBAcmV0dXJuIGJvb2wgV2hldGhlciBzaG93aW5nIG9mIGVycm9ycyB3YXMgYWN0aXZlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBoaWRlX2Vycm9ycygpIHsKCQkkc2hvdyA9ICR0aGlzLT5zaG93X2Vycm9yczsKCQkkdGhpcy0+c2hvd19lcnJvcnMgPSBmYWxzZTsKCQlyZXR1cm4gJHNob3c7Cgl9CgoJLyoqCgkgKiBXaGV0aGVyIHRvIHN1cHByZXNzIGRhdGFiYXNlIGVycm9ycy4KCSAqCgkgKiBCeSBkZWZhdWx0IGRhdGFiYXNlIGVycm9ycyBhcmUgc3VwcHJlc3NlZCwgd2l0aCBhIHNpbXBsZQoJICogY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHRoZXkgY2FuIGJlIGVuYWJsZWQuCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAc2VlIHdwZGI6OmhpZGVfZXJyb3JzKCkKCSAqIEBwYXJhbSBib29sICRzdXBwcmVzcyBPcHRpb25hbC4gTmV3IHZhbHVlLiBEZWZhdWx0cyB0byB0cnVlLgoJICogQHJldHVybiBib29sIE9sZCB2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gc3VwcHJlc3NfZXJyb3JzKCAkc3VwcHJlc3MgPSB0cnVlICkgewoJCSRlcnJvcnMgPSAkdGhpcy0+c3VwcHJlc3NfZXJyb3JzOwoJCSR0aGlzLT5zdXBwcmVzc19lcnJvcnMgPSAoYm9vbCkgJHN1cHByZXNzOwoJCXJldHVybiAkZXJyb3JzOwoJfQoKCS8qKgoJICogS2lsbCBjYWNoZWQgcXVlcnkgcmVzdWx0cy4KCSAqCgkgKiBAc2luY2UgMC43MQoJICovCglwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7CgkJJHRoaXMtPmxhc3RfcmVzdWx0ID0gYXJyYXkoKTsKCQkkdGhpcy0+Y29sX2luZm8gICAgPSBudWxsOwoJCSR0aGlzLT5sYXN0X3F1ZXJ5ICA9IG51bGw7CgkJJHRoaXMtPnJvd3NfYWZmZWN0ZWQgPSAkdGhpcy0+bnVtX3Jvd3MgPSAwOwoJCSR0aGlzLT5sYXN0X2Vycm9yICA9ICcnOwoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICYmICR0aGlzLT5yZXN1bHQgaW5zdGFuY2VvZiBteXNxbGlfcmVzdWx0ICkgewoJCQlteXNxbGlfZnJlZV9yZXN1bHQoICR0aGlzLT5yZXN1bHQgKTsKCQkJJHRoaXMtPnJlc3VsdCA9IG51bGw7CgoJCQkvLyBTYW5pdHkgY2hlY2sgYmVmb3JlIHVzaW5nIHRoZSBoYW5kbGUKCQkJaWYgKCBlbXB0eSggJHRoaXMtPmRiaCApIHx8ICEoICR0aGlzLT5kYmggaW5zdGFuY2VvZiBteXNxbGkgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gQ2xlYXIgb3V0IGFueSByZXN1bHRzIGZyb20gYSBtdWx0aS1xdWVyeQoJCQl3aGlsZSAoIG15c3FsaV9tb3JlX3Jlc3VsdHMoICR0aGlzLT5kYmggKSApIHsKCQkJCW15c3FsaV9uZXh0X3Jlc3VsdCggJHRoaXMtPmRiaCApOwoJCQl9CgkJfSBlbHNlaWYgKCBpc19yZXNvdXJjZSggJHRoaXMtPnJlc3VsdCApICkgewoJCQlteXNxbF9mcmVlX3Jlc3VsdCggJHRoaXMtPnJlc3VsdCApOwoJCX0KCX0KCgkvKioKCSAqIENvbm5lY3QgdG8gYW5kIHNlbGVjdCBkYXRhYmFzZS4KCSAqCgkgKiBJZiAkYWxsb3dfYmFpbCBpcyBmYWxzZSwgdGhlIGxhY2sgb2YgZGF0YWJhc2UgY29ubmVjdGlvbiB3aWxsIG5lZWQKCSAqIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkuCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAc2luY2UgMy45LjAgJGFsbG93X2JhaWwgcGFyYW1ldGVyIGFkZGVkLgoJICoKCSAqIEBwYXJhbSBib29sICRhbGxvd19iYWlsIE9wdGlvbmFsLiBBbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIGJhaWwuIERlZmF1bHQgdHJ1ZS4KCSAqIEByZXR1cm4gYm9vbCBUcnVlIHdpdGggYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24sIGZhbHNlIG9uIGZhaWx1cmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkYl9jb25uZWN0KCAkYWxsb3dfYmFpbCA9IHRydWUgKSB7CgkJJHRoaXMtPmlzX215c3FsID0gdHJ1ZTsKCgkJLyoKCQkgKiBEZXByZWNhdGVkIGluIDMuOSsgd2hlbiB1c2luZyBNeVNRTGkuIE5vIGVxdWl2YWxlbnQKCQkgKiAkbmV3X2xpbmsgcGFyYW1ldGVyIGV4aXN0cyBmb3IgbXlzcWxpXyogZnVuY3Rpb25zLgoJCSAqLwoJCSRuZXdfbGluayA9IGRlZmluZWQoICdNWVNRTF9ORVdfTElOSycgKSA/IE1ZU1FMX05FV19MSU5LIDogdHJ1ZTsKCQkkY2xpZW50X2ZsYWdzID0gZGVmaW5lZCggJ01ZU1FMX0NMSUVOVF9GTEFHUycgKSA/IE1ZU1FMX0NMSUVOVF9GTEFHUyA6IDA7CgoJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCSR0aGlzLT5kYmggPSBteXNxbGlfaW5pdCgpOwoKCQkJLy8gbXlzcWxpX3JlYWxfY29ubmVjdCBkb2Vzbid0IHN1cHBvcnQgdGhlIGhvc3QgcGFyYW0gaW5jbHVkaW5nIGEgcG9ydCBvciBzb2NrZXQKCQkJLy8gbGlrZSBteXNxbF9jb25uZWN0IGRvZXMuIFRoaXMgZHVwbGljYXRlcyBob3cgbXlzcWxfY29ubmVjdCBkZXRlY3RzIGEgcG9ydCBhbmQvb3Igc29ja2V0IGZpbGUuCgkJCSRwb3J0ID0gbnVsbDsKCQkJJHNvY2tldCA9IG51bGw7CgkJCSRob3N0ID0gJHRoaXMtPmRiaG9zdDsKCQkJJHBvcnRfb3Jfc29ja2V0ID0gc3Ryc3RyKCAkaG9zdCwgJzonICk7CgkJCWlmICggISBlbXB0eSggJHBvcnRfb3Jfc29ja2V0ICkgKSB7CgkJCQkkaG9zdCA9IHN1YnN0ciggJGhvc3QsIDAsIHN0cnBvcyggJGhvc3QsICc6JyApICk7CgkJCQkkcG9ydF9vcl9zb2NrZXQgPSBzdWJzdHIoICRwb3J0X29yX3NvY2tldCwgMSApOwoJCQkJaWYgKCAwICE9PSBzdHJwb3MoICRwb3J0X29yX3NvY2tldCwgJy8nICkgKSB7CgkJCQkJJHBvcnQgPSBpbnR2YWwoICRwb3J0X29yX3NvY2tldCApOwoJCQkJCSRtYXliZV9zb2NrZXQgPSBzdHJzdHIoICRwb3J0X29yX3NvY2tldCwgJzonICk7CgkJCQkJaWYgKCAhIGVtcHR5KCAkbWF5YmVfc29ja2V0ICkgKSB7CgkJCQkJCSRzb2NrZXQgPSBzdWJzdHIoICRtYXliZV9zb2NrZXQsIDEgKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSRzb2NrZXQgPSAkcG9ydF9vcl9zb2NrZXQ7CgkJCQl9CgkJCX0KCgkJCWlmICggV1BfREVCVUcgKSB7CgkJCQlteXNxbGlfcmVhbF9jb25uZWN0KCAkdGhpcy0+ZGJoLCAkaG9zdCwgJHRoaXMtPmRidXNlciwgJHRoaXMtPmRicGFzc3dvcmQsIG51bGwsICRwb3J0LCAkc29ja2V0LCAkY2xpZW50X2ZsYWdzICk7CgkJCX0gZWxzZSB7CgkJCQlAbXlzcWxpX3JlYWxfY29ubmVjdCggJHRoaXMtPmRiaCwgJGhvc3QsICR0aGlzLT5kYnVzZXIsICR0aGlzLT5kYnBhc3N3b3JkLCBudWxsLCAkcG9ydCwgJHNvY2tldCwgJGNsaWVudF9mbGFncyApOwoJCQl9CgoJCQlpZiAoICR0aGlzLT5kYmgtPmNvbm5lY3RfZXJybm8gKSB7CgkJCQkkdGhpcy0+ZGJoID0gbnVsbDsKCgkJCQkvKiBJdCdzIHBvc3NpYmxlIGV4dC9teXNxbGkgaXMgbWlzY29uZmlndXJlZC4gRmFsbCBiYWNrIHRvIGV4dC9teXNxbCBpZjoKCQkgCQkgKiAgLSBXZSBoYXZlbid0IHByZXZpb3VzbHkgY29ubmVjdGVkLCBhbmQKCQkgCQkgKiAgLSBXUF9VU0VfRVhUX01ZU1FMIGlzbid0IHNldCB0byBmYWxzZSwgYW5kCgkJIAkJICogIC0gZXh0L215c3FsIGlzIGxvYWRlZC4KCQkgCQkgKi8KCQkJCSRhdHRlbXB0X2ZhbGxiYWNrID0gdHJ1ZTsKCgkJCQlpZiAoICR0aGlzLT5oYXNfY29ubmVjdGVkICkgewoJCQkJCSRhdHRlbXB0X2ZhbGxiYWNrID0gZmFsc2U7CgkJCQl9IGVsc2VpZiAoIGRlZmluZWQoICdXUF9VU0VfRVhUX01ZU1FMJyApICYmICEgV1BfVVNFX0VYVF9NWVNRTCApIHsKCQkJCQkkYXR0ZW1wdF9mYWxsYmFjayA9IGZhbHNlOwoJCQkJfSBlbHNlaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ215c3FsX2Nvbm5lY3QnICkgKSB7CgkJCQkJJGF0dGVtcHRfZmFsbGJhY2sgPSBmYWxzZTsKCQkJCX0KCgkJCQlpZiAoICRhdHRlbXB0X2ZhbGxiYWNrICkgewoJCQkJCSR0aGlzLT51c2VfbXlzcWxpID0gZmFsc2U7CgkJCQkJcmV0dXJuICR0aGlzLT5kYl9jb25uZWN0KCAkYWxsb3dfYmFpbCApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCBXUF9ERUJVRyApIHsKCQkJCSR0aGlzLT5kYmggPSBteXNxbF9jb25uZWN0KCAkdGhpcy0+ZGJob3N0LCAkdGhpcy0+ZGJ1c2VyLCAkdGhpcy0+ZGJwYXNzd29yZCwgJG5ld19saW5rLCAkY2xpZW50X2ZsYWdzICk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGJoID0gQG15c3FsX2Nvbm5lY3QoICR0aGlzLT5kYmhvc3QsICR0aGlzLT5kYnVzZXIsICR0aGlzLT5kYnBhc3N3b3JkLCAkbmV3X2xpbmssICRjbGllbnRfZmxhZ3MgKTsKCQkJfQoJCX0KCgkJaWYgKCAhICR0aGlzLT5kYmggJiYgJGFsbG93X2JhaWwgKSB7CgkJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgoJCQkvLyBMb2FkIGN1c3RvbSBEQiBlcnJvciB0ZW1wbGF0ZSwgaWYgcHJlc2VudC4KCQkJaWYgKCBmaWxlX2V4aXN0cyggV1BfQ09OVEVOVF9ESVIgLiAnL2RiLWVycm9yLnBocCcgKSApIHsKCQkJCXJlcXVpcmVfb25jZSggV1BfQ09OVEVOVF9ESVIgLiAnL2RiLWVycm9yLnBocCcgKTsKCQkJCWRpZSgpOwoJCQl9CgoJCQkkbWVzc2FnZSA9ICc8aDE+JyAuIF9fKCAnRXJyb3IgZXN0YWJsaXNoaW5nIGEgZGF0YWJhc2UgY29ubmVjdGlvbicgKSAuICI8L2gxPlxuIjsKCgkJCSRtZXNzYWdlIC49ICc8cD4nIC4gc3ByaW50ZigKCQkJCS8qIHRyYW5zbGF0b3JzOiAxOiB3cC1jb25maWcucGhwLiAyOiBkYXRhYmFzZSBob3N0ICovCgkJCQlfXyggJ1RoaXMgZWl0aGVyIG1lYW5zIHRoYXQgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbmZvcm1hdGlvbiBpbiB5b3VyICUxJHMgZmlsZSBpcyBpbmNvcnJlY3Qgb3Igd2UgY2FuJiM4MjE3O3QgY29udGFjdCB0aGUgZGF0YWJhc2Ugc2VydmVyIGF0ICUyJHMuIFRoaXMgY291bGQgbWVhbiB5b3VyIGhvc3QmIzgyMTc7cyBkYXRhYmFzZSBzZXJ2ZXIgaXMgZG93bi4nICksCgkJCQknPGNvZGU+d3AtY29uZmlnLnBocDwvY29kZT4nLAoJCQkJJzxjb2RlPicgLiBodG1sc3BlY2lhbGNoYXJzKCAkdGhpcy0+ZGJob3N0LCBFTlRfUVVPVEVTICkgLiAnPC9jb2RlPicKCQkJKSAuICI8L3A+XG4iOwoKCQkJJG1lc3NhZ2UgLj0gIjx1bD5cbiI7CgkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIHlvdSBoYXZlIHRoZSBjb3JyZWN0IHVzZXJuYW1lIGFuZCBwYXNzd29yZD8nICkgLiAiPC9saT5cbiI7CgkJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIHRoYXQgeW91IGhhdmUgdHlwZWQgdGhlIGNvcnJlY3QgaG9zdG5hbWU/JyApIC4gIjwvbGk+XG4iOwoJCQkkbWVzc2FnZSAuPSAnPGxpPicgLiBfXyggJ0FyZSB5b3Ugc3VyZSB0aGF0IHRoZSBkYXRhYmFzZSBzZXJ2ZXIgaXMgcnVubmluZz8nICkgLiAiPC9saT5cbiI7CgkJCSRtZXNzYWdlIC49ICI8L3VsPlxuIjsKCgkJCSRtZXNzYWdlIC49ICc8cD4nIC4gc3ByaW50ZigKCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogc3VwcG9ydCBmb3J1bXMgVVJMICovCgkJCQlfXyggJ0lmIHlvdSYjODIxNztyZSB1bnN1cmUgd2hhdCB0aGVzZSB0ZXJtcyBtZWFuIHlvdSBzaG91bGQgcHJvYmFibHkgY29udGFjdCB5b3VyIGhvc3QuIElmIHlvdSBzdGlsbCBuZWVkIGhlbHAgeW91IGNhbiBhbHdheXMgdmlzaXQgdGhlIDxhIGhyZWY9IiVzIj5Xb3JkUHJlc3MgU3VwcG9ydCBGb3J1bXM8L2E+LicgKSwKCQkJCV9fKCAnaHR0cHM6Ly93b3JkcHJlc3Mub3JnL3N1cHBvcnQvJyApCgkJCSkgLiAiPC9wPlxuIjsKCgkJCSR0aGlzLT5iYWlsKCAkbWVzc2FnZSwgJ2RiX2Nvbm5lY3RfZmFpbCcgKTsKCgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2VpZiAoICR0aGlzLT5kYmggKSB7CgkJCWlmICggISAkdGhpcy0+aGFzX2Nvbm5lY3RlZCApIHsKCQkJCSR0aGlzLT5pbml0X2NoYXJzZXQoKTsKCQkJfQoKCQkJJHRoaXMtPmhhc19jb25uZWN0ZWQgPSB0cnVlOwoKCQkJJHRoaXMtPnNldF9jaGFyc2V0KCAkdGhpcy0+ZGJoICk7CgoJCQkkdGhpcy0+cmVhZHkgPSB0cnVlOwoJCQkkdGhpcy0+c2V0X3NxbF9tb2RlKCk7CgkJCSR0aGlzLT5zZWxlY3QoICR0aGlzLT5kYm5hbWUsICR0aGlzLT5kYmggKTsKCgkJCXJldHVybiB0cnVlOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQ2hlY2sgdGhhdCB0aGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgc3RpbGwgdXAuIElmIG5vdCwgdHJ5IHRvIHJlY29ubmVjdC4KCSAqCgkgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byByZWNvbm5lY3QsIGl0IHdpbGwgZm9yY2libHkgZGllLCBvciBpZiBhZnRlciB0aGUKCSAqIHRoZSB0ZW1wbGF0ZV9yZWRpcmVjdCBob29rIGhhcyBiZWVuIGZpcmVkLCByZXR1cm4gZmFsc2UgaW5zdGVhZC4KCSAqCgkgKiBJZiAkYWxsb3dfYmFpbCBpcyBmYWxzZSwgdGhlIGxhY2sgb2YgZGF0YWJhc2UgY29ubmVjdGlvbiB3aWxsIG5lZWQKCSAqIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkuCgkgKgoJICogQHNpbmNlIDMuOS4wCgkgKgoJICogQHBhcmFtIGJvb2wgJGFsbG93X2JhaWwgT3B0aW9uYWwuIEFsbG93cyB0aGUgZnVuY3Rpb24gdG8gYmFpbC4gRGVmYXVsdCB0cnVlLgoJICogQHJldHVybiBib29sfHZvaWQgVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyB1cC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNoZWNrX2Nvbm5lY3Rpb24oICRhbGxvd19iYWlsID0gdHJ1ZSApIHsKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQlpZiAoIEBteXNxbGlfcGluZyggJHRoaXMtPmRiaCApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoIEBteXNxbF9waW5nKCAkdGhpcy0+ZGJoICkgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJJGVycm9yX3JlcG9ydGluZyA9IGZhbHNlOwoKCQkvLyBEaXNhYmxlIHdhcm5pbmdzLCBhcyB3ZSBkb24ndCB3YW50IHRvIHNlZSBhIG11bHRpdHVkZSBvZiAidW5hYmxlIHRvIGNvbm5lY3QiIG1lc3NhZ2VzCgkJaWYgKCBXUF9ERUJVRyApIHsKCQkJJGVycm9yX3JlcG9ydGluZyA9IGVycm9yX3JlcG9ydGluZygpOwoJCQllcnJvcl9yZXBvcnRpbmcoICRlcnJvcl9yZXBvcnRpbmcgJiB+RV9XQVJOSU5HICk7CgkJfQoKCQlmb3IgKCAkdHJpZXMgPSAxOyAkdHJpZXMgPD0gJHRoaXMtPnJlY29ubmVjdF9yZXRyaWVzOyAkdHJpZXMrKyApIHsKCQkJLy8gT24gdGhlIGxhc3QgdHJ5LCByZS1lbmFibGUgd2FybmluZ3MuIFdlIHdhbnQgdG8gc2VlIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZQoJCQkvLyAidW5hYmxlIHRvIGNvbm5lY3QiIG1lc3NhZ2Ugb24gdGhlIGJhaWwoKSBzY3JlZW4sIGlmIGl0IGFwcGVhcnMuCgkJCWlmICggJHRoaXMtPnJlY29ubmVjdF9yZXRyaWVzID09PSAkdHJpZXMgJiYgV1BfREVCVUcgKSB7CgkJCQllcnJvcl9yZXBvcnRpbmcoICRlcnJvcl9yZXBvcnRpbmcgKTsKCQkJfQoKCQkJaWYgKCAkdGhpcy0+ZGJfY29ubmVjdCggZmFsc2UgKSApIHsKCQkJCWlmICggJGVycm9yX3JlcG9ydGluZyApIHsKCQkJCQllcnJvcl9yZXBvcnRpbmcoICRlcnJvcl9yZXBvcnRpbmcgKTsKCQkJCX0KCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJc2xlZXAoIDEgKTsKCQl9CgoJCS8vIElmIHRlbXBsYXRlX3JlZGlyZWN0IGhhcyBhbHJlYWR5IGhhcHBlbmVkLCBpdCdzIHRvbyBsYXRlIGZvciB3cF9kaWUoKS9kZWFkX2RiKCkuCgkJLy8gTGV0J3MganVzdCByZXR1cm4gYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgoJCWlmICggZGlkX2FjdGlvbiggJ3RlbXBsYXRlX3JlZGlyZWN0JyApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoICEgJGFsbG93X2JhaWwgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgoJCSRtZXNzYWdlID0gJzxoMT4nIC4gX18oICdFcnJvciByZWNvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlJyApIC4gIjwvaDE+XG4iOwoKCQkkbWVzc2FnZSAuPSAnPHA+JyAuIHNwcmludGYoCgkJCS8qIHRyYW5zbGF0b3JzOiAlczogZGF0YWJhc2UgaG9zdCAqLwoJCQlfXyggJ1RoaXMgbWVhbnMgdGhhdCB3ZSBsb3N0IGNvbnRhY3Qgd2l0aCB0aGUgZGF0YWJhc2Ugc2VydmVyIGF0ICVzLiBUaGlzIGNvdWxkIG1lYW4geW91ciBob3N0JiM4MjE3O3MgZGF0YWJhc2Ugc2VydmVyIGlzIGRvd24uJyApLAoJCQknPGNvZGU+JyAuIGh0bWxzcGVjaWFsY2hhcnMoICR0aGlzLT5kYmhvc3QsIEVOVF9RVU9URVMgKSAuICc8L2NvZGU+JwoJCSkgLiAiPC9wPlxuIjsKCgkJJG1lc3NhZ2UgLj0gIjx1bD5cbiI7CgkJJG1lc3NhZ2UgLj0gJzxsaT4nIC4gX18oICdBcmUgeW91IHN1cmUgdGhhdCB0aGUgZGF0YWJhc2Ugc2VydmVyIGlzIHJ1bm5pbmc/JyApIC4gIjwvbGk+XG4iOwoJCSRtZXNzYWdlIC49ICc8bGk+JyAuIF9fKCAnQXJlIHlvdSBzdXJlIHRoYXQgdGhlIGRhdGFiYXNlIHNlcnZlciBpcyBub3QgdW5kZXIgcGFydGljdWxhcmx5IGhlYXZ5IGxvYWQ/JyApIC4gIjwvbGk+XG4iOwoJCSRtZXNzYWdlIC49ICI8L3VsPlxuIjsKCgkJJG1lc3NhZ2UgLj0gJzxwPicgLiBzcHJpbnRmKAoJCQkvKiB0cmFuc2xhdG9yczogJXM6IHN1cHBvcnQgZm9ydW1zIFVSTCAqLwoJCQlfXyggJ0lmIHlvdSYjODIxNztyZSB1bnN1cmUgd2hhdCB0aGVzZSB0ZXJtcyBtZWFuIHlvdSBzaG91bGQgcHJvYmFibHkgY29udGFjdCB5b3VyIGhvc3QuIElmIHlvdSBzdGlsbCBuZWVkIGhlbHAgeW91IGNhbiBhbHdheXMgdmlzaXQgdGhlIDxhIGhyZWY9IiVzIj5Xb3JkUHJlc3MgU3VwcG9ydCBGb3J1bXM8L2E+LicgKSwKCQkJX18oICdodHRwczovL3dvcmRwcmVzcy5vcmcvc3VwcG9ydC8nICkKCQkpIC4gIjwvcD5cbiI7CgoJCS8vIFdlIHdlcmVuJ3QgYWJsZSB0byByZWNvbm5lY3QsIHNvIHdlIGJldHRlciBiYWlsLgoJCSR0aGlzLT5iYWlsKCAkbWVzc2FnZSwgJ2RiX2Nvbm5lY3RfZmFpbCcgKTsKCgkJLy8gQ2FsbCBkZWFkX2RiKCkgaWYgYmFpbCBkaWRuJ3QgZGllLCBiZWNhdXNlIHRoaXMgZGF0YWJhc2UgaXMgbm8gbW9yZS4gSXQgaGFzIGNlYXNlZCB0byBiZSAoYXQgbGVhc3QgdGVtcG9yYXJpbHkpLgoJCWRlYWRfZGIoKTsKCX0KCgkvKioKCSAqIFBlcmZvcm0gYSBNeVNRTCBkYXRhYmFzZSBxdWVyeSwgdXNpbmcgY3VycmVudCBkYXRhYmFzZSBjb25uZWN0aW9uLgoJICoKCSAqIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIG9uIHRoZSBjb2RleCBwYWdlLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgRGF0YWJhc2UgcXVlcnkKCSAqIEByZXR1cm4gaW50fGZhbHNlIE51bWJlciBvZiByb3dzIGFmZmVjdGVkL3NlbGVjdGVkIG9yIGZhbHNlIG9uIGVycm9yCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBxdWVyeSggJHF1ZXJ5ICkgewoJCWlmICggISAkdGhpcy0+cmVhZHkgKSB7CgkJCS8vIEJhY2t1cEJ1ZGR5OiBSZW1vdmVkIGZvbGxvd2luZyBsaW5lLgoJCQkvLyR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gdHJ1ZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLyoqCgkJICogRmlsdGVyIHRoZSBkYXRhYmFzZSBxdWVyeS4KCQkgKgoJCSAqIFNvbWUgcXVlcmllcyBhcmUgbWFkZSBiZWZvcmUgdGhlIHBsdWdpbnMgaGF2ZSBiZWVuIGxvYWRlZCwKCQkgKiBhbmQgdGh1cyBjYW5ub3QgYmUgZmlsdGVyZWQgd2l0aCB0aGlzIG1ldGhvZC4KCQkgKgoJCSAqIEBzaW5jZSAyLjEuMAoJCSAqCgkJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgRGF0YWJhc2UgcXVlcnkuCgkJICovCgkJJHF1ZXJ5ID0gYXBwbHlfZmlsdGVycyggJ3F1ZXJ5JywgJHF1ZXJ5ICk7CgoJCSR0aGlzLT5mbHVzaCgpOwoKCQkvLyBMb2cgaG93IHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkCgkJJHRoaXMtPmZ1bmNfY2FsbCA9ICJcJGRiLT5xdWVyeShcIiRxdWVyeVwiKSI7CgoJCS8vIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhlIGRhdGFiYXNlLCBtYWtlIHN1cmUgdGhlIHF1ZXJ5IHdpbGwgd3JpdGUgc2FmZWx5LgoJCWlmICggJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgJiYgISAkdGhpcy0+Y2hlY2tfYXNjaWkoICRxdWVyeSApICkgewoJCQkkc3RyaXBwZWRfcXVlcnkgPSAkdGhpcy0+c3RyaXBfaW52YWxpZF90ZXh0X2Zyb21fcXVlcnkoICRxdWVyeSApOwoJCQkvLyBzdHJpcF9pbnZhbGlkX3RleHRfZnJvbV9xdWVyeSgpIGNhbiBwZXJmb3JtIHF1ZXJpZXMsIHNvIHdlIG5lZWQKCQkJLy8gdG8gZmx1c2ggYWdhaW4sIGp1c3QgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgY2xlYXIuCgkJCSR0aGlzLT5mbHVzaCgpOwoJCQlpZiAoICRzdHJpcHBlZF9xdWVyeSAhPT0gJHF1ZXJ5ICkgewoJCQkJJHRoaXMtPmluc2VydF9pZCA9IDA7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCS8vIEJhY2t1cEJ1ZGR5OiBDaGFuZ2VkIGZvbGxvd2luZyBsaW5lIGZyb20gdHJ1ZSB0byBmYWxzZS4gRG9uJ3QgcnVuIHRoaXMgY2hlY2sgZXZlciBkdXJpbmcgaW1wb3J0LgoJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7IC8vIHdhczogdHJ1ZQoKCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHF1ZXJ5IGZvciBkZWJ1Zy4uCgkJJHRoaXMtPmxhc3RfcXVlcnkgPSAkcXVlcnk7CgoJCSR0aGlzLT5fZG9fcXVlcnkoICRxdWVyeSApOwoKCQkvLyBNeVNRTCBzZXJ2ZXIgaGFzIGdvbmUgYXdheSwgdHJ5IHRvIHJlY29ubmVjdAoJCSRteXNxbF9lcnJubyA9IDA7CgkJaWYgKCAhIGVtcHR5KCAkdGhpcy0+ZGJoICkgKSB7CgkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCQkkbXlzcWxfZXJybm8gPSBteXNxbGlfZXJybm8oICR0aGlzLT5kYmggKTsKCQkJfSBlbHNlIHsKCQkJCSRteXNxbF9lcnJubyA9IG15c3FsX2Vycm5vKCAkdGhpcy0+ZGJoICk7CgkJCX0KCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT5kYmggKSB8fCAyMDA2ID09ICRteXNxbF9lcnJubyApIHsKCQkJaWYgKCAkdGhpcy0+Y2hlY2tfY29ubmVjdGlvbigpICkgewoJCQkJJHRoaXMtPl9kb19xdWVyeSggJHF1ZXJ5ICk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+aW5zZXJ0X2lkID0gMDsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJLy8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhlbiB0YWtlIG5vdGUgb2YgaXQuLgoJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCSR0aGlzLT5sYXN0X2Vycm9yID0gbXlzcWxpX2Vycm9yKCAkdGhpcy0+ZGJoICk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmxhc3RfZXJyb3IgPSBteXNxbF9lcnJvciggJHRoaXMtPmRiaCApOwoJCX0KCgkJaWYgKCAkdGhpcy0+bGFzdF9lcnJvciApIHsKCQkJLy8gQ2xlYXIgaW5zZXJ0X2lkIG9uIGEgc3Vic2VxdWVudCBmYWlsZWQgaW5zZXJ0LgoJCQlpZiAoICR0aGlzLT5pbnNlcnRfaWQgJiYgcHJlZ19tYXRjaCggJy9eXHMqKGluc2VydHxyZXBsYWNlKVxzL2knLCAkcXVlcnkgKSApCgkJCQkkdGhpcy0+aW5zZXJ0X2lkID0gMDsKCgkJCSR0aGlzLT5wcmludF9lcnJvcigpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKihjcmVhdGV8YWx0ZXJ8dHJ1bmNhdGV8ZHJvcClccy9pJywgJHF1ZXJ5ICkgKSB7CgkJCSRyZXR1cm5fdmFsID0gJHRoaXMtPnJlc3VsdDsKCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKihpbnNlcnR8ZGVsZXRlfHVwZGF0ZXxyZXBsYWNlKVxzL2knLCAkcXVlcnkgKSApIHsKCQkJaWYgKCAkdGhpcy0+dXNlX215c3FsaSApIHsKCQkJCSR0aGlzLT5yb3dzX2FmZmVjdGVkID0gbXlzcWxpX2FmZmVjdGVkX3Jvd3MoICR0aGlzLT5kYmggKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5yb3dzX2FmZmVjdGVkID0gbXlzcWxfYWZmZWN0ZWRfcm93cyggJHRoaXMtPmRiaCApOwoJCQl9CgkJCS8vIFRha2Ugbm90ZSBvZiB0aGUgaW5zZXJ0X2lkCgkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKGluc2VydHxyZXBsYWNlKVxzL2knLCAkcXVlcnkgKSApIHsKCQkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgKSB7CgkJCQkJJHRoaXMtPmluc2VydF9pZCA9IG15c3FsaV9pbnNlcnRfaWQoICR0aGlzLT5kYmggKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmluc2VydF9pZCA9IG15c3FsX2luc2VydF9pZCggJHRoaXMtPmRiaCApOwoJCQkJfQoJCQl9CgkJCS8vIFJldHVybiBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZAoJCQkkcmV0dXJuX3ZhbCA9ICR0aGlzLT5yb3dzX2FmZmVjdGVkOwoJCX0gZWxzZSB7CgkJCSRudW1fcm93cyA9IDA7CgkJCWlmICggJHRoaXMtPnVzZV9teXNxbGkgJiYgJHRoaXMtPnJlc3VsdCBpbnN0YW5jZW9mIG15c3FsaV9yZXN1bHQgKSB7CgkJCQl3aGlsZSAoICRyb3cgPSBAbXlzcWxpX2ZldGNoX29iamVjdCggJHRoaXMtPnJlc3VsdCApICkgewoJCQkJCSR0aGlzLT5sYXN0X3Jlc3VsdFskbnVtX3Jvd3NdID0gJHJvdzsKCQkJCQkkbnVtX3Jvd3MrKzsKCQkJCX0KCQkJfSBlbHNlaWYgKCBpc19yZXNvdXJjZSggJHRoaXMtPnJlc3VsdCApICkgewoJCQkJd2hpbGUgKCAkcm93ID0gQG15c3FsX2ZldGNoX29iamVjdCggJHRoaXMtPnJlc3VsdCApICkgewoJCQkJCSR0aGlzLT5sYXN0X3Jlc3VsdFskbnVtX3Jvd3NdID0gJHJvdzsKCQkJCQkkbnVtX3Jvd3MrKzsKCQkJCX0KCQkJfQoKCQkJLy8gTG9nIG51bWJlciBvZiByb3dzIHRoZSBxdWVyeSByZXR1cm5lZAoJCQkvLyBhbmQgcmV0dXJuIG51bWJlciBvZiByb3dzIHNlbGVjdGVkCgkJCSR0aGlzLT5udW1fcm93cyA9ICRudW1fcm93czsKCQkJJHJldHVybl92YWwgICAgID0gJG51bV9yb3dzOwoJCX0KCgkJcmV0dXJuICRyZXR1cm5fdmFsOwoJfQoKCS8qKgoJICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgbXlzcWxfcXVlcnkoKSBjYWxsLgoJICoKCSAqIEBzaW5jZSAzLjkuMAoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSB3cGRiOjpxdWVyeSgpCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgVGhlIHF1ZXJ5IHRvIHJ1bi4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfZG9fcXVlcnkoICRxdWVyeSApIHsKCQlpZiAoIGRlZmluZWQoICdTQVZFUVVFUklFUycgKSAmJiBTQVZFUVVFUklFUyApIHsKCQkJJHRoaXMtPnRpbWVyX3N0YXJ0KCk7CgkJfQoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkkdGhpcy0+cmVzdWx0ID0gQG15c3FsaV9xdWVyeSggJHRoaXMtPmRiaCwgJHF1ZXJ5ICk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnJlc3VsdCA9IEBteXNxbF9xdWVyeSggJHF1ZXJ5LCAkdGhpcy0+ZGJoICk7CgkJfQoJCSR0aGlzLT5udW1fcXVlcmllcysrOwoKCQlpZiAoIGRlZmluZWQoICdTQVZFUVVFUklFUycgKSAmJiBTQVZFUVVFUklFUyApIHsKCQkJJHRoaXMtPnF1ZXJpZXNbXSA9IGFycmF5KCAkcXVlcnksICR0aGlzLT50aW1lcl9zdG9wKCksICR0aGlzLT5nZXRfY2FsbGVyKCkgKTsKCQl9Cgl9CgoJLyoqCgkgKiBJbnNlcnQgYSByb3cgaW50byBhIHRhYmxlLgoJICoKCSAqICAgICB3cGRiOjppbnNlcnQoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAnYmFyJyApICkKCSAqICAgICB3cGRiOjppbnNlcnQoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAxMzM3ICksIGFycmF5KCAnJXMnLCAnJWQnICkgKQoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHRhYmxlICBUYWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgICAgICAgICRkYXRhICAgRGF0YSB0byBpbnNlcnQgKGluIGNvbHVtbiA9PiB2YWx1ZSBwYWlycykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm90aCAkZGF0YSBjb2x1bW5zIGFuZCAkZGF0YSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciIChuZWl0aGVyIHNob3VsZCBiZSBTUUwgZXNjYXBlZCkuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZGluZyBhIG51bGwgdmFsdWUgd2lsbCBjYXVzZSB0aGUgY29sdW1uIHRvIGJlIHNldCB0byBOVUxMIC0gdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkZm9ybWF0IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBmb3JtYXRzIHRvIGJlIG1hcHBlZCB0byBlYWNoIG9mIHRoZSB2YWx1ZSBpbiAkZGF0YS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzdHJpbmcsIHRoYXQgZm9ybWF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gJGRhdGEuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGFsbCB2YWx1ZXMgaW4gJGRhdGEgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgaW4gd3BkYjo6JGZpZWxkX3R5cGVzLgoJICogQHJldHVybiBpbnR8ZmFsc2UgVGhlIG51bWJlciBvZiByb3dzIGluc2VydGVkLCBvciBmYWxzZSBvbiBlcnJvci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGluc2VydCggJHRhYmxlLCAkZGF0YSwgJGZvcm1hdCA9IG51bGwgKSB7CgkJcmV0dXJuICR0aGlzLT5faW5zZXJ0X3JlcGxhY2VfaGVscGVyKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0LCAnSU5TRVJUJyApOwoJfQoKCS8qKgoJICogUmVwbGFjZSBhIHJvdyBpbnRvIGEgdGFibGUuCgkgKgoJICogICAgIHdwZGI6OnJlcGxhY2UoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAnYmFyJyApICkKCSAqICAgICB3cGRiOjpyZXBsYWNlKCAndGFibGUnLCBhcnJheSggJ2NvbHVtbicgPT4gJ2ZvbycsICdmaWVsZCcgPT4gMTMzNyApLCBhcnJheSggJyVzJywgJyVkJyApICkKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBzZWUgd3BkYjo6cHJlcGFyZSgpCgkgKiBAc2VlIHdwZGI6OiRmaWVsZF90eXBlcwoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICR0YWJsZSAgVGFibGUgbmFtZQoJICogQHBhcmFtIGFycmF5ICAgICAgICAkZGF0YSAgIERhdGEgdG8gaW5zZXJ0IChpbiBjb2x1bW4gPT4gdmFsdWUgcGFpcnMpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggJGRhdGEgY29sdW1ucyBhbmQgJGRhdGEgdmFsdWVzIHNob3VsZCBiZSAicmF3IiAobmVpdGhlciBzaG91bGQgYmUgU1FMIGVzY2FwZWQpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRpbmcgYSBudWxsIHZhbHVlIHdpbGwgY2F1c2UgdGhlIGNvbHVtbiB0byBiZSBzZXQgdG8gTlVMTCAtIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KCSAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZvcm1hdCBPcHRpb25hbC4gQW4gYXJyYXkgb2YgZm9ybWF0cyB0byBiZSBtYXBwZWQgdG8gZWFjaCBvZiB0aGUgdmFsdWUgaW4gJGRhdGEuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc3RyaW5nLCB0aGF0IGZvcm1hdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCBvZiB0aGUgdmFsdWVzIGluICRkYXRhLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgZm9ybWF0IGlzIG9uZSBvZiAnJWQnLCAnJWYnLCAnJXMnIChpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nKS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICRkYXRhIHdpbGwgYmUgdHJlYXRlZCBhcyBzdHJpbmdzIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGluIHdwZGI6OiRmaWVsZF90eXBlcy4KCSAqIEByZXR1cm4gaW50fGZhbHNlIFRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCwgb3IgZmFsc2Ugb24gZXJyb3IuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0ID0gbnVsbCApIHsKCQlyZXR1cm4gJHRoaXMtPl9pbnNlcnRfcmVwbGFjZV9oZWxwZXIoICR0YWJsZSwgJGRhdGEsICRmb3JtYXQsICdSRVBMQUNFJyApOwoJfQoKCS8qKgoJICogSGVscGVyIGZ1bmN0aW9uIGZvciBpbnNlcnQgYW5kIHJlcGxhY2UuCgkgKgoJICogUnVucyBhbiBpbnNlcnQgb3IgcmVwbGFjZSBxdWVyeSBiYXNlZCBvbiAkdHlwZSBhcmd1bWVudC4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzaW5jZSAzLjAuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHRhYmxlICBUYWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgICAgICAgICRkYXRhICAgRGF0YSB0byBpbnNlcnQgKGluIGNvbHVtbiA9PiB2YWx1ZSBwYWlycykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm90aCAkZGF0YSBjb2x1bW5zIGFuZCAkZGF0YSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciIChuZWl0aGVyIHNob3VsZCBiZSBTUUwgZXNjYXBlZCkuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZGluZyBhIG51bGwgdmFsdWUgd2lsbCBjYXVzZSB0aGUgY29sdW1uIHRvIGJlIHNldCB0byBOVUxMIC0gdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkZm9ybWF0IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBmb3JtYXRzIHRvIGJlIG1hcHBlZCB0byBlYWNoIG9mIHRoZSB2YWx1ZSBpbiAkZGF0YS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzdHJpbmcsIHRoYXQgZm9ybWF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gJGRhdGEuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGFsbCB2YWx1ZXMgaW4gJGRhdGEgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgaW4gd3BkYjo6JGZpZWxkX3R5cGVzLgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSAgICAgICAgIE9wdGlvbmFsLiBXaGF0IHR5cGUgb2Ygb3BlcmF0aW9uIGlzIHRoaXM/IElOU0VSVCBvciBSRVBMQUNFLiBEZWZhdWx0cyB0byBJTlNFUlQuCgkgKiBAcmV0dXJuIGludHxmYWxzZSBUaGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQsIG9yIGZhbHNlIG9uIGVycm9yLgoJICovCglmdW5jdGlvbiBfaW5zZXJ0X3JlcGxhY2VfaGVscGVyKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0ID0gbnVsbCwgJHR5cGUgPSAnSU5TRVJUJyApIHsKCQkkdGhpcy0+aW5zZXJ0X2lkID0gMDsKCgkJaWYgKCAhIGluX2FycmF5KCBzdHJ0b3VwcGVyKCAkdHlwZSApLCBhcnJheSggJ1JFUExBQ0UnLCAnSU5TRVJUJyApICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRkYXRhID0gJHRoaXMtPnByb2Nlc3NfZmllbGRzKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0ICk7CgkJaWYgKCBmYWxzZSA9PT0gJGRhdGEgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRmb3JtYXRzID0gJHZhbHVlcyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoICRkYXRhIGFzICR2YWx1ZSApIHsKCQkJaWYgKCBpc19udWxsKCAkdmFsdWVbJ3ZhbHVlJ10gKSApIHsKCQkJCSRmb3JtYXRzW10gPSAnTlVMTCc7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJGZvcm1hdHNbXSA9ICR2YWx1ZVsnZm9ybWF0J107CgkJCSR2YWx1ZXNbXSAgPSAkdmFsdWVbJ3ZhbHVlJ107CgkJfQoKCQkkZmllbGRzICA9ICdgJyAuIGltcGxvZGUoICdgLCBgJywgYXJyYXlfa2V5cyggJGRhdGEgKSApIC4gJ2AnOwoJCSRmb3JtYXRzID0gaW1wbG9kZSggJywgJywgJGZvcm1hdHMgKTsKCgkJJHNxbCA9ICIkdHlwZSBJTlRPIGAkdGFibGVgICgkZmllbGRzKSBWQUxVRVMgKCRmb3JtYXRzKSI7CgoJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7CgkJcmV0dXJuICR0aGlzLT5xdWVyeSggJHRoaXMtPnByZXBhcmUoICRzcWwsICR2YWx1ZXMgKSApOwoJfQoKCS8qKgoJICogVXBkYXRlIGEgcm93IGluIHRoZSB0YWJsZQoJICoKCSAqICAgICB3cGRiOjp1cGRhdGUoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAnYmFyJyApLCBhcnJheSggJ0lEJyA9PiAxICkgKQoJICogICAgIHdwZGI6OnVwZGF0ZSggJ3RhYmxlJywgYXJyYXkoICdjb2x1bW4nID0+ICdmb28nLCAnZmllbGQnID0+IDEzMzcgKSwgYXJyYXkoICdJRCcgPT4gMSApLCBhcnJheSggJyVzJywgJyVkJyApLCBhcnJheSggJyVkJyApICkKCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEBzZWUgd3BkYjo6cHJlcGFyZSgpCgkgKiBAc2VlIHdwZGI6OiRmaWVsZF90eXBlcwoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICR0YWJsZSAgICAgICAgVGFibGUgbmFtZQoJICogQHBhcmFtIGFycmF5ICAgICAgICAkZGF0YSAgICAgICAgIERhdGEgdG8gdXBkYXRlIChpbiBjb2x1bW4gPT4gdmFsdWUgcGFpcnMpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggJGRhdGEgY29sdW1ucyBhbmQgJGRhdGEgdmFsdWVzIHNob3VsZCBiZSAicmF3IiAobmVpdGhlciBzaG91bGQgYmUgU1FMIGVzY2FwZWQpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRpbmcgYSBudWxsIHZhbHVlIHdpbGwgY2F1c2UgdGhlIGNvbHVtbiB0byBiZSBzZXQgdG8gTlVMTCAtIHRoZSBjb3JyZXNwb25kaW5nCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5ICAgICAgICAkd2hlcmUgICAgICAgIEEgbmFtZWQgYXJyYXkgb2YgV0hFUkUgY2xhdXNlcyAoaW4gY29sdW1uID0+IHZhbHVlIHBhaXJzKS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBjbGF1c2VzIHdpbGwgYmUgam9pbmVkIHdpdGggQU5Ecy4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3RoICR3aGVyZSBjb2x1bW5zIGFuZCAkd2hlcmUgdmFsdWVzIHNob3VsZCBiZSAicmF3Ii4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kaW5nIGEgbnVsbCB2YWx1ZSB3aWxsIGNyZWF0ZSBhbiBJUyBOVUxMIGNvbXBhcmlzb24gLSB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgd2lsbCBiZSBpZ25vcmVkIGluIHRoaXMgY2FzZS4KCSAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZvcm1hdCAgICAgICBPcHRpb25hbC4gQW4gYXJyYXkgb2YgZm9ybWF0cyB0byBiZSBtYXBwZWQgdG8gZWFjaCBvZiB0aGUgdmFsdWVzIGluICRkYXRhLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHN0cmluZywgdGhhdCBmb3JtYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgb2YgdGhlIHZhbHVlcyBpbiAkZGF0YS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGZvcm1hdCBpcyBvbmUgb2YgJyVkJywgJyVmJywgJyVzJyAoaW50ZWdlciwgZmxvYXQsIHN0cmluZykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb21pdHRlZCwgYWxsIHZhbHVlcyBpbiAkZGF0YSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5ncyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB3cGRiOjokZmllbGRfdHlwZXMuCgkgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICR3aGVyZV9mb3JtYXQgT3B0aW9uYWwuIEFuIGFycmF5IG9mIGZvcm1hdHMgdG8gYmUgbWFwcGVkIHRvIGVhY2ggb2YgdGhlIHZhbHVlcyBpbiAkd2hlcmUuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc3RyaW5nLCB0aGF0IGZvcm1hdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCBvZiB0aGUgaXRlbXMgaW4gJHdoZXJlLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgZm9ybWF0IGlzIG9uZSBvZiAnJWQnLCAnJWYnLCAnJXMnIChpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nKS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICR3aGVyZSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5ncy4KCSAqIEByZXR1cm4gaW50fGZhbHNlIFRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLCBvciBmYWxzZSBvbiBlcnJvci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZSggJHRhYmxlLCAkZGF0YSwgJHdoZXJlLCAkZm9ybWF0ID0gbnVsbCwgJHdoZXJlX2Zvcm1hdCA9IG51bGwgKSB7CgkJaWYgKCAhIGlzX2FycmF5KCAkZGF0YSApIHx8ICEgaXNfYXJyYXkoICR3aGVyZSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkZGF0YSA9ICR0aGlzLT5wcm9jZXNzX2ZpZWxkcyggJHRhYmxlLCAkZGF0YSwgJGZvcm1hdCApOwoJCWlmICggZmFsc2UgPT09ICRkYXRhICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR3aGVyZSA9ICR0aGlzLT5wcm9jZXNzX2ZpZWxkcyggJHRhYmxlLCAkd2hlcmUsICR3aGVyZV9mb3JtYXQgKTsKCQlpZiAoIGZhbHNlID09PSAkd2hlcmUgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRmaWVsZHMgPSAkY29uZGl0aW9ucyA9ICR2YWx1ZXMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCAkZGF0YSBhcyAkZmllbGQgPT4gJHZhbHVlICkgewoJCQlpZiAoIGlzX251bGwoICR2YWx1ZVsndmFsdWUnXSApICkgewoJCQkJJGZpZWxkc1tdID0gImAkZmllbGRgID0gTlVMTCI7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJGZpZWxkc1tdID0gImAkZmllbGRgID0gIiAuICR2YWx1ZVsnZm9ybWF0J107CgkJCSR2YWx1ZXNbXSA9ICR2YWx1ZVsndmFsdWUnXTsKCQl9CgkJZm9yZWFjaCAoICR3aGVyZSBhcyAkZmllbGQgPT4gJHZhbHVlICkgewoJCQlpZiAoIGlzX251bGwoICR2YWx1ZVsndmFsdWUnXSApICkgewoJCQkJJGNvbmRpdGlvbnNbXSA9ICJgJGZpZWxkYCBJUyBOVUxMIjsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkkY29uZGl0aW9uc1tdID0gImAkZmllbGRgID0gIiAuICR2YWx1ZVsnZm9ybWF0J107CgkJCSR2YWx1ZXNbXSA9ICR2YWx1ZVsndmFsdWUnXTsKCQl9CgoJCSRmaWVsZHMgPSBpbXBsb2RlKCAnLCAnLCAkZmllbGRzICk7CgkJJGNvbmRpdGlvbnMgPSBpbXBsb2RlKCAnIEFORCAnLCAkY29uZGl0aW9ucyApOwoKCQkkc3FsID0gIlVQREFURSBgJHRhYmxlYCBTRVQgJGZpZWxkcyBXSEVSRSAkY29uZGl0aW9ucyI7CgoJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7CgkJcmV0dXJuICR0aGlzLT5xdWVyeSggJHRoaXMtPnByZXBhcmUoICRzcWwsICR2YWx1ZXMgKSApOwoJfQoKCS8qKgoJICogRGVsZXRlIGEgcm93IGluIHRoZSB0YWJsZQoJICoKCSAqICAgICB3cGRiOjpkZWxldGUoICd0YWJsZScsIGFycmF5KCAnSUQnID0+IDEgKSApCgkgKiAgICAgd3BkYjo6ZGVsZXRlKCAndGFibGUnLCBhcnJheSggJ0lEJyA9PiAxICksIGFycmF5KCAnJWQnICkgKQoJICoKCSAqIEBzaW5jZSAzLjQuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHRhYmxlICAgICAgICBUYWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgICAgICAgICR3aGVyZSAgICAgICAgQSBuYW1lZCBhcnJheSBvZiBXSEVSRSBjbGF1c2VzIChpbiBjb2x1bW4gPT4gdmFsdWUgcGFpcnMpLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlIGNsYXVzZXMgd2lsbCBiZSBqb2luZWQgd2l0aCBBTkRzLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggJHdoZXJlIGNvbHVtbnMgYW5kICR3aGVyZSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRpbmcgYSBudWxsIHZhbHVlIHdpbGwgY3JlYXRlIGFuIElTIE5VTEwgY29tcGFyaXNvbiAtIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCB3aWxsIGJlIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkd2hlcmVfZm9ybWF0IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBmb3JtYXRzIHRvIGJlIG1hcHBlZCB0byBlYWNoIG9mIHRoZSB2YWx1ZXMgaW4gJHdoZXJlLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHN0cmluZywgdGhhdCBmb3JtYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgb2YgdGhlIGl0ZW1zIGluICR3aGVyZS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGZvcm1hdCBpcyBvbmUgb2YgJyVkJywgJyVmJywgJyVzJyAoaW50ZWdlciwgZmxvYXQsIHN0cmluZykuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb21pdHRlZCwgYWxsIHZhbHVlcyBpbiAkd2hlcmUgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgaW4gd3BkYjo6JGZpZWxkX3R5cGVzLgoJICogQHJldHVybiBpbnR8ZmFsc2UgVGhlIG51bWJlciBvZiByb3dzIHVwZGF0ZWQsIG9yIGZhbHNlIG9uIGVycm9yLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGVsZXRlKCAkdGFibGUsICR3aGVyZSwgJHdoZXJlX2Zvcm1hdCA9IG51bGwgKSB7CgkJaWYgKCAhIGlzX2FycmF5KCAkd2hlcmUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHdoZXJlID0gJHRoaXMtPnByb2Nlc3NfZmllbGRzKCAkdGFibGUsICR3aGVyZSwgJHdoZXJlX2Zvcm1hdCApOwoJCWlmICggZmFsc2UgPT09ICR3aGVyZSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGNvbmRpdGlvbnMgPSAkdmFsdWVzID0gYXJyYXkoKTsKCQlmb3JlYWNoICggJHdoZXJlIGFzICRmaWVsZCA9PiAkdmFsdWUgKSB7CgkJCWlmICggaXNfbnVsbCggJHZhbHVlWyd2YWx1ZSddICkgKSB7CgkJCQkkY29uZGl0aW9uc1tdID0gImAkZmllbGRgIElTIE5VTEwiOwoJCQkJY29udGludWU7CgkJCX0KCgkJCSRjb25kaXRpb25zW10gPSAiYCRmaWVsZGAgPSAiIC4gJHZhbHVlWydmb3JtYXQnXTsKCQkJJHZhbHVlc1tdID0gJHZhbHVlWyd2YWx1ZSddOwoJCX0KCgkJJGNvbmRpdGlvbnMgPSBpbXBsb2RlKCAnIEFORCAnLCAkY29uZGl0aW9ucyApOwoKCQkkc3FsID0gIkRFTEVURSBGUk9NIGAkdGFibGVgIFdIRVJFICRjb25kaXRpb25zIjsKCgkJJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgPSBmYWxzZTsKCQlyZXR1cm4gJHRoaXMtPnF1ZXJ5KCAkdGhpcy0+cHJlcGFyZSggJHNxbCwgJHZhbHVlcyApICk7Cgl9CgoJLyoqCgkgKiBQcm9jZXNzZXMgYXJyYXlzIG9mIGZpZWxkL3ZhbHVlIHBhaXJzIGFuZCBmaWVsZCBmb3JtYXRzLgoJICoKCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciB3cGRiJ3MgQ1JVRCBtZXRob2RzLCB3aGljaCB0YWtlIGZpZWxkL3ZhbHVlCgkgKiBwYWlycyBmb3IgaW5zZXJ0cywgdXBkYXRlcywgYW5kIHdoZXJlIGNsYXVzZXMuIFRoaXMgbWV0aG9kIGZpcnN0IHBhaXJzCgkgKiBlYWNoIHZhbHVlIHdpdGggYSBmb3JtYXQuIFRoZW4gaXQgZGV0ZXJtaW5lcyB0aGUgY2hhcnNldCBvZiB0aGF0IGZpZWxkLAoJICogdXNpbmcgdGhhdCB0byBkZXRlcm1pbmUgaWYgYW55IGludmFsaWQgdGV4dCB3b3VsZCBiZSBzdHJpcHBlZC4gSWYgdGV4dCBpcwoJICogc3RyaXBwZWQsIHRoZW4gZmllbGQgcHJvY2Vzc2luZyBpcyByZWplY3RlZCBhbmQgdGhlIHF1ZXJ5IGZhaWxzLgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0YWJsZSAgVGFibGUgbmFtZS4KCSAqIEBwYXJhbSBhcnJheSAgJGRhdGEgICBGaWVsZC92YWx1ZSBwYWlyLgoJICogQHBhcmFtIG1peGVkICAkZm9ybWF0IEZvcm1hdCBmb3IgZWFjaCBmaWVsZC4KCSAqIEByZXR1cm4gYXJyYXl8ZmFsc2UgUmV0dXJucyBhbiBhcnJheSBvZiBmaWVsZHMgdGhhdCBjb250YWluIHBhaXJlZCB2YWx1ZXMKCSAqICAgICAgICAgICAgICAgICAgICBhbmQgZm9ybWF0cy4gUmV0dXJucyBmYWxzZSBmb3IgaW52YWxpZCB2YWx1ZXMuCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzX2ZpZWxkcyggJHRhYmxlLCAkZGF0YSwgJGZvcm1hdCApIHsKCQkkZGF0YSA9ICR0aGlzLT5wcm9jZXNzX2ZpZWxkX2Zvcm1hdHMoICRkYXRhLCAkZm9ybWF0ICk7CgkJaWYgKCBmYWxzZSA9PT0gJGRhdGEgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRkYXRhID0gJHRoaXMtPnByb2Nlc3NfZmllbGRfY2hhcnNldHMoICRkYXRhLCAkdGFibGUgKTsKCQlpZiAoIGZhbHNlID09PSAkZGF0YSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGRhdGEgPSAkdGhpcy0+cHJvY2Vzc19maWVsZF9sZW5ndGhzKCAkZGF0YSwgJHRhYmxlICk7CgkJaWYgKCBmYWxzZSA9PT0gJGRhdGEgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRjb252ZXJ0ZWRfZGF0YSA9ICR0aGlzLT5zdHJpcF9pbnZhbGlkX3RleHQoICRkYXRhICk7CgoJCWlmICggJGRhdGEgIT09ICRjb252ZXJ0ZWRfZGF0YSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogUHJlcGFyZXMgYXJyYXlzIG9mIHZhbHVlL2Zvcm1hdCBwYWlycyBhcyBwYXNzZWQgdG8gd3BkYiBDUlVEIG1ldGhvZHMuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBhcnJheSAkZGF0YSAgIEFycmF5IG9mIGZpZWxkcyB0byB2YWx1ZXMuCgkgKiBAcGFyYW0gbWl4ZWQgJGZvcm1hdCBGb3JtYXRzIHRvIGJlIG1hcHBlZCB0byB0aGUgdmFsdWVzIGluICRkYXRhLgoJICogQHJldHVybiBhcnJheSBBcnJheSwga2V5ZWQgYnkgZmllbGQgbmFtZXMgd2l0aCB2YWx1ZXMgYmVpbmcgYW4gYXJyYXkKCSAqICAgICAgICAgICAgICAgb2YgJ3ZhbHVlJyBhbmQgJ2Zvcm1hdCcga2V5cy4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfZmllbGRfZm9ybWF0cyggJGRhdGEsICRmb3JtYXQgKSB7CgkJJGZvcm1hdHMgPSAkb3JpZ2luYWxfZm9ybWF0cyA9IChhcnJheSkgJGZvcm1hdDsKCgkJZm9yZWFjaCAoICRkYXRhIGFzICRmaWVsZCA9PiAkdmFsdWUgKSB7CgkJCSR2YWx1ZSA9IGFycmF5KAoJCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkJJ2Zvcm1hdCcgPT4gJyVzJywKCQkJKTsKCgkJCWlmICggISBlbXB0eSggJGZvcm1hdCApICkgewoJCQkJJHZhbHVlWydmb3JtYXQnXSA9IGFycmF5X3NoaWZ0KCAkZm9ybWF0cyApOwoJCQkJaWYgKCAhICR2YWx1ZVsnZm9ybWF0J10gKSB7CgkJCQkJJHZhbHVlWydmb3JtYXQnXSA9IHJlc2V0KCAkb3JpZ2luYWxfZm9ybWF0cyApOwoJCQkJfQoJCQl9IGVsc2VpZiAoIGlzc2V0KCAkdGhpcy0+ZmllbGRfdHlwZXNbICRmaWVsZCBdICkgKSB7CgkJCQkkdmFsdWVbJ2Zvcm1hdCddID0gJHRoaXMtPmZpZWxkX3R5cGVzWyAkZmllbGQgXTsKCQkJfQoKCQkJJGRhdGFbICRmaWVsZCBdID0gJHZhbHVlOwoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogQWRkcyBmaWVsZCBjaGFyc2V0cyB0byBmaWVsZC92YWx1ZS9mb3JtYXQgYXJyYXlzIGdlbmVyYXRlZCBieQoJICogdGhlIHdwZGI6OnByb2Nlc3NfZmllbGRfZm9ybWF0cygpIG1ldGhvZC4KCSAqCgkgKiBAc2luY2UgNC4yLjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKgoJICogQHBhcmFtIGFycmF5ICAkZGF0YSAgQXMgaXQgY29tZXMgZnJvbSB0aGUgd3BkYjo6cHJvY2Vzc19maWVsZF9mb3JtYXRzKCkgbWV0aG9kLgoJICogQHBhcmFtIHN0cmluZyAkdGFibGUgVGFibGUgbmFtZS4KCSAqIEByZXR1cm4gYXJyYXl8ZmFsc2UgVGhlIHNhbWUgYXJyYXkgYXMgJGRhdGEgd2l0aCBhZGRpdGlvbmFsICdjaGFyc2V0JyBrZXlzLgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc19maWVsZF9jaGFyc2V0cyggJGRhdGEsICR0YWJsZSApIHsKCQlmb3JlYWNoICggJGRhdGEgYXMgJGZpZWxkID0+ICR2YWx1ZSApIHsKCQkJaWYgKCAnJWQnID09PSAkdmFsdWVbJ2Zvcm1hdCddIHx8ICclZicgPT09ICR2YWx1ZVsnZm9ybWF0J10gKSB7CgkJCQkvKgoJCQkJICogV2UgY2FuIHNraXAgdGhpcyBmaWVsZCBpZiB3ZSBrbm93IGl0IGlzbid0IGEgc3RyaW5nLgoJCQkJICogVGhpcyBjaGVja3MgJWQvJWYgdmVyc3VzICEgJXMgYmVjYXVzZSBpdHMgc3ByaW50ZigpIGNvdWxkIHRha2UgbW9yZS4KCQkJCSAqLwoJCQkJJHZhbHVlWydjaGFyc2V0J10gPSBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCSR2YWx1ZVsnY2hhcnNldCddID0gJHRoaXMtPmdldF9jb2xfY2hhcnNldCggJHRhYmxlLCAkZmllbGQgKTsKCQkJCWlmICggaXNfd3BfZXJyb3IoICR2YWx1ZVsnY2hhcnNldCddICkgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkkZGF0YVsgJGZpZWxkIF0gPSAkdmFsdWU7CgkJfQoKCQlyZXR1cm4gJGRhdGE7Cgl9CgoJLyoqCgkgKiBGb3Igc3RyaW5nIGZpZWxkcywgcmVjb3JkIHRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGggdGhhdCBmaWVsZCBjYW4gc2FmZWx5IHNhdmUuCgkgKgoJICogQHNpbmNlIDQuMi4xCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBhcnJheSAgJGRhdGEgIEFzIGl0IGNvbWVzIGZyb20gdGhlIHdwZGI6OnByb2Nlc3NfZmllbGRfY2hhcnNldHMoKSBtZXRob2QuCgkgKiBAcGFyYW0gc3RyaW5nICR0YWJsZSBUYWJsZSBuYW1lLgoJICogQHJldHVybiBhcnJheXxmYWxzZSBUaGUgc2FtZSBhcnJheSBhcyAkZGF0YSB3aXRoIGFkZGl0aW9uYWwgJ2xlbmd0aCcga2V5cywgb3IgZmFsc2UgaWYKCSAqICAgICAgICAgICAgICAgICAgICAgYW55IG9mIHRoZSB2YWx1ZXMgd2VyZSB0b28gbG9uZyBmb3IgdGhlaXIgY29ycmVzcG9uZGluZyBmaWVsZC4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfZmllbGRfbGVuZ3RocyggJGRhdGEsICR0YWJsZSApIHsKCQlmb3JlYWNoICggJGRhdGEgYXMgJGZpZWxkID0+ICR2YWx1ZSApIHsKCQkJaWYgKCAnJWQnID09PSAkdmFsdWVbJ2Zvcm1hdCddIHx8ICclZicgPT09ICR2YWx1ZVsnZm9ybWF0J10gKSB7CgkJCQkvKgoJCQkJICogV2UgY2FuIHNraXAgdGhpcyBmaWVsZCBpZiB3ZSBrbm93IGl0IGlzbid0IGEgc3RyaW5nLgoJCQkJICogVGhpcyBjaGVja3MgJWQvJWYgdmVyc3VzICEgJXMgYmVjYXVzZSBpdHMgc3ByaW50ZigpIGNvdWxkIHRha2UgbW9yZS4KCQkJCSAqLwoJCQkJJHZhbHVlWydsZW5ndGgnXSA9IGZhbHNlOwoJCQl9IGVsc2UgewoJCQkJJHZhbHVlWydsZW5ndGgnXSA9ICR0aGlzLT5nZXRfY29sX2xlbmd0aCggJHRhYmxlLCAkZmllbGQgKTsKCQkJCWlmICggaXNfd3BfZXJyb3IoICR2YWx1ZVsnbGVuZ3RoJ10gKSApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCgkJCSRkYXRhWyAkZmllbGQgXSA9ICR2YWx1ZTsKCQl9CgoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIG9uZSB2YXJpYWJsZSBmcm9tIHRoZSBkYXRhYmFzZS4KCSAqCgkgKiBFeGVjdXRlcyBhIFNRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgU1FMIHJlc3VsdC4KCSAqIElmIHRoZSBTUUwgcmVzdWx0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY29sdW1uIGFuZC9vciBtb3JlIHRoYW4gb25lIHJvdywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgY29sdW1uIGFuZCByb3cgc3BlY2lmaWVkLgoJICogSWYgJHF1ZXJ5IGlzIG51bGwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBjb2x1bW4gYW5kIHJvdyBmcm9tIHRoZSBwcmV2aW91cyBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZ3xudWxsICRxdWVyeSBPcHRpb25hbC4gU1FMIHF1ZXJ5LiBEZWZhdWx0cyB0byBudWxsLCB1c2UgdGhlIHJlc3VsdCBmcm9tIHRoZSBwcmV2aW91cyBxdWVyeS4KCSAqIEBwYXJhbSBpbnQgICAgICAgICAkeCAgICAgT3B0aW9uYWwuIENvbHVtbiBvZiB2YWx1ZSB0byByZXR1cm4uIEluZGV4ZWQgZnJvbSAwLgoJICogQHBhcmFtIGludCAgICAgICAgICR5ICAgICBPcHRpb25hbC4gUm93IG9mIHZhbHVlIHRvIHJldHVybi4gSW5kZXhlZCBmcm9tIDAuCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIERhdGFiYXNlIHF1ZXJ5IHJlc3VsdCAoYXMgc3RyaW5nKSwgb3IgbnVsbCBvbiBmYWlsdXJlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfdmFyKCAkcXVlcnkgPSBudWxsLCAkeCA9IDAsICR5ID0gMCApIHsKCQkkdGhpcy0+ZnVuY19jYWxsID0gIlwkZGItPmdldF92YXIoXCIkcXVlcnlcIiwgJHgsICR5KSI7CgoJCWlmICggJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgJiYgJHRoaXMtPmNoZWNrX3NhZmVfY29sbGF0aW9uKCAkcXVlcnkgKSApIHsKCQkJJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgPSBmYWxzZTsKCQl9CgoJCWlmICggJHF1ZXJ5ICkgewoJCQkkdGhpcy0+cXVlcnkoICRxdWVyeSApOwoJCX0KCgkJLy8gRXh0cmFjdCB2YXIgb3V0IG9mIGNhY2hlZCByZXN1bHRzIGJhc2VkIHgseSB2YWxzCgkJaWYgKCAhZW1wdHkoICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gKSApIHsKCQkJJHZhbHVlcyA9IGFycmF5X3ZhbHVlcyggZ2V0X29iamVjdF92YXJzKCAkdGhpcy0+bGFzdF9yZXN1bHRbJHldICkgKTsKCQl9CgoJCS8vIElmIHRoZXJlIGlzIGEgdmFsdWUgcmV0dXJuIGl0IGVsc2UgcmV0dXJuIG51bGwKCQlyZXR1cm4gKCBpc3NldCggJHZhbHVlc1skeF0gKSAmJiAkdmFsdWVzWyR4XSAhPT0gJycgKSA/ICR2YWx1ZXNbJHhdIDogbnVsbDsKCX0KCgkvKioKCSAqIFJldHJpZXZlIG9uZSByb3cgZnJvbSB0aGUgZGF0YWJhc2UuCgkgKgoJICogRXhlY3V0ZXMgYSBTUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJvdyBmcm9tIHRoZSBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZ3xudWxsICRxdWVyeSAgU1FMIHF1ZXJ5LgoJICogQHBhcmFtIHN0cmluZyAgICAgICRvdXRwdXQgT3B0aW9uYWwuIG9uZSBvZiBBUlJBWV9BIHwgQVJSQVlfTiB8IE9CSkVDVCBjb25zdGFudHMuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4gYW4gYXNzb2NpYXRpdmUgYXJyYXkgKGNvbHVtbiA9PiB2YWx1ZSwgLi4uKSwKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbnVtZXJpY2FsbHkgaW5kZXhlZCBhcnJheSAoMCA9PiB2YWx1ZSwgLi4uKSBvcgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gb2JqZWN0ICggLT5jb2x1bW4gPSB2YWx1ZSApLCByZXNwZWN0aXZlbHkuCgkgKiBAcGFyYW0gaW50ICAgICAgICAgJHkgICAgICBPcHRpb25hbC4gUm93IHRvIHJldHVybi4gSW5kZXhlZCBmcm9tIDAuCgkgKiBAcmV0dXJuIGFycmF5fG9iamVjdHxudWxsfHZvaWQgRGF0YWJhc2UgcXVlcnkgcmVzdWx0IGluIGZvcm1hdCBzcGVjaWZpZWQgYnkgJG91dHB1dCBvciBudWxsIG9uIGZhaWx1cmUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yb3coICRxdWVyeSA9IG51bGwsICRvdXRwdXQgPSBPQkpFQ1QsICR5ID0gMCApIHsKCQkkdGhpcy0+ZnVuY19jYWxsID0gIlwkZGItPmdldF9yb3coXCIkcXVlcnlcIiwkb3V0cHV0LCR5KSI7CgoJCWlmICggJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgJiYgJHRoaXMtPmNoZWNrX3NhZmVfY29sbGF0aW9uKCAkcXVlcnkgKSApIHsKCQkJJHRoaXMtPmNoZWNrX2N1cnJlbnRfcXVlcnkgPSBmYWxzZTsKCQl9CgoJCWlmICggJHF1ZXJ5ICkgewoJCQkkdGhpcy0+cXVlcnkoICRxdWVyeSApOwoJCX0gZWxzZSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCAhaXNzZXQoICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gKSApCgkJCXJldHVybiBudWxsOwoKCQlpZiAoICRvdXRwdXQgPT0gT0JKRUNUICkgewoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA/ICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gOiBudWxsOwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBBUlJBWV9BICkgewoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA/IGdldF9vYmplY3RfdmFycyggJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSApIDogbnVsbDsKCQl9IGVsc2VpZiAoICRvdXRwdXQgPT0gQVJSQVlfTiApIHsKCQkJcmV0dXJuICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gPyBhcnJheV92YWx1ZXMoIGdldF9vYmplY3RfdmFycyggJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSApICkgOiBudWxsOwoJCX0gZWxzZWlmICggc3RydG91cHBlciggJG91dHB1dCApID09PSBPQkpFQ1QgKSB7CgkJCS8vIEJhY2sgY29tcGF0IGZvciBPQkpFQ1QgYmVpbmcgcHJldmlvdXNseSBjYXNlIGluc2Vuc2l0aXZlLgoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA/ICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gOiBudWxsOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5wcmludF9lcnJvciggIiBcJGRiLT5nZXRfcm93KHN0cmluZyBxdWVyeSwgb3V0cHV0IHR5cGUsIGludCBvZmZzZXQpIC0tIE91dHB1dCB0eXBlIG11c3QgYmUgb25lIG9mOiBPQkpFQ1QsIEFSUkFZX0EsIEFSUkFZX04iICk7CgkJfQoJfQoKCS8qKgoJICogUmV0cmlldmUgb25lIGNvbHVtbiBmcm9tIHRoZSBkYXRhYmFzZS4KCSAqCgkgKiBFeGVjdXRlcyBhIFNRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgY29sdW1uIGZyb20gdGhlIFNRTCByZXN1bHQuCgkgKiBJZiB0aGUgU1FMIHJlc3VsdCBjb250YWlucyBtb3JlIHRoYW4gb25lIGNvbHVtbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb2x1bW4gc3BlY2lmaWVkLgoJICogSWYgJHF1ZXJ5IGlzIG51bGwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3BlY2lmaWVkIGNvbHVtbiBmcm9tIHRoZSBwcmV2aW91cyBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZ3xudWxsICRxdWVyeSBPcHRpb25hbC4gU1FMIHF1ZXJ5LiBEZWZhdWx0cyB0byBwcmV2aW91cyBxdWVyeS4KCSAqIEBwYXJhbSBpbnQgICAgICAgICAkeCAgICAgT3B0aW9uYWwuIENvbHVtbiB0byByZXR1cm4uIEluZGV4ZWQgZnJvbSAwLgoJICogQHJldHVybiBhcnJheSBEYXRhYmFzZSBxdWVyeSByZXN1bHQuIEFycmF5IGluZGV4ZWQgZnJvbSAwIGJ5IFNRTCByZXN1bHQgcm93IG51bWJlci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jb2woICRxdWVyeSA9IG51bGwgLCAkeCA9IDAgKSB7CgkJaWYgKCAkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSAmJiAkdGhpcy0+Y2hlY2tfc2FmZV9jb2xsYXRpb24oICRxdWVyeSApICkgewoJCQkkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSA9IGZhbHNlOwoJCX0KCgkJaWYgKCAkcXVlcnkgKSB7CgkJCSR0aGlzLT5xdWVyeSggJHF1ZXJ5ICk7CgkJfQoKCQkkbmV3X2FycmF5ID0gYXJyYXkoKTsKCQkvLyBFeHRyYWN0IHRoZSBjb2x1bW4gdmFsdWVzCgkJZm9yICggJGkgPSAwLCAkaiA9IGNvdW50KCAkdGhpcy0+bGFzdF9yZXN1bHQgKTsgJGkgPCAkajsgJGkrKyApIHsKCQkJJG5ld19hcnJheVskaV0gPSAkdGhpcy0+Z2V0X3ZhciggbnVsbCwgJHgsICRpICk7CgkJfQoJCXJldHVybiAkbmV3X2FycmF5OwoJfQoKCS8qKgoJICogUmV0cmlldmUgYW4gZW50aXJlIFNRTCByZXN1bHQgc2V0IGZyb20gdGhlIGRhdGFiYXNlIChpLmUuLCBtYW55IHJvd3MpCgkgKgoJICogRXhlY3V0ZXMgYSBTUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIGVudGlyZSBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgIFNRTCBxdWVyeS4KCSAqIEBwYXJhbSBzdHJpbmcgJG91dHB1dCBPcHRpb25hbC4gQW55IG9mIEFSUkFZX0EgfCBBUlJBWV9OIHwgT0JKRUNUIHwgT0JKRUNUX0sgY29uc3RhbnRzLgoJICogICAgICAgICAgICAgICAgICAgICAgIFdpdGggb25lIG9mIHRoZSBmaXJzdCB0aHJlZSwgcmV0dXJuIGFuIGFycmF5IG9mIHJvd3MgaW5kZXhlZCBmcm9tIDAgYnkgU1FMIHJlc3VsdCByb3cgbnVtYmVyLgoJICogICAgICAgICAgICAgICAgICAgICAgIEVhY2ggcm93IGlzIGFuIGFzc29jaWF0aXZlIGFycmF5IChjb2x1bW4gPT4gdmFsdWUsIC4uLiksIGEgbnVtZXJpY2FsbHkgaW5kZXhlZCBhcnJheSAoMCA9PiB2YWx1ZSwgLi4uKSwgb3IgYW4gb2JqZWN0LiAoIC0+Y29sdW1uID0gdmFsdWUgKSwgcmVzcGVjdGl2ZWx5LgoJICogICAgICAgICAgICAgICAgICAgICAgIFdpdGggT0JKRUNUX0ssIHJldHVybiBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiByb3cgb2JqZWN0cyBrZXllZCBieSB0aGUgdmFsdWUgb2YgZWFjaCByb3cncyBmaXJzdCBjb2x1bW4ncyB2YWx1ZS4KCSAqICAgICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGUga2V5cyBhcmUgZGlzY2FyZGVkLgoJICogQHJldHVybiBhcnJheXxvYmplY3R8bnVsbCBEYXRhYmFzZSBxdWVyeSByZXN1bHRzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVzdWx0cyggJHF1ZXJ5ID0gbnVsbCwgJG91dHB1dCA9IE9CSkVDVCApIHsKCQkkdGhpcy0+ZnVuY19jYWxsID0gIlwkZGItPmdldF9yZXN1bHRzKFwiJHF1ZXJ5XCIsICRvdXRwdXQpIjsKCgkJaWYgKCAkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSAmJiAkdGhpcy0+Y2hlY2tfc2FmZV9jb2xsYXRpb24oICRxdWVyeSApICkgewoJCQkkdGhpcy0+Y2hlY2tfY3VycmVudF9xdWVyeSA9IGZhbHNlOwoJCX0KCgkJaWYgKCAkcXVlcnkgKSB7CgkJCSR0aGlzLT5xdWVyeSggJHF1ZXJ5ICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQkkbmV3X2FycmF5ID0gYXJyYXkoKTsKCQlpZiAoICRvdXRwdXQgPT0gT0JKRUNUICkgewoJCQkvLyBSZXR1cm4gYW4gaW50ZWdlci1rZXllZCBhcnJheSBvZiByb3cgb2JqZWN0cwoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0OwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBPQkpFQ1RfSyApIHsKCQkJLy8gUmV0dXJuIGFuIGFycmF5IG9mIHJvdyBvYmplY3RzIHdpdGgga2V5cyBmcm9tIGNvbHVtbiAxCgkJCS8vIChEdXBsaWNhdGVzIGFyZSBkaXNjYXJkZWQpCgkJCWZvcmVhY2ggKCAkdGhpcy0+bGFzdF9yZXN1bHQgYXMgJHJvdyApIHsKCQkJCSR2YXJfYnlfcmVmID0gZ2V0X29iamVjdF92YXJzKCAkcm93ICk7CgkJCQkka2V5ID0gYXJyYXlfc2hpZnQoICR2YXJfYnlfcmVmICk7CgkJCQlpZiAoICEgaXNzZXQoICRuZXdfYXJyYXlbICRrZXkgXSApICkKCQkJCQkkbmV3X2FycmF5WyAka2V5IF0gPSAkcm93OwoJCQl9CgkJCXJldHVybiAkbmV3X2FycmF5OwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBBUlJBWV9BIHx8ICRvdXRwdXQgPT0gQVJSQVlfTiApIHsKCQkJLy8gUmV0dXJuIGFuIGludGVnZXIta2V5ZWQgYXJyYXkgb2YuLi4KCQkJaWYgKCAkdGhpcy0+bGFzdF9yZXN1bHQgKSB7CgkJCQlmb3JlYWNoICggKGFycmF5KSAkdGhpcy0+bGFzdF9yZXN1bHQgYXMgJHJvdyApIHsKCQkJCQlpZiAoICRvdXRwdXQgPT0gQVJSQVlfTiApIHsKCQkJCQkJLy8gLi4uaW50ZWdlci1rZXllZCByb3cgYXJyYXlzCgkJCQkJCSRuZXdfYXJyYXlbXSA9IGFycmF5X3ZhbHVlcyggZ2V0X29iamVjdF92YXJzKCAkcm93ICkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyAuLi5jb2x1bW4gbmFtZS1rZXllZCByb3cgYXJyYXlzCgkJCQkJCSRuZXdfYXJyYXlbXSA9IGdldF9vYmplY3RfdmFycyggJHJvdyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJG5ld19hcnJheTsKCQl9IGVsc2VpZiAoIHN0cnRvdXBwZXIoICRvdXRwdXQgKSA9PT0gT0JKRUNUICkgewoJCQkvLyBCYWNrIGNvbXBhdCBmb3IgT0JKRUNUIGJlaW5nIHByZXZpb3VzbHkgY2FzZSBpbnNlbnNpdGl2ZS4KCQkJcmV0dXJuICR0aGlzLT5sYXN0X3Jlc3VsdDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciBzZXQgZm9yIHRoZSBnaXZlbiB0YWJsZS4KCSAqCgkgKiBAc2luY2UgNC4yLjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdGFibGUgVGFibGUgbmFtZS4KCSAqIEByZXR1cm4gc3RyaW5nfFdQX0Vycm9yIFRhYmxlIGNoYXJhY3RlciBzZXQsIFdQX0Vycm9yIG9iamVjdCBpZiBpdCBjb3VsZG4ndCBiZSBmb3VuZC4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF90YWJsZV9jaGFyc2V0KCAkdGFibGUgKSB7CgkJJHRhYmxla2V5ID0gc3RydG9sb3dlciggJHRhYmxlICk7CgoJCS8qKgoJCSAqIEZpbHRlciB0aGUgdGFibGUgY2hhcnNldCB2YWx1ZSBiZWZvcmUgdGhlIERCIGlzIGNoZWNrZWQuCgkJICoKCQkgKiBQYXNzaW5nIGEgbm9uLW51bGwgdmFsdWUgdG8gdGhlIGZpbHRlciB3aWxsIGVmZmVjdGl2ZWx5IHNob3J0LWNpcmN1aXQKCQkgKiBjaGVja2luZyB0aGUgREIgZm9yIHRoZSBjaGFyc2V0LCByZXR1cm5pbmcgdGhhdCB2YWx1ZSBpbnN0ZWFkLgoJCSAqCgkJICogQHNpbmNlIDQuMi4wCgkJICoKCQkgKiBAcGFyYW0gc3RyaW5nICRjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZS4gRGVmYXVsdCBudWxsLgoJCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICAgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGJlaW5nIGNoZWNrZWQuCgkJICovCgkJJGNoYXJzZXQgPSBhcHBseV9maWx0ZXJzKCAncHJlX2dldF90YWJsZV9jaGFyc2V0JywgbnVsbCwgJHRhYmxlICk7CgkJaWYgKCBudWxsICE9PSAkY2hhcnNldCApIHsKCQkJcmV0dXJuICRjaGFyc2V0OwoJCX0KCgkJaWYgKCBpc3NldCggJHRoaXMtPnRhYmxlX2NoYXJzZXRbICR0YWJsZWtleSBdICkgKSB7CgkJCXJldHVybiAkdGhpcy0+dGFibGVfY2hhcnNldFsgJHRhYmxla2V5IF07CgkJfQoKCQkkY2hhcnNldHMgPSAkY29sdW1ucyA9IGFycmF5KCk7CgoJCSR0YWJsZV9wYXJ0cyA9IGV4cGxvZGUoICcuJywgJHRhYmxlICk7CgkJJHRhYmxlID0gJ2AnIC4gaW1wbG9kZSggJ2AuYCcsICR0YWJsZV9wYXJ0cyApIC4gJ2AnOwoJCSRyZXN1bHRzID0gJHRoaXMtPmdldF9yZXN1bHRzKCAiU0hPVyBGVUxMIENPTFVNTlMgRlJPTSAkdGFibGUiICk7CgkJaWYgKCAhICRyZXN1bHRzICkgewoJCQlyZXR1cm4gbmV3IFdQX0Vycm9yKCAnd3BkYl9nZXRfdGFibGVfY2hhcnNldF9mYWlsdXJlJyApOwoJCX0KCgkJZm9yZWFjaCAoICRyZXN1bHRzIGFzICRjb2x1bW4gKSB7CgkJCSRjb2x1bW5zWyBzdHJ0b2xvd2VyKCAkY29sdW1uLT5GaWVsZCApIF0gPSAkY29sdW1uOwoJCX0KCgkJJHRoaXMtPmNvbF9tZXRhWyAkdGFibGVrZXkgXSA9ICRjb2x1bW5zOwoKCQlmb3JlYWNoICggJGNvbHVtbnMgYXMgJGNvbHVtbiApIHsKCQkJaWYgKCAhIGVtcHR5KCAkY29sdW1uLT5Db2xsYXRpb24gKSApIHsKCQkJCWxpc3QoICRjaGFyc2V0ICkgPSBleHBsb2RlKCAnXycsICRjb2x1bW4tPkNvbGxhdGlvbiApOwoKCQkJCS8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gY2FuJ3Qgc3VwcG9ydCB1dGY4bWI0IGNoYXJhY3RlcnMsIGxldCdzIG9ubHkgc2VuZCAzLWJ5dGUgdXRmOCBjaGFyYWN0ZXJzLgoJCQkJaWYgKCAndXRmOG1iNCcgPT09ICRjaGFyc2V0ICYmICEgJHRoaXMtPmhhc19jYXAoICd1dGY4bWI0JyApICkgewoJCQkJCSRjaGFyc2V0ID0gJ3V0ZjgnOwoJCQkJfQoKCQkJCSRjaGFyc2V0c1sgc3RydG9sb3dlciggJGNoYXJzZXQgKSBdID0gdHJ1ZTsKCQkJfQoKCQkJbGlzdCggJHR5cGUgKSA9IGV4cGxvZGUoICcoJywgJGNvbHVtbi0+VHlwZSApOwoKCQkJLy8gQSBiaW5hcnkvYmxvYiBtZWFucyB0aGUgd2hvbGUgcXVlcnkgZ2V0cyB0cmVhdGVkIGxpa2UgdGhpcy4KCQkJaWYgKCBpbl9hcnJheSggc3RydG91cHBlciggJHR5cGUgKSwgYXJyYXkoICdCSU5BUlknLCAnVkFSQklOQVJZJywgJ1RJTllCTE9CJywgJ01FRElVTUJMT0InLCAnQkxPQicsICdMT05HQkxPQicgKSApICkgewoJCQkJJHRoaXMtPnRhYmxlX2NoYXJzZXRbICR0YWJsZWtleSBdID0gJ2JpbmFyeSc7CgkJCQlyZXR1cm4gJ2JpbmFyeSc7CgkJCX0KCQl9CgoJCS8vIHV0ZjhtYjMgaXMgYW4gYWxpYXMgZm9yIHV0ZjguCgkJaWYgKCBpc3NldCggJGNoYXJzZXRzWyd1dGY4bWIzJ10gKSApIHsKCQkJJGNoYXJzZXRzWyd1dGY4J10gPSB0cnVlOwoJCQl1bnNldCggJGNoYXJzZXRzWyd1dGY4bWIzJ10gKTsKCQl9CgoJCS8vIENoZWNrIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBjaGFyc2V0IGluIHBsYXkuCgkJJGNvdW50ID0gY291bnQoICRjaGFyc2V0cyApOwoJCWlmICggMSA9PT0gJGNvdW50ICkgewoJCQkkY2hhcnNldCA9IGtleSggJGNoYXJzZXRzICk7CgkJfSBlbHNlaWYgKCAwID09PSAkY291bnQgKSB7CgkJCS8vIE5vIGNoYXJzZXRzLCBhc3N1bWUgdGhpcyB0YWJsZSBjYW4gc3RvcmUgd2hhdGV2ZXIuCgkJCSRjaGFyc2V0ID0gZmFsc2U7CgkJfSBlbHNlIHsKCQkJLy8gTW9yZSB0aGFuIG9uZSBjaGFyc2V0LiBSZW1vdmUgbGF0aW4xIGlmIHByZXNlbnQgYW5kIHJlY2FsY3VsYXRlLgoJCQl1bnNldCggJGNoYXJzZXRzWydsYXRpbjEnXSApOwoJCQkkY291bnQgPSBjb3VudCggJGNoYXJzZXRzICk7CgkJCWlmICggMSA9PT0gJGNvdW50ICkgewoJCQkJLy8gT25seSBvbmUgY2hhcnNldCAoYmVzaWRlcyBsYXRpbjEpLgoJCQkJJGNoYXJzZXQgPSBrZXkoICRjaGFyc2V0cyApOwoJCQl9IGVsc2VpZiAoIDIgPT09ICRjb3VudCAmJiBpc3NldCggJGNoYXJzZXRzWyd1dGY4J10sICRjaGFyc2V0c1sndXRmOG1iNCddICkgKSB7CgkJCQkvLyBUd28gY2hhcnNldHMsIGJ1dCB0aGV5J3JlIHV0ZjggYW5kIHV0ZjhtYjQsIHVzZSB1dGY4LgoJCQkJJGNoYXJzZXQgPSAndXRmOCc7CgkJCX0gZWxzZSB7CgkJCQkvLyBUd28gbWl4ZWQgY2hhcmFjdGVyIHNldHMuIGFzY2lpLgoJCQkJJGNoYXJzZXQgPSAnYXNjaWknOwoJCQl9CgkJfQoKCQkkdGhpcy0+dGFibGVfY2hhcnNldFsgJHRhYmxla2V5IF0gPSAkY2hhcnNldDsKCQlyZXR1cm4gJGNoYXJzZXQ7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciBzZXQgZm9yIHRoZSBnaXZlbiBjb2x1bW4uCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICBUYWJsZSBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkY29sdW1uIENvbHVtbiBuYW1lLgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2V8V1BfRXJyb3IgQ29sdW1uIGNoYXJhY3RlciBzZXQgYXMgYSBzdHJpbmcuIEZhbHNlIGlmIHRoZSBjb2x1bW4gaGFzIG5vCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2V0LiBXUF9FcnJvciBvYmplY3QgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbF9jaGFyc2V0KCAkdGFibGUsICRjb2x1bW4gKSB7CgkJJHRhYmxla2V5ID0gc3RydG9sb3dlciggJHRhYmxlICk7CgkJJGNvbHVtbmtleSA9IHN0cnRvbG93ZXIoICRjb2x1bW4gKTsKCgkJLyoqCgkJICogRmlsdGVyIHRoZSBjb2x1bW4gY2hhcnNldCB2YWx1ZSBiZWZvcmUgdGhlIERCIGlzIGNoZWNrZWQuCgkJICoKCQkgKiBQYXNzaW5nIGEgbm9uLW51bGwgdmFsdWUgdG8gdGhlIGZpbHRlciB3aWxsIHNob3J0LWNpcmN1aXQKCQkgKiBjaGVja2luZyB0aGUgREIgZm9yIHRoZSBjaGFyc2V0LCByZXR1cm5pbmcgdGhhdCB2YWx1ZSBpbnN0ZWFkLgoJCSAqCgkJICogQHNpbmNlIDQuMi4wCgkJICoKCQkgKiBAcGFyYW0gc3RyaW5nICRjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZS4gRGVmYXVsdCBudWxsLgoJCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICAgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGJlaW5nIGNoZWNrZWQuCgkJICogQHBhcmFtIHN0cmluZyAkY29sdW1uICBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIGJlaW5nIGNoZWNrZWQuCgkJICovCgkJJGNoYXJzZXQgPSBhcHBseV9maWx0ZXJzKCAncHJlX2dldF9jb2xfY2hhcnNldCcsIG51bGwsICR0YWJsZSwgJGNvbHVtbiApOwoJCWlmICggbnVsbCAhPT0gJGNoYXJzZXQgKSB7CgkJCXJldHVybiAkY2hhcnNldDsKCQl9CgoJCS8vIFNraXAgdGhpcyBlbnRpcmVseSBpZiB0aGlzIGlzbid0IGEgTXlTUUwgZGF0YWJhc2UuCgkJaWYgKCBlbXB0eSggJHRoaXMtPmlzX215c3FsICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT50YWJsZV9jaGFyc2V0WyAkdGFibGVrZXkgXSApICkgewoJCQkvLyBUaGlzIHByaW1lcyBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHVzLgoJCQkkdGFibGVfY2hhcnNldCA9ICR0aGlzLT5nZXRfdGFibGVfY2hhcnNldCggJHRhYmxlICk7CgkJCWlmICggaXNfd3BfZXJyb3IoICR0YWJsZV9jaGFyc2V0ICkgKSB7CgkJCQlyZXR1cm4gJHRhYmxlX2NoYXJzZXQ7CgkJCX0KCQl9CgoJCS8vIElmIHN0aWxsIG5vIGNvbHVtbiBpbmZvcm1hdGlvbiwgcmV0dXJuIHRoZSB0YWJsZSBjaGFyc2V0LgoJCWlmICggZW1wdHkoICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxla2V5IF0gKSApIHsKCQkJcmV0dXJuICR0aGlzLT50YWJsZV9jaGFyc2V0WyAkdGFibGVrZXkgXTsKCQl9CgoJCS8vIElmIHRoaXMgY29sdW1uIGRvZXNuJ3QgZXhpc3QsIHJldHVybiB0aGUgdGFibGUgY2hhcnNldC4KCQlpZiAoIGVtcHR5KCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZWtleSBdWyAkY29sdW1ua2V5IF0gKSApIHsKCQkJcmV0dXJuICR0aGlzLT50YWJsZV9jaGFyc2V0WyAkdGFibGVrZXkgXTsKCQl9CgoJCS8vIFJldHVybiBmYWxzZSB3aGVuIGl0J3Mgbm90IGEgc3RyaW5nIGNvbHVtbi4KCQlpZiAoIGVtcHR5KCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZWtleSBdWyAkY29sdW1ua2V5IF0tPkNvbGxhdGlvbiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlsaXN0KCAkY2hhcnNldCApID0gZXhwbG9kZSggJ18nLCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZWtleSBdWyAkY29sdW1ua2V5IF0tPkNvbGxhdGlvbiApOwoJCXJldHVybiAkY2hhcnNldDsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGggYWxsb3dlZCBpbiBhIGdpdmVuIGNvbHVtbi4KCSAqIFRoZSBsZW5ndGggbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgYXMgYSBieXRlIGxlbmd0aCBvciBhIGNoYXJhY3RlciBsZW5ndGguCgkgKgoJICogQHNpbmNlIDQuMi4xCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICBUYWJsZSBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkY29sdW1uIENvbHVtbiBuYW1lLgoJICogQHJldHVybiBhcnJheXxmYWxzZXxXUF9FcnJvciBhcnJheSggJ2xlbmd0aCcgPT4gKGludCksICd0eXBlJyA9PiAnYnl0ZScgfCAnY2hhcicgKQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgY29sdW1uIGhhcyBubyBsZW5ndGggKGZvciBleGFtcGxlLCBudW1lcmljIGNvbHVtbikKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BfRXJyb3Igb2JqZWN0IGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jb2xfbGVuZ3RoKCAkdGFibGUsICRjb2x1bW4gKSB7CgkJJHRhYmxla2V5ID0gc3RydG9sb3dlciggJHRhYmxlICk7CgkJJGNvbHVtbmtleSA9IHN0cnRvbG93ZXIoICRjb2x1bW4gKTsKCgkJLy8gU2tpcCB0aGlzIGVudGlyZWx5IGlmIHRoaXMgaXNuJ3QgYSBNeVNRTCBkYXRhYmFzZS4KCQlpZiAoIGVtcHR5KCAkdGhpcy0+aXNfbXlzcWwgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCBlbXB0eSggJHRoaXMtPmNvbF9tZXRhWyAkdGFibGVrZXkgXSApICkgewoJCQkvLyBUaGlzIHByaW1lcyBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHVzLgoJCQkkdGFibGVfY2hhcnNldCA9ICR0aGlzLT5nZXRfdGFibGVfY2hhcnNldCggJHRhYmxlICk7CgkJCWlmICggaXNfd3BfZXJyb3IoICR0YWJsZV9jaGFyc2V0ICkgKSB7CgkJCQlyZXR1cm4gJHRhYmxlX2NoYXJzZXQ7CgkJCX0KCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxla2V5IF1bICRjb2x1bW5rZXkgXSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkdHlwZWluZm8gPSBleHBsb2RlKCAnKCcsICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxla2V5IF1bICRjb2x1bW5rZXkgXS0+VHlwZSApOwoKCQkkdHlwZSA9IHN0cnRvbG93ZXIoICR0eXBlaW5mb1swXSApOwoJCWlmICggISBlbXB0eSggJHR5cGVpbmZvWzFdICkgKSB7CgkJCSRsZW5ndGggPSB0cmltKCAkdHlwZWluZm9bMV0sICcpJyApOwoJCX0gZWxzZSB7CgkJCSRsZW5ndGggPSBmYWxzZTsKCQl9CgoJCXN3aXRjaCggJHR5cGUgKSB7CgkJCWNhc2UgJ2NoYXInOgoJCQljYXNlICd2YXJjaGFyJzoKCQkJCXJldHVybiBhcnJheSgKCQkJCQkndHlwZScgICA9PiAnY2hhcicsCgkJCQkJJ2xlbmd0aCcgPT4gKGludCkgJGxlbmd0aCwKCQkJCSk7CgoJCQljYXNlICdiaW5hcnknOgoJCQljYXNlICd2YXJiaW5hcnknOgoJCQkJcmV0dXJuIGFycmF5KAoJCQkJCSd0eXBlJyAgID0+ICdieXRlJywKCQkJCQknbGVuZ3RoJyA9PiAoaW50KSAkbGVuZ3RoLAoJCQkJKTsKCgkJCWNhc2UgJ3RpbnlibG9iJzoKCQkJY2FzZSAndGlueXRleHQnOgoJCQkJcmV0dXJuIGFycmF5KAoJCQkJCSd0eXBlJyAgID0+ICdieXRlJywKCQkJCQknbGVuZ3RoJyA9PiAyNTUsICAgICAgICAvLyAyXjggLSAxCgkJCQkpOwoKCQkJY2FzZSAnYmxvYic6CgkJCWNhc2UgJ3RleHQnOgoJCQkJcmV0dXJuIGFycmF5KAoJCQkJCSd0eXBlJyAgID0+ICdieXRlJywKCQkJCQknbGVuZ3RoJyA9PiA2NTUzNSwgICAgICAvLyAyXjE2IC0gMQoJCQkJKTsKCgkJCWNhc2UgJ21lZGl1bWJsb2InOgoJCQljYXNlICdtZWRpdW10ZXh0JzoKCQkJCXJldHVybiBhcnJheSgKCQkJCQkndHlwZScgICA9PiAnYnl0ZScsCgkJCQkJJ2xlbmd0aCcgPT4gMTY3NzcyMTUsICAgLy8gMl4yNCAtIDEKCQkJCSk7CgoJCQljYXNlICdsb25nYmxvYic6CgkJCWNhc2UgJ2xvbmd0ZXh0JzoKCQkJCXJldHVybiBhcnJheSgKCQkJCQkndHlwZScgICA9PiAnYnl0ZScsCgkJCQkJJ2xlbmd0aCcgPT4gNDI5NDk2NzI5NSwgLy8gMl4zMiAtIDEKCQkJCSk7CgoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIENoZWNrIGlmIGEgc3RyaW5nIGlzIEFTQ0lJLgoJICoKCSAqIFRoZSBuZWdhdGl2ZSByZWdleCBpcyBmYXN0ZXIgZm9yIG5vbi1BU0NJSSBzdHJpbmdzLCBhcyBpdCBhbGxvd3MKCSAqIHRoZSBzZWFyY2ggdG8gZmluaXNoIGFzIHNvb24gYXMgaXQgZW5jb3VudGVycyBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyBTdHJpbmcgdG8gY2hlY2suCgkgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBBU0NJSSwgZmFsc2UgaWYgbm90LgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tfYXNjaWkoICRzdHJpbmcgKSB7CgkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdtYl9jaGVja19lbmNvZGluZycgKSApIHsKCQkJaWYgKCBtYl9jaGVja19lbmNvZGluZyggJHN0cmluZywgJ0FTQ0lJJyApICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9IGVsc2VpZiAoICEgcHJlZ19tYXRjaCggJy9bXlx4MDAtXHg3Rl0vJywgJHN0cmluZyApICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIENoZWNrIGlmIHRoZSBxdWVyeSBpcyBhY2Nlc3NpbmcgYSBjb2xsYXRpb24gY29uc2lkZXJlZCBzYWZlIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgTXlTUUwuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFRoZSBxdWVyeSB0byBjaGVjay4KCSAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHRoZSBjb2xsYXRpb24gaXMgc2FmZSwgZmFsc2UgaWYgaXQgaXNuJ3QuCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBjaGVja19zYWZlX2NvbGxhdGlvbiggJHF1ZXJ5ICkgewoJCWlmICggJHRoaXMtPmNoZWNraW5nX2NvbGxhdGlvbiApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBjb2xsYXRpb24gZm9yIHF1ZXJpZXMgdGhhdCBkb24ndCByZWFkIGRhdGEuCgkJJHF1ZXJ5ID0gbHRyaW0oICRxdWVyeSwgIlxyXG5cdCAoIiApOwoJCWlmICggcHJlZ19tYXRjaCggJy9eKD86U0hPV3xERVNDUklCRXxERVNDfEVYUExBSU58Q1JFQVRFKVxzL2knLCAkcXVlcnkgKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBBbGwtQVNDSUkgcXVlcmllcyBkb24ndCBuZWVkIGV4dHJhIGNoZWNraW5nLgoJCWlmICggJHRoaXMtPmNoZWNrX2FzY2lpKCAkcXVlcnkgKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkkdGFibGUgPSAkdGhpcy0+Z2V0X3RhYmxlX2Zyb21fcXVlcnkoICRxdWVyeSApOwoJCWlmICggISAkdGFibGUgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSR0aGlzLT5jaGVja2luZ19jb2xsYXRpb24gPSB0cnVlOwoJCSRjb2xsYXRpb24gPSAkdGhpcy0+Z2V0X3RhYmxlX2NoYXJzZXQoICR0YWJsZSApOwoJCSR0aGlzLT5jaGVja2luZ19jb2xsYXRpb24gPSBmYWxzZTsKCgkJLy8gVGFibGVzIHdpdGggbm8gY29sbGF0aW9uLCBvciBsYXRpbjEgb25seSwgZG9uJ3QgbmVlZCBleHRyYSBjaGVja2luZy4KCQlpZiAoIGZhbHNlID09PSAkY29sbGF0aW9uIHx8ICdsYXRpbjEnID09PSAkY29sbGF0aW9uICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCSR0YWJsZSA9IHN0cnRvbG93ZXIoICR0YWJsZSApOwoJCWlmICggZW1wdHkoICR0aGlzLT5jb2xfbWV0YVsgJHRhYmxlIF0gKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gSWYgYW55IG9mIHRoZSBjb2x1bW5zIGRvbid0IGhhdmUgb25lIG9mIHRoZXNlIGNvbGxhdGlvbnMsIGl0IG5lZWRzIG1vcmUgc2FuaXR5IGNoZWNraW5nLgoJCWZvcmVhY2ggKCAkdGhpcy0+Y29sX21ldGFbICR0YWJsZSBdIGFzICRjb2wgKSB7CgkJCWlmICggZW1wdHkoICRjb2wtPkNvbGxhdGlvbiApICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICggISBpbl9hcnJheSggJGNvbC0+Q29sbGF0aW9uLCBhcnJheSggJ3V0ZjhfZ2VuZXJhbF9jaScsICd1dGY4X2JpbicsICd1dGY4bWI0X2dlbmVyYWxfY2knLCAndXRmOG1iNF9iaW4nICksIHRydWUgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBTdHJpcHMgYW55IGludmFsaWQgY2hhcmFjdGVycyBiYXNlZCBvbiB2YWx1ZS9jaGFyc2V0IHBhaXJzLgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGRhdGEgQXJyYXkgb2YgdmFsdWUgYXJyYXlzLiBFYWNoIHZhbHVlIGFycmF5IGhhcyB0aGUga2V5cwoJICogICAgICAgICAgICAgICAgICAgICd2YWx1ZScgYW5kICdjaGFyc2V0Jy4gQW4gb3B0aW9uYWwgJ2FzY2lpJyBrZXkgY2FuIGJlCgkgKiAgICAgICAgICAgICAgICAgICAgc2V0IHRvIGZhbHNlIHRvIGF2b2lkIHJlZHVuZGFudCBBU0NJSSBjaGVja3MuCgkgKiBAcmV0dXJuIGFycmF5fFdQX0Vycm9yIFRoZSAkZGF0YSBwYXJhbWV0ZXIsIHdpdGggaW52YWxpZCBjaGFyYWN0ZXJzIHJlbW92ZWQgZnJvbQoJICogICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHZhbHVlLiBUaGlzIHdvcmtzIGFzIGEgcGFzc3Rocm91Z2g6IGFueSBhZGRpdGlvbmFsIGtleXMKCSAqICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyAnZmllbGQnIGFyZSByZXRhaW5lZCBpbiBlYWNoIHZhbHVlIGFycmF5LiBJZiB3ZSBjYW5ub3QKCSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlIGludmFsaWQgY2hhcmFjdGVycywgYSBXUF9FcnJvciBvYmplY3QgaXMgcmV0dXJuZWQuCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBzdHJpcF9pbnZhbGlkX3RleHQoICRkYXRhICkgewoJCSRkYl9jaGVja19zdHJpbmcgPSBmYWxzZTsKCgkJZm9yZWFjaCAoICRkYXRhIGFzICYkdmFsdWUgKSB7CgkJCSRjaGFyc2V0ID0gJHZhbHVlWydjaGFyc2V0J107CgoJCQlpZiAoIGlzX2FycmF5KCAkdmFsdWVbJ2xlbmd0aCddICkgKSB7CgkJCQkkbGVuZ3RoID0gJHZhbHVlWydsZW5ndGgnXVsnbGVuZ3RoJ107CgkJCQkkdHJ1bmNhdGVfYnlfYnl0ZV9sZW5ndGggPSAnYnl0ZScgPT09ICR2YWx1ZVsnbGVuZ3RoJ11bJ3R5cGUnXTsKCQkJfSBlbHNlIHsKCQkJCSRsZW5ndGggPSBmYWxzZTsKCQkJCS8vIFNpbmNlIHdlIGhhdmUgbm8gbGVuZ3RoLCB3ZSdsbCBuZXZlciB0cnVuY2F0ZS4KCQkJCS8vIEluaXRpYWxpemUgdGhlIHZhcmlhYmxlIHRvIGZhbHNlLiB0cnVlIHdvdWxkIHRha2UgdXMKCQkJCS8vIHRocm91Z2ggYW4gdW5uZWNlc3NhcnkgKGZvciB0aGlzIGNhc2UpIGNvZGVwYXRoIGJlbG93LgoJCQkJJHRydW5jYXRlX2J5X2J5dGVfbGVuZ3RoID0gZmFsc2U7CgkJCX0KCgkJCS8vIFRoZXJlJ3Mgbm8gY2hhcnNldCB0byB3b3JrIHdpdGguCgkJCWlmICggZmFsc2UgPT09ICRjaGFyc2V0ICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIENvbHVtbiBpc24ndCBhIHN0cmluZy4KCQkJaWYgKCAhIGlzX3N0cmluZyggJHZhbHVlWyd2YWx1ZSddICkgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJG5lZWRzX3ZhbGlkYXRpb24gPSB0cnVlOwoJCQlpZiAoCgkJCQkvLyBsYXRpbjEgY2FuIHN0b3JlIGFueSBieXRlIHNlcXVlbmNlCgkJCQknbGF0aW4xJyA9PT0gJGNoYXJzZXQKCQkJfHwKCQkJCS8vIEFTQ0lJIGlzIGFsd2F5cyBPSy4KCQkJCSggISBpc3NldCggJHZhbHVlWydhc2NpaSddICkgJiYgJHRoaXMtPmNoZWNrX2FzY2lpKCAkdmFsdWVbJ3ZhbHVlJ10gKSApCgkJCSkgewoJCQkJJHRydW5jYXRlX2J5X2J5dGVfbGVuZ3RoID0gdHJ1ZTsKCQkJCSRuZWVkc192YWxpZGF0aW9uID0gZmFsc2U7CgkJCX0KCgkJCWlmICggJHRydW5jYXRlX2J5X2J5dGVfbGVuZ3RoICkgewoJCQkJbWJzdHJpbmdfYmluYXJ5X3NhZmVfZW5jb2RpbmcoKTsKCQkJCWlmICggZmFsc2UgIT09ICRsZW5ndGggJiYgc3RybGVuKCAkdmFsdWVbJ3ZhbHVlJ10gKSA+ICRsZW5ndGggKSB7CgkJCQkJJHZhbHVlWyd2YWx1ZSddID0gc3Vic3RyKCAkdmFsdWVbJ3ZhbHVlJ10sIDAsICRsZW5ndGggKTsKCQkJCX0KCQkJCXJlc2V0X21ic3RyaW5nX2VuY29kaW5nKCk7CgoJCQkJaWYgKCAhICRuZWVkc192YWxpZGF0aW9uICkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgoJCQkvLyB1dGY4IGNhbiBiZSBoYW5kbGVkIGJ5IHJlZ2V4LCB3aGljaCBpcyBhIGJ1bmNoIGZhc3RlciB0aGFuIGEgREIgbG9va3VwLgoJCQlpZiAoICggJ3V0ZjgnID09PSAkY2hhcnNldCB8fCAndXRmOG1iMycgPT09ICRjaGFyc2V0IHx8ICd1dGY4bWI0JyA9PT0gJGNoYXJzZXQgKSAmJiBmdW5jdGlvbl9leGlzdHMoICdtYl9zdHJsZW4nICkgKSB7CgkJCQkkcmVnZXggPSAnLwoJCQkJCSgKCQkJCQkJKD86IFtceDAwLVx4N0ZdICAgICAgICAgICAgICAgICAgIyBzaW5nbGUtYnl0ZSBzZXF1ZW5jZXMgICAweHh4eHh4eAoJCQkJCQl8ICAgW1x4QzItXHhERl1bXHg4MC1ceEJGXSAgICAgICAjIGRvdWJsZS1ieXRlIHNlcXVlbmNlcyAgIDExMHh4eHh4IDEweHh4eHh4CgkJCQkJCXwgICBceEUwW1x4QTAtXHhCRl1bXHg4MC1ceEJGXSAgICMgdHJpcGxlLWJ5dGUgc2VxdWVuY2VzICAgMTExMHh4eHggMTB4eHh4eHggKiAyCgkJCQkJCXwgICBbXHhFMS1ceEVDXVtceDgwLVx4QkZdezJ9CgkJCQkJCXwgICBceEVEW1x4ODAtXHg5Rl1bXHg4MC1ceEJGXQoJCQkJCQl8ICAgW1x4RUUtXHhFRl1bXHg4MC1ceEJGXXsyfSc7CgoJCQkJaWYgKCAndXRmOG1iNCcgPT09ICRjaGFyc2V0ICkgewoJCQkJCSRyZWdleCAuPSAnCgkJCQkJCXwgICAgXHhGMFtceDkwLVx4QkZdW1x4ODAtXHhCRl17Mn0gIyBmb3VyLWJ5dGUgc2VxdWVuY2VzICAgMTExMTB4eHggMTB4eHh4eHggKiAzCgkJCQkJCXwgICAgW1x4RjEtXHhGM11bXHg4MC1ceEJGXXszfQoJCQkJCQl8ICAgIFx4RjRbXHg4MC1ceDhGXVtceDgwLVx4QkZdezJ9CgkJCQkJJzsKCQkJCX0KCgkJCQkkcmVnZXggLj0gJyl7MSw0MH0gICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4ub25lIG9yIG1vcmUgdGltZXMKCQkJCQkpCgkJCQkJfCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55dGhpbmcgZWxzZQoJCQkJCS94JzsKCQkJCSR2YWx1ZVsndmFsdWUnXSA9IHByZWdfcmVwbGFjZSggJHJlZ2V4LCAnJDEnLCAkdmFsdWVbJ3ZhbHVlJ10gKTsKCgoJCQkJaWYgKCBmYWxzZSAhPT0gJGxlbmd0aCAmJiBtYl9zdHJsZW4oICR2YWx1ZVsndmFsdWUnXSwgJ1VURi04JyApID4gJGxlbmd0aCApIHsKCQkJCQkkdmFsdWVbJ3ZhbHVlJ10gPSBtYl9zdWJzdHIoICR2YWx1ZVsndmFsdWUnXSwgMCwgJGxlbmd0aCwgJ1VURi04JyApOwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIFdlIGNvdWxkbid0IHVzZSBhbnkgbG9jYWwgY29udmVyc2lvbnMsIHNlbmQgaXQgdG8gdGhlIERCLgoJCQkkdmFsdWVbJ2RiJ10gPSAkZGJfY2hlY2tfc3RyaW5nID0gdHJ1ZTsKCQl9CgkJdW5zZXQoICR2YWx1ZSApOyAvLyBSZW1vdmUgYnkgcmVmZXJlbmNlLgoKCQlpZiAoICRkYl9jaGVja19zdHJpbmcgKSB7CgkJCSRxdWVyaWVzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoICRkYXRhIGFzICRjb2wgPT4gJHZhbHVlICkgewoJCQkJaWYgKCAhIGVtcHR5KCAkdmFsdWVbJ2RiJ10gKSApIHsKCQkJCQkvLyBXZSdyZSBnb2luZyB0byBuZWVkIHRvIHRydW5jYXRlIGJ5IGNoYXJhY3RlcnMgb3IgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIHZhbHVlIHdlIGhhdmUuCgkJCQkJaWYgKCAnYnl0ZScgPT09ICR2YWx1ZVsnbGVuZ3RoJ11bJ3R5cGUnXSApIHsKCQkJCQkJLy8gVXNpbmcgYmluYXJ5IGNhdXNlcyBMRUZUKCkgdG8gdHJ1bmNhdGUgYnkgYnl0ZXMuCgkJCQkJCSRjaGFyc2V0ID0gJ2JpbmFyeSc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGNoYXJzZXQgPSAkdmFsdWVbJ2NoYXJzZXQnXTsKCQkJCQl9CgoJCQkJCWlmICggaXNfYXJyYXkoICR2YWx1ZVsnbGVuZ3RoJ10gKSApIHsKCQkJCQkJJHF1ZXJpZXNbICRjb2wgXSA9ICR0aGlzLT5wcmVwYXJlKCAiQ09OVkVSVCggTEVGVCggQ09OVkVSVCggJXMgVVNJTkcgJGNoYXJzZXQgKSwgJS4wZiApIFVTSU5HIHskdGhpcy0+Y2hhcnNldH0gKSIsICR2YWx1ZVsndmFsdWUnXSwgJHZhbHVlWydsZW5ndGgnXVsnbGVuZ3RoJ10gKTsKCQkJCQl9IGVsc2UgaWYgKCAnYmluYXJ5JyAhPT0gJGNoYXJzZXQgKSB7CgkJCQkJCS8vIElmIHdlIGRvbid0IGhhdmUgYSBsZW5ndGgsIHRoZXJlJ3Mgbm8gbmVlZCB0byBjb252ZXJ0IGJpbmFyeSAtIGl0IHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCgkJCQkJCSRxdWVyaWVzWyAkY29sIF0gPSAkdGhpcy0+cHJlcGFyZSggIkNPTlZFUlQoIENPTlZFUlQoICVzIFVTSU5HICRjaGFyc2V0ICkgVVNJTkcgeyR0aGlzLT5jaGFyc2V0fSApIiwgJHZhbHVlWyd2YWx1ZSddICk7CgkJCQkJfQoKCQkJCQl1bnNldCggJGRhdGFbICRjb2wgXVsnZGInXSApOwoJCQkJfQoJCQl9CgoJCQkkc3FsID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoICRxdWVyaWVzIGFzICRjb2x1bW4gPT4gJHF1ZXJ5ICkgewoJCQkJaWYgKCAhICRxdWVyeSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkkc3FsW10gPSAkcXVlcnkgLiAiIEFTIHhfJGNvbHVtbiI7CgkJCX0KCgkJCSR0aGlzLT5jaGVja19jdXJyZW50X3F1ZXJ5ID0gZmFsc2U7CgkJCSRyb3cgPSAkdGhpcy0+Z2V0X3JvdyggIlNFTEVDVCAiIC4gaW1wbG9kZSggJywgJywgJHNxbCApLCBBUlJBWV9BICk7CgkJCWlmICggISAkcm93ICkgewoJCQkJcmV0dXJuIG5ldyBXUF9FcnJvciggJ3dwZGJfc3RyaXBfaW52YWxpZF90ZXh0X2ZhaWx1cmUnICk7CgkJCX0KCgkJCWZvcmVhY2ggKCBhcnJheV9rZXlzKCAkZGF0YSApIGFzICRjb2x1bW4gKSB7CgkJCQlpZiAoIGlzc2V0KCAkcm93WyJ4XyRjb2x1bW4iXSApICkgewoJCQkJCSRkYXRhWyAkY29sdW1uIF1bJ3ZhbHVlJ10gPSAkcm93WyJ4XyRjb2x1bW4iXTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRkYXRhOwoJfQoKCS8qKgoJICogU3RyaXBzIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgZnJvbSB0aGUgcXVlcnkuCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFF1ZXJ5IHRvIGNvbnZlcnQuCgkgKiBAcmV0dXJuIHN0cmluZ3xXUF9FcnJvciBUaGUgY29udmVydGVkIHF1ZXJ5LCBvciBhIFdQX0Vycm9yIG9iamVjdCBpZiB0aGUgY29udmVyc2lvbiBmYWlscy4KCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHN0cmlwX2ludmFsaWRfdGV4dF9mcm9tX3F1ZXJ5KCAkcXVlcnkgKSB7CgkJLy8gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgY29sbGF0aW9uIGZvciBxdWVyaWVzIHRoYXQgZG9uJ3QgcmVhZCBkYXRhLgoJCSR0cmltbWVkX3F1ZXJ5ID0gbHRyaW0oICRxdWVyeSwgIlxyXG5cdCAoIiApOwoJCWlmICggcHJlZ19tYXRjaCggJy9eKD86U0hPV3xERVNDUklCRXxERVNDfEVYUExBSU58Q1JFQVRFKVxzL2knLCAkdHJpbW1lZF9xdWVyeSApICkgewoJCQlyZXR1cm4gJHF1ZXJ5OwoJCX0KCgkJJHRhYmxlID0gJHRoaXMtPmdldF90YWJsZV9mcm9tX3F1ZXJ5KCAkcXVlcnkgKTsKCQlpZiAoICR0YWJsZSApIHsKCQkJJGNoYXJzZXQgPSAkdGhpcy0+Z2V0X3RhYmxlX2NoYXJzZXQoICR0YWJsZSApOwoJCQlpZiAoIGlzX3dwX2Vycm9yKCAkY2hhcnNldCApICkgewoJCQkJcmV0dXJuICRjaGFyc2V0OwoJCQl9CgoJCQkvLyBXZSBjYW4ndCByZWxpYWJseSBzdHJpcCB0ZXh0IGZyb20gdGFibGVzIGNvbnRhaW5pbmcgYmluYXJ5L2Jsb2IgY29sdW1ucwoJCQlpZiAoICdiaW5hcnknID09PSAkY2hhcnNldCApIHsKCQkJCXJldHVybiAkcXVlcnk7CgkJCX0KCQl9IGVsc2UgewoJCQkkY2hhcnNldCA9ICR0aGlzLT5jaGFyc2V0OwoJCX0KCgkJJGRhdGEgPSBhcnJheSgKCQkJJ3ZhbHVlJyAgID0+ICRxdWVyeSwKCQkJJ2NoYXJzZXQnID0+ICRjaGFyc2V0LAoJCQknYXNjaWknICAgPT4gZmFsc2UsCgkJCSdsZW5ndGgnICA9PiBmYWxzZSwKCQkpOwoKCQkkZGF0YSA9ICR0aGlzLT5zdHJpcF9pbnZhbGlkX3RleHQoIGFycmF5KCAkZGF0YSApICk7CgkJaWYgKCBpc193cF9lcnJvciggJGRhdGEgKSApIHsKCQkJcmV0dXJuICRkYXRhOwoJCX0KCgkJcmV0dXJuICRkYXRhWzBdWyd2YWx1ZSddOwoJfQoKCS8qKgoJICogU3RyaXBzIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nIGZvciBhIGdpdmVuIHRhYmxlIGFuZCBjb2x1bW4uCgkgKgoJICogQHNpbmNlIDQuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlICBUYWJsZSBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkY29sdW1uIENvbHVtbiBuYW1lLgoJICogQHBhcmFtIHN0cmluZyAkdmFsdWUgIFRoZSB0ZXh0IHRvIGNoZWNrLgoJICogQHJldHVybiBzdHJpbmd8V1BfRXJyb3IgVGhlIGNvbnZlcnRlZCBzdHJpbmcsIG9yIGEgV1BfRXJyb3Igb2JqZWN0IGlmIHRoZSBjb252ZXJzaW9uIGZhaWxzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RyaXBfaW52YWxpZF90ZXh0X2Zvcl9jb2x1bW4oICR0YWJsZSwgJGNvbHVtbiwgJHZhbHVlICkgewoJCWlmICggISBpc19zdHJpbmcoICR2YWx1ZSApICkgewoJCQlyZXR1cm4gJHZhbHVlOwoJCX0KCgkJJGNoYXJzZXQgPSAkdGhpcy0+Z2V0X2NvbF9jaGFyc2V0KCAkdGFibGUsICRjb2x1bW4gKTsKCQlpZiAoICEgJGNoYXJzZXQgKSB7CgkJCS8vIE5vdCBhIHN0cmluZyBjb2x1bW4uCgkJCXJldHVybiAkdmFsdWU7CgkJfSBlbHNlaWYgKCBpc193cF9lcnJvciggJGNoYXJzZXQgKSApIHsKCQkJLy8gQmFpbCBvbiByZWFsIGVycm9ycy4KCQkJcmV0dXJuICRjaGFyc2V0OwoJCX0KCgkJJGRhdGEgPSBhcnJheSgKCQkJJGNvbHVtbiA9PiBhcnJheSgKCQkJCSd2YWx1ZScgICA9PiAkdmFsdWUsCgkJCQknY2hhcnNldCcgPT4gJGNoYXJzZXQsCgkJCQknbGVuZ3RoJyAgPT4gJHRoaXMtPmdldF9jb2xfbGVuZ3RoKCAkdGFibGUsICRjb2x1bW4gKSwKCQkJKQoJCSk7CgoJCSRkYXRhID0gJHRoaXMtPnN0cmlwX2ludmFsaWRfdGV4dCggJGRhdGEgKTsKCQlpZiAoIGlzX3dwX2Vycm9yKCAkZGF0YSApICkgewoJCQlyZXR1cm4gJGRhdGE7CgkJfQoKCQlyZXR1cm4gJGRhdGFbICRjb2x1bW4gXVsndmFsdWUnXTsKCX0KCgkvKioKCSAqIEZpbmQgdGhlIGZpcnN0IHRhYmxlIG5hbWUgcmVmZXJlbmNlZCBpbiBhIHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRxdWVyeSBUaGUgcXVlcnkgdG8gc2VhcmNoLgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2UgJHRhYmxlIFRoZSB0YWJsZSBuYW1lIGZvdW5kLCBvciBmYWxzZSBpZiBhIHRhYmxlIGNvdWxkbid0IGJlIGZvdW5kLgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X3RhYmxlX2Zyb21fcXVlcnkoICRxdWVyeSApIHsKCQkvLyBSZW1vdmUgY2hhcmFjdGVycyB0aGF0IGNhbiBsZWdhbGx5IHRyYWlsIHRoZSB0YWJsZSBuYW1lLgoJCSRxdWVyeSA9IHJ0cmltKCAkcXVlcnksICc7Ly0jJyApOwoKCQkvLyBBbGxvdyAoc2VsZWN0Li4uKSB1bmlvbiBbLi4uXSBzdHlsZSBxdWVyaWVzLiBVc2UgdGhlIGZpcnN0IHF1ZXJ5J3MgdGFibGUgbmFtZS4KCQkkcXVlcnkgPSBsdHJpbSggJHF1ZXJ5LCAiXHJcblx0ICgiICk7CgoJCS8vIFN0cmlwIGV2ZXJ5dGhpbmcgYmV0d2VlbiBwYXJlbnRoZXNlcyBleGNlcHQgbmVzdGVkIHNlbGVjdHMuCgkJJHF1ZXJ5ID0gcHJlZ19yZXBsYWNlKCAnL1woKD8hXHMqc2VsZWN0KVteKF0qP1wpL2lzJywgJygpJywgJHF1ZXJ5ICk7CgoJCS8vIFF1aWNrbHkgbWF0Y2ggbW9zdCBjb21tb24gcXVlcmllcy4KCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKig/OicKCQkJCS4gJ1NFTEVDVC4qP1xzK0ZST00nCgkJCQkuICd8SU5TRVJUKD86XHMrTE9XX1BSSU9SSVRZfFxzK0RFTEFZRUR8XHMrSElHSF9QUklPUklUWSk/KD86XHMrSUdOT1JFKT8oPzpccytJTlRPKT8nCgkJCQkuICd8UkVQTEFDRSg/OlxzK0xPV19QUklPUklUWXxccytERUxBWUVEKT8oPzpccytJTlRPKT8nCgkJCQkuICd8VVBEQVRFKD86XHMrTE9XX1BSSU9SSVRZKT8oPzpccytJR05PUkUpPycKCQkJCS4gJ3xERUxFVEUoPzpccytMT1dfUFJJT1JJVFl8XHMrUVVJQ0t8XHMrSUdOT1JFKSooPzpccytGUk9NKT8nCgkJCQkuICcpXHMrKCg/OlswLTlhLXpBLVokXy5gLV18W1x4QzItXHhERl1bXHg4MC1ceEJGXSkrKS9pcycsICRxdWVyeSwgJG1heWJlICkgKSB7CgkJCXJldHVybiBzdHJfcmVwbGFjZSggJ2AnLCAnJywgJG1heWJlWzFdICk7CgkJfQoKCQkvLyBTSE9XIFRBQkxFIFNUQVRVUyBhbmQgU0hPVyBUQUJMRVMKCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKig/OicKCQkJCS4gJ1NIT1dccytUQUJMRVxzK1NUQVRVUy4rKD86TElLRVxzK3xXSEVSRVxzK05hbWVccyo9XHMqKScKCQkJCS4gJ3xTSE9XXHMrKD86RlVMTFxzKyk/VEFCTEVTLisoPzpMSUtFXHMrfFdIRVJFXHMrTmFtZVxzKj1ccyopJwoJCQkJLiAnKVxXKCg/OlswLTlhLXpBLVokXy5gLV18W1x4QzItXHhERl1bXHg4MC1ceEJGXSkrKVxXL2lzJywgJHF1ZXJ5LCAkbWF5YmUgKSApIHsKCQkJcmV0dXJuIHN0cl9yZXBsYWNlKCAnYCcsICcnLCAkbWF5YmVbMV0gKTsKCQl9CgoJCS8vIEJpZyBwYXR0ZXJuIGZvciB0aGUgcmVzdCBvZiB0aGUgdGFibGUtcmVsYXRlZCBxdWVyaWVzLgoJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKD86JwoJCQkJLiAnKD86RVhQTEFJTlxzKyg/OkVYVEVOREVEXHMrKT8pP1NFTEVDVC4qP1xzK0ZST00nCgkJCQkuICd8REVTQ1JJQkV8REVTQ3xFWFBMQUlOfEhBTkRMRVInCgkJCQkuICd8KD86TE9DS3xVTkxPQ0spXHMrVEFCTEUoPzpTKT8nCgkJCQkuICd8KD86UkVOQU1FfE9QVElNSVpFfEJBQ0tVUHxSRVNUT1JFfENIRUNLfENIRUNLU1VNfEFOQUxZWkV8UkVQQUlSKS4qXHMrVEFCTEUnCgkJCQkuICd8VFJVTkNBVEUoPzpccytUQUJMRSk/JwoJCQkJLiAnfENSRUFURSg/OlxzK1RFTVBPUkFSWSk/XHMrVEFCTEUoPzpccytJRlxzK05PVFxzK0VYSVNUUyk/JwoJCQkJLiAnfEFMVEVSKD86XHMrSUdOT1JFKT9ccytUQUJMRScKCQkJCS4gJ3xEUk9QXHMrVEFCTEUoPzpccytJRlxzK0VYSVNUUyk/JwoJCQkJLiAnfENSRUFURSg/OlxzK1x3Kyk/XHMrSU5ERVguKlxzK09OJwoJCQkJLiAnfERST1BccytJTkRFWC4qXHMrT04nCgkJCQkuICd8TE9BRFxzK0RBVEEuKklORklMRS4qSU5UT1xzK1RBQkxFJwoJCQkJLiAnfCg/OkdSQU5UfFJFVk9LRSkuKk9OXHMrVEFCTEUnCgkJCQkuICd8U0hPV1xzKyg/Oi4qRlJPTXwuKlRBQkxFKScKCQkJCS4gJylccytcKCpccyooKD86WzAtOWEtekEtWiRfLmAtXXxbXHhDMi1ceERGXVtceDgwLVx4QkZdKSspXHMqXCkqL2lzJywgJHF1ZXJ5LCAkbWF5YmUgKSApIHsKCQkJcmV0dXJuIHN0cl9yZXBsYWNlKCAnYCcsICcnLCAkbWF5YmVbMV0gKTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIExvYWQgdGhlIGNvbHVtbiBtZXRhZGF0YSBmcm9tIHRoZSBsYXN0IHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAzLjUuMAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBsb2FkX2NvbF9pbmZvKCkgewoJCWlmICggJHRoaXMtPmNvbF9pbmZvICkKCQkJcmV0dXJuOwoKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkkbnVtX2ZpZWxkcyA9IEBteXNxbGlfbnVtX2ZpZWxkcyggJHRoaXMtPnJlc3VsdCApOwoJCQlmb3IgKCAkaSA9IDA7ICRpIDwgJG51bV9maWVsZHM7ICRpKysgKSB7CgkJCQkkdGhpcy0+Y29sX2luZm9bICRpIF0gPSBAbXlzcWxpX2ZldGNoX2ZpZWxkKCAkdGhpcy0+cmVzdWx0ICk7CgkJCX0KCQl9IGVsc2UgewoJCQkkbnVtX2ZpZWxkcyA9IEBteXNxbF9udW1fZmllbGRzKCAkdGhpcy0+cmVzdWx0ICk7CgkJCWZvciAoICRpID0gMDsgJGkgPCAkbnVtX2ZpZWxkczsgJGkrKyApIHsKCQkJCSR0aGlzLT5jb2xfaW5mb1sgJGkgXSA9IEBteXNxbF9mZXRjaF9maWVsZCggJHRoaXMtPnJlc3VsdCwgJGkgKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFJldHJpZXZlIGNvbHVtbiBtZXRhZGF0YSBmcm9tIHRoZSBsYXN0IHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaW5mb190eXBlICBPcHRpb25hbC4gVHlwZSBvbmUgb2YgbmFtZSwgdGFibGUsIGRlZiwgbWF4X2xlbmd0aCwgbm90X251bGwsIHByaW1hcnlfa2V5LCBtdWx0aXBsZV9rZXksIHVuaXF1ZV9rZXksIG51bWVyaWMsIGJsb2IsIHR5cGUsIHVuc2lnbmVkLCB6ZXJvZmlsbAoJICogQHBhcmFtIGludCAgICAkY29sX29mZnNldCBPcHRpb25hbC4gMDogY29sIG5hbWUuIDE6IHdoaWNoIHRhYmxlIHRoZSBjb2wncyBpbi4gMjogY29sJ3MgbWF4IGxlbmd0aC4gMzogaWYgdGhlIGNvbCBpcyBudW1lcmljLiA0OiBjb2wncyB0eXBlCgkgKiBAcmV0dXJuIG1peGVkIENvbHVtbiBSZXN1bHRzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29sX2luZm8oICRpbmZvX3R5cGUgPSAnbmFtZScsICRjb2xfb2Zmc2V0ID0gLTEgKSB7CgkJJHRoaXMtPmxvYWRfY29sX2luZm8oKTsKCgkJaWYgKCAkdGhpcy0+Y29sX2luZm8gKSB7CgkJCWlmICggJGNvbF9vZmZzZXQgPT0gLTEgKSB7CgkJCQkkaSA9IDA7CgkJCQkkbmV3X2FycmF5ID0gYXJyYXkoKTsKCQkJCWZvcmVhY2ggKCAoYXJyYXkpICR0aGlzLT5jb2xfaW5mbyBhcyAkY29sICkgewoJCQkJCSRuZXdfYXJyYXlbJGldID0gJGNvbC0+eyRpbmZvX3R5cGV9OwoJCQkJCSRpKys7CgkJCQl9CgkJCQlyZXR1cm4gJG5ld19hcnJheTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAkdGhpcy0+Y29sX2luZm9bJGNvbF9vZmZzZXRdLT57JGluZm9fdHlwZX07CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBTdGFydHMgdGhlIHRpbWVyLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gdHJ1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gdGltZXJfc3RhcnQoKSB7CgkJJHRoaXMtPnRpbWVfc3RhcnQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFN0b3BzIHRoZSBkZWJ1Z2dpbmcgdGltZXIuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHJldHVybiBmbG9hdCBUb3RhbCB0aW1lIHNwZW50IG9uIHRoZSBxdWVyeSwgaW4gc2Vjb25kcwoJICovCglwdWJsaWMgZnVuY3Rpb24gdGltZXJfc3RvcCgpIHsKCQlyZXR1cm4gKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0ICk7Cgl9CgoJLyoqCgkgKiBXcmFwcyBlcnJvcnMgaW4gYSBuaWNlIGhlYWRlciBhbmQgZm9vdGVyIGFuZCBkaWVzLgoJICoKCSAqIFdpbGwgbm90IGRpZSBpZiB3cGRiOjokc2hvd19lcnJvcnMgaXMgZmFsc2UuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZSAgICBUaGUgRXJyb3IgbWVzc2FnZQoJICogQHBhcmFtIHN0cmluZyAkZXJyb3JfY29kZSBPcHRpb25hbC4gQSBDb21wdXRlciByZWFkYWJsZSBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGVycm9yLgoJICogQHJldHVybiBmYWxzZXx2b2lkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBiYWlsKCAkbWVzc2FnZSwgJGVycm9yX2NvZGUgPSAnNTAwJyApIHsKCQlpZiAoICEkdGhpcy0+c2hvd19lcnJvcnMgKSB7CgkJCWlmICggY2xhc3NfZXhpc3RzKCAnV1BfRXJyb3InLCBmYWxzZSApICkgewoJCQkJJHRoaXMtPmVycm9yID0gbmV3IFdQX0Vycm9yKCRlcnJvcl9jb2RlLCAkbWVzc2FnZSk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZXJyb3IgPSAkbWVzc2FnZTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXdwX2RpZSgkbWVzc2FnZSk7Cgl9CgoJLyoqCgkgKiBXaGV0aGVyIE15U1FMIGRhdGFiYXNlIGlzIGF0IGxlYXN0IHRoZSByZXF1aXJlZCBtaW5pbXVtIHZlcnNpb24uCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKgoJICogQGdsb2JhbCBzdHJpbmcgJHdwX3ZlcnNpb24KCSAqIEBnbG9iYWwgc3RyaW5nICRyZXF1aXJlZF9teXNxbF92ZXJzaW9uCgkgKgoJICogQHJldHVybiBXUF9FcnJvcnx2b2lkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjaGVja19kYXRhYmFzZV92ZXJzaW9uKCkgewoJCWdsb2JhbCAkd3BfdmVyc2lvbiwgJHJlcXVpcmVkX215c3FsX3ZlcnNpb247CgkJLy8gTWFrZSBzdXJlIHRoZSBzZXJ2ZXIgaGFzIHRoZSByZXF1aXJlZCBNeVNRTCB2ZXJzaW9uCgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoJHRoaXMtPmRiX3ZlcnNpb24oKSwgJHJlcXVpcmVkX215c3FsX3ZlcnNpb24sICc8JykgKQoJCQlyZXR1cm4gbmV3IFdQX0Vycm9yKCdkYXRhYmFzZV92ZXJzaW9uJywgc3ByaW50ZiggX18oICc8c3Ryb25nPkVSUk9SPC9zdHJvbmc+OiBXb3JkUHJlc3MgJTEkcyByZXF1aXJlcyBNeVNRTCAlMiRzIG9yIGhpZ2hlcicgKSwgJHdwX3ZlcnNpb24sICRyZXF1aXJlZF9teXNxbF92ZXJzaW9uICkpOwoJfQoKCS8qKgoJICogV2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgY29sbGF0aW9uLgoJICoKCSAqIENhbGxlZCB3aGVuIFdvcmRQcmVzcyBpcyBnZW5lcmF0aW5nIHRoZSB0YWJsZSBzY2hlbWUuCgkgKgoJICogVXNlIGB3cGRiOjpoYXNfY2FwKCAnY29sbGF0aW9uJyApYC4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEBkZXByZWNhdGVkIDMuNS4wIFVzZSB3cGRiOjpoYXNfY2FwKCkKCSAqCgkgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBjb2xsYXRpb24gaXMgc3VwcG9ydGVkLCBmYWxzZSBpZiB2ZXJzaW9uIGRvZXMgbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0c19jb2xsYXRpb24oKSB7CgkJX2RlcHJlY2F0ZWRfZnVuY3Rpb24oIF9fRlVOQ1RJT05fXywgJzMuNScsICd3cGRiOjpoYXNfY2FwKCBcJ2NvbGxhdGlvblwnICknICk7CgkJcmV0dXJuICR0aGlzLT5oYXNfY2FwKCAnY29sbGF0aW9uJyApOwoJfQoKCS8qKgoJICogVGhlIGRhdGFiYXNlIGNoYXJhY3RlciBjb2xsYXRlLgoJICoKCSAqIEBzaW5jZSAzLjUuMAoJICoKCSAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhYmFzZSBjaGFyYWN0ZXIgY29sbGF0ZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jaGFyc2V0X2NvbGxhdGUoKSB7CgkJJGNoYXJzZXRfY29sbGF0ZSA9ICcnOwoKCQlpZiAoICEgZW1wdHkoICR0aGlzLT5jaGFyc2V0ICkgKQoJCQkkY2hhcnNldF9jb2xsYXRlID0gIkRFRkFVTFQgQ0hBUkFDVEVSIFNFVCAkdGhpcy0+Y2hhcnNldCI7CgkJaWYgKCAhIGVtcHR5KCAkdGhpcy0+Y29sbGF0ZSApICkKCQkJJGNoYXJzZXRfY29sbGF0ZSAuPSAiIENPTExBVEUgJHRoaXMtPmNvbGxhdGUiOwoKCQlyZXR1cm4gJGNoYXJzZXRfY29sbGF0ZTsKCX0KCgkvKioKCSAqIERldGVybWluZSBpZiBhIGRhdGFiYXNlIHN1cHBvcnRzIGEgcGFydGljdWxhciBmZWF0dXJlLgoJICoKCSAqIEBzaW5jZSAyLjcuMAoJICogQHNpbmNlIDQuMS4wIFN1cHBvcnQgd2FzIGFkZGVkIGZvciB0aGUgJ3V0ZjhtYjQnIGZlYXR1cmUuCgkgKgoJICogQHNlZSB3cGRiOjpkYl92ZXJzaW9uKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkYl9jYXAgVGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yLiBBY2NlcHRzICdjb2xsYXRpb24nLAoJICogICAgICAgICAgICAgICAgICAgICAgICdncm91cF9jb25jYXQnLCAnc3VicXVlcmllcycsICdzZXRfY2hhcnNldCcsCgkgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgJ3V0ZjhtYjQnLgoJICogQHJldHVybiBpbnR8ZmFsc2UgV2hldGhlciB0aGUgZGF0YWJhc2UgZmVhdHVyZSBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGhhc19jYXAoICRkYl9jYXAgKSB7CgkJJHZlcnNpb24gPSAkdGhpcy0+ZGJfdmVyc2lvbigpOwoKCQlzd2l0Y2ggKCBzdHJ0b2xvd2VyKCAkZGJfY2FwICkgKSB7CgkJCWNhc2UgJ2NvbGxhdGlvbicgOiAgICAvLyBAc2luY2UgMi41LjAKCQkJY2FzZSAnZ3JvdXBfY29uY2F0JyA6IC8vIEBzaW5jZSAyLjcuMAoJCQljYXNlICdzdWJxdWVyaWVzJyA6ICAgLy8gQHNpbmNlIDIuNy4wCgkJCQlyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCAkdmVyc2lvbiwgJzQuMScsICc+PScgKTsKCQkJY2FzZSAnc2V0X2NoYXJzZXQnIDoKCQkJCXJldHVybiB2ZXJzaW9uX2NvbXBhcmUoICR2ZXJzaW9uLCAnNS4wLjcnLCAnPj0nICk7CgkJCWNhc2UgJ3V0ZjhtYjQnIDogICAgICAvLyBAc2luY2UgNC4xLjAKCQkJCWlmICggdmVyc2lvbl9jb21wYXJlKCAkdmVyc2lvbiwgJzUuNS4zJywgJzwnICkgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAkdGhpcy0+dXNlX215c3FsaSApIHsKCQkJCQkkY2xpZW50X3ZlcnNpb24gPSBteXNxbGlfZ2V0X2NsaWVudF9pbmZvKCk7CgkJCQl9IGVsc2UgewoJCQkJCSRjbGllbnRfdmVyc2lvbiA9IG15c3FsX2dldF9jbGllbnRfaW5mbygpOwoJCQkJfQoKCQkJCS8qCgkJCQkgKiBsaWJteXNxbCBoYXMgc3VwcG9ydGVkIHV0ZjhtYjQgc2luY2UgNS41LjMsIHNhbWUgYXMgdGhlIE15U1FMIHNlcnZlci4KCQkJCSAqIG15c3FsbmQgaGFzIHN1cHBvcnRlZCB1dGY4bWI0IHNpbmNlIDUuMC45LgoJCQkJICovCgkJCQlpZiAoIGZhbHNlICE9PSBzdHJwb3MoICRjbGllbnRfdmVyc2lvbiwgJ215c3FsbmQnICkgKSB7CgkJCQkJJGNsaWVudF92ZXJzaW9uID0gcHJlZ19yZXBsYWNlKCAnL15cRCsoW1xkLl0rKS4qLycsICckMScsICRjbGllbnRfdmVyc2lvbiApOwoJCQkJCXJldHVybiB2ZXJzaW9uX2NvbXBhcmUoICRjbGllbnRfdmVyc2lvbiwgJzUuMC45JywgJz49JyApOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCAkY2xpZW50X3ZlcnNpb24sICc1LjUuMycsICc+PScgKTsKCQkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZCB3cGRiLgoJICoKCSAqIFNlYXJjaGVzIHVwIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB1bnRpbCBpdCByZWFjaGVzCgkgKiB0aGUgb25lIHRoYXQgd291bGQgbW9zdCBsb2dpY2FsbHkgaGFkIGNhbGxlZCB0aGlzIG1ldGhvZC4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xhcnJheSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NhbGxlcigpIHsKCQlyZXR1cm4gd3BfZGVidWdfYmFja3RyYWNlX3N1bW1hcnkoIF9fQ0xBU1NfXyApOwoJfQoKCS8qKgoJICogVGhlIGRhdGFiYXNlIHZlcnNpb24gbnVtYmVyLgoJICoKCSAqIEBzaW5jZSAyLjcuMAoJICoKCSAqIEByZXR1cm4gbnVsbHxzdHJpbmcgTnVsbCBvbiBmYWlsdXJlLCB2ZXJzaW9uIG51bWJlciBvbiBzdWNjZXNzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZGJfdmVyc2lvbigpIHsKCQlpZiAoICR0aGlzLT51c2VfbXlzcWxpICkgewoJCQkkc2VydmVyX2luZm8gPSBteXNxbGlfZ2V0X3NlcnZlcl9pbmZvKCAkdGhpcy0+ZGJoICk7CgkJfSBlbHNlIHsKCQkJJHNlcnZlcl9pbmZvID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCAkdGhpcy0+ZGJoICk7CgkJfQoJCXJldHVybiBwcmVnX3JlcGxhY2UoICcvW14wLTkuXS4qLycsICcnLCAkc2VydmVyX2luZm8gKTsKCX0KfQo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/wp-db.php,importbuddy/classes/wp-db.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax.php,importbuddy/controllers/ajax.php PD9waHAKY2xhc3MgcGJfYmFja3VwYnVkZHlfYWpheCBleHRlbmRzIHBiX2JhY2t1cGJ1ZGR5X2FqYXhjb3JlIHsKfQo/Pg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax.php,importbuddy/controllers/ajax.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/index.php,importbuddy/controllers/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/index.php,importbuddy/controllers/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/index.php,importbuddy/css/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/index.php,importbuddy/css/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/nprogress.css,importbuddy/css/nprogress.css LyogTWFrZSBjbGlja3MgcGFzcy10aHJvdWdoICovCiNucHJvZ3Jlc3MgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgojbnByb2dyZXNzIC5iYXIgewogIGJhY2tncm91bmQ6ICMyOWQ7CgogIHBvc2l0aW9uOiBmaXhlZDsKICB6LWluZGV4OiA3NTsKICB0b3A6IDQ4cHg7CiAgbGVmdDogMDsKCiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA0cHg7Cn0KCi8qIEZhbmN5IGJsdXIgZWZmZWN0ICovCiNucHJvZ3Jlc3MgLnBlZyB7Cgp9CgovKiBSZW1vdmUgdGhlc2UgdG8gZ2V0IHJpZCBvZiB0aGUgc3Bpbm5lciAqLwojbnByb2dyZXNzIC5zcGlubmVyIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogZml4ZWQ7CiAgei1pbmRleDogMTAzMTsKICB0b3A6IDY1cHg7CiAgcmlnaHQ6IDE1cHg7Cn0KCiNucHJvZ3Jlc3MgLnNwaW5uZXItaWNvbiB7CiAgd2lkdGg6IDQwcHg7CiAgaGVpZ2h0OiA0MHB4OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogIGJvcmRlcjogc29saWQgNHB4IHRyYW5zcGFyZW50OwogIGJvcmRlci10b3AtY29sb3I6ICMyOWQ7CiAgYm9yZGVyLWxlZnQtY29sb3I6ICMyOWQ7CiAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAtd2Via2l0LWFuaW1hdGlvbjogbnByb2dyZXNzLXNwaW5uZXIgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgICAgYW5pbWF0aW9uOiBucHJvZ3Jlc3Mtc3Bpbm5lciA0MDBtcyBsaW5lYXIgaW5maW5pdGU7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBucHJvZ3Jlc3Mtc3Bpbm5lciB7CiAgMCUgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KICAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0KQGtleWZyYW1lcyBucHJvZ3Jlc3Mtc3Bpbm5lciB7CiAgMCUgICB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KfQo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/nprogress.css,importbuddy/css/nprogress.css ###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/style.css,importbuddy/css/style.css QGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PU9wZW4rU2Fuczo0MDBpdGFsaWMsNDAwLDcwMCk7CgoKLyoqKioqKioqKioqKioqKioqKioqKiAKCUJhc2ljcwoqKioqKioqKioqKioqKioqKioqKiovCgphIHsKCWNvbG9yOiAjMDA4NGNiOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CmE6aG92ZXIgewoJY29sb3I6ICM0NDQ7Cgl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLndpZGVmYXQgewoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1zcGFjaW5nOiAwOwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4OwoJY2xlYXI6IGJvdGg7CgltYXJnaW46IDA7Cgl3aWR0aDogMTAwJTsKCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Cglib3JkZXItY29sb3I6ICNERkRGREY7Cn0KLndpZGVmYXQgdGQsIAoud2lkZWZhdCB0aCB7Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsKCWJvcmRlci1ib3R0b20td2lkdGg6IDFweDsKCWZvbnQtc2l6ZTogMTFweDsKCWJvcmRlci1jb2xvcjogI0RGREZERjsKfQoud2lkZWZhdCB0aCB7CgliYWNrZ3JvdW5kOiAjREZERkRGOwoJY29sb3I6ICMzMzMzMzM7Cglmb250LXNpemU6IDExcHg7Cgl0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CglsaW5lLWhlaWdodDogMS4zZW07CglwYWRkaW5nOiA3cHggN3B4IDhweDsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KLndpZGVmYXQgdGQgewoJcGFkZGluZzogM3B4IDdweDsKCXZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KaDEgewoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXNpemU6IDI0cHg7Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglmb250LXN0eWxlOiBpdGFsaWM7CgltYXJnaW4tdG9wOiAwcHg7Cn0KaDIgewoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXNpemU6IDIwcHg7Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglmb250LXN0eWxlOiBpdGFsaWM7CgltYXJnaW4tdG9wOiAtMTBweDsKfQpoMyB7Cglmb250LXNpemU6IDEuMmVtOwoJZm9udC13ZWlnaHQ6IDIwMDsKfQppbWcgewoJdmVydGljYWwtYWxpZ246IC0ycHg7CgltYXgtd2lkdGg6IDEwMCU7CgloZWlnaHQ6IGF1dG87Cn0KdGggewoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKfQoKaW5wdXRbdHlwZT0idGV4dCJdLCAKaW5wdXRbdHlwZT0icGFzc3dvcmQiXSwgCnRleHRhcmVhIHsKCW1hcmdpbjogM3B4OwoJcGFkZGluZzogOHB4OwoJLW1vei1ib3JkZXItcmFkaXVzOjNweCAzcHggM3B4IDNweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OwoJYm9yZGVyLXJhZGl1czogM3B4OwoJYm9yZGVyLXN0eWxlOnNvbGlkOwoJYm9yZGVyLXdpZHRoOjFweDsKCWJvcmRlci1jb2xvcjogI0Q2RDZENjsKCS13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKCS1tb3otYm94LXNpemluZzpib3JkZXItYm94OwoJYm94LXNpemluZzogYm9yZGVyLWJveDsKCQoJZm9udC1zaXplOiAxLjJlbTsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKfQoKaW5wdXRbdHlwZT0idGV4dCJdOmZvY3VzLCAKaW5wdXRbdHlwZT0icGFzc3dvcmQiXTpmb2N1cywgCnRleHRhcmVhOmZvY3VzIHsKCW91dGxpbmU6bm9uZTsKCWJvcmRlci1jb2xvcjogIzk5OTsKfQp0ZXh0YXJlYSB7Cglmb250LWZhbWlseTogc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMTNweDsKCWxpbmUtaGVpZ2h0OiAxLjRlbTsKCWNvbG9yOiAjNDY0NjQ2OwoJd2lkdGg6IDEwMCU7CgltaW4taGVpZ2h0OiAyMDBweDsKfQoKbGFiZWwgewoJd2lkdGg6IDIwMHB4OwoJbWFyZ2luLXRvcDogN3B4Owp9CgovKiBCdXR0b25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLml0LWJ1dHRvbiwKLmJ1dHRvbiwKLmJ1dHRvbi1wcmltYXJ5IHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCWJvcmRlcjpub25lOwoJb3V0bGluZTpub25lOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJbWFyZ2luOiAwLjVlbSAwLjI1ZW07CglwYWRkaW5nOiAuNWVtIDFlbTsKCWJhY2tncm91bmQ6ICMyRUEyQ0M7Cgljb2xvcjogI2ZmZjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWZvbnQtc2l6ZTogMS4xMjVlbTsKCWJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMjc3NjkzOwoJYm9yZGVyLXJhZGl1czogM3B4Owp9CgouaXQtYnV0dG9uOmhvdmVyLAouYnV0dG9uOmhvdmVyLAouYnV0dG9uLXByaW1hcnk6aG92ZXIgewoJYm9yZGVyLWJvdHRvbS1jb2xvcjogIzEzNDU1QjsKCWNvbG9yOiAjRkZGRkZGOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJY3Vyc29yOnBvaW50ZXI7Cn0KCi5pdC1idXR0b246aG92ZXIgewoJYmFja2dyb3VuZDogIzNhYjFkYjsKfQoKLmJ1dHRvbi1zZWNvbmRhcnkgewoJYmFja2dyb3VuZDogI2YxZjFmMTsKCWNvbG9yOiAjNjY2OwoJYm9yZGVyOiAxcHggc29saWQgI2ViZWJlYjsKCWJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjYzljOWM5Owp9CgouYnV0dG9uLXNlY29uZGFyeTpob3ZlciB7Cgljb2xvcjogIzQ0NDsKCWJvcmRlci1ib3R0b20tY29sb3I6ICM5OTk7Cn0KCi5idXR0b24tdGVydGlhcnkgewoJYmFja2dyb3VuZDogI2YxZjFmMTsKCWNvbG9yOiAjNjY2OwoJYm9yZGVyOiAxcHggc29saWQgI2ViZWJlYjsKCWJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjYzljOWM5OwoJcGFkZGluZzogMCAxZW07Cglmb250LXNpemU6IC44NzVlbTsKfQoKLmJ1dHRvbi10ZXJ0aWFyeTpob3ZlciB7Cgljb2xvcjogIzQ0NDsKCWJvcmRlci1ib3R0b20tY29sb3I6ICM5OTk7Cn0KCi5idXR0b25fZGlzYWJsZWQgewoJb3BhY2l0eTogLjc7Cn0KCgoKLyogRXJyb3JzIGFuZCBNZXNzYWdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5wYl9iYWNrdXBidWRkeV9hbGVydCB7CgltYXJnaW46IDAgMCAyZW0gMDsKCWJhY2tncm91bmQtY29sb3I6I0ZGRkZFMDsKCWJvcmRlcjogMXB4IHNvbGlkICNFNkRCNTU7CglwYWRkaW5nOiAxMHB4OwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKfQoKLmVycm9yLCAKLnVwZGF0ZWQgewoJZm9udC1zaXplOiAwLjhlbTsKfQouZXJyb3IgcCwgCi51cGRhdGVkIHAgewoJbWFyZ2luOiAwOwoJcGFkZGluZzogMDsKfQoKCgoKCi8qIFBhZ2UgTGF5b3V0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpib2R5IHsKCS8vYmFja2dyb3VuZDogI0ZGRkZGRjsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMWVtOwoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXdlaWdodDogMjAwOwoJbWFyZ2luOiAwOwp9CgoudG9wTmF2IHsKCXBvc2l0aW9uOiBmaXhlZDsKCXRvcDogMDsKCXdpZHRoOiAxMDAlOwoJYmFja2dyb3VuZDogIzJhMmYzMzsKCWNvbG9yOiAjZmZmOwoJZm9udC1zaXplOiAwLjllbTsKCW92ZXJmbG93OmhpZGRlbjsKCXotaW5kZXg6IDkwMDA7Cn0KLnRvcE5hdiBhIHsKCWRpc3BsYXk6IGJsb2NrOwoJZmxvYXQ6bGVmdDsKCW1hcmdpbjogMCBhdXRvOwoJY29sb3I6ICNmZmY7CgljdXJzb3I6IHBvaW50ZXI7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCXBhZGRpbmc6IDFlbTsKCWJhY2tncm91bmQ6ICM0MTQ3NGQ7Cn0KLnRvcE5hdiBhOmhvdmVyLAoudG9wTmF2IC5hY3RpdmVQYWdlIHsKCWJhY2tncm91bmQ6ICMzMjM3M2M7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cgljb2xvcjogI2ZmZjsKfQoKLnRvcE5hdiAuYWN0aXZlUGFnZSB7Cgljb2xvcjogIzAwQjdGRjsKfQojbWluaUZyYW1lIHsKCW1hcmdpbi10b3A6IDJweDsKfQoKLm1haW5fYm94X3dyYXB7Cgl3aWR0aDogMTAwJTsKCW1heC13aWR0aDogODUwcHg7CgltYXJnaW46MmVtIGF1dG87CglwYWRkaW5nOiAwcHg7Cglib3JkZXI6IDFweCBzb2xpZCAjRDZENkQ2OwoJYmFja2dyb3VuZDogI0ZGRkZGRjsKfQoKLm1haW5fYm94IHsKCXBhZGRpbmc6IDJlbTsKfQoKI3BiX2JhY2t1cGJ1ZGR5X3N0YXR1c193cmFwIHsKCXBhZGRpbmc6IDJlbSAyZW0gMCAyZW0KfQoKLm1haW5fYm94X2hlYWQgewoJYmFja2dyb3VuZDogIzQxNDc0ZDsKCXBhZGRpbmc6IC41ZW0gMWVtOwoJZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnICxzYW5zLXNlcmlmOwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKCWZvbnQtc2l6ZTogMS4yNWVtOwoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNENkQ2RDY7CgliYWNrZ3JvdW5kOiAjZmZmOwoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjMDBCN0ZGOwp9Cgouc3RlcF9udW1iZXIgewoJY29sb3I6ICMwMEI3RkY7Cglmb250LXdlaWdodDogYm9sZDsKfQoKLm1haW5fYm94X2Zvb3QgewoJcGFkZGluZzogMTBweDsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWNvbG9yOiAjNDY0NjQ2OwoJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNENkQ2RDY7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi53cmFwIHsKCW1hcmdpbi10b3A6IDEwcHg7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl0ZXh0LWFsaWduOiBsZWZ0OwoJbWFyZ2luLWxlZnQ6IGF1dG87CgltYXJnaW4tcmlnaHQ6IGF1dG87Cn0KCgoKCgouZm9vdGVyX3RleHQgewoJZm9udC1zaXplOiAwLjdlbTsKCWNvbG9yOiAjNzc3Owp9Ci5mb290ZXIgewoJY2xlYXI6IGJvdGg7CgltYXJnaW4tdG9wOiAyNXB4OwoJbWFyZ2luLWJvdHRvbTogNTBweDsKCXRleHQtYWxpZ246Y2VudGVyOwp9CgouYmFja3VwX3NlbGVjdF9idXR0b25zIHsKCW1hcmdpbjogMCAwIDNlbSAwOwp9CgouYmFja3VwX3NlbGVjdF90ZXh0IHNwYW4gewoJZGlzcGxheTppbmxpbmUtYmxvY2s7CgltYXgtd2lkdGg6IDUwMHB4OwoJb3ZlcmZsb3c6c2Nyb2xsOwoJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKfQouYmFja3VwX3NlbGVjdF90ZXh0IHNwYW46Oi13ZWJraXQtc2Nyb2xsYmFyIHsgCglkaXNwbGF5OiBub25lOyAKfQoKLnJvdW5kLXdyYXAgewoJbWFyZ2luOiAxZW0gMDsKCXBhZGRpbmc6IDA7Cn0KCi5yb3VuZC13cmFwIGxpIHsKCWxpc3Qtc3R5bGU6IG5vbmU7Cglib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RmZGZkZjsKCW1hcmdpbi1ib3R0b206IDFlbTsKCXBhZGRpbmctYm90dG9tOiAxZW07Cn0KCi5yb3VuZC13cmFwIGxpOmxhc3QtY2hpbGQgewoJYm9yZGVyOm5vbmU7Cn0KCi5zZXR0aW5nQ29weSB7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCgoKCgoKCiNpbXBvcnRidWRkeV9zdGF0dXMgewoJYm9yZGVyOiAwcHg7CgltYXJnaW46IC0xNXB4OwoJbWFyZ2luLWJvdHRvbTogMHB4OwoJd2lkdGg6IDEwMCU7CgltYXgtd2lkdGg6IDc0MHB4OwoJaGVpZ2h0OiAyMDBweDsKfQoKCi5iYWNrdXBfc2VsZWN0X3RleHQgewoJbWFyZ2luLWJvdHRvbTogMTJweDsKfQoKCgoKCi5tZW51IHsKCXBhZGRpbmc6IDhweDsKCXRleHQtYWxpZ246IGNlbnRlcjsKCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Cglmb250LXdlaWdodDogYm9sZDsKfQoKLnRvZ2dsZSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KLnRvZ2dsZWQgewoJZGlzcGxheTogbm9uZTsKCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CgltYXJnaW46IDRweDsKCXBhZGRpbmc6IDhweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OwoJLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7Cglib3JkZXItcmFkaXVzOiA0cHg7Cn0KCiN0b29sdGlwIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDk5OTk5OTsKCWJvcmRlcjogMXB4IHNvbGlkICMxMTE7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwoJcGFkZGluZzogNXB4OwoJbWF4LXdpZHRoOiAzMDBweDsKCW9wYWNpdHk6IDAuODU7Cglib3JkZXItcmFkaXVzOiA1cHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKCS1tb3otYm9yZGVyLXJhZGl1czogNXB4Owp9CiN0b29sdGlwIGgzLCAjdG9vbHRpcCBkaXYgeyBtYXJnaW46IDA7IH0KLmxpZ2h0IHsKCWNvbG9yOiAjQUZBRkFGOwp9CiNwYl9pbXBvcnRidWRkeV93b3JraW5nIHsKCXRleHQtYWxpZ246IGNlbnRlcjsKCXBhZGRpbmctdG9wOiAyMHB4Owp9CgoKCmhyIHsKCWJvcmRlci10b3A6IDFweCBkb3R0ZWQgI0Q2RDZENjsKCWJvcmRlci1ib3R0b206IDA7CgltYXJnaW4tdG9wOiAzMHB4OwoJbWFyZ2luLWJvdHRvbTogMzBweDsKfQoKCgovKiBUYWJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktdGFicyB7Cglib3JkZXItdG9wOiAxcHggc29saWQgI0RGREZERjsKCW1hcmdpbi10b3A6IDIwcHg7Cglmb250LXNpemU6IDEuM2VtOwp9IC8qIHBhZGRpbmc6IC4yZW07IHpvb206IDE7ICovCi51aS10YWJzIC51aS10YWJzLW5hdiB7Cgl6LWluZGV4OiAxNTsKCWxpc3Qtc3R5bGU6IG5vbmU7Cglwb3NpdGlvbjogcmVsYXRpdmU7CglwYWRkaW5nOiAwcHggMHB4IDBweDsKCW1hcmdpbi10b3A6IC0xNXB4OwoJbWFyZ2luLWxlZnQ6IDEwcHg7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIHsgCgltYXJnaW46IC0yNXB4IDNweCAtMXB4IDBweDsgCglwb3NpdGlvbjogcmVsYXRpdmU7IAoJZmxvYXQ6IGxlZnQ7IAoJcGFkZGluZzogMDsgCgl0ZXh0LWFsaWduOiBjZW50ZXI7IAoJCn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEgewoJY29sb3I6ICM1MzU3NUQ7CgloZWlnaHQ6IDM0cHg7CglmbG9hdDogbGVmdDsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCXBhZGRpbmctbGVmdDogMTJweDsKCXBhZGRpbmctcmlnaHQ6IDEycHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDVweCA1cHggMHB4IDBweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4OwoJYm9yZGVyOiAxcHggc29saWQgI0RGREZERjsKCWJvcmRlci1ib3R0b206IDBweCBzb2xpZCByZWQ7CglvdXRsaW5lOiBub25lOwoJcGFkZGluZy10b3A6IDVweDsKfQoudWktdGFicyAudWktdGFicy1uYXYgbGkgYTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7IH0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgeyAgfSAvKiBwYWRkaW5nLWJvdHRvbTogMHB4OyAqLwoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCBhLCAKLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLWRpc2FibGVkIGEsIAoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtcHJvY2Vzc2luZyBhIHsKCWhlaWdodDogMzRweDsKCWN1cnNvcjogdGV4dDsKCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Cglib3JkZXItYm90dG9tOiAwcHg7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEsIAoudWktdGFicy51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLXNlbGVjdGVkIGEgeyBjdXJzb3I6IHBvaW50ZXI7IH0gLyogZmlyc3Qgc2VsZWN0b3IgaW4gZ3JvdXAgc2VlbXMgb2Jzb2xldGUsIGJ1dCByZXF1aXJlZCB0byBvdmVyY29tZSBidWcgaW4gT3BlcmEgYXBwbHlpbmcgY3Vyc29yOiB0ZXh0IG92ZXJhbGwgaWYgZGVmaW5lZCBlbHNld2hlcmUuLi4gKi8KLnVpLXRhYnMgLnVpLXRhYnMtcGFuZWwgeyBwYWRkaW5nLXRvcDogM3B4OyBkaXNwbGF5OiBibG9jazsgYm9yZGVyLXdpZHRoOiAwOyBiYWNrZ3JvdW5kOiBub25lOyB9Ci51aS10YWJzIC51aS10YWJzLWhpZGUgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KLnRhYnMtaXRlbSB7CgkvL3BhZGRpbmctbGVmdDogMTZweDsKCXBhZGRpbmctdG9wOiAxNnB4OwoJLy9wYWRkaW5nLXRvcDogMjhweDsKCS8vcGFkZGluZy1ib3R0b206IDI4cHg7CgliYWNrZ3JvdW5kOiAjRkZGRkZGOwoJZm9udC1zaXplOiAxNnB4Owp9CgojcGx1Z2luYnVkZHktdGFicyB7CgltYXJnaW4tdG9wOiA0ZW07Cn0KCiNwbHVnaW5idWRkeS10YWJzLnVpLXRhYnMgewoJCn0KI3BsdWdpbmJ1ZGR5LXRhYnMudWktdGFicyAudWktdGFicy1uYXYgbGkgYXsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKCS1tb3otYm9yZGVyLXJhZGl1czogMDsKCWJvcmRlci1yYWRpdXM6IDA7Cn0KCi53aWRlZmF0IHsKCWJvcmRlcjogMDsKfQouZGVzY3JpcHRpb24gewoJY29sb3I6ICM2NjY2NjY7CgltYXJnaW46IDFlbTsKCWZvbnQtc3R5bGU6IG5vcm1hbDsgCglsaW5lLWhlaWdodDogMjZweDsKfQoKCi5tb2RhbCB7Cgl3aWR0aDogNzAwcHg7CgliYWNrZ3JvdW5kOiAjRkZGRkZGOwoJYm9yZGVyLXJhZGl1czogNXB4OwoJYm9yZGVyOiAxcHggc29saWQgI0Q2RDZENjsKCS1tb3otYm9yZGVyLXJhZGl1czogNXB4OwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7CglvdmVyZmxvdzogaGlkZGVuOwoJcGFkZGluZzogMHB4OwoJaGVpZ2h0OiBpbmhlcml0OwoJb3ZlcmZsb3c6IHNjcm9sbDsKfQoubW9kYWxfaGVhZGVyIHsKCWJhY2tncm91bmQ6ICM0MTQ3NGQ7CglwYWRkaW5nOiAxZW07Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglmb250LXdlaWdodDogbm9ybWFsOwoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNENkQ2RDY7CgliYWNrZ3JvdW5kOiAjZmZmOwoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjMDBCN0ZGOwp9Ci5tb2RhbF9oZWFkZXIgaDIgewoJZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnICxzYW5zLXNlcmlmOwoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXNpemU6IDEuNDNlbTsKCWZvbnQtc3R5bGU6IG5vcm1hbDsKCWxpbmUtaGVpZ2h0OiAxOwoJbWFyZ2luOiAwIDAgNXB4Owp9Ci5tb2RhbF9jbG9zZSB7CglmbG9hdDogcmlnaHQ7Cgljb2xvcjogIzhmOGY4ZjsKCWZvbnQtc2l6ZTogMS41ZW07CgljdXJzb3I6IHBvaW50ZXI7CgkKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXJpZ2h0OiAxNXB4OwoJdG9wOiAxNXB4OwoJLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OwoJLW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OwoJYm94LXNpemluZzpjb250ZW50LWJveDsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJd2lkdGg6MjVweDsKCWhlaWdodDoyNXB4OwoJYm9yZGVyOjJweCBzb2xpZCB0cmFuc3BhcmVudDsKCWJvcmRlci1yYWRpdXM6NTAlOwoJbGluZS1oZWlnaHQ6MWVtOwoJdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCS13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjJzIGxpbmVhcjsKCS1tb3otdHJhbnNpdGlvbjphbGwgLjJzIGxpbmVhcjsKCXRyYW5zaXRpb246YWxsIC4ycyBsaW5lYXI7Cn0KCi5tb2RhbF9jbG9zZTpob3ZlcnsKCWJvcmRlci1jb2xvcjojRTE3OTdBICFpbXBvcnRhbnQ7Cgljb2xvcjojRTE3OTdBOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgoubW9kYWxfY29udGVudCB7CglwYWRkaW5nOiAyMHB4OwoJCn0KI2xlYW5fb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB6LWluZGV4OjEwMDsKICAgIHRvcDogMHB4OwogICAgbGVmdDogMHB4OwogICAgaGVpZ2h0OjEwMCU7CiAgICB3aWR0aDoxMDAlOwogICAgYmFja2dyb3VuZDogIzAwMDsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCgojcGJfY3JlYXRlZGJfbW9kYWwgewoJaGVpZ2h0OiA4NSU7CglvdmVyZmxvdzogYXV0bzsKfQoKCgoucGJfbGFiZWwgewoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKfQoucGJfbGFiZWwgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJcGFkZGluZzogMnB4IDRweDsKCWZvbnQtc2l6ZTogMTEuODQ0cHg7Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAxNHB4OwoJY29sb3I6IHdoaXRlOwoJdGV4dC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwoJYmFja2dyb3VuZC1jb2xvcjogIzk5OTsKfQoucGJfbGFiZWwtc3VjY2VzcyB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNDY4ODQ3Owp9Ci5wYl9sYWJlbC13YXJuaW5nIHsKCWJhY2tncm91bmQtY29sb3I6ICNGODk0MDY7Cn0KLnBiX2xhYmVsLWVycm9yIHsKCWJhY2tncm91bmQtY29sb3I6IHJlZDsKfQoucGJfbGFiZWwtaW1wb3J0YW50IHsKCWJhY2tncm91bmQtY29sb3I6ICNkZDQ1NDI7IC8vI0I5NEE0ODsKfQoucGJfbGFiZWwtaW5mbyB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjM0E4N0FEOwp9Ci5wYl9sYWJlbC1pbnZlcnNlIHsKCWJhY2tncm91bmQtY29sb3I6ICMzMzM7Cn0KCi5leHBhbmRlcjpob3ZlciB7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLmV4cGFuZGVyLWJveCB7CglwYWRkaW5nLWJvdHRvbTogNnB4Owp9Ci5leHBhbmRlci1ib3ggLmNvbnRlbnQgewoJZGlzcGxheTogbm9uZTsKCXBhZGRpbmc6IDEwcHg7CgltYXJnaW4tbGVmdDogNHB4OwoJYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCAjZjVmNWY1OwoJbWFyZ2luLWJvdHRvbTogMTJweDsKCW1hcmdpbi10b3A6IDEycHg7CgltYXJnaW4tYm90dG9tOiAxMnB4Owp9Ci5leHBhbmRlci5jb2xsYXBzZWQgewoJcGFkZGluZy1sZWZ0OiAxM3B4OwoJYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9jb2xsYXBzZWQuZ2lmKTsKfQouZXhwYW5kZXIuZXhwYW5kZWQgewoJcGFkZGluZy1sZWZ0OiAxM3B4OwoJYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9leHBhbmRlZC5naWYpOwp9CgoKI3BiX2JhY2t1cGJ1ZGR5X3N0YXR1c193cmFwIHsKCWRpc3BsYXk6IG5vbmU7Cn0KCi5lcnJvcl9hbGVydF9ib3ggewoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCByZWQ7CgliYWNrZ3JvdW5kOiByZ2IoMjU1LCAyMDAsIDIwMCk7Cn0KLmVycm9yX2FsZXJ0X3RpdGxlIHsKCWRpc3BsYXk6IGJsb2NrOwp9Ci5iYWNrdXBidWR5X2Vycm9yX2xpc3QgewoJZm9udC1zaXplOiAxNHB4Owp9Cgoud2FybmluZ19hbGVydF9ib3ggewoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCBvcmFuZ2U7CgliYWNrZ3JvdW5kOiByZ2IoMjU1LCAyNTUsIDIwMCk7CgltYXgtaGVpZ2h0OiAyMjBweDsKCW92ZXJmbG93OiBzY3JvbGw7Cglmb250LXNpemU6IDAuOWVtOwp9Ci53YXJuaW5nX2FsZXJ0X3RpdGxlIHsKCWRpc3BsYXk6IGJsb2NrOwp9Ci5iYWNrdXBidWR5X3dhcm5pbmdfbGlzdCB7Cglmb250LXNpemU6IDE0cHg7Cn0KCi5kYXRhYmFzZV9yZXN0b3JlX3RhYmxlX3NlbGVjdCB7CgltYXgtaGVpZ2h0OiAyMDBweDsKCW92ZXJmbG93OiBzY3JvbGw7Cglib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjOwp9Ci5kYXRhYmFzZV9yZXN0b3JlX3RhYmxlX3NlbGVjdDo6LXdlYmtpdC1zY3JvbGxiYXIgewoJLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwoJd2lkdGg6IDExcHg7CgloZWlnaHQ6IDExcHg7Cn0KLmRhdGFiYXNlX3Jlc3RvcmVfdGFibGVfc2VsZWN0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7Cglib3JkZXItcmFkaXVzOiA4cHg7Cglib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTsgLyogc2hvdWxkIG1hdGNoIGJhY2tncm91bmQsIGNhbid0IGJlIHRyYW5zcGFyZW50ICovCgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4xKTsKfQ== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/style.css,importbuddy/css/style.css ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/collapsed.gif,importbuddy/images/collapsed.gif R0lGODlhBgAHALMKAM7Ozr6+vq6urp6enoWFhaampt7e3u/v742NjX19ff///wAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAGAAcAAAQVEAFFVUrD0HvF4RfCEYGVFAeFaFUEADs= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/collapsed.gif,importbuddy/images/collapsed.gif ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/expanded.gif,importbuddy/images/expanded.gif R0lGODlhBwAGALMKAM7Ozr6+vq6urp6enoWFhaampt7e3u/v742NjX19ff///wAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAHAAYAAAQWEKU5kaETqEKHUgcxGZ8SJEL5IccXAQA7 ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/expanded.gif,importbuddy/images/expanded.gif ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/gray-grad.png,importbuddy/images/gray-grad.png iVBORw0KGgoAAAANSUhEUgAAAAUAAAAfCAIAAACgQJBPAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAAAIXRFWHRTb2Z0d2FyZQBNYWNyb21lZGlhIEZpcmV3b3JrcyA0LjDqJid1AAAAFnRFWHRDcmVhdGlvbiBUaW1lADEwLzI0LzA4KQ6r+wAAAClJREFUeJxjfPv2LQMSYPn//z8yn4kBFaDzqa0eXZ5U9QMtT6l5tFYPADsXLPcJwrwLAAAAAElFTkSuQmCC ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/gray-grad.png,importbuddy/images/gray-grad.png ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/icon_16x16.png,importbuddy/images/icon_16x16.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAk1JREFUeNqkkz1MU2EUhp97b6FGoSAMaoBYAimMxgSdHFCpa/1ZXIyToZMOhCgDgyFqjFGm1jhoTDT+JHo7oCYMxp/JgdiAaATibeUvESjtNdD29rscB+GKAeLgSc7ynfd87zk576uJCP8Tvq0KqYTPD0SBZDCi3myF0zabIJXwnQOigabz+5xcksL82zjQH4yosQ1gEfHSMo2QZRqx6df7pZhNylrkJvolPVArlml0r8eLCOubu9MDtZIdvyWu627I4s9vMvv+sFimEbNMI+R9YJnGLss0YjPv2iWfGxfHcWRizpaJOVuO3f0gXS9GZWgyI3P2sjiOI5mvNyU9UONNo1mmEato7olWNPd4a515PsrLsfm/Vu070kRnWz0Abj5N9uNpSvbwQR2Ibgt2o5RCKYW1sERluQ7AvUgrl9sbAfiezbOwVEAphZTV4a/vBIjqgNeslCK1uMSTTz9oCPjpCFZxqrUWgDtDM6Qyyx5O9AqAah1IOrmkV2jbvZ3eQw1M2kXCD0YIPxwG4PHxEC07yz1ccfYRwH0diOdHTlCYvO0Vs3mHky012EVFZblBR2MVi8sOSilKhQz5z2dRC6/iwYhKaCJCKuELARe06nDUaLwBRgAAcyxLXWUZB/bs+K2Z7CCu1QWufTUYUT0blJhK+K5gBC5pe69DVcefE7g2MtUHmWcJIB6MqMEtpZxK+MJAVAJHI9JwDS3/BW3qIjjTHus/veBNs2qmVdanm5oJMIAywA8Yuq4bq28aoANrDC7grqyslIAS4ADurwEAaepxmqgtIWwAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/icon_16x16.png,importbuddy/images/icon_16x16.png ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/icon_32x32.png,importbuddy/images/icon_32x32.png iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAIk0lEQVR42n1WWVCb1xU2dmKaTu2x04e2k7STtn5q8lYnkzw0T+lMJ3lo7ZlMM5lkYhu8PrSk8aSk8VKQDDYBaqABswnEYkDsNkLsSGwChI2QhA3CrDb7ItCKWPT1nMs//9ipRpr55t7733PO/c6555yrfQD+D0VFxYfa2/WfWaw285DVOjtksRCsMsxDFsLQrJm/C7woY7buwUKw2myMSUNHR2V5RcV7PzwrKIGu7u5zk1NTAy6Pd9vpdsPpehEbEpweD5xeH41ekJwMl9sDt4fhhcfng8frDcw8feYYePCgUqFUvBySgFKpDH/4cNDk8/u3SRFEAu4fYmcXbgAupwvOmadwrm+ItWd3d+9QIsXw+jZl+Le2A7bh4dmbN28eCUmABSw225JkRD6UvRJkAoBjyILVmFg4LlyEO1cFx6VLWL12DY5BMzwAeb1JEAT25t49EqP2MW9iYuKvQxIggV+OjIy6+HAXRUAmQGDjc3TgzG+PYf7IESxfuIBdAKtRUVg8+iqeHjuGucxMeAUJIu99Php+TExNBVJSUn8fksDtlJQ3xycnt5mxiIBEwgfgSZYKluNvY62kFI7mZmyMjYl95/g4HK1tWK2shPWddzD2fSbLs/4L10F5gIyMOx+EJJCenv7uNN0rK8jKOztYso5Af+Q1dL3/BwwUFaGfPB1tb4eDks6u16MvPR0mtRqdtN92+GdYHhyGd3dXSkICjXPz81CpVH8NSSArK+vDZ7NzcO/dv+y9/dZ/URf2EnQ/PYra8HBUkar+88+xFAjAcOYMqsP2ie/1R49AG3YQdsV/xFW4PB45iguLSygqKroYkoC6oOD0wuIiMZaugOAH8FiRiDISLz38E1QfPoTK/fvR8PHHsJNXTZ9+Ck1YGKoPHUIZoZTIDF+NxybA+jKWlleg0Wi+DUmgtLQsmgXlHCD4dgOY7jKiPOzHSN9/AHk/Ckdx+EHk02FZb7yB/MOHUXyQ1hSB9AMvE9FwTOo74RNl6ZPtrKytoab2XlJIAtU1NYkraw65fj0S+BqM0VeRTd4lkFrygZeQSuP3hLR9YUgiYt/RPJPQ/VU0vIGA5LlXvoJVxzrqdQ15IQmQgGptfYOT5oVr4Ll7ewd9t1OR/9rrSCLVeMINaeS16ue/QG9iMlxb21TCPqkjSgRovb7hRGtbe21IAiRQs+50ygQkL6Rk8olILFI5mUtK0BodDd3582j7ZzTMRcWYn54R+y5uzS4PEWAI74XuBnXOzq7ujpAESMBAff557+WKEIbZq00/HyTglSDq3u/nfQG5cxLEKOn2m0zm+Pj4/UEJxMXFhfX1mwZJWW4eWxR2n3+LjPC3PVJMUESDiLBx3pN0+CB5zvt+0ic7siODZvPErVu3XglKICEh4RV6iMbZACstr67B9OAhxp5MiCtZWlnF7PyC2JukZmV6OEjNZYHkVoUsdVCSWYGD7nqean6KrsRssWKF9liHydmGH60kJye/GpQAbRy1DA8vsVfbVEJthg7U3K9DXkERns3No6K6Blm5ecJgQfFd9PT2oZtQV9+AWpLjUd/RKcnWoqyiktZdKNGUy6/k6NgTX1pa2m+CEkhNTf3VyKjdzYI7VEbV9+4jv7AYd3JyMfx4hA4toXURWtoNaGptB/8mpqYRdflrIqDF41E7GptbRLmVV9XgbpkGFVXVPIrwe+lKJqenA3cyM48HJZCRkfHW+MTkDicgR4C97OjqQXFZGbJV+Si4W4IsVR7ukkeaymrYn4yj29iHqtr7RLYOWl2D8PrBoJkJMMR83emSK4ofpFyV6o9BCeTk5Lw3RXfr9u2xfWwfQ2u7nr3n0FGycR7QXZPXZosNrXoDJianKA8WsUjdc5zmtkcjFCE9rZc5B8ThWzvyHxXMzs3ze/BJUAJqtfqjp7NzLMz/YNDbb+IokLdVIqna6X65Ah6N2DFktaGBwp2br+b75xoX+aKmfmAgOUo+Js5eMyGppDfFg1Sm0VwKSqCkpPTM3MICKwnW2Xn5RGKAjfLhnA9cdmxQhD1XXYAZIlxcWoaWNj1yiMyzuQVOOpEThXRlTLKyphbbZI91OVLU7q8EJVBVXf3NwuKyaKObVPvpmdnCWHJqGoz9Jj6IciMgQn9PW09rjegTnT1G1NZpSbaC655J88FCJ/rKNXqE1jkHmIAoV229LjkoAW19fRLXOgsyklPSONzioDpKsJw8tcgFlboQ+s5u3MnOxdj4hIiUobuHE5X/96GQqoVJ8qOWkZ3DjYy7oETAgeaW1vygBJpbWvKYodRKOayU1VXQNTaDHyiLbZhKqpwTUyRXY0srR4hKso3/rotDS2hf19RM+06h02sa4INlcInqDYZ7QQnoDR011MWIgPjfz62U2YuK4O/ccqVyYuM8ym8G77McJy9DehPIhuw9wSfmPcberqAEjL19/RxCNs6C7CU/oQ7GOo8btCc8k0F7MlieweQlsB0ZvB6j3tE/MPAoKAFqrdP9Aw8kb7bIOz95xz1cfhX3XkSG5JX8XRo9UlQYXimCm1vbhB1RhiayT2fMBCXwXVJSTxNlbyPdoa6hUaCeoWvgkdAg5g1aLZrq6qCjeYuWRx2a6FtjvRZa1mM0NqGBwLZkkO2WtnakpKbaghL429+jymJiFVDeiJOhuHEDCqUSsYo9KGNjcSE1E5HpKnyrvInPMosRHZeAyLRcXLx9h/eFvJL0SP9FxMUhRqFA1Jf/aA1K4Nz58xlXrl6TDlMIMCHGv8lwTEwMrscocVylxe8Km/FJYi5eL+zAidsFeDO3Ce9m3CM5JcnFso4MthcjOXDt+nVcvHSpIiiBv5w48f4XX5wyRJ49a4yIfB6RxogIAo2nz54zfnhZafzT1/HGk1H/Mn7wTYLxxJdXxPqjywrjaZaPiDCeIfkzJC/py7ZOnTrVefLkyT9DOvN/1S/OiQQ06hAAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/icon_32x32.png,importbuddy/images/icon_32x32.png ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/index.php,importbuddy/images/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/index.php,importbuddy/images/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/loading.gif,importbuddy/images/loading.gif R0lGODlhEAAQAPQAAObm5iV9ptvf4oy1x87Y3VmZt4GuxCV9pmeguz+LrqbD0LXL1TSFqpu9zSd+pk2SsnOnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAkKAAAALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQJCgAAACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQJCgAAACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkECQoAAAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkECQoAAAAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAkKAAAALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAkKAAAALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQJCgAAACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQJCgAAACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/loading.gif,importbuddy/images/loading.gif ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/loading_large.gif,importbuddy/images/loading_large.gif R0lGODlhQgBCAPMAAP///wFmoUyTvHqvzdzp8aDF2/j6+xx2q8La6AAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9VBzMu/8VcRTWsVXFYYBsS4knZZYH4d6gYdpyLMErnBAwGFg0pF5lcBBYCMEhR3dAoJqVWWZUMRB4Uk5KEAUAlRMqGOCFhjsGjbFnnWgliLukXX5b8jUUTEkSWBNMc3tffVIEA4xyFAgCdRiTlWxfFl6MH0xkITthfF1fayxxTaeDo5oUbW44qaBpCJ0tBrmvprc5GgKnfqWLb7O9xQQIscUamMJpxC4pBYxezxi6w8ESKU3O1y5eyts/Gqrg4cnKx3jmj+gebevsaQXN8HDJyy3J9OCc+AKycCVQWLZfAwqQK5hPXR17v5oMWMhQEYKLFwmaQTDgl5OKHP8cQjlGQCHIKftOqlzJsqVLPwJiNokZ86UkjDg5emxyIJHNnDhtCh1KtGjFkt9WAgxZoGNMny0RFMC4DyJNASZtips6VZkEp1P9qZQ3VZFROGLPfiiZ1mDKHBApwisZFtWkmNSUIlXITifWtv+kTl0IcUBSlgYEk2tqa9PhZ2/Fyd3UcfIQAwXy+jHQ8R0+zHVHdQZ8A7RmIZwFeN7TWMpS1plJsxmNwnAYqc4Sx8Zhb/WPyqMynwL9eMrpQwlfTOxQco1gx7IvOPLNmEJmSbbrZf3c0VmRNUVeJZe0Gx9H35x9h6+HXjj35dgJfYXK8RTd6B7K1vZO/3qFi2MV0cccemkkhJ8w01lA4ARNHegHUgpCBYBUDgbkHzwRAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9VAjMu/8VIRTWcVjFYYBsSxFmeVYm4d6gYa5U/O64oGQwsAwOpN5skipWiEKPQXBAVJq0pYTqnCB8UU5KwJPAVEqK7mCbrLvhyxRZobYlYMD5CYxzvmwUR0lbGxNHcGtWfnoDZYd0EyKLGAgClABHhi8DmCxjj3o1YYB3Em84UxqmACmEQYghJmipVGRqCKE3BgWPa7RBqreMGGfAQnPDxGomymGqnsuAuh4FI7oG0csAuRYGBgTUrQca2ts5BAQIrC8aBwPs5xzg6eEf1lzi8qf06foVvMrtm7fO3g11/+R9SziwoZ54DoPx0CBgQAGIEefRWyehwACKGv/gZeywcV3BFwg+hhzJIV3Bbx0IXGSJARxDmjhz6tzJs4NKkBV7SkJAtOi6nyDh8FRnlChGoVCjSp0aRqY5ljZjplSpNKdRfxQ8Jp3ZE1xTjpkqFuhGteQicFQ1xmWEEGfWXWKfymPK9kO2jxZvLstW1GBLwI54EiaqzxoRvSPVrYWYsq8byFWxqcOs5vFApoKlEEm8L9va0DVHo06F4HQUA6pxrQZoGIBpyy1gEwlVuepagK1xg/BIWpLn1wV6ASfrgpcuj5hkPpVOIbi32lV3V+8U9pVVNck5ByPiyeMjiy+Sh3C9L6VyN9qZJEruq7X45seNe0Jfnfkp+u1F4xEjKx6tF006NPFS3BCv2AZgTwTwF1ZX4QnFSzQSSvLeXOrtEwEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvVQIzLv/FSEU1nFYhWCAbEsRx1aZ5UG4OGgI9ny+plVuCBiQKoORr1I4DCyDJ7GzEyCYziVlcDhOELRpJ6WiGGJCSVhy7k3aXvGlGgfwbpM1ACabNMtyHGCAEk1xSRRNUmwmV4F7BXhbAot7ApIXCJdbMRYGA44uZGkSIptTMG5vJpUsVQOYAIZiihVtpzhVhAAGCKQ5vaQiQVOfGr+PZiYHyLlJu8mMaI/GodESg7EfKQXIBtrXvp61F2Sg10RgrBwEz7DoLcONH5oa3fBUXKzNc2TW+Fic8OtAQBzAfv8OKgwBbmEOBHiSRIHo0AWBFMuwPdNgpGFFAJr/li3D1KuAu48YRBIgMHAPRZSeDLSESbOmzZs4oVDaKTFnqZVAgUbhSamVzYJIIb70ybSp06eBkOb81rJklCg5k7IkheBq0UhTgSpdKeFqAYNOZa58+Q0qBpluAwWDSRWYyXcoe0Gc+abrRL7XviGAyNLDxSj3bArey+EuWJ+LG3ZF+8YjNW9Ac5m0LEYv4A8GTCaGp5fykNBGPhNZrHpcajOFi8VmM9i0K9G/EJwVI9VM7dYaR7Pp2Fn3L8GcLxREZtJaaMvLXwz2NFvOReG6Mel+sbvvUtKbmQgvECf0v4K2k+kWHnp8eeO+v0f79PhLdz91sts6C5yFfJD3FVIHHnoWkPVRe7+Qt196eSkongXw4fQcCnW41F9F0+ETAQAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9dAjMu/8VISCWcFiFYIBsS4lbJcSUSbg4aMxrfb68nFBSKFg0xhpNgjgMUM9hZye4URCC6MRUGRxI18NSesEOehIqGjCjUK1pU5KMMSBlVd9LXCmI13QWMGspcwADWgApiTtfgRIEBYCHAoYEA2AYWHCHThZ2nCyLgG9kIgehp4ksdlmAKZlCfoYAjSpCrWduCJMuBrxAf1K5vY9xwmTExp8mt4GtoctNzi0FmJMG0csAwBUGs5pZmNtDWAeeGJdZBdrk6SZisZoaA5LuU17n9jpm7feK53Th+FXs3zd//xJOyKbQGAIriOp1a9giErwYCCJGZEexQ8ZzIP8PGPplDRGtjj7OVUJI4CHKeQhfypxJs6bNDyU11rs5IaTPnBpP0oTncwzPo0iTKjXWMmbDjPK8IShikmfIlVeslSwwseZHn1G0sitY0yLINGSVEnC6lFVXigbi5iDJ8WW2tWkXTpWYd9tdvGkjFXlrdy1eDlOLsG34t9hUwgwTyvV2d6Big4efDe6LqylnDt+KfO6cGddmNwRGf5qcxrNp0SHqDmnqzbBqblxJwR7WklTvuYQf7yJL8IXL2rfT5c7KCUEs2gt/G5waauoa57vk/Ur9L1LXb12x6/0OnVxoQC3lcQ1xXC93d2stOK8ur3x0u9YriB+ffBl4+Sc5158LMdvJF1Vpbe1HTgQAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvXQMzLv/lTEUliBYxWCAbEsRwlaZpUC4OCgKK0W/pl5uWCBVCgLE7ERBxFDGYUc0UDYFUclvMkhWnExpB6ERAgwx8/Zsuk3Qh6z4srNybb4wAKYHIHlzHjAqFEh2ABqFWBRoXoESBAVmEkhZBANuGJeHXTKMmDkphC8amUN8pmxPOAaik4ZzSJ4ScIA5VKO0BJOsCGaNtkOtZY9TAgfBUri8xarJYsOpzQAIyMxjVbwG0tN72gVxGGSl3VJOB+GaogXc5ZoD6I7YGpLuU/DI9Trj7fbUyLlaGPDlD0OrfgUTnkGosAUCNymKEGzYIhI+JghE0dNH8QKZY+j/8jEikJFeRwwgD4xAOJChwowuT8qcSbOmzQ5FRugscnNCypD5IkYc0VML0JB9iipdyrQptIc9yRyysC1jETkzU2IxZfVqgYk2yRxNdxUB2KWRUtK65nSX02Lb2NoTETOE1brNwFljse2q25MiQnLUZPWsTBghp76QiLegXpXi2GlrnANqCHCz9g3uVu0AZYMZDU8zEFKuZtHdSKP7/Cb0r7/KDPwCaRr010kkWb8hkEq15xyRDA/czIr3JNWZdcCeYNbUQLlxX/CmCgquWTO5XxzKvnt5ueGprjc5tC0Vb+/TSJ4deNbsyPXG54rXHn4qyeMPa5+Sxp351JZU6SbMGXz+2YWeTOxZ4F4F9/UE4BeKRffWHgJ6EAEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvXQMzLv/lTEglmYhgwGuLEWYlbBVg0C0OCim9DwZMlVuCECQKoVRzCdBCAqWApTY2d0oqOkENkkeJ04m9fIqCCW7M0BGEQnUbu34YvD2rhIugMDGBucdLzxgSltMWW0CAl9zBAhqEnYTBAV4ZAOWBU8WdZYrWZBWY3w2IYpyK3VSkCiMOU6uboM4dQNmbQSQtI+Jf0Sqt4Acsp45tcHCpr5zqsXJfLOfBbwhzsl7unWbFwhSlddUTqcclN664IE1iq5k3tTow5qn53Td3/AcCAdP9FXv+JwQWANIEFfBZAIjSRHY7yAGSuoESHDkbWFDhy8U7dsnxwBFbw7/O2iUgYxOrpDk7qFcybKly5cIK7qDSUHjgY37uumcNo3mBAE3gQaV6LOo0aNI4XkcGFJnFUc62bEUesCWJYpR/7nMeDPoFCNGTiatBZSogYtHCTBN2sIjWnAi1po08vaavqpy0UBlyFJE15L1wNaF9yKo1ImCjTq5KWYS3xCDh2gFUOcAqg8G6AK8G3lY2M4sgOzL+/QxQANBSQf+dxZ0m5KiD7jObBqx6gsDqlbgMzqHI7E/avu+6Yp3Y8zAHVty20ETo7IWXtz2l1zt1Uz72ty8fM2jVrVq1GK5ieSmaxC/4TgKv/zmcqDHAXmHZH23J6CoOONLPpG/eAoFZIdEHHz4LEWfJwSY55N30RVD3IL87VFMDdOh9B88EQAAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvbQUzLv/lVEg1jBYyGCAbEsRw1aZ5UC4OCiq80kZplVuCECQKprjhEZJyZpPIkZUuL1iPeRAKSEIfFIOQiOUAAtlANMc/Jm4YQsVXuAtwQAYvtiOcwhkTVsZUU5uAlZ+BghpEkkvaB2AiQB1UWZVOWORP3WNOAZflABAApc6m41jcDiGh3agqT8Eny4GtK+1LHO6fmxfvbsanL4hJrBhi5nFFV7IIJOfBsF+uCEIphiAI6PMLikC2VObjN62A+E2H9sj1OYi6cQetxrd5hXYpu5y1vfj9v4CXpgmkBkBK6sQ9CvYYke6LqtGGNknEEa4i+LMHBwxgqEHdOn/ynG4RTHgJI8oU6pcyXKlkZcwW5Y4gPGiEY4JZc6gyVPAgT06gwodStQjSaFjAGokEDOoz3iUmMJUWNKfxZ7iXh6sarTOUzNcZS4sqmgsQxFKRzI1WxDBgZ8Ub0llK7DUW3kD54YtBuOtAFYT9BLFdlfbVjl7W4jslHEX08Qf3AqAPItqwFA00+o4SLcYZkRSblmeMI2yiDSf98ode1hKgZ8hnmq+wLmRXMoE3o7CDPTD0WYHmxwAPAEblwE05ajzdZsCcjzJJ7zGY+AtceaPK+im8Fb4ASQ0KXdoHvhtmu6kt5P22VvR6CXRJ6Cf4POS2wPip3yqr/17hvjSnVKXGnry+VcefkjNV6AF1gmV2ykKOgIaWRT4FFAEACH5BAkKAAAALAAAAABCAEIAAAT/EMhJq720FMy7/5VREJZmIYUBriwlbpUZD2prf289FUM4pLeghIA4jWKwCWFQrCCaQo4BpRsWoBLZBDEgUZa9aIdwreYoPxfPzMOKLdNjBrhLAgxpCpf+xpy3cll2S1giXX0SU1UST4UIXhhkVXtwgSxECIt/Qng0IW03cZkVZJBBXG6dnqGNZgaLNgYEbD+wLKK2iIkDvLm3rbqVtYhxvm9gxhdEs3DJx7BTTJHAwUJgeRdT1NUrZLyHHpiPztWGvKMgsk/kwVzDsczcHVOm8vY47PfdXo0E8fo2iBQQwGuIuCf/AHLwRpAgtjvqGin0wItgmXkJJ1oopbGjx48g/0MCPNhPZIUBAlKqJLjskct6IlE2VBnGpM2bOHN6lJXPHgqYLmQtA+pRJsFHX1r6ywgSzEoBMJbO6jmRiMwwr3SGo6p1Xtadlla88sdVDIKUq/BJLRsFj0o+ftaaXKLSTVKyOc+mtONiaiWA6NRAjXXggF1detmSKnxAsQcDAg4IcHyHMeXHKhUTsKzGsQgzKok+5ozmQM0gA0/fyXxjQOFFmw2LiV0P8gG+ILjAKnz67OEtArDIrCTaBoLCplyfTpnBtIvIv4kV5oucQuEvkmNIvoyhwGvsja0fcFF9AuTB8gwUduNd9fXSfI9PtvdQQmTq45urBqBlovoD9bxn3hd3NsVmgYATRFZcVeiJV4IAC5rEnD0RAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9FCHMu/+VgRBWUVhEYYBsS4lbhZyy6t6gaFNFPBmmFW4IIJAqhFEN2bNoiB6YcJL0SUy1IxUL7VSnAGmGJgHuyiZt9wJTA2bg5k++Pa/ZGnBS/dxazW5QBgRgEnsvCIUhShMzVmWMLnuFYoJBISaPOV9IkUOOmJc4gyNgBqddg6YFA3Y3pIl3HWauo5OybCa1Q6SKuCm7s4mKqLgXhBY6moa3xkQpAwPLZVXIzi1A0QWByXvW1xwi2rGbSb7gVNHkLqfn6GHf7/Lh7vM31kZGxfbYM9ED1EaM0MfPi4l/rf6cGsit4JV/PeqpcojhEMWLGDNq3Agln0cjHP8nIBz50WPIhwIGpFRJ5qTLlzBjrkEgLaSGhoYKCDjA80DIaCl7qBnQs+cAnAWhpVwZo6eAbTJ1qARYBCnMeDI7DqgHDohVNkQPtOSHICjXH2EPbL0IRIDbdRjK8hTw9V3blNMApM1LkYDKpxiI1hIxDy6kVq948u1CIOVZEI0PCHjM6y/lcHMvV3bccSfdF8FYiDBlmVfmCoK76Bzrl/MNop8pEOBZl0Pj2GgB31tbYSdVCWX5lh2aEgVUWQh4gkk9wS2P4j/eyjOwc+xONTszOH8++V0ByXrAU+D5Yidp3dcMKK7w/beE7BRYynCruQWX+GIrSGYPncfYedQd4AYZeS+Ix9FsAliwX2+4adTYfwQ+VxtG/V0TAQAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9FCHMu/+VgRCWZhGIAa4sJW6VGRdqa39vPSFFWKS3oIRAqqCKO9gEpdwhhRgDSjccxZoAzRNAKPSgHRGBmqP8XDwybwsOHa9UmcRwpnSBbU55aU3aC090gHlzYyd9c3hRillyEyJUK0SGLlNggpGCWCBSI5GWUF1bmpErUkRkBqUtUmpeq6ZHsIQAgjRtp5S0Ll6MUJ2zuD/BF6ilqrvFxzybhZ7JQl29epO60DheXmwWudbX3Dy9xI+T48kEA8M3qua7rd/wks3x0TUH9wKD9DYiXukSBe4JPCBg3j4+BdINSNekiwCBAg52SJgOUDAEAwxKBCWxo8ePIP9DwhtIUmQFigtTFnhIkqBJMyljfnlJs6bNm/Qwajz4hoNDiDRlMgpIMiPNLjEXwoCoD2e/lEO24VzSbuqHLlUJiVk34N5MiRjztaMjcEDWPHRS+irBUoBUnisXvu1KcOfGhQUxdL0Vwi6YtSL+tSDw0G8QwmYJESZ4loWBAQISg1ksoDEryJIPP6zMy/IjRo8jW6YcaS+YlV9rYW7clbMdgm9BEHYbAnJq2QPYPBxgJy8HjE/icmvaBgFjCrYpCIg4Qfij5bFxPUz98Mny3sx3iIYX0PWQ4xMeulhOJvk1A9VPRq7gEnk+I+S/ebFgWnl2CQjWz/CI/kCk9kvE9xIUAQCGd4AF0NGE3m3XnZSZVfpdEwEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvZQQzLv/laFZCGIRiAGuLCVuFXqmbQ2KNFWGpWr/ANGJ4JvIMghYRgnEvIoSQ7KyQzKD1Sbn6dJAj9Geq3TVhryxnCSLNSHV5gt3Iv0yUUwpXIsYlDV5RB0iX2xRgjUDBwJXc0B6UFgFZR8GB5eRL1p4PAV7K5aXeQaRNaRQep8soQelcWOeri2ssnGptbMCB26vIbGJBwOlYL0hpSKTGIqXBcVNKAXJGAiXi5TOWwjRqhUF1QK42EEE24gfBMu84hfkk+EX2u/OhOv1K8T2Zojf0vmz0NEkFNBVLZg6f3K0RVt4Z+A3hB0WejLHbsBBiF3kYdzIsaPHjyz/CBZcBJKCxJMiCwooOSHagAIvXzZjSbOmzZvitF3kyIkDuWUkS8JkCGVASgF+WEKL+dINwZcaMeoZegjnlqhWO5DDamuKqXQ8B1jUaMDhgQJczUgRO9YDgqfXEJYV28+Ct0U7O/60iMHbJyn5KIbhm0tA3jjohL0yoAtcPQN008YQQFnyKraWgzRGxQ0UnLmKbRCg7JiC0ZlA+qCOgtmG0dJGKMcFgQ52FKo10JWiPCADYQzomMDs7SszlcomBawWm3w15KSPKa8GIJsCZRdIj4cWN9D2aNvX6RhFJfawFsaMtFcI39Lw5O3OAlYwepD9GuUkzGNDf8W+ZvgefWeBEn8AGDUbQuhcRGAfxtnD3DoRAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9lBDMu/8VcRSWZhmEAa4shRxHuVVI2t6gAc+TSaE2nBAwGFgEoxBPApQNPbokpXAQKEMI1a/29FAPWokInFkCwwDgsnuCkSgwREY+QdF7NTTb8joskUY9SxpmBFl7EggDawCAGQd3FyhohoyTOANVen2MLXZ6BghcNwZIZBSZgUOGoJV6KwSmaAYFr54Gs6KHQ6VVnYhMrmxRAraIoaLGpEiRwEx5N5m1J83OTK92v1+Q1ry6vwAIpgLg3dS6yhPbA+nmdqJBHwaZ3OYchtA3BNP2GJf9AD0YCggMlwRTAwqUIygJXwE6BUzBEDCgGsMtoh4+NFOAXpWLHP8y1oh3YZ9FkGlIolzJsqXLlzgkwpgIcwKCAjhzPhSApCcMVTBvCtV4sqbRo0iTshFak1WHfQN6WgmaM5+EiFWqUFxIMJROnDN4UuSX1E5OMVyPGlSKaF+7bqHenogqoKi9fQ/lponIk+zFUAkVthPHc9FLwGA58K17FO9DDBH9PguoMuXjFgSi2u2SWTKvwnpx0MIZ2h/ogLQSlq5QauuW1axJpvac4/QUAW+GKGo2G3ZEwxl4ws5QZE3qzSU9R80NIHO5fUsUMX82/II4drcjFXGR8EdxgPMYoyKHCmhmoM1V9/s9iyIait6x1+mIXEjrNeKmw59SMUSR6l5UE1EjM9txN1049RUUlR771fFfUw1OEJUF38E0TzURJkLbUR31EwEAOwAAAAAAAAAAAA== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/loading_large.gif,importbuddy/images/loading_large.gif ###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/white-grad.png,importbuddy/images/white-grad.png iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACF0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgNC4w6iYndQAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMS8xNy8wONpsdXEAAAAlSURBVHicY/z///9/BjTAhC7AwMDAwIJFIXbBoaJ9qLhz+IUSAIMMOibeSzRBAAAAAElFTkSuQmCC ###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/white-grad.png,importbuddy/images/white-grad.png ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ejs.js,importbuddy/js/ejs.js KGZ1bmN0aW9uKCl7CiAgICAKCnZhciByc3BsaXQgPSBmdW5jdGlvbihzdHJpbmcsIHJlZ2V4KSB7Cgl2YXIgcmVzdWx0ID0gcmVnZXguZXhlYyhzdHJpbmcpLHJldEFyciA9IG5ldyBBcnJheSgpLCBmaXJzdF9pZHgsIGxhc3RfaWR4LCBmaXJzdF9iaXQ7Cgl3aGlsZSAocmVzdWx0ICE9IG51bGwpCgl7CgkJZmlyc3RfaWR4ID0gcmVzdWx0LmluZGV4OyBsYXN0X2lkeCA9IHJlZ2V4Lmxhc3RJbmRleDsKCQlpZiAoKGZpcnN0X2lkeCkgIT0gMCkKCQl7CgkJCWZpcnN0X2JpdCA9IHN0cmluZy5zdWJzdHJpbmcoMCxmaXJzdF9pZHgpOwoJCQlyZXRBcnIucHVzaChzdHJpbmcuc3Vic3RyaW5nKDAsZmlyc3RfaWR4KSk7CgkJCXN0cmluZyA9IHN0cmluZy5zbGljZShmaXJzdF9pZHgpOwoJCX0JCQoJCXJldEFyci5wdXNoKHJlc3VsdFswXSk7CgkJc3RyaW5nID0gc3RyaW5nLnNsaWNlKHJlc3VsdFswXS5sZW5ndGgpOwoJCXJlc3VsdCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKTsJCgl9CglpZiAoISBzdHJpbmcgPT0gJycpCgl7CgkJcmV0QXJyLnB1c2goc3RyaW5nKTsKCX0KCXJldHVybiByZXRBcnI7Cn0sCmNob3AgPSAgZnVuY3Rpb24oc3RyaW5nKXsKICAgIHJldHVybiBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5sZW5ndGggLSAxKTsKfSwKZXh0ZW5kID0gZnVuY3Rpb24oZCwgcyl7CiAgICBmb3IodmFyIG4gaW4gcyl7CiAgICAgICAgaWYocy5oYXNPd25Qcm9wZXJ0eShuKSkgIGRbbl0gPSBzW25dCiAgICB9Cn0KCgpFSlMgPSBmdW5jdGlvbiggb3B0aW9ucyApewoJb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09ICJzdHJpbmciID8ge3ZpZXc6IG9wdGlvbnN9IDogb3B0aW9ucwogICAgdGhpcy5zZXRfb3B0aW9ucyhvcHRpb25zKTsKCWlmKG9wdGlvbnMucHJlY29tcGlsZWQpewoJCXRoaXMudGVtcGxhdGUgPSB7fTsKCQl0aGlzLnRlbXBsYXRlLnByb2Nlc3MgPSBvcHRpb25zLnByZWNvbXBpbGVkOwoJCUVKUy51cGRhdGUodGhpcy5uYW1lLCB0aGlzKTsKCQlyZXR1cm47Cgl9CiAgICBpZihvcHRpb25zLmVsZW1lbnQpCgl7CgkJaWYodHlwZW9mIG9wdGlvbnMuZWxlbWVudCA9PSAnc3RyaW5nJyl7CgkJCXZhciBuYW1lID0gb3B0aW9ucy5lbGVtZW50CgkJCW9wdGlvbnMuZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAgb3B0aW9ucy5lbGVtZW50ICkKCQkJaWYob3B0aW9ucy5lbGVtZW50ID09IG51bGwpIHRocm93IG5hbWUrJ2RvZXMgbm90IGV4aXN0IScKCQl9CgkJaWYob3B0aW9ucy5lbGVtZW50LnZhbHVlKXsKCQkJdGhpcy50ZXh0ID0gb3B0aW9ucy5lbGVtZW50LnZhbHVlCgkJfWVsc2V7CgkJCXRoaXMudGV4dCA9IG9wdGlvbnMuZWxlbWVudC5pbm5lckhUTUwKCQl9CgkJdGhpcy5uYW1lID0gb3B0aW9ucy5lbGVtZW50LmlkCgkJdGhpcy50eXBlID0gJ1snCgl9ZWxzZSBpZihvcHRpb25zLnVybCl7CiAgICAgICAgb3B0aW9ucy51cmwgPSBFSlMuZW5kRXh0KG9wdGlvbnMudXJsLCB0aGlzLmV4dE1hdGNoKTsKCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiBvcHRpb25zLnVybDsKICAgICAgICB2YXIgdXJsID0gb3B0aW9ucy51cmwKICAgICAgICAvL29wdGlvbnMudmlldyA9IG9wdGlvbnMuYWJzb2x1dGVfdXJsIHx8IG9wdGlvbnMudmlldyB8fCBvcHRpb25zLjsKCQl2YXIgdGVtcGxhdGUgPSBFSlMuZ2V0KHRoaXMubmFtZSAvKnVybCovLCB0aGlzLmNhY2hlKTsKCQlpZiAodGVtcGxhdGUpIHJldHVybiB0ZW1wbGF0ZTsKCSAgICBpZiAodGVtcGxhdGUgPT0gRUpTLklOVkFMSURfUEFUSCkgcmV0dXJuIG51bGw7CiAgICAgICAgdHJ5ewogICAgICAgICAgICB0aGlzLnRleHQgPSBFSlMucmVxdWVzdCggdXJsKyh0aGlzLmNhY2hlID8gJycgOiAnPycrTWF0aC5yYW5kb20oKSApKTsKICAgICAgICB9Y2F0Y2goZSl7fQoKCQlpZih0aGlzLnRleHQgPT0gbnVsbCl7CiAgICAgICAgICAgIHRocm93KCB7dHlwZTogJ0VKUycsIG1lc3NhZ2U6ICdUaGVyZSBpcyBubyB0ZW1wbGF0ZSBhdCAnK3VybH0gICk7CgkJfQoJCS8vdGhpcy5uYW1lID0gdXJsOwoJfQoJdmFyIHRlbXBsYXRlID0gbmV3IEVKUy5Db21waWxlcih0aGlzLnRleHQsIHRoaXMudHlwZSk7CgoJdGVtcGxhdGUuY29tcGlsZShvcHRpb25zLCB0aGlzLm5hbWUpOwoKCQoJRUpTLnVwZGF0ZSh0aGlzLm5hbWUsIHRoaXMpOwoJdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwp9OwovKiBAUHJvdG90eXBlKi8KRUpTLnByb3RvdHlwZSA9IHsKCS8qKgoJICogUmVuZGVycyBhbiBvYmplY3Qgd2l0aCBleHRyYSB2aWV3IGhlbHBlcnMgYXR0YWNoZWQgdG8gdGhlIHZpZXcuCgkgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IGRhdGEgdG8gYmUgcmVuZGVyZWQKCSAqIEBwYXJhbSB7T2JqZWN0fSBleHRyYV9oZWxwZXJzIGFuIG9iamVjdCB3aXRoIGFkZGl0b25hbCB2aWV3IGhlbHBlcnMKCSAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdHJpbmcKCSAqLwogICAgcmVuZGVyIDogZnVuY3Rpb24ob2JqZWN0LCBleHRyYV9oZWxwZXJzKXsKICAgICAgICBvYmplY3QgPSBvYmplY3QgfHwge307CiAgICAgICAgdGhpcy5fZXh0cmFfaGVscGVycyA9IGV4dHJhX2hlbHBlcnM7CgkJdmFyIHYgPSBuZXcgRUpTLkhlbHBlcnMob2JqZWN0LCBleHRyYV9oZWxwZXJzIHx8IHt9KTsKCQlyZXR1cm4gdGhpcy50ZW1wbGF0ZS5wcm9jZXNzLmNhbGwob2JqZWN0LCBvYmplY3Qsdik7Cgl9LAogICAgdXBkYXRlIDogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7CiAgICAgICAgaWYodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpewoJCQllbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCkKCQl9CgkJaWYob3B0aW9ucyA9PSBudWxsKXsKCQkJX3RlbXBsYXRlID0gdGhpczsKCQkJcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7CgkJCQlFSlMucHJvdG90eXBlLnVwZGF0ZS5jYWxsKF90ZW1wbGF0ZSwgZWxlbWVudCwgb2JqZWN0KQoJCQl9CgkJfQoJCWlmKHR5cGVvZiBvcHRpb25zID09ICdzdHJpbmcnKXsKCQkJcGFyYW1zID0ge30KCQkJcGFyYW1zLnVybCA9IG9wdGlvbnMKCQkJX3RlbXBsYXRlID0gdGhpczsKCQkJcGFyYW1zLm9uQ29tcGxldGUgPSBmdW5jdGlvbihyZXF1ZXN0KXsKCQkJCXZhciBvYmplY3QgPSBldmFsKCByZXF1ZXN0LnJlc3BvbnNlVGV4dCApCgkJCQlFSlMucHJvdG90eXBlLnVwZGF0ZS5jYWxsKF90ZW1wbGF0ZSwgZWxlbWVudCwgb2JqZWN0KQoJCQl9CgkJCUVKUy5hamF4X3JlcXVlc3QocGFyYW1zKQoJCX1lbHNlCgkJewoJCQllbGVtZW50LmlubmVySFRNTCA9IHRoaXMucmVuZGVyKG9wdGlvbnMpCgkJfQogICAgfSwKCW91dCA6IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMudGVtcGxhdGUub3V0OwoJfSwKICAgIC8qKgogICAgICogU2V0cyBvcHRpb25zIG9uIHRoaXMgdmlldyB0byBiZSByZW5kZXJlZCB3aXRoLgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAqLwoJc2V0X29wdGlvbnMgOiBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgRUpTLnR5cGU7CgkJdGhpcy5jYWNoZSA9IG9wdGlvbnMuY2FjaGUgIT0gbnVsbCA/IG9wdGlvbnMuY2FjaGUgOiBFSlMuY2FjaGU7CgkJdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0IHx8IG51bGw7CgkJdGhpcy5uYW1lID0gIG9wdGlvbnMubmFtZSB8fCBudWxsOwoJCXRoaXMuZXh0ID0gb3B0aW9ucy5leHQgfHwgRUpTLmV4dDsKCQl0aGlzLmV4dE1hdGNoID0gbmV3IFJlZ0V4cCh0aGlzLmV4dC5yZXBsYWNlKC9cLi8sICdcLicpKTsKCX0KfTsKRUpTLmVuZEV4dCA9IGZ1bmN0aW9uKHBhdGgsIG1hdGNoKXsKCWlmKCFwYXRoKSByZXR1cm4gbnVsbDsKCW1hdGNoLmxhc3RJbmRleCA9IDAKCXJldHVybiBwYXRoKyAobWF0Y2gudGVzdChwYXRoKSA/ICcnIDogdGhpcy5leHQgKQp9CgoKCgovKiBAU3RhdGljKi8KRUpTLlNjYW5uZXIgPSBmdW5jdGlvbihzb3VyY2UsIGxlZnQsIHJpZ2h0KSB7CgkKICAgIGV4dGVuZCh0aGlzLAogICAgICAgIHtsZWZ0X2RlbGltaXRlcjogCWxlZnQgKyclJywKICAgICAgICAgcmlnaHRfZGVsaW1pdGVyOiAJJyUnK3JpZ2h0LAogICAgICAgICBkb3VibGVfbGVmdDogCQlsZWZ0KyclJScsCiAgICAgICAgIGRvdWJsZV9yaWdodDogIAknJSUnK3JpZ2h0LAogICAgICAgICBsZWZ0X2VxdWFsOiAJCWxlZnQrJyU9JywKICAgICAgICAgbGVmdF9jb21tZW50OiAJbGVmdCsnJSMnfSkKCgl0aGlzLlNwbGl0UmVnZXhwID0gbGVmdD09J1snID8gLyhcWyUlKXwoJSVcXSl8KFxbJT0pfChcWyUjKXwoXFslKXwoJVxdXG4pfCglXF0pfChcbikvIDogbmV3IFJlZ0V4cCgnKCcrdGhpcy5kb3VibGVfbGVmdCsnKXwoJSUnK3RoaXMuZG91YmxlX3JpZ2h0KycpfCgnK3RoaXMubGVmdF9lcXVhbCsnKXwoJyt0aGlzLmxlZnRfY29tbWVudCsnKXwoJyt0aGlzLmxlZnRfZGVsaW1pdGVyKycpfCgnK3RoaXMucmlnaHRfZGVsaW1pdGVyKydcbil8KCcrdGhpcy5yaWdodF9kZWxpbWl0ZXIrJyl8KFxuKScpIDsKCQoJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Cgl0aGlzLnN0YWcgPSBudWxsOwoJdGhpcy5saW5lcyA9IDA7Cn07CgpFSlMuU2Nhbm5lci50b190ZXh0ID0gZnVuY3Rpb24oaW5wdXQpewoJaWYoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiAnJzsKICAgIGlmKGlucHV0IGluc3RhbmNlb2YgRGF0ZSkKCQlyZXR1cm4gaW5wdXQudG9EYXRlU3RyaW5nKCk7CglpZihpbnB1dC50b1N0cmluZykgCiAgICAgICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7CglyZXR1cm4gJyc7Cn07CgpFSlMuU2Nhbm5lci5wcm90b3R5cGUgPSB7CiAgc2NhbjogZnVuY3Rpb24oYmxvY2spIHsKICAgICBzY2FubGluZSA9IHRoaXMuc2NhbmxpbmU7CgkgcmVnZXggPSB0aGlzLlNwbGl0UmVnZXhwOwoJIGlmICghIHRoaXMuc291cmNlID09ICcnKQoJIHsKCSAJIHZhciBzb3VyY2Vfc3BsaXQgPSByc3BsaXQodGhpcy5zb3VyY2UsIC9cbi8pOwoJIAkgZm9yKHZhciBpPTA7IGk8c291cmNlX3NwbGl0Lmxlbmd0aDsgaSsrKSB7CgkJIAkgdmFyIGl0ZW0gPSBzb3VyY2Vfc3BsaXRbaV07CgkJCSB0aGlzLnNjYW5saW5lKGl0ZW0sIHJlZ2V4LCBibG9jayk7CgkJIH0KCSB9CiAgfSwKICBzY2FubGluZTogZnVuY3Rpb24obGluZSwgcmVnZXgsIGJsb2NrKSB7CgkgdGhpcy5saW5lcysrOwoJIHZhciBsaW5lX3NwbGl0ID0gcnNwbGl0KGxpbmUsIHJlZ2V4KTsKIAkgZm9yKHZhciBpPTA7IGk8bGluZV9zcGxpdC5sZW5ndGg7IGkrKykgewoJICAgdmFyIHRva2VuID0gbGluZV9zcGxpdFtpXTsKICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CgkJICAgCXRyeXsKCSAgICAgICAgIAlibG9jayh0b2tlbiwgdGhpcyk7CgkJIAl9Y2F0Y2goZSl7CgkJCQl0aHJvdyB7dHlwZTogJ0VKUy5TY2FubmVyJywgbGluZTogdGhpcy5saW5lc307CgkJCX0KICAgICAgIH0KCSB9CiAgfQp9OwoKCkVKUy5CdWZmZXIgPSBmdW5jdGlvbihwcmVfY21kLCBwb3N0X2NtZCkgewoJdGhpcy5saW5lID0gbmV3IEFycmF5KCk7Cgl0aGlzLnNjcmlwdCA9ICIiOwoJdGhpcy5wcmVfY21kID0gcHJlX2NtZDsKCXRoaXMucG9zdF9jbWQgPSBwb3N0X2NtZDsKCWZvciAodmFyIGk9MDsgaTx0aGlzLnByZV9jbWQubGVuZ3RoOyBpKyspCgl7CgkJdGhpcy5wdXNoKHByZV9jbWRbaV0pOwoJfQp9OwpFSlMuQnVmZmVyLnByb3RvdHlwZSA9IHsKCQogIHB1c2g6IGZ1bmN0aW9uKGNtZCkgewoJdGhpcy5saW5lLnB1c2goY21kKTsKICB9LAoKICBjcjogZnVuY3Rpb24oKSB7Cgl0aGlzLnNjcmlwdCA9IHRoaXMuc2NyaXB0ICsgdGhpcy5saW5lLmpvaW4oJzsgJyk7Cgl0aGlzLmxpbmUgPSBuZXcgQXJyYXkoKTsKCXRoaXMuc2NyaXB0ID0gdGhpcy5zY3JpcHQgKyAiXG4iOwogIH0sCgogIGNsb3NlOiBmdW5jdGlvbigpIHsKCWlmICh0aGlzLmxpbmUubGVuZ3RoID4gMCkKCXsKCQlmb3IgKHZhciBpPTA7IGk8dGhpcy5wb3N0X2NtZC5sZW5ndGg7IGkrKyl7CgkJCXRoaXMucHVzaChwcmVfY21kW2ldKTsKCQl9CgkJdGhpcy5zY3JpcHQgPSB0aGlzLnNjcmlwdCArIHRoaXMubGluZS5qb2luKCc7ICcpOwoJCWxpbmUgPSBudWxsOwoJfQogIH0KIAkKfTsKCgpFSlMuQ29tcGlsZXIgPSBmdW5jdGlvbihzb3VyY2UsIGxlZnQpIHsKICAgIHRoaXMucHJlX2NtZCA9IFsndmFyIF9fX1ZpZXdPID0gW107J107Cgl0aGlzLnBvc3RfY21kID0gbmV3IEFycmF5KCk7Cgl0aGlzLnNvdXJjZSA9ICcgJzsJCglpZiAoc291cmNlICE9IG51bGwpCgl7CgkJaWYgKHR5cGVvZiBzb3VyY2UgPT0gJ3N0cmluZycpCgkJewoJCSAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZSgvXHJcbi9nLCAiXG4iKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnJlcGxhY2UoL1xyL2csICAgIlxuIik7CgkJCXRoaXMuc291cmNlID0gc291cmNlOwoJCX1lbHNlIGlmIChzb3VyY2UuaW5uZXJIVE1MKXsKCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2UuaW5uZXJIVE1MOwoJCX0gCgkJaWYgKHR5cGVvZiB0aGlzLnNvdXJjZSAhPSAnc3RyaW5nJyl7CgkJCXRoaXMuc291cmNlID0gIiI7CgkJfQoJfQoJbGVmdCA9IGxlZnQgfHwgJzwnOwoJdmFyIHJpZ2h0ID0gJz4nOwoJc3dpdGNoKGxlZnQpIHsKCQljYXNlICdbJzoKCQkJcmlnaHQgPSAnXSc7CgkJCWJyZWFrOwoJCWNhc2UgJzwnOgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl0aHJvdyBsZWZ0KycgaXMgbm90IGEgc3VwcG9ydGVkIGRlbGltaW5hdG9yJzsKCQkJYnJlYWs7Cgl9Cgl0aGlzLnNjYW5uZXIgPSBuZXcgRUpTLlNjYW5uZXIodGhpcy5zb3VyY2UsIGxlZnQsIHJpZ2h0KTsKCXRoaXMub3V0ID0gJyc7Cn07CkVKUy5Db21waWxlci5wcm90b3R5cGUgPSB7CiAgY29tcGlsZTogZnVuY3Rpb24ob3B0aW9ucywgbmFtZSkgewogIAlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCXRoaXMub3V0ID0gJyc7Cgl2YXIgcHV0X2NtZCA9ICJfX19WaWV3Ty5wdXNoKCI7Cgl2YXIgaW5zZXJ0X2NtZCA9IHB1dF9jbWQ7Cgl2YXIgYnVmZiA9IG5ldyBFSlMuQnVmZmVyKHRoaXMucHJlX2NtZCwgdGhpcy5wb3N0X2NtZCk7CQkKCXZhciBjb250ZW50ID0gJyc7Cgl2YXIgY2xlYW4gPSBmdW5jdGlvbihjb250ZW50KQoJewoJICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcL2csICdcXFxcJyk7CiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXG4vZywgJ1xcbicpOwogICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyIvZywgICdcXCInKTsKICAgICAgICByZXR1cm4gY29udGVudDsKCX07Cgl0aGlzLnNjYW5uZXIuc2NhbihmdW5jdGlvbih0b2tlbiwgc2Nhbm5lcikgewoJCWlmIChzY2FubmVyLnN0YWcgPT0gbnVsbCkKCQl7CgkJCXN3aXRjaCh0b2tlbikgewoJCQkJY2FzZSAnXG4nOgoJCQkJCWNvbnRlbnQgPSBjb250ZW50ICsgIlxuIjsKCQkJCQlidWZmLnB1c2gocHV0X2NtZCArICciJyArIGNsZWFuKGNvbnRlbnQpICsgJyIpOycpOwoJCQkJCWJ1ZmYuY3IoKTsKCQkJCQljb250ZW50ID0gJyc7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNjYW5uZXIubGVmdF9kZWxpbWl0ZXI6CgkJCQljYXNlIHNjYW5uZXIubGVmdF9lcXVhbDoKCQkJCWNhc2Ugc2Nhbm5lci5sZWZ0X2NvbW1lbnQ6CgkJCQkJc2Nhbm5lci5zdGFnID0gdG9rZW47CgkJCQkJaWYgKGNvbnRlbnQubGVuZ3RoID4gMCkKCQkJCQl7CgkJCQkJCWJ1ZmYucHVzaChwdXRfY21kICsgJyInICsgY2xlYW4oY29udGVudCkgKyAnIiknKTsKCQkJCQl9CgkJCQkJY29udGVudCA9ICcnOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzY2FubmVyLmRvdWJsZV9sZWZ0OgoJCQkJCWNvbnRlbnQgPSBjb250ZW50ICsgc2Nhbm5lci5sZWZ0X2RlbGltaXRlcjsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyB0b2tlbjsKCQkJCQlicmVhazsKCQkJfQoJCX0KCQllbHNlIHsKCQkJc3dpdGNoKHRva2VuKSB7CgkJCQljYXNlIHNjYW5uZXIucmlnaHRfZGVsaW1pdGVyOgoJCQkJCXN3aXRjaChzY2FubmVyLnN0YWcpIHsKCQkJCQkJY2FzZSBzY2FubmVyLmxlZnRfZGVsaW1pdGVyOgoJCQkJCQkJaWYgKGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9PSAnXG4nKQoJCQkJCQkJewoJCQkJCQkJCWNvbnRlbnQgPSBjaG9wKGNvbnRlbnQpOwoJCQkJCQkJCWJ1ZmYucHVzaChjb250ZW50KTsKCQkJCQkJCQlidWZmLmNyKCk7CgkJCQkJCQl9CgkJCQkJCQllbHNlIHsKCQkJCQkJCQlidWZmLnB1c2goY29udGVudCk7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSBzY2FubmVyLmxlZnRfZXF1YWw6CgkJCQkJCQlidWZmLnB1c2goaW5zZXJ0X2NtZCArICIoRUpTLlNjYW5uZXIudG9fdGV4dCgiICsgY29udGVudCArICIpKSkiKTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlzY2FubmVyLnN0YWcgPSBudWxsOwoJCQkJCWNvbnRlbnQgPSAnJzsKCQkJCQlicmVhazsKCQkJCWNhc2Ugc2Nhbm5lci5kb3VibGVfcmlnaHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyBzY2FubmVyLnJpZ2h0X2RlbGltaXRlcjsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyB0b2tlbjsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0pOwoJaWYgKGNvbnRlbnQubGVuZ3RoID4gMCkKCXsKCQkvLyBDaG91bGQgYmUgY29udGVudC5kdW1wIGluIFJ1YnkKCQlidWZmLnB1c2gocHV0X2NtZCArICciJyArIGNsZWFuKGNvbnRlbnQpICsgJyIpJyk7Cgl9CglidWZmLmNsb3NlKCk7Cgl0aGlzLm91dCA9IGJ1ZmYuc2NyaXB0ICsgIjsiOwoJdmFyIHRvX2JlX2V2YWxlZCA9ICcvKicrbmFtZSsnKi90aGlzLnByb2Nlc3MgPSBmdW5jdGlvbihfQ09OVEVYVCxfVklFVykgeyB0cnkgeyB3aXRoKF9WSUVXKSB7IHdpdGggKF9DT05URVhUKSB7Jyt0aGlzLm91dCsiIHJldHVybiBfX19WaWV3Ty5qb2luKCcnKTt9fX1jYXRjaChlKXtlLmxpbmVOdW1iZXI9bnVsbDt0aHJvdyBlO319OyI7CgkKCXRyeXsKCQlldmFsKHRvX2JlX2V2YWxlZCk7Cgl9Y2F0Y2goZSl7CgkJaWYodHlwZW9mIEpTTElOVCAhPSAndW5kZWZpbmVkJyl7CgkJCUpTTElOVCh0aGlzLm91dCk7CgkJCWZvcih2YXIgaSA9IDA7IGkgPCBKU0xJTlQuZXJyb3JzLmxlbmd0aDsgaSsrKXsKCQkJCXZhciBlcnJvciA9IEpTTElOVC5lcnJvcnNbaV07CgkJCQlpZihlcnJvci5yZWFzb24gIT0gIlVubmVjZXNzYXJ5IHNlbWljb2xvbi4iKXsKCQkJCQllcnJvci5saW5lKys7CgkJCQkJdmFyIGUgPSBuZXcgRXJyb3IoKTsKCQkJCQllLmxpbmVOdW1iZXIgPSBlcnJvci5saW5lOwoJCQkJCWUubWVzc2FnZSA9IGVycm9yLnJlYXNvbjsKCQkJCQlpZihvcHRpb25zLnZpZXcpCgkJCQkJCWUuZmlsZU5hbWUgPSBvcHRpb25zLnZpZXc7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCQkJfQoJCX1lbHNlewoJCQl0aHJvdyBlOwoJCX0KCX0KICB9Cn07CgoKLy90eXBlLCBjYWNoZSwgZm9sZGVyCi8qKgogKiBTZXRzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYWxsIHZpZXdzCiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFNldCB2aWV3IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zCiAqIDx0YWJsZSBjbGFzcz0ib3B0aW9ucyI+CgkJCQk8dGJvZHk+PHRyPjx0aD5PcHRpb248L3RoPjx0aD5EZWZhdWx0PC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkPnR5cGU8L3RkPgoJCQkJCTx0ZD4nPCc8L3RkPgoJCQkJCTx0ZD50eXBlIG9mIG1hZ2ljIHRhZ3MuICBPcHRpb25zIGFyZSAnJmx0Oycgb3IgJ1snCgkJCQkJPC90ZD4KCQkJCTwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkPmNhY2hlPC90ZD4KCQkJCQk8dGQ+dHJ1ZSBpbiBwcm9kdWN0aW9uIG1vZGUsIGZhbHNlIGluIG90aGVyIG1vZGVzPC90ZD4KCQkJCQk8dGQ+dHJ1ZSB0byBjYWNoZSB0ZW1wbGF0ZS4KCQkJCQk8L3RkPgoJCQkJPC90cj4KCTwvdGJvZHk+PC90YWJsZT4KICogCiAqLwpFSlMuY29uZmlnID0gZnVuY3Rpb24ob3B0aW9ucyl7CglFSlMuY2FjaGUgPSBvcHRpb25zLmNhY2hlICE9IG51bGwgPyBvcHRpb25zLmNhY2hlIDogRUpTLmNhY2hlOwoJRUpTLnR5cGUgPSBvcHRpb25zLnR5cGUgIT0gbnVsbCA/IG9wdGlvbnMudHlwZSA6IEVKUy50eXBlOwoJRUpTLmV4dCA9IG9wdGlvbnMuZXh0ICE9IG51bGwgPyBvcHRpb25zLmV4dCA6IEVKUy5leHQ7CgkKCXZhciB0ZW1wbGF0ZXNfZGlyZWN0b3J5ID0gRUpTLnRlbXBsYXRlc19kaXJlY3RvcnkgfHwge307IC8vbmljZSBhbmQgcHJpdmF0ZSBjb250YWluZXIKCUVKUy50ZW1wbGF0ZXNfZGlyZWN0b3J5ID0gdGVtcGxhdGVzX2RpcmVjdG9yeTsKCUVKUy5nZXQgPSBmdW5jdGlvbihwYXRoLCBjYWNoZSl7CgkJaWYoY2FjaGUgPT0gZmFsc2UpIHJldHVybiBudWxsOwoJCWlmKHRlbXBsYXRlc19kaXJlY3RvcnlbcGF0aF0pIHJldHVybiB0ZW1wbGF0ZXNfZGlyZWN0b3J5W3BhdGhdOwogIAkJcmV0dXJuIG51bGw7Cgl9OwoJCglFSlMudXBkYXRlID0gZnVuY3Rpb24ocGF0aCwgdGVtcGxhdGUpIHsgCgkJaWYocGF0aCA9PSBudWxsKSByZXR1cm47CgkJdGVtcGxhdGVzX2RpcmVjdG9yeVtwYXRoXSA9IHRlbXBsYXRlIDsKCX07CgkKCUVKUy5JTlZBTElEX1BBVEggPSAgLTE7Cn07CkVKUy5jb25maWcoIHtjYWNoZTogdHJ1ZSwgdHlwZTogJzwnLCBleHQ6ICcuaHRtJyB9ICk7CgoKCi8qKgogKiBAY29uc3RydWN0b3IKICogQnkgYWRkaW5nIGZ1bmN0aW9ucyB0byBFSlMuSGVscGVycy5wcm90b3R5cGUsIHRob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgCiAqIHZpZXdzLgogKiBAaW5pdCBDcmVhdGVzIGEgdmlldyBoZWxwZXIuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnRlcm5hbGx5LiAgWW91IHNob3VsZCBuZXZlciBjYWxsIGl0LgogKiBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIHZpZXcuICBIZWxwZXJzIGhhdmUgYWNjZXNzIHRvIGl0IHRocm91Z2ggdGhpcy5fZGF0YQogKi8KRUpTLkhlbHBlcnMgPSBmdW5jdGlvbihkYXRhLCBleHRyYXMpewoJdGhpcy5fZGF0YSA9IGRhdGE7CiAgICB0aGlzLl9leHRyYXMgPSBleHRyYXM7CiAgICBleHRlbmQodGhpcywgZXh0cmFzICk7Cn07Ci8qIEBwcm90b3R5cGUqLwpFSlMuSGVscGVycy5wcm90b3R5cGUgPSB7CiAgICAvKioKICAgICAqIFJlbmRlcnMgYSBuZXcgdmlldy4gIElmIGRhdGEgaXMgcGFzc2VkIGluLCB1c2VzIHRoYXQgdG8gcmVuZGVyIHRoZSB2aWV3LgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgc3RhbmRhcmQgb3B0aW9ucyBwYXNzZWQgdG8gYSBuZXcgdmlldy4KICAgICAqIEBwYXJhbSB7b3B0aW9uYWw6T2JqZWN0fSBkYXRhCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgKi8KCXZpZXc6IGZ1bmN0aW9uKG9wdGlvbnMsIGRhdGEsIGhlbHBlcnMpewogICAgICAgIGlmKCFoZWxwZXJzKSBoZWxwZXJzID0gdGhpcy5fZXh0cmFzCgkJaWYoIWRhdGEpIGRhdGEgPSB0aGlzLl9kYXRhOwoJCXJldHVybiBuZXcgRUpTKG9wdGlvbnMpLnJlbmRlcihkYXRhLCBoZWxwZXJzKTsKCX0sCiAgICAvKioKICAgICAqIEZvciBhIGdpdmVuIHZhbHVlLCB0cmllcyB0byBjcmVhdGUgYSBodW1hbiByZXByZXNlbnRhdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgdmFsdWUgYmVpbmcgY29udmVydGVkLgogICAgICogQHBhcmFtIHtPYmplY3R9IG51bGxfdGV4dCB3aGF0IHRleHQgc2hvdWxkIGJlIHByZXNlbnQgaWYgaW5wdXQgPT0gbnVsbCBvciB1bmRlZmluZWQsIGRlZmF1bHRzIHRvICcnCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IAogICAgICovCgl0b190ZXh0OiBmdW5jdGlvbihpbnB1dCwgbnVsbF90ZXh0KSB7CgkgICAgaWYoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbF90ZXh0IHx8ICcnOwoJICAgIGlmKGlucHV0IGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGlucHV0LnRvRGF0ZVN0cmluZygpOwoJCWlmKGlucHV0LnRvU3RyaW5nKSByZXR1cm4gaW5wdXQudG9TdHJpbmcoKS5yZXBsYWNlKC9cbi9nLCAnPGJyIC8+JykucmVwbGFjZSgvJycvZywgIiciKTsKCQlyZXR1cm4gJyc7Cgl9Cn07CiAgICBFSlMubmV3UmVxdWVzdCA9IGZ1bmN0aW9uKCl7CgkgICB2YXIgZmFjdG9yaWVzID0gW2Z1bmN0aW9uKCkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7IH0sZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSxmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOyB9XTsKCSAgIGZvcih2YXIgaSA9IDA7IGkgPCBmYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gZmFjdG9yaWVzW2ldKCk7CgkgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSAgcmV0dXJuIHJlcXVlc3Q7CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2goZSkgeyBjb250aW51ZTt9CgkgICB9Cgl9CgkKCUVKUy5yZXF1ZXN0ID0gZnVuY3Rpb24ocGF0aCl7CgkgICB2YXIgcmVxdWVzdCA9IG5ldyBFSlMubmV3UmVxdWVzdCgpCgkgICByZXF1ZXN0Lm9wZW4oIkdFVCIsIHBhdGgsIGZhbHNlKTsKCSAgIAoJICAgdHJ5e3JlcXVlc3Quc2VuZChudWxsKTt9CgkgICBjYXRjaChlKXtyZXR1cm4gbnVsbDt9CgkgICAKCSAgIGlmICggcmVxdWVzdC5zdGF0dXMgPT0gNDA0IHx8IHJlcXVlc3Quc3RhdHVzID09IDIgfHwocmVxdWVzdC5zdGF0dXMgPT0gMCAmJiByZXF1ZXN0LnJlc3BvbnNlVGV4dCA9PSAnJykgKSByZXR1cm4gbnVsbDsKCSAgIAoJICAgcmV0dXJuIHJlcXVlc3QucmVzcG9uc2VUZXh0Cgl9CglFSlMuYWpheF9yZXF1ZXN0ID0gZnVuY3Rpb24ocGFyYW1zKXsKCQlwYXJhbXMubWV0aG9kID0gKCBwYXJhbXMubWV0aG9kID8gcGFyYW1zLm1ldGhvZCA6ICdHRVQnKQoJCQoJCXZhciByZXF1ZXN0ID0gbmV3IEVKUy5uZXdSZXF1ZXN0KCk7CgkJcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpewoJCQlpZihyZXF1ZXN0LnJlYWR5U3RhdGUgPT0gNCl7CgkJCQlpZihyZXF1ZXN0LnN0YXR1cyA9PSAyMDApewoJCQkJCXBhcmFtcy5vbkNvbXBsZXRlKHJlcXVlc3QpCgkJCQl9ZWxzZQoJCQkJewoJCQkJCXBhcmFtcy5vbkNvbXBsZXRlKHJlcXVlc3QpCgkJCQl9CgkJCX0KCQl9CgkJcmVxdWVzdC5vcGVuKHBhcmFtcy5tZXRob2QsIHBhcmFtcy51cmwpCgkJcmVxdWVzdC5zZW5kKG51bGwpCgl9CgoKfSkoKTs= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ejs.js,importbuddy/js/ejs.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/importbuddy.js,importbuddy/js/importbuddy.js alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCWpRdWVyeSh3aW5kb3cpLmxvYWQoZnVuY3Rpb24oKXsKCQlpZiAoIGpRdWVyeSgnI3BiX2ltcG9ydGJ1ZGR5X3dvcmtpbmcnKS5pcygnOnZpc2libGUnKSApIHsKCQkJalF1ZXJ5KCcjcGJfaW1wb3J0YnVkZHlfd29ya2luZycpLnJlcGxhY2VXaXRoKAoJCQkJalF1ZXJ5KCcjcGJfaW1wb3J0YnVkZHlfYmxhbmthbGVydCcpLmh0bWwoKS5yZXBsYWNlKCAnI1RJVExFIycsICdQSFAgVGltZW91dCBvciBGYXRhbCBFcnJvciBPY2N1cnJlZCcgKS5yZXBsYWNlKCAnI01FU1NBR0UjJywgJ1RoZSBwYWdlIGRpZCBub3QgZmluaXNoIGxvYWRpbmcgYXMgZXhwZWN0ZWQuICBUaGUgbW9zdCBjb21tb24gY2F1c2UgZm9yIHRoaXMgaXMgdGhlIFBIUCBwcm9jZXNzIHRha2luZyBtb3JlIHRpbWUgdGhhbiBpdCBoYXMgYmVlbiBhbGxvd2VkIGJ5IHlvdXIgaG9zdCAocGhwLmluaSBzZXR0aW5nIDxpPm1heF9leGVjdXRpb25fdGltZTwvaT4pLiBJZiBhIFBIUCBlcnJvciBpcyBkaXNwbGF5ZWQgYWJvdmUgdGhpcyBjYW4gYWxzbyBjYXVzZSB0aGlzIGVycm9yLicgKQoJCQkpOwoJCX0KCX0pOwp9KTsKCmZ1bmN0aW9uIGxvYWRUb29sdGlwcygpIHsKCWpRdWVyeSgnLnBsdWdpbmJ1ZGR5X3RpcCcpLnRvb2x0aXAoewoJCXRyYWNrOiB0cnVlLAoJCWRlbGF5OiAwLAoJCXNob3dVUkw6IGZhbHNlLAoJCXNob3dCb2R5OiAiIC0gIiwKCQlmYWRlOiAyNTAKCX0pOwp9CgpqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJbG9hZFRvb2x0aXBzKCk7CgkKCWpRdWVyeSgnLnRvZ2dsZScpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKCQlqUXVlcnkoICcjdG9nZ2xlLScgKyBqUXVlcnkodGhpcykuYXR0cignaWQnKSApLnNsaWRlVG9nZ2xlKCk7Cgl9KTsKCQoJalF1ZXJ5KCcub3B0aW9uX3RvZ2dsZScpLmNoYW5nZShmdW5jdGlvbihlKSB7CgkJaWYgKGpRdWVyeSh0aGlzKS5hdHRyKCdjaGVja2VkJykpIHsKCQkJalF1ZXJ5KCcuJyArIGpRdWVyeSh0aGlzKS5hdHRyKCdpZCcpICsgJ190b2dnbGUnICkuc2xpZGVUb2dnbGUoKTsKCQl9IGVsc2UgewoJCQlqUXVlcnkoJy4nICsgalF1ZXJ5KHRoaXMpLmF0dHIoJ2lkJykgKyAnX3RvZ2dsZScgKS5zbGlkZVRvZ2dsZSgpOwoJCX0KCX0pOwoJCgkKfSk7CgpmdW5jdGlvbiBiYWNrdXBidWRkeV9zYXZlTG9nQXNGaWxlKCkgewoJdmFyIHRleHRGaWxlQXNCbG9iID0gbmV3IEJsb2IoWyBqUXVlcnkoICcjYmFja3VwYnVkZHlfbWVzc2FnZXMnICkudGV4dCgpIF0sIHt0eXBlOid0ZXh0L3BsYWluJ30pOwoJdmFyIGZpbGVOYW1lVG9TYXZlQXMgPSAnaW1wb3J0YnVkZHkudHh0JzsKCgl2YXIgZG93bmxvYWRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwoJZG93bmxvYWRMaW5rLmRvd25sb2FkID0gZmlsZU5hbWVUb1NhdmVBczsKCWRvd25sb2FkTGluay5pbm5lckhUTUwgPSAiRG93bmxvYWQgRmlsZSI7Cglkb3dubG9hZExpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX25ldycpOyAvLyBTYWZhcmkgbG9hZHMgdGhpcyBsaW5rIGFzIGEgcGFnZSBpbnN0ZWFkIG9mIGRpcmVjdGx5IGRvd25sb2FkaW5nLgoJZG93bmxvYWRMaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh0ZXh0RmlsZUFzQmxvYik7Cglkb3dubG9hZExpbmsub25jbGljayA9IGJhY2t1cGJ1ZGR5X2Rlc3Ryb3lDbGlja2VkRWxlbWVudDsKCWRvd25sb2FkTGluay5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb3dubG9hZExpbmspOwoKCWRvd25sb2FkTGluay5jbGljaygpOwp9CgpmdW5jdGlvbiBiYWNrdXBidWRkeV9kZXN0cm95Q2xpY2tlZEVsZW1lbnQoZXZlbnQpIHsKICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZXZlbnQudGFyZ2V0KTsKfQ== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/importbuddy.js,importbuddy/js/importbuddy.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/index.php,importbuddy/js/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/index.php,importbuddy/js/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.js,importbuddy/js/jquery.js LyohIGpRdWVyeSB2MS4xMS4wIHwgKGMpIDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPSIiLnRyaW0sbD17fSxtPSIxLjExLjAiLG49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG4uZm4uaW5pdChhLGIpfSxvPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxwPS9eLW1zLS8scT0vLShbXGRhLXpdKS9naSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bi5mbj1uLnByb3RvdHlwZT17anF1ZXJ5Om0sY29uc3RydWN0b3I6bixzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZC5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bi5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmVhY2godGhpcyxhLGIpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG4uZXh0ZW5kPW4uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxuLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2hdKSlmb3IoZCBpbiBlKWE9Z1tkXSxjPWVbZF0sZyE9PWMmJihqJiZjJiYobi5pc1BsYWluT2JqZWN0KGMpfHwoYj1uLmlzQXJyYXkoYykpKT8oYj8oYj0hMSxmPWEmJm4uaXNBcnJheShhKT9hOltdKTpmPWEmJm4uaXNQbGFpbk9iamVjdChhKT9hOnt9LGdbZF09bi5leHRlbmQoaixmLGMpKTp2b2lkIDAhPT1jJiYoZ1tkXT1jKSk7cmV0dXJuIGd9LG4uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhtK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1uLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuImFycmF5Ij09PW4udHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEtcGFyc2VGbG9hdChhKT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW4udHlwZShhKXx8YS5ub2RlVHlwZXx8bi5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYobC5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cyhhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTprJiYhay5jYWxsKCJcdWZlZmZceGEwIik/ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6ay5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXMoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSxuLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHMoYSl7dmFyIGI9YS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzPSJzaXp6bGUiKy1uZXcgRGF0ZSx0PWEuZG9jdW1lbnQsdT0wLHY9MCx3PWViKCkseD1lYigpLHk9ZWIoKSx6PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iJiYoaj0hMCksMH0sQT0idW5kZWZpbmVkIixCPTE8PDMxLEM9e30uaGFzT3duUHJvcGVydHksRD1bXSxFPUQucG9wLEY9RC5wdXNoLEc9RC5wdXNoLEg9RC5zbGljZSxJPUQuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz10aGlzLmxlbmd0aDtjPmI7YisrKWlmKHRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfSxKPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsSz0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTD0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE09TC5yZXBsYWNlKCJ3IiwidyMiKSxOPSJcXFsiK0srIiooIitMKyIpIitLKyIqKD86KFsqXiR8IX5dPz0pIitLKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitNKyIpfCl8KSIrSysiKlxcXSIsTz0iOigiK0wrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiK04ucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLFA9bmV3IFJlZ0V4cCgiXiIrSysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitLKyIrJCIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0srIiosIitLKyIqIiksUj1uZXcgUmVnRXhwKCJeIitLKyIqKFs+K35dfCIrSysiKSIrSysiKiIpLFM9bmV3IFJlZ0V4cCgiPSIrSysiKihbXlxcXSdcIl0qPykiK0srIipcXF0iLCJnIiksVD1uZXcgUmVnRXhwKE8pLFU9bmV3IFJlZ0V4cCgiXiIrTSsiJCIpLFY9e0lEOm5ldyBSZWdFeHAoIl4jKCIrTCsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitMKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitMLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpuZXcgUmVnRXhwKCJeIitOKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89Lyd8XFwvZyxhYj1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0srIj98KCIrSysiKXwuKSIsImlnIiksYmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9O3RyeXtHLmFwcGx5KEQ9SC5jYWxsKHQuY2hpbGROb2RlcyksdC5jaGlsZE5vZGVzKSxEW3QuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGNiKXtHPXthcHBseTpELmxlbmd0aD9mdW5jdGlvbihhLGIpe0YuYXBwbHkoYSxILmNhbGwoYikpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGQ9MDt3aGlsZShhW2MrK109YltkKytdKTthLmxlbmd0aD1jLTF9fX1mdW5jdGlvbiBkYihhLGIsZCxlKXt2YXIgZixnLGgsaSxqLG0scCxxLHUsdjtpZigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dCkhPT1sJiZrKGIpLGI9Ynx8bCxkPWR8fFtdLCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGQ7aWYoMSE9PShpPWIubm9kZVR5cGUpJiY5IT09aSlyZXR1cm5bXTtpZihuJiYhZSl7aWYoZj1aLmV4ZWMoYSkpaWYoaD1mWzFdKXtpZig5PT09aSl7aWYoZz1iLmdldEVsZW1lbnRCeUlkKGgpLCFnfHwhZy5wYXJlbnROb2RlKXJldHVybiBkO2lmKGcuaWQ9PT1oKXJldHVybiBkLnB1c2goZyksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGc9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGgpKSYmcihiLGcpJiZnLmlkPT09aClyZXR1cm4gZC5wdXNoKGcpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBHLmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaD1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaCkpLGR9aWYoYy5xc2EmJighb3x8IW8udGVzdChhKSkpe2lmKHE9cD1zLHU9Yix2PTk9PT1pJiZhLDE9PT1pJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bT1vYihhKSwocD1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cT1wLnJlcGxhY2UoXywiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscSkscT0iW2lkPSciK3ErIiddICIsaj1tLmxlbmd0aDt3aGlsZShqLS0pbVtqXT1xK3BiKG1bal0pO3U9JC50ZXN0KGEpJiZtYihiLnBhcmVudE5vZGUpfHxiLHY9bS5qb2luKCIsIil9aWYodil0cnl7cmV0dXJuIEcuYXBwbHkoZCx1LnF1ZXJ5U2VsZWN0b3JBbGwodikpLGR9Y2F0Y2godyl7fWZpbmFsbHl7cHx8Yi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4geGIoYS5yZXBsYWNlKFAsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGViKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBmYihhKXtyZXR1cm4gYVtzXT0hMCxhfWZ1bmN0aW9uIGdiKGEpe3ZhciBiPWwuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24gaGIoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEIpLSh+YS5zb3VyY2VJbmRleHx8Qik7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIGpiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIGtiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBsYihhKXtyZXR1cm4gZmIoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsZmIoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBtYihhKXtyZXR1cm4gYSYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1BJiZhfWM9ZGIuc3VwcG9ydD17fSxmPWRiLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxrPWRiLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGU9YT9hLm93bmVyRG9jdW1lbnR8fGE6dCxnPWUuZGVmYXVsdFZpZXc7cmV0dXJuIGUhPT1sJiY5PT09ZS5ub2RlVHlwZSYmZS5kb2N1bWVudEVsZW1lbnQ/KGw9ZSxtPWUuZG9jdW1lbnRFbGVtZW50LG49IWYoZSksZyYmZyE9PWcudG9wJiYoZy5hZGRFdmVudExpc3RlbmVyP2cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe2soKX0sITEpOmcuYXR0YWNoRXZlbnQmJmcuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2soKX0pKSxjLmF0dHJpYnV0ZXM9Z2IoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1nYihmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1ZLnRlc3QoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSYmZ2IoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiIsYS5maXJzdENoaWxkLmNsYXNzTmFtZT0iaSIsMj09PWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaSIpLmxlbmd0aH0pLGMuZ2V0QnlJZD1nYihmdW5jdGlvbihhKXtyZXR1cm4gbS5hcHBlbmRDaGlsZChhKS5pZD1zLCFlLmdldEVsZW1lbnRzQnlOYW1lfHwhZS5nZXRFbGVtZW50c0J5TmFtZShzKS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT09QSYmbil7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYyYmYy5wYXJlbnROb2RlP1tjXTpbXX19LGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShhYixiYik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGFiLGJiKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9PUEmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSksZC5maW5kLlRBRz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09QT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PUEmJm4/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scD1bXSxvPVtdLChjLnFzYT1ZLnRlc3QoZS5xdWVyeVNlbGVjdG9yQWxsKSkmJihnYihmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdCB0PScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixhLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0Xj0nJ10iKS5sZW5ndGgmJm8ucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fG8ucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8by5wdXNoKCI6Y2hlY2tlZCIpfSksZ2IoZnVuY3Rpb24oYSl7dmFyIGI9ZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmby5wdXNoKCJuYW1lIitLKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fG8ucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxvLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9WS50ZXN0KHE9bS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG0ubW96TWF0Y2hlc1NlbGVjdG9yfHxtLm9NYXRjaGVzU2VsZWN0b3J8fG0ubXNNYXRjaGVzU2VsZWN0b3IpKSYmZ2IoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1xLmNhbGwoYSwiZGl2IikscS5jYWxsKGEsIltzIT0nJ106eCIpLHAucHVzaCgiIT0iLE8pfSksbz1vLmxlbmd0aCYmbmV3IFJlZ0V4cChvLmpvaW4oInwiKSkscD1wLmxlbmd0aCYmbmV3IFJlZ0V4cChwLmpvaW4oInwiKSksYj1ZLnRlc3QobS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikscj1ifHxZLnRlc3QobS5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSx6PWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gaj0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1lfHxhLm93bmVyRG9jdW1lbnQ9PT10JiZyKHQsYSk/LTE6Yj09PWV8fGIub3duZXJEb2N1bWVudD09PXQmJnIodCxiKT8xOmk/SS5jYWxsKGksYSktSS5jYWxsKGksYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGo9ITAsMDt2YXIgYyxkPTAsZj1hLnBhcmVudE5vZGUsZz1iLnBhcmVudE5vZGUsaD1bYV0saz1bYl07aWYoIWZ8fCFnKXJldHVybiBhPT09ZT8tMTpiPT09ZT8xOmY/LTE6Zz8xOmk/SS5jYWxsKGksYSktSS5jYWxsKGksYik6MDtpZihmPT09ZylyZXR1cm4gaWIoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlrLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWtbZF0pZCsrO3JldHVybiBkP2liKGhbZF0sa1tkXSk6aFtkXT09PXQ/LTE6a1tkXT09PXQ/MTowfSxlKTpsfSxkYi5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGRiKGEsbnVsbCxudWxsLGIpfSxkYi5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PWwmJmsoYSksYj1iLnJlcGxhY2UoUywiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFufHxwJiZwLnRlc3QoYil8fG8mJm8udGVzdChiKSkpdHJ5e3ZhciBkPXEuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGRiKGIsbCxudWxsLFthXSkubGVuZ3RoPjB9LGRiLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1sJiZrKGEpLHIoYSxiKX0sZGIuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09bCYmayhhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkMuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhbik6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhbj9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGRiLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZGIudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYoaj0hYy5kZXRlY3REdXBsaWNhdGVzLGk9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoeiksail7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGk9bnVsbCxhfSxlPWRiLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1kYi5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpmYixtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYWIsYmIpLGFbM109KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGFiLGJiKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZGIuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZGIuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNV0mJmFbMl07cmV0dXJuIFYuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdJiZ2b2lkIDAhPT1hWzRdP2FbMl09YVs0XTpjJiZULnRlc3QoYykmJihiPW9iKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShhYixiYikudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9d1thKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrSysiKSIrYSsiKCIrSysifCQpIikpJiZ3KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8dHlwZW9mIGEuZ2V0QXR0cmlidXRlIT09QSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZGIuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHQ9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmdCl7az1xW3NdfHwocVtzXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT11JiZqWzFdLG09alswXT09PXUmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3UsbixtXTticmVha319ZWxzZSBpZih0JiYoaj0oYltzXXx8KGJbc109e30pKVthXSkmJmpbMF09PT11KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJih0JiYoKGxbc118fChsW3NdPXt9KSlbYV09W3UsbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8ZGIuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVtzXT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9mYihmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SS5jYWxsKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmZiKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1nKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFtzXT9mYihmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSwhYy5wb3AoKX19KSxoYXM6ZmIoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBkYihhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmZiKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzpmYihmdW5jdGlvbihhKXtyZXR1cm4gVS50ZXN0KGF8fCIiKXx8ZGIuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoYWIsYmIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1uP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW19LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bC5hY3RpdmVFbGVtZW50JiYoIWwuaGFzRm9jdXN8fGwuaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBYLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBXLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmxiKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpsYihmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6bGIoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpsYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpsYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0OmxiKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6bGIoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPWpiKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPWtiKGIpO2Z1bmN0aW9uIG5iKCl7fW5iLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgbmI7ZnVuY3Rpb24gb2IoYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXhbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1RLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9Ui5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShQLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9VltnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2RiLmVycm9yKGEpOngoYSxpKS5zbGljZSgwKX1mdW5jdGlvbiBwYihhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHFiKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj12Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3UsZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbc118fChiW3NdPXt9KSwoaD1pW2RdKSYmaFswXT09PXUmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiByYihhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiBzYihhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHRiKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbc10mJihkPXRiKGQpKSxlJiYhZVtzXSYmKGU9dGIoZSxmKSksZmIoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8d2IoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6c2IocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXNiKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JLmNhbGwoZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXNiKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpHLmFwcGx5KGcscil9KX1mdW5jdGlvbiB1YihhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saT1nfHxkLnJlbGF0aXZlWyIgIl0saj1nPzE6MCxrPXFiKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saSwhMCksbD1xYihmdW5jdGlvbihhKXtyZXR1cm4gSS5jYWxsKGIsYSk+LTF9LGksITApLG09W2Z1bmN0aW9uKGEsYyxkKXtyZXR1cm4hZyYmKGR8fGMhPT1oKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKX1dO2Y+ajtqKyspaWYoYz1kLnJlbGF0aXZlW2Fbal0udHlwZV0pbT1bcWIocmIobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2pdLnR5cGVdLmFwcGx5KG51bGwsYVtqXS5tYXRjaGVzKSxjW3NdKXtmb3IoZT0rK2o7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHRiKGo+MSYmcmIobSksaj4xJiZwYihhLnNsaWNlKDAsai0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbai0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxlPmomJnViKGEuc2xpY2UoaixlKSksZj5lJiZ1YihhPWEuc2xpY2UoZSkpLGY+ZSYmcGIoYSkpfW0ucHVzaChjKX1yZXR1cm4gcmIobSl9ZnVuY3Rpb24gdmIoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxpLGosayl7dmFyIG0sbixvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1oLHY9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdz11Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD12Lmxlbmd0aDtmb3IoayYmKGg9ZyE9PWwmJmcpO3EhPT14JiZudWxsIT0obT12W3FdKTtxKyspe2lmKGUmJm0pe249MDt3aGlsZShvPWFbbisrXSlpZihvKG0sZyxpKSl7ai5wdXNoKG0pO2JyZWFrfWsmJih1PXcpfWMmJigobT0hbyYmbSkmJnAtLSxmJiZyLnB1c2gobSkpfWlmKHArPXEsYyYmcSE9PXApe249MDt3aGlsZShvPWJbbisrXSlvKHIscyxnLGkpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09RS5jYWxsKGopKTtzPXNiKHMpfUcuYXBwbHkoaixzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZkYi51bmlxdWVTb3J0KGopfXJldHVybiBrJiYodT13LGg9dCkscn07cmV0dXJuIGM/ZmIoZik6Zn1nPWRiLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj15W2ErIiAiXTtpZighZil7Ynx8KGI9b2IoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9dWIoYltjXSksZltzXT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9eShhLHZiKGUsZCkpfXJldHVybiBmfTtmdW5jdGlvbiB3YihhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWRiKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB4YihhLGIsZSxmKXt2YXIgaCxpLGosayxsLG09b2IoYSk7aWYoIWYmJjE9PT1tLmxlbmd0aCl7aWYoaT1tWzBdPW1bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJm4mJmQucmVsYXRpdmVbaVsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGoubWF0Y2hlc1swXS5yZXBsYWNlKGFiLGJiKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO2E9YS5zbGljZShpLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1oPVYubmVlZHNDb250ZXh0LnRlc3QoYSk/MDppLmxlbmd0aDt3aGlsZShoLS0pe2lmKGo9aVtoXSxkLnJlbGF0aXZlW2s9ai50eXBlXSlicmVhaztpZigobD1kLmZpbmRba10pJiYoZj1sKGoubWF0Y2hlc1swXS5yZXBsYWNlKGFiLGJiKSwkLnRlc3QoaVswXS50eXBlKSYmbWIoYi5wYXJlbnROb2RlKXx8YikpKXtpZihpLnNwbGljZShoLDEpLGE9Zi5sZW5ndGgmJnBiKGkpLCFhKXJldHVybiBHLmFwcGx5KGUsZiksZTticmVha319fXJldHVybiBnKGEsbSkoZixiLCFuLGUsJC50ZXN0KGEpJiZtYihiLnBhcmVudE5vZGUpfHxiKSxlfXJldHVybiBjLnNvcnRTdGFibGU9cy5zcGxpdCgiIikuc29ydCh6KS5qb2luKCIiKT09PXMsYy5kZXRlY3REdXBsaWNhdGVzPSEhaixrKCksYy5zb3J0RGV0YWNoZWQ9Z2IoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihsLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGdiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGhiKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmdiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGhiKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGdiKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxoYihKLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxkYn0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlPXQudW5pcXVlU29ydCxuLnRleHQ9dC5nZXRUZXh0LG4uaXNYTUxEb2M9dC5pc1hNTCxuLmNvbnRhaW5zPXQuY29udGFpbnM7dmFyIHU9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx2PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdz0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHgoYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYody50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbi5pbkFycmF5KGEsYik+PTAhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG4uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbi5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bi51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXgodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnUudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHksej1hLmRvY3VtZW50LEE9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxCPW4uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTpBLmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eSkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2Ygbj9iWzBdOmIsbi5tZXJnZSh0aGlzLG4ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eiwhMCkpLHYudGVzdChjWzFdKSYmbi5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbi5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD16LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHkuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXosdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTpuLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB5LnJlYWR5P3kucmVhZHkoYSk6YShuKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxuLm1ha2VBcnJheShhLHRoaXMpKX07Qi5wcm90b3R5cGU9bi5mbix5PW4oeik7dmFyIEM9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sRD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtuLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW4oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG4uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1uKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobi5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXUudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP24oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm4uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9uLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWUobi5tZXJnZSh0aGlzLmdldCgpLG4oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRShhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBFKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEUoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihEW2FdfHwoZT1uLnVuaXF1ZShlKSksQy50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBGPS9cUysvZyxHPXt9O2Z1bmN0aW9uIEgoYSl7dmFyIGI9R1thXT17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRil8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/R1thXXx8SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXtuLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW4udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZuLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bi5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bi5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbi5yZWFkeVdhaXQ6IW4uaXNSZWFkeSl7aWYoIXouYm9keSlyZXR1cm4gc2V0VGltZW91dChuLnJlYWR5KTtuLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW4ucmVhZHlXYWl0PjB8fChJLnJlc29sdmVXaXRoKHosW25dKSxuLmZuLnRyaWdnZXImJm4oeikudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5IikpfX19KTtmdW5jdGlvbiBKKCl7ei5hZGRFdmVudExpc3RlbmVyPyh6LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEssITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSywhMSkpOih6LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEspLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSykpfWZ1bmN0aW9uIEsoKXsoei5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09ei5yZWFkeVN0YXRlKSYmKEooKSxuLnJlYWR5KCkpfW4ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSSlpZihJPW4uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09ei5yZWFkeVN0YXRlKXNldFRpbWVvdXQobi5yZWFkeSk7ZWxzZSBpZih6LmFkZEV2ZW50TGlzdGVuZXIpei5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixLLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEssITEpO2Vsc2V7ei5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixLKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEspO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ6LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbi5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9O3ZhciBMPSJ1bmRlZmluZWQiLE07Zm9yKE0gaW4gbihsKSlicmVhaztsLm93bkxhc3Q9IjAiIT09TSxsLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbihmdW5jdGlvbigpe3ZhciBhLGIsYz16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07YyYmKGE9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4IixiPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYy5hcHBlbmRDaGlsZChhKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09TCYmKGIuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7bWFyZ2luOjA7d2lkdGg6MXB4O3BhZGRpbmc6MXB4O2Rpc3BsYXk6aW5saW5lO3pvb206MSIsKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0zPT09Yi5vZmZzZXRXaWR0aCkmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoYSksYT1iPW51bGwpfSksZnVuY3Rpb24oKXt2YXIgYT16LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWwuZGVsZXRlRXhwYW5kbyl7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG4uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1uLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFEoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW4uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBSKGEsYixkLGUpe2lmKG4uYWNjZXB0RGF0YShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksKCJvYmplY3QiPT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoZT9qW2tdPW4uZXh0ZW5kKGpba10sYik6altrXS5kYXRhPW4uZXh0ZW5kKGpba10uZGF0YSxiKSksZz1qW2tdLGV8fChnLmRhdGF8fChnLmRhdGE9e30pLGc9Zy5kYXRhKSx2b2lkIDAhPT1kJiYoZ1tuLmNhbWVsQ2FzZShiKV09ZCksInN0cmluZyI9PXR5cGVvZiBiPyhmPWdbYl0sbnVsbD09ZiYmKGY9Z1tuLmNhbWVsQ2FzZShiKV0pKTpmPWcsZgp9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKG4uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP24uY2FjaGU6YSxoPWY/YVtuLmV4cGFuZG9dOm4uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bi5pc0FycmF5KGIpP2I9Yi5jb25jYXQobi5tYXAoYixuLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1uLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFRKGQpOiFuLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxRKGdbaF0pKSkmJihmP24uY2xlYW5EYXRhKFthXSwhMCk6bC5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZD1nW2NdLm5hbWUsMD09PWQuaW5kZXhPZigiZGF0YS0iKSYmKGQ9bi5jYW1lbENhc2UoZC5zbGljZSg1KSksUChmLGQsZVtkXSkpO24uX2RhdGEoZiwicGFyc2VkQXR0cnMiLCEwKX1yZXR1cm4gZX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kYXRhKHRoaXMsYSl9KTphcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kYXRhKHRoaXMsYSxiKX0pOmY/UChmLGEsbi5kYXRhKGYsYSkpOnZvaWQgMH0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBhPyhiPShifHwiZngiKSsicXVldWUiLGQ9bi5fZGF0YShhLGIpLGMmJighZHx8bi5pc0FycmF5KGMpP2Q9bi5fZGF0YShhLGIsbi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1uLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW4uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bi5kZXF1ZXVlKGEsYil9OyJpbnByb2dyZXNzIj09PWUmJihlPWMuc2hpZnQoKSxkLS0pLGUmJigiZngiPT09YiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YisicXVldWVIb29rcyI7cmV0dXJuIG4uX2RhdGEoYSxjKXx8bi5fZGF0YShhLGMse2VtcHR5Om4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe24uX3JlbW92ZURhdGEoYSxiKyJxdWV1ZSIpLG4uX3JlbW92ZURhdGEoYSxjKX0pfSl9fSksbi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT0iZngiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP24ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bi5xdWV1ZSh0aGlzLGEsYik7bi5fcXVldWVIb29rcyh0aGlzLGEpLCJmeCI9PT1hJiYiaW5wcm9ncmVzcyIhPT1jWzBdJiZuLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRlcXVldWUodGhpcyxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bi5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTsic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8ImZ4Ijt3aGlsZShnLS0pYz1uLl9kYXRhKGZbZ10sYSsicXVldWVIb29rcyIpLGMmJmMuZW1wdHkmJihkKyssYy5lbXB0eS5hZGQoaCkpO3JldHVybiBoKCksZS5wcm9taXNlKGIpfX0pO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxWPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX0sVz1uLmFjY2Vzcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09bi50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpbi5hY2Nlc3MoYSxiLGgsY1toXSwhMCxmLGcpfWVsc2UgaWYodm9pZCAwIT09ZCYmKGU9ITAsbi5pc0Z1bmN0aW9uKGQpfHwoZz0hMCksaiYmKGc/KGIuY2FsbChhLGQpLGI9bnVsbCk6KGo9YixiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKG4oYSksYyl9KSksYikpZm9yKDtpPmg7aCsrKWIoYVtoXSxjLGc/ZDpkLmNhbGwoYVtoXSxoLGIoYVtoXSxjKSkpO3JldHVybiBlP2E6aj9iLmNhbGwoYSk6aT9iKGFbMF0sYyk6Zn0sWD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaTshZnVuY3Rpb24oKXt2YXIgYT16LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxiPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYz16LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7aWYoYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ei5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYS5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYS5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixsLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7bC5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09bC5kZWxldGVFeHBhbmRvKXtsLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7bC5kZWxldGVFeHBhbmRvPSExfX1hPWI9Yz1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGIsYyxkPXouY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiKyJCdWJibGVzIl09YyBpbiBhKXx8KGQuc2V0QXR0cmlidXRlKGMsInQiKSxsW2IrIkJ1YmJsZXMiXT1kLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExKTtkPW51bGx9KCk7dmFyIFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLFo9L15rZXkvLCQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLF89L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLGFiPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYmIoKXtyZXR1cm4hMH1mdW5jdGlvbiBjYigpe3JldHVybiExfWZ1bmN0aW9uIGRiKCl7dHJ5e3JldHVybiB6LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2Ygbj09PUx8fGEmJm4uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDpuLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEYpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9YWIuZXhlYyhiW2hdKXx8W10sbz1xPWZbMV0scD0oZlsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8mJihqPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9qLmRlbGVnYXRlVHlwZTpqLmJpbmRUeXBlKXx8byxqPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbD1uLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZuLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxpKSwobT1nW29dKXx8KG09Z1tvXT1bXSxtLmRlbGVnYXRlQ291bnQ9MCxqLnNldHVwJiZqLnNldHVwLmNhbGwoYSxkLHAsaykhPT0hMXx8KGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobyxrLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbyxrKSkpLGouYWRkJiYoai5hZGQuY2FsbChhLGwpLGwuaGFuZGxlci5ndWlkfHwobC5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGwpOm0ucHVzaChsKSxuLmV2ZW50Lmdsb2JhbFtvXT0hMCk7YT1udWxsfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uaGFzRGF0YShhKSYmbi5fZGF0YShhKTtpZihyJiYoaz1yLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChGKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPWFiLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxvKXtsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxtPWtbb118fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrcC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxpPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWc9bVtmXSwhZSYmcSE9PWcub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWcuZ3VpZHx8aCYmIWgudGVzdChnLm5hbWVzcGFjZSl8fGQmJmQhPT1nLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFnLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksZy5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxnKSk7aSYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEscCxyLmhhbmRsZSkhPT0hMXx8bi5yZW1vdmVFdmVudChhLG8sci5oYW5kbGUpLGRlbGV0ZSBrW29dKX1lbHNlIGZvcihvIGluIGspbi5ldmVudC5yZW1vdmUoYSxvK2Jbal0sYyxkLCEwKTtuLmlzRW1wdHlPYmplY3QoaykmJihkZWxldGUgci5oYW5kbGUsbi5fcmVtb3ZlRGF0YShhLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmLGcsaCxpLGssbCxtLG89W2R8fHpdLHA9ai5jYWxsKGIsInR5cGUiKT9iLnR5cGU6YixxPWouY2FsbChiLCJuYW1lc3BhY2UiKT9iLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGg9bD1kPWR8fHosMyE9PWQubm9kZVR5cGUmJjghPT1kLm5vZGVUeXBlJiYhXy50ZXN0KHArbi5ldmVudC50cmlnZ2VyZWQpJiYocC5pbmRleE9mKCIuIik+PTAmJihxPXAuc3BsaXQoIi4iKSxwPXEuc2hpZnQoKSxxLnNvcnQoKSksZz1wLmluZGV4T2YoIjoiKTwwJiYib24iK3AsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChwLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9ZT8yOjMsYi5uYW1lc3BhY2U9cS5qb2luKCIuIiksYi5uYW1lc3BhY2VfcmU9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWQpLGM9bnVsbD09Yz9bYl06bi5tYWtlQXJyYXkoYyxbYl0pLGs9bi5ldmVudC5zcGVjaWFsW3BdfHx7fSxlfHwhay50cmlnZ2VyfHxrLnRyaWdnZXIuYXBwbHkoZCxjKSE9PSExKSl7aWYoIWUmJiFrLm5vQnViYmxlJiYhbi5pc1dpbmRvdyhkKSl7Zm9yKGk9ay5kZWxlZ2F0ZVR5cGV8fHAsXy50ZXN0KGkrcCl8fChoPWgucGFyZW50Tm9kZSk7aDtoPWgucGFyZW50Tm9kZSlvLnB1c2goaCksbD1oO2w9PT0oZC5vd25lckRvY3VtZW50fHx6KSYmby5wdXNoKGwuZGVmYXVsdFZpZXd8fGwucGFyZW50V2luZG93fHxhKX1tPTA7d2hpbGUoKGg9b1ttKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSliLnR5cGU9bT4xP2k6ay5iaW5kVHlwZXx8cCxmPShuLl9kYXRhKGgsImV2ZW50cyIpfHx7fSlbYi50eXBlXSYmbi5fZGF0YShoLCJoYW5kbGUiKSxmJiZmLmFwcGx5KGgsYyksZj1nJiZoW2ddLGYmJmYuYXBwbHkmJm4uYWNjZXB0RGF0YShoKSYmKGIucmVzdWx0PWYuYXBwbHkoaCxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1wLCFlJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFrLl9kZWZhdWx0fHxrLl9kZWZhdWx0LmFwcGx5KG8ucG9wKCksYyk9PT0hMSkmJm4uYWNjZXB0RGF0YShkKSYmZyYmZFtwXSYmIW4uaXNXaW5kb3coZCkpe2w9ZFtnXSxsJiYoZFtnXT1udWxsKSxuLmV2ZW50LnRyaWdnZXJlZD1wO3RyeXtkW3BdKCl9Y2F0Y2gocil7fW4uZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxsJiYoZFtnXT1sKX1yZXR1cm4gYi5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXthPW4uZXZlbnQuZml4KGEpO3ZhciBiLGMsZSxmLGcsaD1bXSxpPWQuY2FsbChhcmd1bWVudHMpLGo9KG4uX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVthLnR5cGVdfHxbXSxrPW4uZXZlbnQuc3BlY2lhbFthLnR5cGVdfHx7fTtpZihpWzBdPWEsYS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFrLnByZURpc3BhdGNofHxrLnByZURpc3BhdGNoLmNhbGwodGhpcyxhKSE9PSExKXtoPW4uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsaiksYj0wO3doaWxlKChmPWhbYisrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2EuY3VycmVudFRhcmdldD1mLmVsZW0sZz0wO3doaWxlKChlPWYuaGFuZGxlcnNbZysrXSkmJiFhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpKCFhLm5hbWVzcGFjZV9yZXx8YS5uYW1lc3BhY2VfcmUudGVzdChlLm5hbWVzcGFjZSkpJiYoYS5oYW5kbGVPYmo9ZSxhLmRhdGE9ZS5kYXRhLGM9KChuLmV2ZW50LnNwZWNpYWxbZS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGUuaGFuZGxlcikuYXBwbHkoZi5lbGVtLGkpLHZvaWQgMCE9PWMmJihhLnJlc3VsdD1jKT09PSExJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gay5wb3N0RGlzcGF0Y2gmJmsucG9zdERpc3BhdGNoLmNhbGwodGhpcyxhKSxhLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz1bXSxoPWIuZGVsZWdhdGVDb3VudCxpPWEudGFyZ2V0O2lmKGgmJmkubm9kZVR5cGUmJighYS5idXR0b258fCJjbGljayIhPT1hLnR5cGUpKWZvcig7aSE9dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZigxPT09aS5ub2RlVHlwZSYmKGkuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWEudHlwZSkpe2ZvcihlPVtdLGY9MDtoPmY7ZisrKWQ9YltmXSxjPWQuc2VsZWN0b3IrIiAiLHZvaWQgMD09PWVbY10mJihlW2NdPWQubmVlZHNDb250ZXh0P24oYyx0aGlzKS5pbmRleChpKT49MDpuLmZpbmQoYyx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGVbY10mJmUucHVzaChkKTtlLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZX0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30sZml4OmZ1bmN0aW9uKGEpe2lmKGFbbi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGQsZT1hLnR5cGUsZj1hLGc9dGhpcy5maXhIb29rc1tlXTtnfHwodGhpcy5maXhIb29rc1tlXT1nPSQudGVzdChlKT90aGlzLm1vdXNlSG9va3M6Wi50ZXN0KGUpP3RoaXMua2V5SG9va3M6e30pLGQ9Zy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChnLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZiksYj1kLmxlbmd0aDt3aGlsZShiLS0pYz1kW2JdLGFbY109ZltjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1mLnNyY0VsZW1lbnR8fHopLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxnLmZpbHRlcj9nLmZpbHRlcihhLGYpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1hLndoaWNoJiYoYS53aGljaD1udWxsIT1iLmNoYXJDb2RlP2IuY2hhckNvZGU6Yi5rZXlDb2RlKSxhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1iLmJ1dHRvbixnPWIuZnJvbUVsZW1lbnQ7cmV0dXJuIG51bGw9PWEucGFnZVgmJm51bGwhPWIuY2xpZW50WCYmKGQ9YS50YXJnZXQub3duZXJEb2N1bWVudHx8eixlPWQuZG9jdW1lbnRFbGVtZW50LGM9ZC5ib2R5LGEucGFnZVg9Yi5jbGllbnRYKyhlJiZlLnNjcm9sbExlZnR8fGMmJmMuc2Nyb2xsTGVmdHx8MCktKGUmJmUuY2xpZW50TGVmdHx8YyYmYy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWIuY2xpZW50WSsoZSYmZS5zY3JvbGxUb3B8fGMmJmMuc2Nyb2xsVG9wfHwwKS0oZSYmZS5jbGllbnRUb3B8fGMmJmMuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmZyYmKGEucmVsYXRlZFRhcmdldD1nPT09YS50YXJnZXQ/Yi50b0VsZW1lbnQ6ZyksYS53aGljaHx8dm9pZCAwPT09Znx8KGEud2hpY2g9MSZmPzE6MiZmPzM6NCZmPzI6MCksYX19LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1kYigpJiZ0aGlzLmZvY3VzKXRyeXtyZXR1cm4gdGhpcy5mb2N1cygpLCExfWNhdGNoKGEpe319LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWRiKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiaW5wdXQiKSYmImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljaz8odGhpcy5jbGljaygpLCExKTp2b2lkIDB9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe3JldHVybiBuLm5vZGVOYW1lKGEudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihhKXt2b2lkIDAhPT1hLnJlc3VsdCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bi5leHRlbmQobmV3IG4uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP24uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD16LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09TCYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiYoYS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCkpP2JiOmNiKTp0aGlzLnR5cGU9YSxiJiZuLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxuLm5vdygpLHZvaWQodGhpc1tuLmV4cGFuZG9dPSEwKSk6bmV3IG4uRXZlbnQoYSxiKX0sbi5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDpjYixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpjYixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpjYixwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1iYixhJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWJiLGEmJihhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YmIsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7bi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iajtyZXR1cm4oIWV8fGUhPT1kJiYhbi5jb250YWlucyhkLGUpKSYmKGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksbC5zdWJtaXRCdWJibGVzfHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP2IuZm9ybTp2b2lkIDA7YyYmIW4uX2RhdGEoYywic3VibWl0QnViYmxlcyIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxuLl9kYXRhKGMsInN1Ym1pdEJ1YmJsZXMiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFhLmlzVHJpZ2dlciYmbi5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG4uZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksbC5jaGFuZ2VCdWJibGVzfHwobi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gWS50ZXN0KHRoaXMubm9kZU5hbWUpPygoImNoZWNrYm94Ij09PXRoaXMudHlwZXx8InJhZGlvIj09PXRoaXMudHlwZSkmJihuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLG4uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7WS50ZXN0KGIubm9kZU5hbWUpJiYhbi5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksbi5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIiwhMCkpfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtyZXR1cm4gdGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHwicmFkaW8iIT09Yi50eXBlJiYiY2hlY2tib3giIT09Yi50eXBlP2EuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOnZvaWQgMH0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gbi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKSwhWS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbkJ1YmJsZXN8fG4uZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbihhKXtuLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsbi5ldmVudC5maXgoYSksITApfTtuLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9bi5fZGF0YShkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX2RhdGEoZCxiLChlfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYiktMTtlP24uX2RhdGEoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxuLl9yZW1vdmVEYXRhKGQsYikpfX19KSxuLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7InN0cmluZyIhPXR5cGVvZiBiJiYoYz1jfHxiLGI9dm9pZCAwKTtmb3IoZiBpbiBhKXRoaXMub24oZixiLGMsYVtmXSxlKTtyZXR1cm4gdGhpc31pZihudWxsPT1jJiZudWxsPT1kPyhkPWIsYz1iPXZvaWQgMCk6bnVsbD09ZCYmKCJzdHJpbmciPT10eXBlb2YgYj8oZD1jLGM9dm9pZCAwKTooZD1jLGM9YixiPXZvaWQgMCkpLGQ9PT0hMSlkPWNiO2Vsc2UgaWYoIWQpcmV0dXJuIHRoaXM7cmV0dXJuIDE9PT1lJiYoZz1kLGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4oKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9bi5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LmFkZCh0aGlzLGEsZCxjLGIpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIGQ9YS5oYW5kbGVPYmosbihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZC5uYW1lc3BhY2U/ZC5vcmlnVHlwZSsiLiIrZC5uYW1lc3BhY2U6ZC5vcmlnVHlwZSxkLnNlbGVjdG9yLGQuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGEpe2ZvcihlIGluIGEpdGhpcy5vZmYoZSxiLGFbZV0pO3JldHVybiB0aGlzfXJldHVybihiPT09ITF8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGM9YixiPXZvaWQgMCksYz09PSExJiYoYz1jYiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtyZXR1cm4gYz9uLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApOnZvaWQgMH19KTtmdW5jdGlvbiBlYihhKXt2YXIgYj1mYi5zcGxpdCgifCIpLGM9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYy5jcmVhdGVFbGVtZW50KXdoaWxlKGIubGVuZ3RoKWMuY3JlYXRlRWxlbWVudChiLnBvcCgpKTtyZXR1cm4gY312YXIgZmI9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8aGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLGdiPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csaGI9bmV3IFJlZ0V4cCgiPCg/OiIrZmIrIilbXFxzLz5dIiwiaSIpLGliPS9eXHMrLyxqYj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGtiPS88KFtcdzpdKykvLGxiPS88dGJvZHkvaSxtYj0vPHwmIz9cdys7LyxuYj0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLG9iPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHBiPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxxYj0vXnRydWVcLyguKikvLHJiPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxzYj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19LHRiPWViKHopLHViPXRiLmFwcGVuZENoaWxkKHouY3JlYXRlRWxlbWVudCgiZGl2IikpO3NiLm9wdGdyb3VwPXNiLm9wdGlvbixzYi50Ym9keT1zYi50Zm9vdD1zYi5jb2xncm91cD1zYi5jYXB0aW9uPXNiLnRoZWFkLHNiLnRoPXNiLnRkO2Z1bmN0aW9uIHZiKGEsYil7dmFyIGMsZCxlPTAsZj10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PUw/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPT1MP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLHZiKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiB3YihhKXtYLnRlc3QoYS50eXBlKSYmKGEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkKX1mdW5jdGlvbiB4YihhLGIpe3JldHVybiBuLm5vZGVOYW1lKGEsInRhYmxlIikmJm4ubm9kZU5hbWUoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24geWIoYSl7cmV0dXJuIGEudHlwZT0obnVsbCE9PW4uZmluZC5hdHRyKGEsInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIHpiKGEpe3ZhciBiPXFiLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gQWIoYSxiKXtmb3IodmFyIGMsZD0wO251bGwhPShjPWFbZF0pO2QrKyluLl9kYXRhKGMsImdsb2JhbEV2YWwiLCFifHxuLl9kYXRhKGJbZF0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gQmIoYSxiKXtpZigxPT09Yi5ub2RlVHlwZSYmbi5oYXNEYXRhKGEpKXt2YXIgYyxkLGUsZj1uLl9kYXRhKGEpLGc9bi5fZGF0YShiLGYpLGg9Zi5ldmVudHM7aWYoaCl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihjIGluIGgpZm9yKGQ9MCxlPWhbY10ubGVuZ3RoO2U+ZDtkKyspbi5ldmVudC5hZGQoYixjLGhbY11bZF0pfWcuZGF0YSYmKGcuZGF0YT1uLmV4dGVuZCh7fSxnLmRhdGEpKX19ZnVuY3Rpb24gQ2IoYSxiKXt2YXIgYyxkLGU7aWYoMT09PWIubm9kZVR5cGUpe2lmKGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCFsLm5vQ2xvbmVFdmVudCYmYltuLmV4cGFuZG9dKXtlPW4uX2RhdGEoYik7Zm9yKGQgaW4gZS5ldmVudHMpbi5yZW1vdmVFdmVudChiLGQsZS5oYW5kbGUpO2IucmVtb3ZlQXR0cmlidXRlKG4uZXhwYW5kbyl9InNjcmlwdCI9PT1jJiZiLnRleHQhPT1hLnRleHQ/KHliKGIpLnRleHQ9YS50ZXh0LHpiKGIpKToib2JqZWN0Ij09PWM/KGIucGFyZW50Tm9kZSYmKGIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MKSxsLmh0bWw1Q2xvbmUmJmEuaW5uZXJIVE1MJiYhbi50cmltKGIuaW5uZXJIVE1MKSYmKGIuaW5uZXJIVE1MPWEuaW5uZXJIVE1MKSk6ImlucHV0Ij09PWMmJlgudGVzdChhLnR5cGUpPyhiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQsYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpKToib3B0aW9uIj09PWM/Yi5kZWZhdWx0U2VsZWN0ZWQ9Yi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDooImlucHV0Ij09PWN8fCJ0ZXh0YXJlYSI9PT1jKSYmKGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19bi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGk9bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYobC5odG1sNUNsb25lfHxuLmlzWE1MRG9jKGEpfHwhaGIudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2Y9YS5jbG9uZU5vZGUoITApOih1Yi5pbm5lckhUTUw9YS5vdXRlckhUTUwsdWIucmVtb3ZlQ2hpbGQoZj11Yi5maXJzdENoaWxkKSksIShsLm5vQ2xvbmVFdmVudCYmbC5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8bi5pc1hNTERvYyhhKSkpZm9yKGQ9dmIoZiksaD12YihhKSxnPTA7bnVsbCE9KGU9aFtnXSk7KytnKWRbZ10mJkNiKGUsZFtnXSk7aWYoYilpZihjKWZvcihoPWh8fHZiKGEpLGQ9ZHx8dmIoZiksZz0wO251bGwhPShlPWhbZ10pO2crKylCYihlLGRbZ10pO2Vsc2UgQmIoYSxmKTtyZXR1cm4gZD12YihmLCJzY3JpcHQiKSxkLmxlbmd0aD4wJiZBYihkLCFpJiZ2YihhLCJzY3JpcHQiKSksZD1oPWU9bnVsbCxmfSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZSxmLGcsaCxpLGosayxtPWEubGVuZ3RoLG89ZWIoYikscD1bXSxxPTA7bT5xO3ErKylpZihmPWFbcV0sZnx8MD09PWYpaWYoIm9iamVjdCI9PT1uLnR5cGUoZikpbi5tZXJnZShwLGYubm9kZVR5cGU/W2ZdOmYpO2Vsc2UgaWYobWIudGVzdChmKSl7aD1ofHxvLmFwcGVuZENoaWxkKGIuY3JlYXRlRWxlbWVudCgiZGl2IikpLGk9KGtiLmV4ZWMoZil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksaz1zYltpXXx8c2IuX2RlZmF1bHQsaC5pbm5lckhUTUw9a1sxXStmLnJlcGxhY2UoamIsIjwkMT48LyQyPiIpK2tbMl0sZT1rWzBdO3doaWxlKGUtLSloPWgubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZpYi50ZXN0KGYpJiZwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShpYi5leGVjKGYpWzBdKSksIWwudGJvZHkpe2Y9InRhYmxlIiE9PWl8fGxiLnRlc3QoZik/Ijx0YWJsZT4iIT09a1sxXXx8bGIudGVzdChmKT8wOmg6aC5maXJzdENoaWxkLGU9ZiYmZi5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShlLS0pbi5ub2RlTmFtZShqPWYuY2hpbGROb2Rlc1tlXSwidGJvZHkiKSYmIWouY2hpbGROb2Rlcy5sZW5ndGgmJmYucmVtb3ZlQ2hpbGQoail9bi5tZXJnZShwLGguY2hpbGROb2RlcyksaC50ZXh0Q29udGVudD0iIjt3aGlsZShoLmZpcnN0Q2hpbGQpaC5yZW1vdmVDaGlsZChoLmZpcnN0Q2hpbGQpO2g9by5sYXN0Q2hpbGR9ZWxzZSBwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7aCYmby5yZW1vdmVDaGlsZChoKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcCh2YihwLCJpbnB1dCIpLHdiKSxxPTA7d2hpbGUoZj1wW3ErK10paWYoKCFkfHwtMT09PW4uaW5BcnJheShmLGQpKSYmKGc9bi5jb250YWlucyhmLm93bmVyRG9jdW1lbnQsZiksaD12YihvLmFwcGVuZENoaWxkKGYpLCJzY3JpcHQiKSxnJiZBYihoKSxjKSl7ZT0wO3doaWxlKGY9aFtlKytdKXBiLnRlc3QoZi50eXBlfHwiIikmJmMucHVzaChmKX1yZXR1cm4gaD1udWxsLG99LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5kZWxldGVFeHBhbmRvLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8bi5hY2NlcHREYXRhKGQpKSYmKGY9ZFtpXSxnPWYmJmpbZl0pKXtpZihnLmV2ZW50cylmb3IoZSBpbiBnLmV2ZW50cyltW2VdP24uZXZlbnQucmVtb3ZlKGQsZSk6bi5yZW1vdmVFdmVudChkLGUsZy5oYW5kbGUpO2pbZl0mJihkZWxldGUgaltmXSxrP2RlbGV0ZSBkW2ldOnR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZSE9PUw/ZC5yZW1vdmVBdHRyaWJ1dGUoaSk6ZFtpXT1udWxsLGMucHVzaChmKSl9fX0pLG4uZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBXKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8eikuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9eGIodGhpcyxhKTtiLmFwcGVuZENoaWxkKGEpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj14Yih0aGlzLGEpO2IuaW5zZXJ0QmVmb3JlKGEsYi5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPWE/bi5maWx0ZXIoYSx0aGlzKTp0aGlzLGU9MDtudWxsIT0oYz1kW2VdKTtlKyspYnx8MSE9PWMubm9kZVR5cGV8fG4uY2xlYW5EYXRhKHZiKGMpKSxjLnBhcmVudE5vZGUmJihiJiZuLmNvbnRhaW5zKGMub3duZXJEb2N1bWVudCxjKSYmQWIodmIoYywic2NyaXB0IikpLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGI9MDtudWxsIT0oYT10aGlzW2JdKTtiKyspezE9PT1hLm5vZGVUeXBlJiZuLmNsZWFuRGF0YSh2YihhLCExKSk7d2hpbGUoYS5maXJzdENoaWxkKWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLm9wdGlvbnMmJm4ubm9kZU5hbWUoYSwic2VsZWN0IikmJihhLm9wdGlvbnMubGVuZ3RoPTApfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hKXJldHVybiAxPT09Yi5ub2RlVHlwZT9iLmlubmVySFRNTC5yZXBsYWNlKGdiLCIiKTp2b2lkIDA7aWYoISgic3RyaW5nIiE9dHlwZW9mIGF8fG5iLnRlc3QoYSl8fCFsLmh0bWxTZXJpYWxpemUmJmhiLnRlc3QoYSl8fCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZpYi50ZXN0KGEpfHxzYlsoa2IuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pKXthPWEucmVwbGFjZShqYiwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEodmIoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGIpe2E9dGhpcy5wYXJlbnROb2RlLG4uY2xlYW5EYXRhKHZiKHRoaXMpKSxhJiZhLnJlcGxhY2VDaGlsZChiLHRoaXMpfSksYSYmKGEubGVuZ3RofHxhLm5vZGVUeXBlKT90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYil7YT1lLmFwcGx5KFtdLGEpO3ZhciBjLGQsZixnLGgsaSxqPTAsaz10aGlzLmxlbmd0aCxtPXRoaXMsbz1rLTEscD1hWzBdLHE9bi5pc0Z1bmN0aW9uKHApO2lmKHF8fGs+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhbC5jaGVja0Nsb25lJiZvYi50ZXN0KHApKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9bS5lcShjKTtxJiYoYVswXT1wLmNhbGwodGhpcyxjLGQuaHRtbCgpKSksZC5kb21NYW5pcChhLGIpfSk7aWYoayYmKGk9bi5idWlsZEZyYWdtZW50KGEsdGhpc1swXS5vd25lckRvY3VtZW50LCExLHRoaXMpLGM9aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1jKSxjKSl7Zm9yKGc9bi5tYXAodmIoaSwic2NyaXB0IikseWIpLGY9Zy5sZW5ndGg7az5qO2orKylkPWksaiE9PW8mJihkPW4uY2xvbmUoZCwhMCwhMCksZiYmbi5tZXJnZShnLHZiKGQsInNjcmlwdCIpKSksYi5jYWxsKHRoaXNbal0sZCxqKTtpZihmKWZvcihoPWdbZy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxuLm1hcChnLHpiKSxqPTA7Zj5qO2orKylkPWdbal0scGIudGVzdChkLnR5cGV8fCIiKSYmIW4uX2RhdGEoZCwiZ2xvYmFsRXZhbCIpJiZuLmNvbnRhaW5zKGgsZCkmJihkLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGQuc3JjKTpuLmdsb2JhbEV2YWwoKGQudGV4dHx8ZC50ZXh0Q29udGVudHx8ZC5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKHJiLCIiKSkpO2k9Yz1udWxsfXJldHVybiB0aGlzfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZz1uKGEpLGg9Zy5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihnW2RdKVtiXShjKSxmLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBEYixFYj17fTtmdW5jdGlvbiBGYihiLGMpe3ZhciBkPW4oYy5jcmVhdGVFbGVtZW50KGIpKS5hcHBlbmRUbyhjLmJvZHkpLGU9YS5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZT9hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGRbMF0pLmRpc3BsYXk6bi5jc3MoZFswXSwiZGlzcGxheSIpO3JldHVybiBkLmRldGFjaCgpLGV9ZnVuY3Rpb24gR2IoYSl7dmFyIGI9eixjPUViW2FdO3JldHVybiBjfHwoYz1GYihhLGIpLCJub25lIiE9PWMmJmN8fChEYj0oRGJ8fG4oIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9KERiWzBdLmNvbnRlbnRXaW5kb3d8fERiWzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPUZiKGEsYiksRGIuZGV0YWNoKCkpLEViW2FdPWMpLGN9IWZ1bmN0aW9uKCl7dmFyIGEsYixjPXouY3JlYXRlRWxlbWVudCgiZGl2IiksZD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowIjtjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsbC5vcGFjaXR5PS9eMC41Ly50ZXN0KGEuc3R5bGUub3BhY2l0eSksbC5jc3NGbG9hdD0hIWEuc3R5bGUuY3NzRmxvYXQsYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixsLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxhPWM9bnVsbCxsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXt2YXIgYSxjLGUsZjtpZihudWxsPT1iKXtpZihhPXouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSwhYSlyZXR1cm47Zj0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHgiLGM9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChlKSxiPSExLHR5cGVvZiBlLnN0eWxlLnpvb20hPT1MJiYoZS5zdHlsZS5jc3NUZXh0PWQrIjt3aWR0aDoxcHg7cGFkZGluZzoxcHg7em9vbToxIixlLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLGUuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4IixiPTMhPT1lLm9mZnNldFdpZHRoKSxhLnJlbW92ZUNoaWxkKGMpLGE9Yz1lPW51bGx9cmV0dXJuIGJ9fSgpO3ZhciBIYj0vXm1hcmdpbi8sSWI9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxKYixLYixMYj0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhKYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxudWxsKX0sS2I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxKYihhKSxnPWM/Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdOnZvaWQgMCxjJiYoIiIhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxJYi50ZXN0KGcpJiZIYi50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDA9PT1nP2c6ZysiIn0pOnouZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKEpiPWZ1bmN0aW9uKGEpe3JldHVybiBhLmN1cnJlbnRTdHlsZX0sS2I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxKYihhKSxnPWM/Y1tiXTp2b2lkIDAsbnVsbD09ZyYmaCYmaFtiXSYmKGc9aFtiXSksSWIudGVzdChnKSYmIUxiLnRlc3QoYikmJihkPWgubGVmdCxlPWEucnVudGltZVN0eWxlLGY9ZSYmZS5sZWZ0LGYmJihlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksaC5sZWZ0PSJmb250U2l6ZSI9PT1iPyIxZW0iOmcsZz1oLnBpeGVsTGVmdCsicHgiLGgubGVmdD1kLGYmJihlLmxlZnQ9ZikpLHZvaWQgMD09PWc/ZzpnKyIifHwiYXV0byJ9KTtmdW5jdGlvbiBNYihhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXt2YXIgYz1hKCk7aWYobnVsbCE9YylyZXR1cm4gYz92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19IWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixnLGg9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxpPSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweCIsaj0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowIjtoLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixiPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnN0eWxlLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsbC5vcGFjaXR5PS9eMC41Ly50ZXN0KGIuc3R5bGUub3BhY2l0eSksbC5jc3NGbG9hdD0hIWIuc3R5bGUuY3NzRmxvYXQsaC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGguY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixsLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxiPWg9bnVsbCxuLmV4dGVuZChsLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtpZihudWxsIT1jKXJldHVybiBjO3ZhciBhLGIsZCxlPXouY3JlYXRlRWxlbWVudCgiZGl2IiksZj16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aWYoZilyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxlLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYS5zdHlsZS5jc3NUZXh0PWksZi5hcHBlbmRDaGlsZChhKS5hcHBlbmRDaGlsZChlKSxlLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsYj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGJbMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIsZD0wPT09YlswXS5vZmZzZXRIZWlnaHQsYlswXS5zdHlsZS5kaXNwbGF5PSIiLGJbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kJiYwPT09YlswXS5vZmZzZXRIZWlnaHQsZi5yZW1vdmVDaGlsZChhKSxlPWY9bnVsbCxjfSxib3hTaXppbmc6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZCYmaygpLGR9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmsoKSxlfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmsoKSxmfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGIsYyxkLGU7aWYobnVsbD09ZyYmYS5nZXRDb21wdXRlZFN0eWxlKXtpZihiPXouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSwhYilyZXR1cm47Yz16LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxjLnN0eWxlLmNzc1RleHQ9aSxiLmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGQpLGU9ZC5hcHBlbmRDaGlsZCh6LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxlLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PWosZS5zdHlsZS5tYXJnaW5SaWdodD1lLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpLGIucmVtb3ZlQ2hpbGQoYyl9cmV0dXJuIGd9fSk7ZnVuY3Rpb24gaygpe3ZhciBiLGMsaD16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aCYmKGI9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zdHlsZS5jc3NUZXh0PWksaC5hcHBlbmRDaGlsZChiKS5hcHBlbmRDaGlsZChjKSxjLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7dG9wOjElIixuLnN3YXAoaCxudWxsIT1oLnN0eWxlLnpvb20/e3pvb206MX06e30sZnVuY3Rpb24oKXtkPTQ9PT1jLm9mZnNldFdpZHRofSksZT0hMCxmPSExLGc9ITAsYS5nZXRDb21wdXRlZFN0eWxlJiYoZj0iMSUiIT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShjLG51bGwpfHx7fSkudG9wLGU9IjRweCI9PT0oYS5nZXRDb21wdXRlZFN0eWxlKGMsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoKSxoLnJlbW92ZUNoaWxkKGIpLGM9aD1udWxsKX19KCksbi5zd2FwPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZz17fTtmb3IoZiBpbiBiKWdbZl09YS5zdHlsZVtmXSxhLnN0eWxlW2ZdPWJbZl07ZT1jLmFwcGx5KGEsZHx8W10pO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1nW2ZdO3JldHVybiBlfTt2YXIgTmI9L2FscGhhXChbXildKlwpL2ksT2I9L29wYWNpdHlccyo9XHMqKFteKV0qKS8sUGI9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFFiPW5ldyBSZWdFeHAoIl4oIitUKyIpKC4qKSQiLCJpIiksUmI9bmV3IFJlZ0V4cCgiXihbKy1dKT0oIitUKyIpIiwiaSIpLFNiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYj17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSxVYj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFZiKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1VYi5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VWJbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gV2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlYoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsR2IoZC5ub2RlTmFtZSkpKSk6ZltnXXx8KGU9VihkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFhiKGEsYixjKXt2YXIgZD1RYi5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFliKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVVtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1VbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1VbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVVtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUpiKGEpLGc9bC5ib3hTaXppbmcoKSYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxmKTtpZigwPj1lfHxudWxsPT1lKXtpZihlPUtiKGEsYixmKSwoMD5lfHxudWxsPT1lKSYmKGU9YS5zdHlsZVtiXSksSWIudGVzdChlKSlyZXR1cm4gZTtkPWcmJihsLmJveFNpemluZ1JlbGlhYmxlKCl8fGU9PT1hLnN0eWxlW2JdKSxlPXBhcnNlRmxvYXQoZSl8fDB9cmV0dXJuIGUrWWIoYSxiLGN8fChnPyJib3JkZXIiOiJjb250ZW50IiksZCxmKSsicHgifW4uZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9S2IoYSwib3BhY2l0eSIpO3JldHVybiIiPT09Yz8iMSI6Y319fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1WYihpLGgpKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVJiLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobi5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG4uY3NzTnVtYmVyW2hdfHwoYys9InB4IiksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09IiIsaVtiXT1jfWNhdGNoKGope319fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYik7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09VmIoYS5zdHlsZSxoKSksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGY9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZiYmKGY9S2IoYSxiLGQpKSwibm9ybWFsIj09PWYmJmIgaW4gVGImJihmPVRiW2JdKSwiIj09PWN8fGM/KGU9cGFyc2VGbG9hdChmKSxjPT09ITB8fG4uaXNOdW1lcmljKGUpP2V8fDA6Zik6Zn19KSxuLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYz8wPT09YS5vZmZzZXRXaWR0aCYmUGIudGVzdChuLmNzcyhhLCJkaXNwbGF5IikpP24uc3dhcChhLFNiLGZ1bmN0aW9uKCl7cmV0dXJuIFpiKGEsYixkKX0pOlpiKGEsYixkKTp2b2lkIDB9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9ZCYmSmIoYSk7cmV0dXJuIFhiKGEsYyxkP1liKGEsYixkLGwuYm94U2l6aW5nKCkmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZSksZSk6MCl9fX0pLGwub3BhY2l0eXx8KG4uY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIE9iLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT8uMDEqcGFyc2VGbG9hdChSZWdFeHAuJDEpKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnN0eWxlLGQ9YS5jdXJyZW50U3R5bGUsZT1uLmlzTnVtZXJpYyhiKT8iYWxwaGEob3BhY2l0eT0iKzEwMCpiKyIpIjoiIixmPWQmJmQuZmlsdGVyfHxjLmZpbHRlcnx8IiI7Yy56b29tPTEsKGI+PTF8fCIiPT09YikmJiIiPT09bi50cmltKGYucmVwbGFjZShOYiwiIikpJiZjLnJlbW92ZUF0dHJpYnV0ZSYmKGMucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSwiIj09PWJ8fGQmJiFkLmZpbHRlcil8fChjLmZpbHRlcj1OYi50ZXN0KGYpP2YucmVwbGFjZShOYixlKTpmKyIgIitlKX19KSxuLmNzc0hvb2tzLm1hcmdpblJpZ2h0PU1iKGwucmVsaWFibGVNYXJnaW5SaWdodCxmdW5jdGlvbihhLGIpe3JldHVybiBiP24uc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxLYixbYSwibWFyZ2luUmlnaHQiXSk6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVVtkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxIYi50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1YYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPUpiKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpCn0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gV2IodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gV2IodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Vih0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uICRiKGEsYixjLGQsZSl7cmV0dXJuIG5ldyAkYi5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49JGIsJGIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjokYixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPSRiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTokYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz0kYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9Yj10aGlzLm9wdGlvbnMuZHVyYXRpb24/bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTokYi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSwkYi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9JGIucHJvdG90eXBlLCRiLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbD09YS5lbGVtW2EucHJvcF18fGEuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYobnVsbCE9YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV18fG4uY3NzSG9va3NbYS5wcm9wXSk/bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sJGIucHJvcEhvb2tzLnNjcm9sbFRvcD0kYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9fSxuLmZ4PSRiLnByb3RvdHlwZS5pbml0LG4uZnguc3RlcD17fTt2YXIgX2IsYWMsYmM9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNjPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitUKyIpKFthLXolXSopJCIsImkiKSxkYz0vcXVldWVIb29rcyQvLGVjPVtqY10sZmM9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZD1jLmN1cigpLGU9Y2MuZXhlYyhiKSxmPWUmJmVbM118fChuLmNzc051bWJlclthXT8iIjoicHgiKSxnPShuLmNzc051bWJlclthXXx8InB4IiE9PWYmJitkKSYmY2MuZXhlYyhuLmNzcyhjLmVsZW0sYSkpLGg9MSxpPTIwO2lmKGcmJmdbM10hPT1mKXtmPWZ8fGdbM10sZT1lfHxbXSxnPStkfHwxO2RvIGg9aHx8Ii41IixnLz1oLG4uc3R5bGUoYy5lbGVtLGEsZytmKTt3aGlsZShoIT09KGg9Yy5jdXIoKS9kKSYmMSE9PWgmJi0taSl9cmV0dXJuIGUmJihnPWMuc3RhcnQ9K2d8fCtkfHwwLGMudW5pdD1mLGMuZW5kPWVbMV0/ZysoZVsxXSsxKSplWzJdOitlWzJdKSxjfV19O2Z1bmN0aW9uIGdjKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfYj12b2lkIDB9KSxfYj1uLm5vdygpfWZ1bmN0aW9uIGhjKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VVtlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIGljKGEsYixjKXtmb3IodmFyIGQsZT0oZmNbYl18fFtdKS5jb25jYXQoZmNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gamMoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVihhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz1HYihhLm5vZGVOYW1lKSwibm9uZSI9PT1qJiYoaj1rKSwiaW5saW5lIj09PWomJiJub25lIj09PW4uY3NzKGEsImZsb2F0IikmJihsLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09az9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGJjLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1pZighbi5pc0VtcHR5T2JqZWN0KG8pKXtyPyJoaWRkZW4iaW4gciYmKHE9ci5oaWRkZW4pOnI9bi5fZGF0YShhLCJmeHNob3ciLHt9KSxmJiYoci5oaWRkZW49IXEpLHE/bihhKS5zaG93KCk6bS5kb25lKGZ1bmN0aW9uKCl7bihhKS5oaWRlKCl9KSxtLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjtuLl9yZW1vdmVEYXRhKGEsImZ4c2hvdyIpO2ZvcihiIGluIG8pbi5zdHlsZShhLGIsb1tiXSl9KTtmb3IoZCBpbiBvKWc9aWMocT9yW2RdOjAsZCxtKSxkIGluIHJ8fChyW2RdPWcuc3RhcnQscSYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBrYyhhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW4uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbi5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1uLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIGxjKGEsYixjKXt2YXIgZCxlLGY9MCxnPWVjLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPV9ifHxnYygpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6X2J8fGdjKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1uLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihrYyhrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9ZWNbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBuLm1hcChrLGljLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQobGMse3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sZmNbY109ZmNbY118fFtdLGZjW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/ZWMudW5zaGlmdChhKTplYy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe24uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG4uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFYpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uaXNFbXB0eU9iamVjdChhKSxmPW4uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1sYyh0aGlzLG4uZXh0ZW5kKHt9LGEpLGYpOyhlfHxuLl9kYXRhKHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bi50aW1lcnMsZz1uLl9kYXRhKHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJmRjLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7KGJ8fCFjKSYmbi5kZXF1ZXVlKHRoaXMsYSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09ITEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9bi5fZGF0YSh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bi50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG4ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW4uZm5bYl07bi5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGhjKGIsITApLGEsZCxlKX19KSxuLmVhY2goe3NsaWRlRG93bjpoYygic2hvdyIpLHNsaWRlVXA6aGMoImhpZGUiKSxzbGlkZVRvZ2dsZTpoYygidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbi50aW1lcnM9W10sbi5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1uLnRpbWVycyxjPTA7Zm9yKF9iPW4ubm93KCk7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEoKXx8YltjXSE9PWF8fGIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8bi5meC5zdG9wKCksX2I9dm9pZCAwfSxuLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe24udGltZXJzLnB1c2goYSksYSgpP24uZnguc3RhcnQoKTpuLnRpbWVycy5wb3AoKX0sbi5meC5pbnRlcnZhbD0xMyxuLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7YWN8fChhYz1zZXRJbnRlcnZhbChuLmZ4LnRpY2ssbi5meC5pbnRlcnZhbCkpfSxuLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGFjKSxhYz1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bi5meD9uLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9ei5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGUuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGM9ei5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxkPWMuYXBwZW5kQ2hpbGQoei5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksYj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGEuc3R5bGUuY3NzVGV4dD0idG9wOjFweCIsbC5nZXRTZXRBdHRyaWJ1dGU9InQiIT09ZS5jbGFzc05hbWUsbC5zdHlsZT0vdG9wLy50ZXN0KGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxsLmhyZWZOb3JtYWxpemVkPSIvYSI9PT1hLmdldEF0dHJpYnV0ZSgiaHJlZiIpLGwuY2hlY2tPbj0hIWIudmFsdWUsbC5vcHRTZWxlY3RlZD1kLnNlbGVjdGVkLGwuZW5jdHlwZT0hIXouY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsYy5kaXNhYmxlZD0hMCxsLm9wdERpc2FibGVkPSFkLmRpc2FibGVkLGI9ei5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGIuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLGwuaW5wdXQ9IiI9PT1iLmdldEF0dHJpYnV0ZSgidmFsdWUiKSxiLnZhbHVlPSJ0IixiLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksbC5yYWRpb1ZhbHVlPSJ0Ij09PWIudmFsdWUsYT1iPWM9ZD1lPW51bGx9KCk7dmFyIG1jPS9cci9nO24uZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1uLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMsbih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOm4uaXNBcnJheShlKSYmKGU9bi5tYXAoZSxmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphKyIifSkpLGI9bi52YWxIb29rc1t0aGlzLnR5cGVdfHxuLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmInNldCJpbiBiJiZ2b2lkIDAhPT1iLnNldCh0aGlzLGUsInZhbHVlIil8fCh0aGlzLnZhbHVlPWUpKX0pO2lmKGUpcmV0dXJuIGI9bi52YWxIb29rc1tlLnR5cGVdfHxuLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmImdldCJpbiBiJiZ2b2lkIDAhPT0oYz1iLmdldChlLCJ2YWx1ZSIpKT9jOihjPWUudmFsdWUsInN0cmluZyI9PXR5cGVvZiBjP2MucmVwbGFjZShtYywiIik6bnVsbD09Yz8iIjpjKX19fSksbi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1uLmZpbmQuYXR0cihhLCJ2YWx1ZSIpO3JldHVybiBudWxsIT1iP2I6bi50ZXh0KGEpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChsLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZuLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bihjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW4ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxuLmluQXJyYXkobi52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bi52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uaXNBcnJheShiKT9hLmNoZWNrZWQ9bi5pbkFycmF5KG4oYSkudmFsKCksYik+PTA6dm9pZCAwfX0sbC5jaGVja09ufHwobi52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBuYyxvYyxwYz1uLmV4cHIuYXR0ckhhbmRsZSxxYz0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHJjPWwuZ2V0U2V0QXR0cmlidXRlLHNjPWwuaW5wdXQ7bi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVyh0aGlzLG4uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09TD9uLnByb3AoYSxiLGMpOigxPT09ZiYmbi5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bi5hdHRySG9va3NbYl18fChuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP29jOm5jKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBuLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRik7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1uLnByb3BGaXhbY118fGMsbi5leHByLm1hdGNoLmJvb2wudGVzdChjKT9zYyYmcmN8fCFxYy50ZXN0KGMpP2FbZF09ITE6YVtuLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm4uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHJjP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWwucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm4ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksb2M9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9uLnJlbW92ZUF0dHIoYSxjKTpzYyYmcmN8fCFxYy50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFyYyYmbi5wcm9wRml4W2NdfHxjLGMpOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbi5lYWNoKG4uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGNbYl18fG4uZmluZC5hdHRyO3BjW2JdPXNjJiZyY3x8IXFjLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPXBjW2JdLHBjW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxwY1tiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSksc2MmJnJjfHwobi5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm5jJiZuYy5zZXQoYSxiLGMpfX0pLHJjfHwobmM9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxwYy5pZD1wYy5uYW1lPXBjLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG4udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bmMuc2V0fSxuLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bmMuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxuLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bi5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGwuc3R5bGV8fChuLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciB0Yz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx1Yz0vXig/OmF8YXJlYSkkL2k7bi5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVyh0aGlzLG4ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1uLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxuLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW4uaXNYTUxEb2MoYSksZiYmKGI9bi5wcm9wRml4W2JdfHxiLGU9bi5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6dGMudGVzdChhLm5vZGVOYW1lKXx8dWMudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxuLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe24ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxsLmVuY3R5cGV8fChuLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdmM9L1tcdFxyXG5cZl0vZztuLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEYpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodmMsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW4udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChGKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHZjLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP24udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1uKHRoaXMpLGY9YS5tYXRjaChGKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09THx8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpuLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodmMsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG4uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG4uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHdjPW4ubm93KCkseGM9L1w/Lyx5Yz0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO24ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bi50cmltKGIrIiIpO3JldHVybiBlJiYhbi50cmltKGUucmVwbGFjZSh5YyxmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTpuLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG4ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHpjLEFjLEJjPS8jLiokLyxDYz0vKFs/Jl0pXz1bXiZdKi8sRGM9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxFYz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxGYz0vXig/OkdFVHxIRUFEKSQvLEdjPS9eXC9cLy8sSGM9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSWM9e30sSmM9e30sS2M9IiovIi5jb25jYXQoIioiKTt0cnl7QWM9bG9jYXRpb24uaHJlZn1jYXRjaChMYyl7QWM9ei5jcmVhdGVFbGVtZW50KCJhIiksQWMuaHJlZj0iIixBYz1BYy5ocmVmfXpjPUhjLmV4ZWMoQWMudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIE1jKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEYpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmMoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmM7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYyhhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gUGMoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUWMoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6QWMsdHlwZToiR0VUIixpc0xvY2FsOkVjLnRlc3QoemNbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6S2MsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpuLnBhcnNlSlNPTiwidGV4dCB4bWwiOm4ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP09jKE9jKGEsbi5hamF4U2V0dGluZ3MpLGIpOk9jKG4uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOk1jKEljKSxhamF4VHJhbnNwb3J0Ok1jKEpjKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1uLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxtPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9uKGwpOm4uZXZlbnQsbz1uLkRlZmVycmVkKCkscD1uLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPURjLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fEFjKSsiIikucmVwbGFjZShCYywiIikucmVwbGFjZShHYyx6Y1sxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1uLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEYpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUhjLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09emNbMV0mJmNbMl09PT16Y1syXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oemNbM118fCgiaHR0cDoiPT09emNbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1uLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTmMoSWMsayxiLHYpLDI9PT10KXJldHVybiB2O2g9ay5nbG9iYWwsaCYmMD09PW4uYWN0aXZlKysmJm4uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRmMudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHhjLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUNjLnRlc3QoZSk/ZS5yZXBsYWNlKENjLCIkMV89Iit3YysrKTplKyh4Yy50ZXN0KGUpPyImIjoiPyIpKyJfPSIrd2MrKykpLGsuaWZNb2RpZmllZCYmKG4ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixuLmxhc3RNb2RpZmllZFtlXSksbi5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG4uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0tjKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1OYyhKYyxrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm0udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PVBjKGssdixjKSksdT1RYyhrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobi5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG4uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZtLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihtLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG4uZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLG4uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbi5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW4oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXtuKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1uLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG4odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG4uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5IikpfSxuLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFuLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBSYz0vJTIwL2csU2M9L1xbXF0kLyxUYz0vXHI/XG4vZyxVYz0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVmM9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFdjKGEsYixjLGQpe3ZhciBlO2lmKG4uaXNBcnJheShiKSluLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFNjLnRlc3QoYSk/ZChhLGUpOldjKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1uLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilXYyhhKyJbIitlKyJdIixiW2VdLGMsZCl9bi5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bi5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW4uYWpheFNldHRpbmdzJiZuLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW4uaXNQbGFpbk9iamVjdChhKSluLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVdjKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFJjLCIrIil9LG4uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW4ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP24ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW4odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZWYy50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVWMudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVgudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1uKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bi5pc0FycmF5KGMpP24ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShUYywiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoVGMsIlxyXG4iKX19KS5nZXQoKX19KSxuLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmJGMoKXx8X2MoKX06JGM7dmFyIFhjPTAsWWM9e30sWmM9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5BY3RpdmVYT2JqZWN0JiZuKGEpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFljKVljW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFaYyYmIndpdGhDcmVkZW50aWFscyJpbiBaYyxaYz1sLmFqYXg9ISFaYyxaYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytYYztpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFljW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WWNbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gJGMoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gX2MoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1uLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXouaGVhZHx8bigiaGVhZCIpWzBdfHx6LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9ei5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgYWQ9W10sYmQ9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9YWQucG9wKCl8fG4uZXhwYW5kbysiXyIrd2MrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGJkLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYmQudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGJkLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh4Yy50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssYWQucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHo7dmFyIGQ9di5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW4uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbihlKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgY2Q9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZjZClyZXR1cm4gY2QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9YS5zbGljZShoLGEubGVuZ3RoKSxhPWEuc2xpY2UoMCxoKSksbi5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGY9IlBPU1QiKSxnLmxlbmd0aD4wJiZuLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtlPWFyZ3VtZW50cyxnLmh0bWwoZD9uKCI8ZGl2PiIpLmFwcGVuZChuLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZXx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIGRkPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIGVkKGEpe3JldHVybiBuLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9bi5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1uLmNzcyhhLCJwb3NpdGlvbiIpLGw9bihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bi5jc3MoYSwidG9wIiksaT1uLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmbi5pbkFycmF5KCJhdXRvIixbZixpXSk+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG4uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8odHlwZW9mIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09TCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1lZChmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8ZGQ7d2hpbGUoYSYmIW4ubm9kZU5hbWUoYSwiaHRtbCIpJiYic3RhdGljIj09PW4uY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8ZGR9KX19KSxuLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0vWS8udGVzdChiKTtuLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBXKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmPWVkKGEpO3JldHVybiB2b2lkIDA9PT1lP2Y/YiBpbiBmP2ZbYl06Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP24oZikuc2Nyb2xsTGVmdCgpOmUsYz9lOm4oZikuc2Nyb2xsVG9wKCkpOmFbZF09ZSl9LGEsZCxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG4uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09TWIobC5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9S2IoYSxiKSxJYi50ZXN0KGMpP24oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxuLmZuLmFuZFNlbGY9bi5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIGZkPWEualF1ZXJ5LGdkPWEuJDtyZXR1cm4gbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1uJiYoYS4kPWdkKSxiJiZhLmpRdWVyeT09PW4mJihhLmpRdWVyeT1mZCksbn0sdHlwZW9mIGI9PT1MJiYoYS5qUXVlcnk9YS4kPW4pLG59KTs= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.js,importbuddy/js/jquery.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js KGZ1bmN0aW9uKCQpewogCiAgICAkLmZuLmV4dGVuZCh7IAogICAgICAgICAKICAgICAgICBsZWFuTW9kYWw6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKIAkJCQogCQkJdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CiAJCQkKICAgICAgICAgICAgdmFyIGRlZmF1bHRzID0gewogICAgICAgICAgICAgICAgdG9wOiAxMDAsCiAgICAgICAgICAgICAgICBvdmVybGF5OiAwLjUsCiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSAkKCI8ZGl2IGlkPSdsZWFuX292ZXJsYXknPjwvZGl2PiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZChvdmVybGF5KTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgb3B0aW9ucyA9ICAkLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgCXZhciBtb2RhbF9pZCA9ICQodGhpcykuYXR0cigiaHJlZiIpOwoKCQkJCSQoIiNsZWFuX292ZXJsYXkiKS5jbGljayhmdW5jdGlvbigpIHsgCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlX21vZGFsKG1vZGFsX2lkKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoby5jbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24oKSB7IAogICAgICAgICAgICAgICAgICAgICBjbG9zZV9tb2RhbChtb2RhbF9pZCk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgIAl2YXIgbW9kYWxfaGVpZ2h0ID0gJChtb2RhbF9pZCkub3V0ZXJIZWlnaHQoZmFsc2UpOwogICAgICAgIAkgIAl2YXIgbW9kYWxfd2lkdGggPSAkKG1vZGFsX2lkKS5vdXRlcldpZHRoKGZhbHNlKTsKCiAgICAgICAgCQkkKCcjbGVhbl9vdmVybGF5JykuY3NzKHsgJ2Rpc3BsYXknIDogJ2Jsb2NrJywgb3BhY2l0eSA6IDAgfSk7CgogICAgICAgIAkJJCgnI2xlYW5fb3ZlcmxheScpLmZhZGVUbygyMDAsby5vdmVybGF5KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5jc3MoeyAKICAgICAgICAJCQogICAgICAgIAkJCSdkaXNwbGF5JyA6ICdibG9jaycsCiAgICAgICAgCQkJJ3Bvc2l0aW9uJyA6ICdmaXhlZCcsCiAgICAgICAgCQkJJ29wYWNpdHknIDogMCwKICAgICAgICAJCQknei1pbmRleCc6IDExMDAwLAogICAgICAgIAkJCSdsZWZ0JyA6IDUwICsgJyUnLAogICAgICAgIAkJCSdtYXJnaW4tbGVmdCcgOiAtKG1vZGFsX3dpZHRoLzIpICsgInB4IiwKICAgICAgICAJCQkndG9wJyA6IG8udG9wICsgInB4IgogICAgICAgIAkJCiAgICAgICAgCQl9KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5mYWRlVG8oMjAwLDEpOwoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIAl9KTsKICAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCgkJCWZ1bmN0aW9uIGNsb3NlX21vZGFsKG1vZGFsX2lkKXsKCiAgICAgICAgCQkkKCIjbGVhbl9vdmVybGF5IikuZmFkZU91dCgyMDApOwoKICAgICAgICAJCSQobW9kYWxfaWQpLmNzcyh7ICdkaXNwbGF5JyA6ICdub25lJyB9KTsKCQkJCgkJCX0KICAgIAogICAgICAgIH0KICAgIH0pOwogICAgIAp9KShqUXVlcnkpOw== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.simple-expand.min.js,importbuddy/js/jquery.simple-expand.min.js LyogQ29weXJpZ2h0IChDKSAyMDEyIFN5bHZhaW4gSGFtZWwKUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3JlZGhvdHNseS9zaW1wbGUtZXhwYW5kCk1JVCBMaWNlbmNlOiBodHRwczovL3Jhdy5naXRodWIuY29tL3JlZGhvdHNseS9zaW1wbGUtZXhwYW5kL21hc3Rlci9saWNlbmNlLW1pdC50eHQgKi8KKGZ1bmN0aW9uKCQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcztlLmRlZmF1bHRzPXtoaWRlTW9kZToiZmFkZVRvZ2dsZSIsZGVmYXVsdFNlYXJjaE1vZGU6InBhcmVudCIsZGVmYXVsdFRhcmdldDoiLmNvbnRlbnQiLHRocm93T25NaXNzaW5nVGFyZ2V0OiEwLGtlZXBTdGF0ZUluQ29va2llOiExLGNvb2tpZU5hbWU6InNpbXBsZS1leHBhbmQifSxlLnNldHRpbmdzPXt9LCQuZXh0ZW5kKGUuc2V0dGluZ3MsZS5kZWZhdWx0cyksZS5maW5kTGV2ZWxPbmVEZWVwPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5maW5kKHQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiEkKHRoaXMpLnBhcmVudHNVbnRpbChlLG4pLmxlbmd0aH0pfSxlLnNldEluaXRpYWxTdGF0ZT1mdW5jdGlvbih0LG4pe3ZhciByPWUucmVhZFN0YXRlKHQpO3I/KHQucmVtb3ZlQ2xhc3MoImNvbGxhcHNlZCIpLmFkZENsYXNzKCJleHBhbmRlZCIpLGUuc2hvdyhuKSk6KHQucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIikuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLGUuaGlkZShuKSl9LGUuaGlkZT1mdW5jdGlvbih0KXtlLnNldHRpbmdzLmhpZGVNb2RlPT09ImZhZGVUb2dnbGUiP3QuaGlkZSgpOmUuc2V0dGluZ3MuaGlkZU1vZGU9PT0iYmFzaWMiJiZ0LmhpZGUoKX0sZS5zaG93PWZ1bmN0aW9uKHQpe2Uuc2V0dGluZ3MuaGlkZU1vZGU9PT0iZmFkZVRvZ2dsZSI/dC5zaG93KCk6ZS5zZXR0aW5ncy5oaWRlTW9kZT09PSJiYXNpYyImJnQuc2hvdygpfSxlLmNoZWNrS2VlcFN0YXRlSW5Db29raWVQcmVjb25kaXRpb25zPWZ1bmN0aW9uKCl7aWYoZS5zZXR0aW5ncy5rZWVwU3RhdGVJbkNvb2tpZSYmJC5jb29raWU9PT11bmRlZmluZWQpdGhyb3cgbmV3IEVycm9yKCJzaW1wbGUtZXhwYW5kOiBrZWVwU3RhdGVJbkNvb2tpZSBvcHRpb24gcmVxdWlyZXMgJC5jb29raWUgdG8gYmUgZGVmaW5lZC4iKX0sZS5yZWFkQ29va2llPWZ1bmN0aW9uKCl7dmFyIHQ9JC5jb29raWUoZS5zZXR0aW5ncy5jb29raWVOYW1lKTtyZXR1cm4gdD09PW51bGx8fHQ9PT0iIj97fTpKU09OLnBhcnNlKHQpfSxlLnJlYWRTdGF0ZT1mdW5jdGlvbih0KXtpZighZS5zZXR0aW5ncy5rZWVwU3RhdGVJbkNvb2tpZSlyZXR1cm4hMTt2YXIgbj10LmF0dHIoIklkIik7aWYobj09PXVuZGVmaW5lZClyZXR1cm47dmFyIHI9ZS5yZWFkQ29va2llKCksaT1yW25dPT09ITB8fCExO3JldHVybiBpfSxlLnNhdmVTdGF0ZT1mdW5jdGlvbih0LG4pe2lmKCFlLnNldHRpbmdzLmtlZXBTdGF0ZUluQ29va2llKXJldHVybjt2YXIgcj10LmF0dHIoIklkIik7aWYocj09PXVuZGVmaW5lZClyZXR1cm47dmFyIGk9ZS5yZWFkQ29va2llKCk7aVtyXT1uLCQuY29va2llKGUuc2V0dGluZ3MuY29va2llTmFtZSxKU09OLnN0cmluZ2lmeShpKSx7cmF3OiEwLHBhdGg6d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSl9LGUudG9nZ2xlPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS50b2dnbGVDc3ModCk7cmV0dXJuIGUuc2V0dGluZ3MuaGlkZU1vZGU9PT0iZmFkZVRvZ2dsZSI/bi5mYWRlVG9nZ2xlKDE1MCk6ZS5zZXR0aW5ncy5oaWRlTW9kZT09PSJiYXNpYyI/bi50b2dnbGUoKTokLmlzRnVuY3Rpb24oZS5zZXR0aW5ncy5oaWRlTW9kZSkmJmUuc2V0dGluZ3MuaGlkZU1vZGUodCxuLHIpLGUuc2F2ZVN0YXRlKHQsciksITF9LGUudG9nZ2xlQ3NzPWZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc0NsYXNzKCJleHBhbmRlZCIpPyhlLnRvZ2dsZUNsYXNzKCJjb2xsYXBzZWQgZXhwYW5kZWQiKSwhMSk6KGUudG9nZ2xlQ2xhc3MoImV4cGFuZGVkIGNvbGxhcHNlZCIpLCEwKX0sZS5maW5kVGFyZ2V0cz1mdW5jdGlvbih0LG4scil7dmFyIGk9W107aWYobj09PSJhYnNvbHV0ZSIpaT0kKHIpO2Vsc2UgaWYobj09PSJyZWxhdGl2ZSIpaT1lLmZpbmRMZXZlbE9uZURlZXAodCxyLHIpO2Vsc2UgaWYobj09PSJwYXJlbnQiKXt2YXIgcz10LnBhcmVudCgpO2RvIGk9ZS5maW5kTGV2ZWxPbmVEZWVwKHMscixyKSxpLmxlbmd0aD09PTAmJihzPXMucGFyZW50KCkpO3doaWxlKGkubGVuZ3RoPT09MCYmcy5sZW5ndGghPT0wKX1yZXR1cm4gaX0sZS5hY3RpdmF0ZT1mdW5jdGlvbih0LG4peyQuZXh0ZW5kKGUuc2V0dGluZ3MsbiksZS5jaGVja0tlZXBTdGF0ZUluQ29va2llUHJlY29uZGl0aW9ucygpLHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PSQodGhpcyksbj10LmF0dHIoImRhdGEtZXhwYW5kZXItdGFyZ2V0Iil8fGUuc2V0dGluZ3MuZGVmYXVsdFRhcmdldCxyPXQuYXR0cigiZGF0YS1leHBhbmRlci10YXJnZXQtc2VhcmNoIil8fGUuc2V0dGluZ3MuZGVmYXVsdFNlYXJjaE1vZGUsaT1lLmZpbmRUYXJnZXRzKHQscixuKTtpZihpLmxlbmd0aD09PTApe2lmKGUuc2V0dGluZ3MudGhyb3dPbk1pc3NpbmdUYXJnZXQpdGhyb3cic2ltcGxlLWV4cGFuZDogVGFyZ2V0cyBub3QgZm91bmQiO3JldHVybiB0aGlzfWUuc2V0SW5pdGlhbFN0YXRlKHQsaSksdC5jbGljayhmdW5jdGlvbigpe3JldHVybiBlLnRvZ2dsZSh0LGkpfSl9KX19d2luZG93LlNpbXBsZUV4cGFuZD1lLCQuZm4uc2ltcGxlZXhwYW5kPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBlO3JldHVybiBuLmFjdGl2YXRlKHRoaXMsdCksdGhpc319KShqUXVlcnkpOw== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.simple-expand.min.js,importbuddy/js/jquery.simple-expand.min.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/main.js,importbuddy/js/main.js alF1ZXJ5LmZuLnZpc2libGUgPSBmdW5jdGlvbigpIHsKCXJldHVybiB0aGlzLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7Cn07CgpqUXVlcnkuZm4uaW52aXNpYmxlID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gdGhpcy5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7Cn07CgpqUXVlcnkuZm4udmlzaWJpbGl0eVRvZ2dsZSA9IGZ1bmN0aW9uKCkgewoJcmV0dXJuIHRoaXMuY3NzKCd2aXNpYmlsaXR5JywgZnVuY3Rpb24oaSwgdmlzaWJpbGl0eSkgewoJCXJldHVybiAodmlzaWJpbGl0eSA9PSAndmlzaWJsZScpID8gJ2hpZGRlbicgOiAndmlzaWJsZSc7Cgl9KTsKfTs= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/main.js,importbuddy/js/main.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/nprogress.js,importbuddy/js/nprogress.js LyohIE5Qcm9ncmVzcyAoYykgMjAxMywgUmljbyBTdGEuIENydXoKICogIGh0dHA6Ly9yaWNvc3RhY3J1ei5jb20vbnByb2dyZXNzICovCgo7KGZ1bmN0aW9uKGZhY3RvcnkpIHsKCiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdmdW5jdGlvbicpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICBkZWZpbmUoZmFjdG9yeSk7CiAgfSBlbHNlIHsKICAgIHRoaXMuTlByb2dyZXNzID0gZmFjdG9yeSgpOwogIH0KCn0pKGZ1bmN0aW9uKCkgewogIHZhciBOUHJvZ3Jlc3MgPSB7fTsKCiAgTlByb2dyZXNzLnZlcnNpb24gPSAnMC4xLjMnOwoKICB2YXIgU2V0dGluZ3MgPSBOUHJvZ3Jlc3Muc2V0dGluZ3MgPSB7CiAgICBtaW5pbXVtOiAwLjA4LAogICAgZWFzaW5nOiAnZWFzZScsCiAgICBwb3NpdGlvblVzaW5nOiAnJywKICAgIHNwZWVkOiAyMDAsCiAgICB0cmlja2xlOiB0cnVlLAogICAgdHJpY2tsZVJhdGU6IDAuMDIsCiAgICB0cmlja2xlU3BlZWQ6IDgwMCwKICAgIHNob3dTcGlubmVyOiB0cnVlLAogICAgYmFyU2VsZWN0b3I6ICdbcm9sZT0iYmFyIl0nLAogICAgc3Bpbm5lclNlbGVjdG9yOiAnW3JvbGU9InNwaW5uZXIiXScsCiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9ImJhciIgcm9sZT0iYmFyIj48ZGl2IGNsYXNzPSJwZWciPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNwaW5uZXIiIHJvbGU9InNwaW5uZXIiPjxkaXYgY2xhc3M9InNwaW5uZXItaWNvbiI+PC9kaXY+PC9kaXY+JwogIH07CgogIC8qKgogICAqIFVwZGF0ZXMgY29uZmlndXJhdGlvbi4KICAgKgogICAqICAgICBOUHJvZ3Jlc3MuY29uZmlndXJlKHsKICAgKiAgICAgICBtaW5pbXVtOiAwLjEKICAgKiAgICAgfSk7CiAgICovCiAgTlByb2dyZXNzLmNvbmZpZ3VyZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIHZhciBrZXksIHZhbHVlOwogICAgZm9yIChrZXkgaW4gb3B0aW9ucykgewogICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsKICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBTZXR0aW5nc1trZXldID0gdmFsdWU7CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfTsKCiAgLyoqCiAgICogTGFzdCBudW1iZXIuCiAgICovCgogIE5Qcm9ncmVzcy5zdGF0dXMgPSBudWxsOwoKICAvKioKICAgKiBTZXRzIHRoZSBwcm9ncmVzcyBiYXIgc3RhdHVzLCB3aGVyZSBgbmAgaXMgYSBudW1iZXIgZnJvbSBgMC4wYCB0byBgMS4wYC4KICAgKgogICAqICAgICBOUHJvZ3Jlc3Muc2V0KDAuNCk7CiAgICogICAgIE5Qcm9ncmVzcy5zZXQoMS4wKTsKICAgKi8KCiAgTlByb2dyZXNzLnNldCA9IGZ1bmN0aW9uKG4pIHsKICAgIHZhciBzdGFydGVkID0gTlByb2dyZXNzLmlzU3RhcnRlZCgpOwoKICAgIG4gPSBjbGFtcChuLCBTZXR0aW5ncy5taW5pbXVtLCAxKTsKICAgIE5Qcm9ncmVzcy5zdGF0dXMgPSAobiA9PT0gMSA/IG51bGwgOiBuKTsKCiAgICB2YXIgcHJvZ3Jlc3MgPSBOUHJvZ3Jlc3MucmVuZGVyKCFzdGFydGVkKSwKICAgICAgICBiYXIgICAgICA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3MuYmFyU2VsZWN0b3IpLAogICAgICAgIHNwZWVkICAgID0gU2V0dGluZ3Muc3BlZWQsCiAgICAgICAgZWFzZSAgICAgPSBTZXR0aW5ncy5lYXNpbmc7CgogICAgcHJvZ3Jlc3Mub2Zmc2V0V2lkdGg7IC8qIFJlcGFpbnQgKi8KCiAgICBxdWV1ZShmdW5jdGlvbihuZXh0KSB7CiAgICAgIC8vIFNldCBwb3NpdGlvblVzaW5nIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gc2V0CiAgICAgIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAnJykgU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9IE5Qcm9ncmVzcy5nZXRQb3NpdGlvbmluZ0NTUygpOwoKICAgICAgLy8gQWRkIHRyYW5zaXRpb24KICAgICAgY3NzKGJhciwgYmFyUG9zaXRpb25DU1Mobiwgc3BlZWQsIGVhc2UpKTsKCiAgICAgIGlmIChuID09PSAxKSB7CiAgICAgICAgLy8gRmFkZSBvdXQKICAgICAgICBjc3MocHJvZ3Jlc3MsIHsgCiAgICAgICAgICB0cmFuc2l0aW9uOiAnbm9uZScsIAogICAgICAgICAgb3BhY2l0eTogMSAKICAgICAgICB9KTsKICAgICAgICBwcm9ncmVzcy5vZmZzZXRXaWR0aDsgLyogUmVwYWludCAqLwoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgY3NzKHByb2dyZXNzLCB7IAogICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsICcgKyBzcGVlZCArICdtcyBsaW5lYXInLCAKICAgICAgICAgICAgb3BhY2l0eTogMCAKICAgICAgICAgIH0pOwogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgTlByb2dyZXNzLnJlbW92ZSgpOwogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICB9LCBzcGVlZCk7CiAgICAgICAgfSwgc3BlZWQpOwogICAgICB9IGVsc2UgewogICAgICAgIHNldFRpbWVvdXQobmV4dCwgc3BlZWQpOwogICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9OwoKICBOUHJvZ3Jlc3MuaXNTdGFydGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdHlwZW9mIE5Qcm9ncmVzcy5zdGF0dXMgPT09ICdudW1iZXInOwogIH07CgogIC8qKgogICAqIFNob3dzIHRoZSBwcm9ncmVzcyBiYXIuCiAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gMCUsIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgZ28gYmFja3dhcmRzLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5zdGFydCgpOwogICAqCiAgICovCiAgTlByb2dyZXNzLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIU5Qcm9ncmVzcy5zdGF0dXMpIE5Qcm9ncmVzcy5zZXQoMCk7CgogICAgdmFyIHdvcmsgPSBmdW5jdGlvbigpIHsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIU5Qcm9ncmVzcy5zdGF0dXMpIHJldHVybjsKICAgICAgICBOUHJvZ3Jlc3MudHJpY2tsZSgpOwogICAgICAgIHdvcmsoKTsKICAgICAgfSwgU2V0dGluZ3MudHJpY2tsZVNwZWVkKTsKICAgIH07CgogICAgaWYgKFNldHRpbmdzLnRyaWNrbGUpIHdvcmsoKTsKCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAvKioKICAgKiBIaWRlcyB0aGUgcHJvZ3Jlc3MgYmFyLgogICAqIFRoaXMgaXMgdGhlICpzb3J0IG9mKiB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gMTAwJSwgd2l0aCB0aGUKICAgKiBkaWZmZXJlbmNlIGJlaW5nIGBkb25lKClgIG1ha2VzIHNvbWUgcGxhY2VibyBlZmZlY3Qgb2Ygc29tZSByZWFsaXN0aWMgbW90aW9uLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5kb25lKCk7CiAgICoKICAgKiBJZiBgdHJ1ZWAgaXMgcGFzc2VkLCBpdCB3aWxsIHNob3cgdGhlIHByb2dyZXNzIGJhciBldmVuIGlmIGl0cyBoaWRkZW4uCiAgICoKICAgKiAgICAgTlByb2dyZXNzLmRvbmUodHJ1ZSk7CiAgICovCgogIE5Qcm9ncmVzcy5kb25lID0gZnVuY3Rpb24oZm9yY2UpIHsKICAgIGlmICghZm9yY2UgJiYgIU5Qcm9ncmVzcy5zdGF0dXMpIHJldHVybiB0aGlzOwoKICAgIHJldHVybiBOUHJvZ3Jlc3MuaW5jKDAuMyArIDAuNSAqIE1hdGgucmFuZG9tKCkpLnNldCgxKTsKICB9OwoKICAvKioKICAgKiBJbmNyZW1lbnRzIGJ5IGEgcmFuZG9tIGFtb3VudC4KICAgKi8KCiAgTlByb2dyZXNzLmluYyA9IGZ1bmN0aW9uKGFtb3VudCkgewogICAgdmFyIG4gPSBOUHJvZ3Jlc3Muc3RhdHVzOwoKICAgIGlmICghbikgewogICAgICByZXR1cm4gTlByb2dyZXNzLnN0YXJ0KCk7CiAgICB9IGVsc2UgewogICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHsKICAgICAgICBhbW91bnQgPSAoMSAtIG4pICogY2xhbXAoTWF0aC5yYW5kb20oKSAqIG4sIDAuMSwgMC45NSk7CiAgICAgIH0KCiAgICAgIG4gPSBjbGFtcChuICsgYW1vdW50LCAwLCAwLjk5NCk7CiAgICAgIHJldHVybiBOUHJvZ3Jlc3Muc2V0KG4pOwogICAgfQogIH07CgogIE5Qcm9ncmVzcy50cmlja2xlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTlByb2dyZXNzLmluYyhNYXRoLnJhbmRvbSgpICogU2V0dGluZ3MudHJpY2tsZVJhdGUpOwogIH07CgogIC8qKgogICAqIFdhaXRzIGZvciBhbGwgc3VwcGxpZWQgalF1ZXJ5IHByb21pc2VzIGFuZAogICAqIGluY3JlYXNlcyB0aGUgcHJvZ3Jlc3MgYXMgdGhlIHByb21pc2VzIHJlc29sdmUuCiAgICogCiAgICogQHBhcmFtICRwcm9taXNlIGpRVWVyeSBQcm9taXNlCiAgICovCiAgKGZ1bmN0aW9uKCkgewogICAgdmFyIGluaXRpYWwgPSAwLCBjdXJyZW50ID0gMDsKICAgIAogICAgTlByb2dyZXNzLnByb21pc2UgPSBmdW5jdGlvbigkcHJvbWlzZSkgewogICAgICBpZiAoISRwcm9taXNlIHx8ICRwcm9taXNlLnN0YXRlKCkgPT0gInJlc29sdmVkIikgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIAogICAgICBpZiAoY3VycmVudCA9PSAwKSB7CiAgICAgICAgTlByb2dyZXNzLnN0YXJ0KCk7CiAgICAgIH0KICAgICAgCiAgICAgIGluaXRpYWwrKzsKICAgICAgY3VycmVudCsrOwogICAgICAKICAgICAgJHByb21pc2UuYWx3YXlzKGZ1bmN0aW9uKCkgewogICAgICAgIGN1cnJlbnQtLTsKICAgICAgICBpZiAoY3VycmVudCA9PSAwKSB7CiAgICAgICAgICAgIGluaXRpYWwgPSAwOwogICAgICAgICAgICBOUHJvZ3Jlc3MuZG9uZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIE5Qcm9ncmVzcy5zZXQoKGluaXRpYWwgLSBjdXJyZW50KSAvIGluaXRpYWwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIAogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICB9KSgpOwoKICAvKioKICAgKiAoSW50ZXJuYWwpIHJlbmRlcnMgdGhlIHByb2dyZXNzIGJhciBtYXJrdXAgYmFzZWQgb24gdGhlIGB0ZW1wbGF0ZWAKICAgKiBzZXR0aW5nLgogICAqLwoKICBOUHJvZ3Jlc3MucmVuZGVyID0gZnVuY3Rpb24oZnJvbVN0YXJ0KSB7CiAgICBpZiAoTlByb2dyZXNzLmlzUmVuZGVyZWQoKSkgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCducHJvZ3Jlc3MnKTsKCiAgICBhZGRDbGFzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICducHJvZ3Jlc3MtYnVzeScpOwogICAgCiAgICB2YXIgcHJvZ3Jlc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHByb2dyZXNzLmlkID0gJ25wcm9ncmVzcyc7CiAgICBwcm9ncmVzcy5pbm5lckhUTUwgPSBTZXR0aW5ncy50ZW1wbGF0ZTsKCiAgICB2YXIgYmFyICAgICAgPSBwcm9ncmVzcy5xdWVyeVNlbGVjdG9yKFNldHRpbmdzLmJhclNlbGVjdG9yKSwKICAgICAgICBwZXJjICAgICA9IGZyb21TdGFydCA/ICctMTAwJyA6IHRvQmFyUGVyYyhOUHJvZ3Jlc3Muc3RhdHVzIHx8IDApLAogICAgICAgIHNwaW5uZXI7CiAgICAKICAgIGNzcyhiYXIsIHsKICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwIGxpbmVhcicsCiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyBwZXJjICsgJyUsMCwwKScKICAgIH0pOwoKICAgIGlmICghU2V0dGluZ3Muc2hvd1NwaW5uZXIpIHsKICAgICAgc3Bpbm5lciA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3Muc3Bpbm5lclNlbGVjdG9yKTsKICAgICAgc3Bpbm5lciAmJiByZW1vdmVFbGVtZW50KHNwaW5uZXIpOwogICAgfQoKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocHJvZ3Jlc3MpOwogICAgcmV0dXJuIHByb2dyZXNzOwogIH07CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQuIE9wcG9zaXRlIG9mIHJlbmRlcigpLgogICAqLwoKICBOUHJvZ3Jlc3MucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgICByZW1vdmVDbGFzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICducHJvZ3Jlc3MtYnVzeScpOwogICAgdmFyIHByb2dyZXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25wcm9ncmVzcycpOwogICAgcHJvZ3Jlc3MgJiYgcmVtb3ZlRWxlbWVudChwcm9ncmVzcyk7CiAgfTsKCiAgLyoqCiAgICogQ2hlY2tzIGlmIHRoZSBwcm9ncmVzcyBiYXIgaXMgcmVuZGVyZWQuCiAgICovCgogIE5Qcm9ncmVzcy5pc1JlbmRlcmVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnByb2dyZXNzJyk7CiAgfTsKCiAgLyoqCiAgICogRGV0ZXJtaW5lIHdoaWNoIHBvc2l0aW9uaW5nIENTUyBydWxlIHRvIHVzZS4KICAgKi8KCiAgTlByb2dyZXNzLmdldFBvc2l0aW9uaW5nQ1NTID0gZnVuY3Rpb24oKSB7CiAgICAvLyBTbmlmZiBvbiBkb2N1bWVudC5ib2R5LnN0eWxlCiAgICB2YXIgYm9keVN0eWxlID0gZG9jdW1lbnQuYm9keS5zdHlsZTsKCiAgICAvLyBTbmlmZiBwcmVmaXhlcwogICAgdmFyIHZlbmRvclByZWZpeCA9ICgnV2Via2l0VHJhbnNmb3JtJyBpbiBib2R5U3R5bGUpID8gJ1dlYmtpdCcgOgogICAgICAgICAgICAgICAgICAgICAgICgnTW96VHJhbnNmb3JtJyBpbiBib2R5U3R5bGUpID8gJ01veicgOgogICAgICAgICAgICAgICAgICAgICAgICgnbXNUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnbXMnIDoKICAgICAgICAgICAgICAgICAgICAgICAoJ09UcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnTycgOiAnJzsKCiAgICBpZiAodmVuZG9yUHJlZml4ICsgJ1BlcnNwZWN0aXZlJyBpbiBib2R5U3R5bGUpIHsKICAgICAgLy8gTW9kZXJuIGJyb3dzZXJzIHdpdGggM0Qgc3VwcG9ydCwgZS5nLiBXZWJraXQsIElFMTAKICAgICAgcmV0dXJuICd0cmFuc2xhdGUzZCc7CiAgICB9IGVsc2UgaWYgKHZlbmRvclByZWZpeCArICdUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgewogICAgICAvLyBCcm93c2VycyB3aXRob3V0IDNEIHN1cHBvcnQsIGUuZy4gSUU5CiAgICAgIHJldHVybiAndHJhbnNsYXRlJzsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEJyb3dzZXJzIHdpdGhvdXQgdHJhbnNsYXRlKCkgc3VwcG9ydCwgZS5nLiBJRTctOAogICAgICByZXR1cm4gJ21hcmdpbic7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogSGVscGVycwogICAqLwoKICBmdW5jdGlvbiBjbGFtcChuLCBtaW4sIG1heCkgewogICAgaWYgKG4gPCBtaW4pIHJldHVybiBtaW47CiAgICBpZiAobiA+IG1heCkgcmV0dXJuIG1heDsKICAgIHJldHVybiBuOwogIH0KCiAgLyoqCiAgICogKEludGVybmFsKSBjb252ZXJ0cyBhIHBlcmNlbnRhZ2UgKGAwLi4xYCkgdG8gYSBiYXIgdHJhbnNsYXRlWAogICAqIHBlcmNlbnRhZ2UgKGAtMTAwJS4uMCVgKS4KICAgKi8KCiAgZnVuY3Rpb24gdG9CYXJQZXJjKG4pIHsKICAgIHJldHVybiAoLTEgKyBuKSAqIDEwMDsKICB9CgoKICAvKioKICAgKiAoSW50ZXJuYWwpIHJldHVybnMgdGhlIGNvcnJlY3QgQ1NTIGZvciBjaGFuZ2luZyB0aGUgYmFyJ3MKICAgKiBwb3NpdGlvbiBnaXZlbiBhbiBuIHBlcmNlbnRhZ2UsIGFuZCBzcGVlZCBhbmQgZWFzZSBmcm9tIFNldHRpbmdzCiAgICovCgogIGZ1bmN0aW9uIGJhclBvc2l0aW9uQ1NTKG4sIHNwZWVkLCBlYXNlKSB7CiAgICB2YXIgYmFyQ1NTOwoKICAgIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAndHJhbnNsYXRlM2QnKSB7CiAgICAgIGJhckNTUyA9IHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyt0b0JhclBlcmMobikrJyUsMCwwKScgfTsKICAgIH0gZWxzZSBpZiAoU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9PT0gJ3RyYW5zbGF0ZScpIHsKICAgICAgYmFyQ1NTID0geyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoJyt0b0JhclBlcmMobikrJyUsMCknIH07CiAgICB9IGVsc2UgewogICAgICBiYXJDU1MgPSB7ICdtYXJnaW4tbGVmdCc6IHRvQmFyUGVyYyhuKSsnJScgfTsKICAgIH0KCiAgICBiYXJDU1MudHJhbnNpdGlvbiA9ICdhbGwgJytzcGVlZCsnbXMgJytlYXNlOwoKICAgIHJldHVybiBiYXJDU1M7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIFF1ZXVlcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLgogICAqLwoKICB2YXIgcXVldWUgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgcGVuZGluZyA9IFtdOwogICAgCiAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICB2YXIgZm4gPSBwZW5kaW5nLnNoaWZ0KCk7CiAgICAgIGlmIChmbikgewogICAgICAgIGZuKG5leHQpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7CiAgICAgIHBlbmRpbmcucHVzaChmbik7CiAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PSAxKSBuZXh0KCk7CiAgICB9OwogIH0pKCk7CgogIC8qKgogICAqIChJbnRlcm5hbCkgQXBwbGllcyBjc3MgcHJvcGVydGllcyB0byBhbiBlbGVtZW50LCBzaW1pbGFyIHRvIHRoZSBqUXVlcnkgCiAgICogY3NzIG1ldGhvZC4KICAgKgogICAqIFdoaWxlIHRoaXMgaGVscGVyIGRvZXMgYXNzaXN0IHdpdGggdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5IG5hbWVzLCBpdCAKICAgKiBkb2VzIG5vdCBwZXJmb3JtIGFueSBtYW5pcHVsYXRpb24gb2YgdmFsdWVzIHByaW9yIHRvIHNldHRpbmcgc3R5bGVzLgogICAqLwoKICB2YXIgY3NzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIGNzc1ByZWZpeGVzID0gWyAnV2Via2l0JywgJ08nLCAnTW96JywgJ21zJyBdLAogICAgICAgIGNzc1Byb3BzICAgID0ge307CgogICAgZnVuY3Rpb24gY2FtZWxDYXNlKHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL14tbXMtLywgJ21zLScpLnJlcGxhY2UoLy0oW1xkYS16XSkvZ2ksIGZ1bmN0aW9uKG1hdGNoLCBsZXR0ZXIpIHsKICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFZlbmRvclByb3AobmFtZSkgewogICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlOwogICAgICBpZiAobmFtZSBpbiBzdHlsZSkgcmV0dXJuIG5hbWU7CgogICAgICB2YXIgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aCwKICAgICAgICAgIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwKICAgICAgICAgIHZlbmRvck5hbWU7CiAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICB2ZW5kb3JOYW1lID0gY3NzUHJlZml4ZXNbaV0gKyBjYXBOYW1lOwogICAgICAgIGlmICh2ZW5kb3JOYW1lIGluIHN0eWxlKSByZXR1cm4gdmVuZG9yTmFtZTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U3R5bGVQcm9wKG5hbWUpIHsKICAgICAgbmFtZSA9IGNhbWVsQ2FzZShuYW1lKTsKICAgICAgcmV0dXJuIGNzc1Byb3BzW25hbWVdIHx8IChjc3NQcm9wc1tuYW1lXSA9IGdldFZlbmRvclByb3AobmFtZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5Q3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlKSB7CiAgICAgIHByb3AgPSBnZXRTdHlsZVByb3AocHJvcCk7CiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSB2YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydGllcykgewogICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgIHByb3AsIAogICAgICAgICAgdmFsdWU7CgogICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikgewogICAgICAgIGZvciAocHJvcCBpbiBwcm9wZXJ0aWVzKSB7CiAgICAgICAgICB2YWx1ZSA9IHByb3BlcnRpZXNbcHJvcF07CiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3ApKSBhcHBseUNzcyhlbGVtZW50LCBwcm9wLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFwcGx5Q3NzKGVsZW1lbnQsIGFyZ3NbMV0sIGFyZ3NbMl0pOwogICAgICB9CiAgICB9CiAgfSkoKTsKCiAgLyoqCiAgICogKEludGVybmFsKSBEZXRlcm1pbmVzIGlmIGFuIGVsZW1lbnQgb3Igc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3MgbmFtZXMgY29udGFpbnMgYSBjbGFzcyBuYW1lLgogICAqLwoKICBmdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50LCBuYW1lKSB7CiAgICB2YXIgbGlzdCA9IHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnID8gZWxlbWVudCA6IGNsYXNzTGlzdChlbGVtZW50KTsKICAgIHJldHVybiBsaXN0LmluZGV4T2YoJyAnICsgbmFtZSArICcgJykgPj0gMDsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgQWRkcyBhIGNsYXNzIHRvIGFuIGVsZW1lbnQuCiAgICovCgogIGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIG5hbWUpIHsKICAgIHZhciBvbGRMaXN0ID0gY2xhc3NMaXN0KGVsZW1lbnQpLAogICAgICAgIG5ld0xpc3QgPSBvbGRMaXN0ICsgbmFtZTsKCiAgICBpZiAoaGFzQ2xhc3Mob2xkTGlzdCwgbmFtZSkpIHJldHVybjsgCgogICAgLy8gVHJpbSB0aGUgb3BlbmluZyBzcGFjZS4KICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3TGlzdC5zdWJzdHJpbmcoMSk7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIFJlbW92ZXMgYSBjbGFzcyBmcm9tIGFuIGVsZW1lbnQuCiAgICovCgogIGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIG5hbWUpIHsKICAgIHZhciBvbGRMaXN0ID0gY2xhc3NMaXN0KGVsZW1lbnQpLAogICAgICAgIG5ld0xpc3Q7CgogICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBuYW1lKSkgcmV0dXJuOwoKICAgIC8vIFJlcGxhY2UgdGhlIGNsYXNzIG5hbWUuCiAgICBuZXdMaXN0ID0gb2xkTGlzdC5yZXBsYWNlKCcgJyArIG5hbWUgKyAnICcsICcgJyk7CgogICAgLy8gVHJpbSB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBzcGFjZXMuCiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG5ld0xpc3Quc3Vic3RyaW5nKDEsIG5ld0xpc3QubGVuZ3RoIC0gMSk7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIEdldHMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgY2xhc3MgbmFtZXMgb24gdGhlIGVsZW1lbnQuIAogICAqIFRoZSBsaXN0IGlzIHdyYXBwZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBvbiBlYWNoIGVuZCB0byBmYWNpbGl0YXRlIGZpbmRpbmcgCiAgICogbWF0Y2hlcyB3aXRoaW4gdGhlIGxpc3QuCiAgICovCgogIGZ1bmN0aW9uIGNsYXNzTGlzdChlbGVtZW50KSB7CiAgICByZXR1cm4gKCcgJyArIChlbGVtZW50LmNsYXNzTmFtZSB8fCAnJykgKyAnICcpLnJlcGxhY2UoL1xzKy9naSwgJyAnKTsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTS4KICAgKi8KCiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbGVtZW50KSB7CiAgICBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7CiAgfQoKICByZXR1cm4gTlByb2dyZXNzOwp9KTsK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/nprogress.js,importbuddy/js/nprogress.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/restoreEvents.js,importbuddy/js/restoreEvents.js ZnVuY3Rpb24gaW1wb3J0YnVkZHlfbG9hZFJlc3RvcmVFdmVudHMoKSB7CgkKCQoJLy8gVXBkYXRlIHN0YXR1cyBsb2cgZGV0YWlscywgbWVzc2FnZXMsIG9yIGVycm9ycy4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCgnYmFja3VwYnVkZHlfZGV0YWlscyBiYWNrdXBidWRkeV9tZXNzYWdlIGJhY2t1cGJ1ZGR5X2Vycm9yIGJhY2t1cGJ1ZGR5X3dhcm5pbmcnLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJY2xhc3NUeXBlID0gJyc7CgkJCgkJaWYgKCAnYmFja3VwYnVkZHlfZXJyb3InID09IGUudHlwZSApIHsKCQkJanNvbi5kYXRhID0gYmFja3VwYnVkZHlFcnJvcigganNvbi5kYXRhICk7CgkJCWNsYXNzVHlwZSA9ICdlcnJvcic7CgkJfQoJCWlmICggJ2JhY2t1cGJ1ZGR5X3dhcm5pbmcnID09IGUudHlwZSApIHsKCQkJanNvbi5kYXRhID0gYmFja3VwYnVkZHlXYXJuaW5nKCBqc29uLmRhdGEgKTsKCQkJY2xhc3NUeXBlID0gJ3dhcm5pbmcnOwoJCX0KCQoJCWJhY2t1cGJ1ZGR5X2xvZygganNvbiwgY2xhc3NUeXBlICk7Cgl9KTsKCQoJCgkKCQoJLy8gQSBiYWNrdXAgZnVuY3Rpb24gKHN0ZXApIGJlZ2FuLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfc3RhcnRGdW5jdGlvbicsIGZ1bmN0aW9uKGUsIGpzb24pIHsKCQlmdW5jdGlvbkluZm8gPSBqUXVlcnkucGFyc2VKU09OKGpzb24uZGF0YSApOwoJCWh0bWwgPSAnPGRpdiBjbGFzcz0iYmFja3VwLXN0ZXAgYmFja3VwLXN0ZXAtcHJpbWFyeSBiYWNrdXAtZnVuY3Rpb24tJyArIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiArICciPjxzcGFuIGNsYXNzPSJiYWNrdXAtc3RlcC1zdGF0dXMgYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmciPjwvc3Bhbj48c3BhbiBjbGFzcz0iYmFja3VwLXN0ZXAtdGl0bGUiPicgKyBmdW5jdGlvbkluZm8udGl0bGUgKyAnPC9zcGFuPjwvZGl2Pic7CgkJalF1ZXJ5KCAnLmJhY2t1cC1zdGVwcycgKS5hcHBlbmQoIGh0bWwgKTsKCQlpZiAoICcnICE9PSBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJ1dhcm5pbmcgIzIzNzgzMmE6IEEgZnVuY3Rpb24gYCcgKyBmdW5jdGlvbkluZm8uZnVuY3Rpb24gKyAnYCBzdGFydGVkIGJlZm9yZSBhIHByaW9yIGZ1bmN0aW9uIGAnICsgYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICsgJ2Agd2FzIGNvbXBsZXRlZC4nICk7CgkJfQoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRGdW5jdGlvbiA9IGZ1bmN0aW9uSW5mby5mdW5jdGlvbjsKCX0pOwoJCgkKCS8vIEEgYmFja3VwIGZ1bmN0aW9uIChzdGVwKSBmaW5pc2hlZC4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCggJ2JhY2t1cGJ1ZGR5X2ZpbmlzaEZ1bmN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWZ1bmN0aW9uSW5mbyA9IGpRdWVyeS5wYXJzZUpTT04oIGpzb24uZGF0YSApOwoJCWpRdWVyeSggJy5iYWNrdXAtZnVuY3Rpb24tJyArIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiApLmZpbmQoICcuYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmcnICkucmVtb3ZlQ2xhc3MoICdiYWNrdXAtc3RlcC1zdGF0dXMtd29ya2luZycgKS5hZGRDbGFzcyggJ2JhY2t1cC1zdGVwLXN0YXR1cy1maW5pc2hlZCcgKTsKCQlpZiAoIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiAhPT0gYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICdXYXJuaW5nICMyMzc4MzJiOiBBIGZ1bmN0aW9uIGAnICsgZnVuY3Rpb25JbmZvLmZ1bmN0aW9uICsgJ2AgY29tcGxldGVkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGZ1bmN0aW9uIHdoaWNoIHdhcyB0aG91Z2h0IHRvIGJlIHJ1bm5pbmcgYCcgKyBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKyAnYC4nICk7CgkJfQoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRGdW5jdGlvbiA9ICcnOwoJfSk7CgkKCQoJLy8gVHJhY2sgbWlub3IgZXZlbnRzIHNvIHdlIGNhbiBkZXRlY3QgY2VydGFpbiB0aGluZ3Mgbm90IGZpbmlzaGluZywgc3VjaCBhcyBpbXBvcnRidWRkeSBnZW5lcmF0aW9uLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfc3RhcnRBY3Rpb24nLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJY29uc29sZS5sb2coICdTdGFydGluZyBhY3Rpb246ICcgKyBqc29uLmRhdGEgKTsKCQlpZiAoICcnICE9PSBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICdXYXJuaW5nICMzMjc4Mzc0YTogQW4gYWN0aW9uIGAnICsganNvbi5kYXRhICsgJ2Agc3RhcnRlZCBiZWZvcmUgYSBwcmlvciBhY3Rpb24gYCcgKyBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICsgJ2Agd2FzIGNvbXBsZXRlZC4nICk7CgkJfQoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gPSBqc29uLmRhdGE7CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvblN0YXJ0ID0gdW5peF90aW1lc3RhbXAoKTsKCQliYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uTGFzdFdhcm4gPSAwOwoJfSk7CgkKCQoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfZmluaXNoQWN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWNvbnNvbGUubG9nKCAnRmluaXNoaW5nIGFjdGlvbjogJyArIGpzb24uZGF0YSApOwoJCWlmICgganNvbi5kYXRhICE9PSBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICdXYXJuaW5nICMzMjc4Mzc0YjogQW4gYWN0aW9uIGAnICsganNvbi5kYXRhICsgJ2AgY29tcGxldGVkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGFjdGlvbiBgJyArIGJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gKyAnYCB3aGljaCB3YXMgdGhvdWdodCB0byBiZSBydW5uaW5nLicgKTsKCQl9CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiA9ICcnOwoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb25TdGFydCA9IDA7CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbkxhc3RXYXJuID0gMDsKCX0pOwoJCgkKCQoJCgkvLyBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgcnVubmluZyBhIGZ1bmN0aW9uLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfZXJyb3JGdW5jdGlvbicsIGZ1bmN0aW9uKGUsIGpzb24pIHsKCQlqUXVlcnkoICcuYmFja3VwLWZ1bmN0aW9uLScgKyBqc29uLmRhdGEgKS5maW5kKCAnLmJhY2t1cC1zdGVwLXN0YXR1cy13b3JraW5nJyApLnJlbW92ZUNsYXNzKCAnYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmcnICkuYWRkQ2xhc3MoICdiYWNrdXAtc3RlcC1zdGF0dXMtZXJyb3InICk7Cgl9KTsKCQoJCgkvLyBTdGFydCBhIHN1YmZ1bmN0aW9uLiBUaGVzZSBhcmUgdHlwaWNhbGx5IG1vcmUgbWlub3IsIHRob3VnaCBzdGlsbCBub3RhYmxlLCBldmVudHMuCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV9zdGFydFN1YkZ1bmN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWZ1bmN0aW9uSW5mbyA9IGpRdWVyeS5wYXJzZUpTT04oanNvbi5kYXRhICk7CgkJaHRtbCA9ICc8ZGl2IGNsYXNzPSJiYWNrdXAtc3RlcCBiYWNrdXAtc3RlcC1zZWNvbmRhcnkgYmFja3VwLWZ1bmN0aW9uLScgKyBmdW5jdGlvbkluZm8uZnVuY3Rpb24gKyAnIj48c3BhbiBjbGFzcz0iYmFja3VwLXN0ZXAtc3RhdHVzIj48L3NwYW4+PHNwYW4gY2xhc3M9ImJhY2t1cC1zdGVwLXRpdGxlIj4nICsgZnVuY3Rpb25JbmZvLnRpdGxlICsgJzwvc3Bhbj48L2Rpdj4nOwoJCWpRdWVyeSggJy5iYWNrdXAtc3RlcHMnICkuYXBwZW5kKCBodG1sICk7Cgl9KTsKCQoJCgkKCS8vIEFuIGVycm9yIG1lc3NhZ2Ugd2FzIHNlbnQgZnJvbSB0aGUgc2VydmVyLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfZXJyb3InLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJY29uc29sZS5sb2coICdCQUNLVVBCVUREWSBFUlJPUjogJyArIGpzb24uZGF0YSApOwoJfSk7CgkKCS8vdmFyIGJhY2t1cGJ1ZGR5X2FjdGlvbnMgPSBbXTsKCQoJCgkKCQoJCgkvLyBBIHdhcm5pbmcgbWVzc2FnZSB3YXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIuCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV93YXJuaW5nJywgZnVuY3Rpb24oZSwganNvbikgewoJCWh0bWwgPSAnPHNwYW4gY2xhc3M9ImJhY2t1cC1zdGVwLXN0YXR1cyBiYWNrdXAtc3RlcC1zdGF0dXMtd2FybmluZyI+PC9zcGFuPjxkaXYgY2xhc3M9ImJhY2t1cC1zdGVwIGJhY2t1cC1zdGVwLXNlY29uZGFyeSI+PHNwYW4gY2xhc3M9ImJhY2t1cC1zdGVwLXRpdGxlIj4nICsganNvbi5kYXRhICsgJzwvc3Bhbj48L2Rpdj4nOwoJCWpRdWVyeSggJy5iYWNrdXAtc3RlcHMnICkuYXBwZW5kKCBodG1sICk7Cgl9KTsKCQoJCgkvLyBUaGUgZW50aXJlIGJhY2t1cCBwcm9jZXNzIGhhcyBiZWVuIGhhbHRlZCwgd2hldGhlciBieSBCYWNrdXBCdWRkeSBvciB0aGUgdXNlci4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCggJ2JhY2t1cGJ1ZGR5X2hhbHRTY3JpcHQnLCBmdW5jdGlvbihlLCBqc29uKSB7CgkKCQlpZiAoIDAgPT09IGtlZXBfcG9sbGluZyApIHsgLy8gT25seSBzaG93IG9uY2UuCgkJCXJldHVybjsKCQl9CgkKCQlrZWVwX3BvbGxpbmcgPSAwOyAvLyBTdG9wIHBvbGxpbmcgc2VydmVyIGZvciBzdGF0dXMgdXBkYXRlcy4KCQoJCWpRdWVyeSggJy5iYWNrdXAtc3RlcC1zdGF0dXMtd29ya2luZycgKS5yZW1vdmVDbGFzcyggJ2JhY2t1cC1zdGVwLXN0YXR1cy13b3JraW5nJyApLmFkZENsYXNzKCAnYmFja3VwLXN0ZXAtc3RhdHVzLWVycm9yJyApOyAvLyBBbnl0aGluZyB0aGF0IHdhcyBjdXJyZW50bHkgcnVubmluZyB0dXJucyBpbnRvIGFuIGVycm9yLgoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zdG9wJyApLmNzcyggJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyApOwoJCWpRdWVyeSggJy5wYl9iYWNrdXBidWRkeV9ibGlua3onICkuY3NzKCAnYmFja2dyb3VuZC1wb3NpdGlvbicsICd0b3AnICk7IC8vIHR1cm4gb2ZmIGxlZAoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zbG90MV9sZWQnICkucmVtb3ZlQ2xhc3MoICdwYl9iYWNrdXBidWRkeV9ibGlua3onICk7IC8vIGRpc2FibGUgYmxpbmtpbmcKCQlqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2xvdDJfbGVkJyApLnJlbW92ZUNsYXNzKCAncGJfYmFja3VwYnVkZHlfYmxpbmt6JyApOyAvLyBkaXNhYmxlIGJsaW5raW5nCgkJalF1ZXJ5KCAnI3BiX2JhY2t1cGJ1ZGR5X3Nsb3QzX2xlZCcgKS5yZW1vdmVDbGFzcyggJ3BiX2JhY2t1cGJ1ZGR5X2JsaW5reicgKTsgLy8gZGlzYWJsZSBibGlua2luZwoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zbG90NF9sZWQnICkucmVtb3ZlQ2xhc3MoICdwYl9iYWNrdXBidWRkeV9lbXB0eScgKTsgLy8gUmVtb3ZlIGVtcHR5IExFRCBob2xlLgoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zbG90NF9sZWQnICkuYWRkQ2xhc3MoICdwYl9iYWNrdXBidWRkeV9jb2RlcmVkJyApOyAvLyBzZXQgY2hlY2ttYXJrCgkKCQkvLyBCcmllZmx5IHdhaXQKCQkvL3NldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQliYWNrdXBidWRkeV9sb2coICcqKionICk7CgkJaWYgKCAnJyAhPT0gYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICkgewoJCQliYWNrdXBidWRkeV9sb2coICcqIFVuZmluaXNoZWQgZnVuY3Rpb246IGAnICsgYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uICsgJ2AuJyApOwoJCX0gZWxzZSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJyogTm8gaW4tcHJvZ3Jlc3MgZnVuY3Rpb24gZGV0ZWN0ZWQuJyApOwoJCX0KCQoJCWlmICggJycgIT09IGJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJyogVW5maW5pc2hlZCBhY3Rpb246IGAnICsgYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiArICdgICgnICsgKCB1bml4X3RpbWVzdGFtcCgpIC0gYmFja3VwYnVkZHlfY3VycmVudEFjdGlvblN0YXJ0ICkgKyAnIHNlY29uZHMgYWdvKS4nICk7CgkJfSBlbHNlIHsKCQkJYmFja3VwYnVkZHlfbG9nKCAnKiBObyBpbi1wcm9ncmVzcyBhY3Rpb24gZGV0ZWN0ZWQuJyApOwoJCX0KCQliYWNrdXBidWRkeV9sb2coICcqKionICk7CgkKCQkvLyBDYWxjdWxhdGUgc3VnZ2VzdGlvbnMuCgkJLyoKCQkgaWYgKCAnaW1wb3J0YnVkZHlDcmVhdGlvbicgPT0gYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiApIHsKCQkgc3VnZ2VzdGlvbnMucHVzaCggewoJCSBkZXNjcmlwdGlvbjogJ0JhY2t1cEJ1ZGR5IGJ5IGRlZmF1bHQgaW5jbHVkZXMgYSBjb3B5IG9mIHRoZSByZXN0b3JlIHRvb2wsIGltcG9ydGJ1ZGR5LnBocCwgaW5zaWRlIHRoZSBiYWNrdXAgWklQIGZpbGUgZm9yIHJldHJpZXZhbCBpZiBuZWVkZWQgaW4gdGhlIGZ1dHVyZS4nLAoJCSBxdWlja0ZpeDogJ1R1cm4gb2ZmIGluY2x1c2lvbiBvZiBJbXBvcnRCdWRkeS4gTmF2aWdhdGUgdG8gU2V0dGluZ3M6IEFkdmFuY2VkIFNldHRpbmdzIC8gVHJvdWJsZXNob290aW5nIHRhYjogVW5jaGVjayAiSW5jbHVkZSBJbXBvcnRCdWRkeSBpbiBmdWxsIGJhY2t1cCBhcmNoaXZlIi4nLAoJCSBzb2x1dGlvbjogJ0luY3JlYXNlIGF2YWlsYWJsZSBQSFAgbWVtb3J5LicKCQkgfSApOwoJCSB9CgkJICovCgkKCQliYWNrdXBidWRkeV9zaG93U3VnZ2VzdGlvbnMoIHN1Z2dlc3Rpb25zICk7CgkKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJyogVGhlIGJhY2t1cCBoYXMgaGFsdGVkLicgKTsKCQl9LDUwMCk7CgkJYWxlcnQoICdUaGUgYmFja3VwIGhhcyBoYWx0ZWQuJyApOwoJCS8vfSwxMDAwKTsKCQoJfSk7Cgp9IC8vIGVuZCBsb2Fk ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/restoreEvents.js,importbuddy/js/restoreEvents.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/tooltip.js,importbuddy/js/tooltip.js LyoKICogalF1ZXJ5IFRvb2x0aXAgcGx1Z2luIDEuMwogKgogKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi10b29sdGlwLwogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvVG9vbHRpcAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IErDtnJuIFphZWZmZXJlcgogKgogKiAkSWQ6IGpxdWVyeS50b29sdGlwLmpzIDU3NDEgMjAwOC0wNi0yMSAxNToyMjoxNlogam9lcm4uemFlZmZlcmVyICQKICogCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqLwogCjsoZnVuY3Rpb24oJCkgewoJCgkJLy8gdGhlIHRvb2x0aXAgZWxlbWVudAoJdmFyIGhlbHBlciA9IHt9LAoJCS8vIHRoZSBjdXJyZW50IHRvb2x0aXBwZWQgZWxlbWVudAoJCWN1cnJlbnQsCgkJLy8gdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsIHVzZWQgZm9yIHJlc3RvcmluZwoJCXRpdGxlLAoJCS8vIHRpbWVvdXQgaWQgZm9yIGRlbGF5ZWQgdG9vbHRpcHMKCQl0SUQsCgkJLy8gSUUgNS41IG9yIDYKCQlJRSA9IGZhbHNlLAoJCS8vIGZsYWcgZm9yIG1vdXNlIHRyYWNraW5nCgkJdHJhY2sgPSBmYWxzZTsKCQoJJC50b29sdGlwID0gewoJCWJsb2NrZWQ6IGZhbHNlLAoJCWRlZmF1bHRzOiB7CgkJCWRlbGF5OiAyMDAsCgkJCWZhZGU6IGZhbHNlLAoJCQlzaG93VVJMOiB0cnVlLAoJCQlleHRyYUNsYXNzOiAiIiwKCQkJdG9wOiAxNSwKCQkJbGVmdDogMTUsCgkJCWlkOiAidG9vbHRpcCIKCQl9LAoJCWJsb2NrOiBmdW5jdGlvbigpIHsKCQkJJC50b29sdGlwLmJsb2NrZWQgPSAhJC50b29sdGlwLmJsb2NrZWQ7CgkJfQoJfTsKCQoJJC5mbi5leHRlbmQoewoJCXRvb2x0aXA6IGZ1bmN0aW9uKHNldHRpbmdzKSB7CgkJCXNldHRpbmdzID0gJC5leHRlbmQoe30sICQudG9vbHRpcC5kZWZhdWx0cywgc2V0dGluZ3MpOwoJCQljcmVhdGVIZWxwZXIoc2V0dGluZ3MpOwoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCSQuZGF0YSh0aGlzLCAidG9vbHRpcCIsIHNldHRpbmdzKTsKCQkJCQl0aGlzLnRPcGFjaXR5ID0gaGVscGVyLnBhcmVudC5jc3MoIm9wYWNpdHkiKTsKCQkJCQkvLyBjb3B5IHRvb2x0aXAgaW50byBpdHMgb3duIGV4cGFuZG8gYW5kIHJlbW92ZSB0aGUgdGl0bGUKCQkJCQl0aGlzLnRvb2x0aXBUZXh0ID0gdGhpcy50aXRsZTsKCQkJCQkkKHRoaXMpLnJlbW92ZUF0dHIoInRpdGxlIik7CgkJCQkJLy8gYWxzbyByZW1vdmUgYWx0IGF0dHJpYnV0ZSB0byBwcmV2ZW50IGRlZmF1bHQgdG9vbHRpcCBpbiBJRQoJCQkJCXRoaXMuYWx0ID0gIiI7CgkJCQl9KQoJCQkJLm1vdXNlb3ZlcihzYXZlKQoJCQkJLm1vdXNlb3V0KGhpZGUpCgkJCQkuY2xpY2soaGlkZSk7CgkJfSwKCQlmaXhQTkc6IElFID8gZnVuY3Rpb24oKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJdmFyIGltYWdlID0gJCh0aGlzKS5jc3MoJ2JhY2tncm91bmRJbWFnZScpOwoJCQkJaWYgKGltYWdlLm1hdGNoKC9edXJsXChbIiddPyguKlwucG5nKVsiJ10/XCkkL2kpKSB7CgkJCQkJaW1hZ2UgPSBSZWdFeHAuJDE7CgkJCQkJJCh0aGlzKS5jc3MoewoJCQkJCQknYmFja2dyb3VuZEltYWdlJzogJ25vbmUnLAoJCQkJCQknZmlsdGVyJzogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKGVuYWJsZWQ9dHJ1ZSwgc2l6aW5nTWV0aG9kPWNyb3AsIHNyYz0nIiArIGltYWdlICsgIicpIgoJCQkJCX0pLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJCQl2YXIgcG9zaXRpb24gPSAkKHRoaXMpLmNzcygncG9zaXRpb24nKTsKCQkJCQkJaWYgKHBvc2l0aW9uICE9ICdhYnNvbHV0ZScgJiYgcG9zaXRpb24gIT0gJ3JlbGF0aXZlJykKCQkJCQkJCSQodGhpcykuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOwoJCQkJCX0pOwoJCQkJfQoJCQl9KTsKCQl9IDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9LAoJCXVuZml4UE5HOiBJRSA/IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKCQkJCSQodGhpcykuY3NzKHsnZmlsdGVyJzogJycsIGJhY2tncm91bmRJbWFnZTogJyd9KTsKCQkJfSk7CgkJfSA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSwKCQloaWRlV2hlbkVtcHR5OiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQodGhpcylbICQodGhpcykuaHRtbCgpID8gInNob3ciIDogImhpZGUiIF0oKTsKCQkJfSk7CgkJfSwKCQl1cmw6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gdGhpcy5hdHRyKCdocmVmJykgfHwgdGhpcy5hdHRyKCdzcmMnKTsKCQl9Cgl9KTsKCQoJZnVuY3Rpb24gY3JlYXRlSGVscGVyKHNldHRpbmdzKSB7CgkJLy8gdGhlcmUgY2FuIGJlIG9ubHkgb25lIHRvb2x0aXAgaGVscGVyCgkJaWYoIGhlbHBlci5wYXJlbnQgKQoJCQlyZXR1cm47CgkJLy8gY3JlYXRlIHRoZSBoZWxwZXIsIGgzIGZvciB0aXRsZSwgZGl2IGZvciB1cmwKCQloZWxwZXIucGFyZW50ID0gJCgnPGRpdiBpZD0iJyArIHNldHRpbmdzLmlkICsgJyI+PGgzPjwvaDM+PGRpdiBjbGFzcz0iYm9keSI+PC9kaXY+PGRpdiBjbGFzcz0idXJsIj48L2Rpdj48L2Rpdj4nKQoJCQkvLyBhZGQgdG8gZG9jdW1lbnQKCQkJLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpCgkJCS8vIGhpZGUgaXQgYXQgZmlyc3QKCQkJLmhpZGUoKTsKCQkJCgkJLy8gYXBwbHkgYmdpZnJhbWUgaWYgYXZhaWxhYmxlCgkJaWYgKCAkLmZuLmJnaWZyYW1lICkKCQkJaGVscGVyLnBhcmVudC5iZ2lmcmFtZSgpOwoJCQoJCS8vIHNhdmUgcmVmZXJlbmNlcyB0byB0aXRsZSBhbmQgdXJsIGVsZW1lbnRzCgkJaGVscGVyLnRpdGxlID0gJCgnaDMnLCBoZWxwZXIucGFyZW50KTsKCQloZWxwZXIuYm9keSA9ICQoJ2Rpdi5ib2R5JywgaGVscGVyLnBhcmVudCk7CgkJaGVscGVyLnVybCA9ICQoJ2Rpdi51cmwnLCBoZWxwZXIucGFyZW50KTsKCX0KCQoJZnVuY3Rpb24gc2V0dGluZ3MoZWxlbWVudCkgewoJCXJldHVybiAkLmRhdGEoZWxlbWVudCwgInRvb2x0aXAiKTsKCX0KCQoJLy8gbWFpbiBldmVudCBoYW5kbGVyIHRvIHN0YXJ0IHNob3dpbmcgdG9vbHRpcHMKCWZ1bmN0aW9uIGhhbmRsZShldmVudCkgewoJCS8vIHNob3cgaGVscGVyLCBlaXRoZXIgd2l0aCB0aW1lb3V0IG9yIG9uIGluc3RhbnQKCQlpZiggc2V0dGluZ3ModGhpcykuZGVsYXkgKQoJCQl0SUQgPSBzZXRUaW1lb3V0KHNob3csIHNldHRpbmdzKHRoaXMpLmRlbGF5KTsKCQllbHNlCgkJCXNob3coKTsKCQkKCQkvLyBpZiBzZWxlY3RlZCwgdXBkYXRlIHRoZSBoZWxwZXIgcG9zaXRpb24gd2hlbiB0aGUgbW91c2UgbW92ZXMKCQl0cmFjayA9ICEhc2V0dGluZ3ModGhpcykudHJhY2s7CgkJJChkb2N1bWVudC5ib2R5KS5iaW5kKCdtb3VzZW1vdmUnLCB1cGRhdGUpOwoJCQkKCQkvLyB1cGRhdGUgYXQgbGVhc3Qgb25jZQoJCXVwZGF0ZShldmVudCk7Cgl9CgkKCS8vIHNhdmUgZWxlbWVudHMgdGl0bGUgYmVmb3JlIHRoZSB0b29sdGlwIGlzIGRpc3BsYXllZAoJZnVuY3Rpb24gc2F2ZSgpIHsKCQkvLyBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IHNvdXJjZSwgb3IgaXQgaGFzIG5vIHRpdGxlIChvY2N1cnMgd2l0aCBjbGljayBldmVudCksIHN0b3AKCQlpZiAoICQudG9vbHRpcC5ibG9ja2VkIHx8IHRoaXMgPT0gY3VycmVudCB8fCAoIXRoaXMudG9vbHRpcFRleHQgJiYgIXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyKSApCgkJCXJldHVybjsKCgkJLy8gc2F2ZSBjdXJyZW50CgkJY3VycmVudCA9IHRoaXM7CgkJdGl0bGUgPSB0aGlzLnRvb2x0aXBUZXh0OwoJCQoJCWlmICggc2V0dGluZ3ModGhpcykuYm9keUhhbmRsZXIgKSB7CgkJCWhlbHBlci50aXRsZS5oaWRlKCk7CgkJCXZhciBib2R5Q29udGVudCA9IHNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyLmNhbGwodGhpcyk7CgkJCWlmIChib2R5Q29udGVudC5ub2RlVHlwZSB8fCBib2R5Q29udGVudC5qcXVlcnkpIHsKCQkJCWhlbHBlci5ib2R5LmVtcHR5KCkuYXBwZW5kKGJvZHlDb250ZW50KQoJCQl9IGVsc2UgewoJCQkJaGVscGVyLmJvZHkuaHRtbCggYm9keUNvbnRlbnQgKTsKCQkJfQoJCQloZWxwZXIuYm9keS5zaG93KCk7CgkJfSBlbHNlIGlmICggc2V0dGluZ3ModGhpcykuc2hvd0JvZHkgKSB7CgkJCXZhciBwYXJ0cyA9IHRpdGxlLnNwbGl0KHNldHRpbmdzKHRoaXMpLnNob3dCb2R5KTsKCQkJaGVscGVyLnRpdGxlLmh0bWwocGFydHMuc2hpZnQoKSkuc2hvdygpOwoJCQloZWxwZXIuYm9keS5lbXB0eSgpOwoJCQlmb3IodmFyIGkgPSAwLCBwYXJ0OyAocGFydCA9IHBhcnRzW2ldKTsgaSsrKSB7CgkJCQlpZihpID4gMCkKCQkJCQloZWxwZXIuYm9keS5hcHBlbmQoIjxici8+Iik7CgkJCQloZWxwZXIuYm9keS5hcHBlbmQocGFydCk7CgkJCX0KCQkJaGVscGVyLmJvZHkuaGlkZVdoZW5FbXB0eSgpOwoJCX0gZWxzZSB7CgkJCWhlbHBlci50aXRsZS5odG1sKHRpdGxlKS5zaG93KCk7CgkJCWhlbHBlci5ib2R5LmhpZGUoKTsKCQl9CgkJCgkJLy8gaWYgZWxlbWVudCBoYXMgaHJlZiBvciBzcmMsIGFkZCBhbmQgc2hvdyBpdCwgb3RoZXJ3aXNlIGhpZGUgaXQKCQlpZiggc2V0dGluZ3ModGhpcykuc2hvd1VSTCAmJiAkKHRoaXMpLnVybCgpICkKCQkJaGVscGVyLnVybC5odG1sKCAkKHRoaXMpLnVybCgpLnJlcGxhY2UoJ2h0dHA6Ly8nLCAnJykgKS5zaG93KCk7CgkJZWxzZSAKCQkJaGVscGVyLnVybC5oaWRlKCk7CgkJCgkJLy8gYWRkIGFuIG9wdGlvbmFsIGNsYXNzIGZvciB0aGlzIHRpcAoJCWhlbHBlci5wYXJlbnQuYWRkQ2xhc3Moc2V0dGluZ3ModGhpcykuZXh0cmFDbGFzcyk7CgoJCS8vIGZpeCBQTkcgYmFja2dyb3VuZCBmb3IgSUUKCQlpZiAoc2V0dGluZ3ModGhpcykuZml4UE5HICkKCQkJaGVscGVyLnBhcmVudC5maXhQTkcoKTsKCQkJCgkJaGFuZGxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9CgkKCS8vIGRlbGV0ZSB0aW1lb3V0IGFuZCBzaG93IGhlbHBlcgoJZnVuY3Rpb24gc2hvdygpIHsKCQl0SUQgPSBudWxsOwoJCWlmICgoIUlFIHx8ICEkLmZuLmJnaWZyYW1lKSAmJiBzZXR0aW5ncyhjdXJyZW50KS5mYWRlKSB7CgkJCWlmIChoZWxwZXIucGFyZW50LmlzKCI6YW5pbWF0ZWQiKSkKCQkJCWhlbHBlci5wYXJlbnQuc3RvcCgpLnNob3coKS5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSwgY3VycmVudC50T3BhY2l0eSk7CgkJCWVsc2UKCQkJCWhlbHBlci5wYXJlbnQuaXMoJzp2aXNpYmxlJykgPyBoZWxwZXIucGFyZW50LmZhZGVUbyhzZXR0aW5ncyhjdXJyZW50KS5mYWRlLCBjdXJyZW50LnRPcGFjaXR5KSA6IGhlbHBlci5wYXJlbnQuZmFkZUluKHNldHRpbmdzKGN1cnJlbnQpLmZhZGUpOwoJCX0gZWxzZSB7CgkJCWhlbHBlci5wYXJlbnQuc2hvdygpOwoJCX0KCQl1cGRhdGUoKTsKCX0KCQoJLyoqCgkgKiBjYWxsYmFjayBmb3IgbW91c2Vtb3ZlCgkgKiB1cGRhdGVzIHRoZSBoZWxwZXIgcG9zaXRpb24KCSAqIHJlbW92ZXMgaXRzZWxmIHdoZW4gbm8gY3VycmVudCBlbGVtZW50CgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZShldmVudCkJewoJCWlmKCQudG9vbHRpcC5ibG9ja2VkKQoJCQlyZXR1cm47CgkJCgkJaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldC50YWdOYW1lID09ICJPUFRJT04iKSB7CgkJCXJldHVybjsKCQl9CgkJCgkJLy8gc3RvcCB1cGRhdGluZyB3aGVuIHRyYWNraW5nIGlzIGRpc2FibGVkIGFuZCB0aGUgdG9vbHRpcCBpcyB2aXNpYmxlCgkJaWYgKCAhdHJhY2sgJiYgaGVscGVyLnBhcmVudC5pcygiOnZpc2libGUiKSkgewoJCQkkKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlJywgdXBkYXRlKQoJCX0KCQkKCQkvLyBpZiBubyBjdXJyZW50IGVsZW1lbnQgaXMgYXZhaWxhYmxlLCByZW1vdmUgdGhpcyBsaXN0ZW5lcgoJCWlmKCBjdXJyZW50ID09IG51bGwgKSB7CgkJCSQoZG9jdW1lbnQuYm9keSkudW5iaW5kKCdtb3VzZW1vdmUnLCB1cGRhdGUpOwoJCQlyZXR1cm47CQoJCX0KCQkKCQkvLyByZW1vdmUgcG9zaXRpb24gaGVscGVyIGNsYXNzZXMKCQloZWxwZXIucGFyZW50LnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1yaWdodCIpLnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTsKCQkKCQl2YXIgbGVmdCA9IGhlbHBlci5wYXJlbnRbMF0ub2Zmc2V0TGVmdDsKCQl2YXIgdG9wID0gaGVscGVyLnBhcmVudFswXS5vZmZzZXRUb3A7CgkJaWYgKGV2ZW50KSB7CgkJCS8vIHBvc2l0aW9uIHRoZSBoZWxwZXIgMTUgcGl4ZWwgdG8gYm90dG9tIHJpZ2h0LCBzdGFydGluZyBmcm9tIG1vdXNlIHBvc2l0aW9uCgkJCWxlZnQgPSBldmVudC5wYWdlWCArIHNldHRpbmdzKGN1cnJlbnQpLmxlZnQ7CgkJCXRvcCA9IGV2ZW50LnBhZ2VZICsgc2V0dGluZ3MoY3VycmVudCkudG9wOwoJCQl2YXIgcmlnaHQ9J2F1dG8nOwoJCQlpZiAoc2V0dGluZ3MoY3VycmVudCkucG9zaXRpb25MZWZ0KSB7CgkJCQlyaWdodCA9ICQod2luZG93KS53aWR0aCgpIC0gbGVmdDsKCQkJCWxlZnQgPSAnYXV0byc7CgkJCX0KCQkJaGVscGVyLnBhcmVudC5jc3MoewoJCQkJbGVmdDogbGVmdCwKCQkJCXJpZ2h0OiByaWdodCwKCQkJCXRvcDogdG9wCgkJCX0pOwoJCX0KCQkKCQl2YXIgdiA9IHZpZXdwb3J0KCksCgkJCWggPSBoZWxwZXIucGFyZW50WzBdOwoJCS8vIGNoZWNrIGhvcml6b250YWwgcG9zaXRpb24KCQlpZiAodi54ICsgdi5jeCA8IGgub2Zmc2V0TGVmdCArIGgub2Zmc2V0V2lkdGgpIHsKCQkJbGVmdCAtPSBoLm9mZnNldFdpZHRoICsgMjAgKyBzZXR0aW5ncyhjdXJyZW50KS5sZWZ0OwoJCQloZWxwZXIucGFyZW50LmNzcyh7bGVmdDogbGVmdCArICdweCd9KS5hZGRDbGFzcygidmlld3BvcnQtcmlnaHQiKTsKCQl9CgkJLy8gY2hlY2sgdmVydGljYWwgcG9zaXRpb24KCQlpZiAodi55ICsgdi5jeSA8IGgub2Zmc2V0VG9wICsgaC5vZmZzZXRIZWlnaHQpIHsKCQkJdG9wIC09IGgub2Zmc2V0SGVpZ2h0ICsgMjAgKyBzZXR0aW5ncyhjdXJyZW50KS50b3A7CgkJCWhlbHBlci5wYXJlbnQuY3NzKHt0b3A6IHRvcCArICdweCd9KS5hZGRDbGFzcygidmlld3BvcnQtYm90dG9tIik7CgkJfQoJfQoJCglmdW5jdGlvbiB2aWV3cG9ydCgpIHsKCQlyZXR1cm4gewoJCQl4OiAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpLAoJCQl5OiAkKHdpbmRvdykuc2Nyb2xsVG9wKCksCgkJCWN4OiAkKHdpbmRvdykud2lkdGgoKSwKCQkJY3k6ICQod2luZG93KS5oZWlnaHQoKQoJCX07Cgl9CgkKCS8vIGhpZGUgaGVscGVyIGFuZCByZXN0b3JlIGFkZGVkIGNsYXNzZXMgYW5kIHRoZSB0aXRsZQoJZnVuY3Rpb24gaGlkZShldmVudCkgewoJCWlmKCQudG9vbHRpcC5ibG9ja2VkKQoJCQlyZXR1cm47CgkJLy8gY2xlYXIgdGltZW91dCBpZiBwb3NzaWJsZQoJCWlmKHRJRCkKCQkJY2xlYXJUaW1lb3V0KHRJRCk7CgkJLy8gbm8gbW9yZSBjdXJyZW50IGVsZW1lbnQKCQljdXJyZW50ID0gbnVsbDsKCQkKCQl2YXIgdHNldHRpbmdzID0gc2V0dGluZ3ModGhpcyk7CgkJZnVuY3Rpb24gY29tcGxldGUoKSB7CgkJCWhlbHBlci5wYXJlbnQucmVtb3ZlQ2xhc3MoIHRzZXR0aW5ncy5leHRyYUNsYXNzICkuaGlkZSgpLmNzcygib3BhY2l0eSIsICIiKTsKCQl9CgkJaWYgKCghSUUgfHwgISQuZm4uYmdpZnJhbWUpICYmIHRzZXR0aW5ncy5mYWRlKSB7CgkJCWlmIChoZWxwZXIucGFyZW50LmlzKCc6YW5pbWF0ZWQnKSkKCQkJCWhlbHBlci5wYXJlbnQuc3RvcCgpLmZhZGVUbyh0c2V0dGluZ3MuZmFkZSwgMCwgY29tcGxldGUpOwoJCQllbHNlCgkJCQloZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlT3V0KHRzZXR0aW5ncy5mYWRlLCBjb21wbGV0ZSk7CgkJfSBlbHNlCgkJCWNvbXBsZXRlKCk7CgkJCgkJaWYoIHNldHRpbmdzKHRoaXMpLmZpeFBORyApCgkJCWhlbHBlci5wYXJlbnQudW5maXhQTkcoKTsKCX0KCQp9KShqUXVlcnkpOwo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/tooltip.js,importbuddy/js/tooltip.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ui.core.js,importbuddy/js/ui.core.js LyohCiAqIGpRdWVyeSBVSSAxLjguMTIKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJCiAqLwooZnVuY3Rpb24oYyxqKXtmdW5jdGlvbiBrKGEpe3JldHVybiFjKGEpLnBhcmVudHMoKS5hbmRTZWxmKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIGMuY3VyQ1NTKHRoaXMsInZpc2liaWxpdHkiKT09PSJoaWRkZW4ifHxjLmV4cHIuZmlsdGVycy5oaWRkZW4odGhpcyl9KS5sZW5ndGh9Yy51aT1jLnVpfHx7fTtpZighYy51aS52ZXJzaW9uKXtjLmV4dGVuZChjLnVpLHt2ZXJzaW9uOiIxLjguMTIiLGtleUNvZGU6e0FMVDoxOCxCQUNLU1BBQ0U6OCxDQVBTX0xPQ0s6MjAsQ09NTUE6MTg4LENPTU1BTkQ6OTEsQ09NTUFORF9MRUZUOjkxLENPTU1BTkRfUklHSFQ6OTMsQ09OVFJPTDoxNyxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsSU5TRVJUOjQ1LExFRlQ6MzcsTUVOVTo5MyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LApOVU1QQURfU1VCVFJBQ1Q6MTA5LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU0hJRlQ6MTYsU1BBQ0U6MzIsVEFCOjksVVA6MzgsV0lORE9XUzo5MX19KTtjLmZuLmV4dGVuZCh7X2ZvY3VzOmMuZm4uZm9jdXMsZm9jdXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGE9PT0ibnVtYmVyIj90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjKGQpLmZvY3VzKCk7YiYmYi5jYWxsKGQpfSxhKX0pOnRoaXMuX2ZvY3VzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sc2Nyb2xsUGFyZW50OmZ1bmN0aW9uKCl7dmFyIGE7YT1jLmJyb3dzZXIubXNpZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT90aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKHJlbGF0aXZlfGFic29sdXRlfGZpeGVkKS8udGVzdChjLmN1ckNTUyh0aGlzLAoicG9zaXRpb24iLDEpKSYmLyhhdXRvfHNjcm9sbCkvLnRlc3QoYy5jdXJDU1ModGhpcywib3ZlcmZsb3ciLDEpK2MuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXkiLDEpK2MuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXgiLDEpKX0pLmVxKDApOnRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8oYXV0b3xzY3JvbGwpLy50ZXN0KGMuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTtyZXR1cm4vZml4ZWQvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwhYS5sZW5ndGg/Yyhkb2N1bWVudCk6YX0sekluZGV4OmZ1bmN0aW9uKGEpe2lmKGEhPT1qKXJldHVybiB0aGlzLmNzcygiekluZGV4IixhKTtpZih0aGlzLmxlbmd0aCl7YT1jKHRoaXNbMF0pO2Zvcih2YXIgYjthLmxlbmd0aCYmYVswXSE9PWRvY3VtZW50Oyl7Yj1hLmNzcygicG9zaXRpb24iKTsKaWYoYj09PSJhYnNvbHV0ZSJ8fGI9PT0icmVsYXRpdmUifHxiPT09ImZpeGVkIil7Yj1wYXJzZUludChhLmNzcygiekluZGV4IiksMTApO2lmKCFpc05hTihiKSYmYiE9PTApcmV0dXJuIGJ9YT1hLnBhcmVudCgpfX1yZXR1cm4gMH0sZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoKGMuc3VwcG9ydC5zZWxlY3RzdGFydD8ic2VsZWN0c3RhcnQiOiJtb3VzZWRvd24iKSsiLnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSk7Yy5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZixnLGwsbSl7Yy5lYWNoKGUsZnVuY3Rpb24oKXtnLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGYsInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHwwO2lmKGwpZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLAoiYm9yZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwO2lmKG0pZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLCJtYXJnaW4iK3RoaXMsdHJ1ZSkpfHwwfSk7cmV0dXJuIGd9dmFyIGU9Yj09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGg9Yi50b0xvd2VyQ2FzZSgpLGk9e2lubmVyV2lkdGg6Yy5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmMuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDpjLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6Yy5mbi5vdXRlckhlaWdodH07Yy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKGYpe2lmKGY9PT1qKXJldHVybiBpWyJpbm5lciIrYl0uY2FsbCh0aGlzKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5jc3MoaCxkKHRoaXMsZikrInB4Iil9KX07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGYsZyl7aWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gaVsib3V0ZXIiK2JdLmNhbGwodGhpcyxmKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5jc3MoaCwKZCh0aGlzLGYsdHJ1ZSxnKSsicHgiKX0pfX0pO2MuZXh0ZW5kKGMuZXhwclsiOiJdLHtkYXRhOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4hIWMuZGF0YShhLGRbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGQ9Yy5hdHRyKGEsInRhYmluZGV4Iik7aWYoImFyZWEiPT09Yil7Yj1hLnBhcmVudE5vZGU7ZD1iLm5hbWU7aWYoIWEuaHJlZnx8IWR8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJtYXAiKXJldHVybiBmYWxzZTthPWMoImltZ1t1c2VtYXA9IyIrZCsiXSIpWzBdO3JldHVybiEhYSYmayhhKX1yZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGIpPyFhLmRpc2FibGVkOiJhIj09Yj9hLmhyZWZ8fCFpc05hTihkKTohaXNOYU4oZCkpJiZrKGEpfSx0YWJiYWJsZTpmdW5jdGlvbihhKXt2YXIgYj1jLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4oaXNOYU4oYil8fGI+PTApJiZjKGEpLmlzKCI6Zm9jdXNhYmxlIil9fSk7CmMoZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5ib2R5LGI9YS5hcHBlbmRDaGlsZChiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtjLmV4dGVuZChiLnN0eWxlLHttaW5IZWlnaHQ6IjEwMHB4IixoZWlnaHQ6ImF1dG8iLHBhZGRpbmc6MCxib3JkZXJXaWR0aDowfSk7Yy5zdXBwb3J0Lm1pbkhlaWdodD1iLm9mZnNldEhlaWdodD09PTEwMDtjLnN1cHBvcnQuc2VsZWN0c3RhcnQ9Im9uc2VsZWN0c3RhcnQiaW4gYjthLnJlbW92ZUNoaWxkKGIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7Yy5leHRlbmQoYy51aSx7cGx1Z2luOnthZGQ6ZnVuY3Rpb24oYSxiLGQpe2E9Yy51aVthXS5wcm90b3R5cGU7Zm9yKHZhciBlIGluIGQpe2EucGx1Z2luc1tlXT1hLnBsdWdpbnNbZV18fFtdO2EucGx1Z2luc1tlXS5wdXNoKFtiLGRbZV1dKX19LGNhbGw6ZnVuY3Rpb24oYSxiLGQpe2lmKChiPWEucGx1Z2luc1tiXSkmJmEuZWxlbWVudFswXS5wYXJlbnROb2RlKWZvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKWEub3B0aW9uc1tiW2VdWzBdXSYmCmJbZV1bMV0uYXBwbHkoYS5lbGVtZW50LGQpfX0sY29udGFpbnM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNjphIT09YiYmYS5jb250YWlucyhiKX0saGFzU2Nyb2xsOmZ1bmN0aW9uKGEsYil7aWYoYyhhKS5jc3MoIm92ZXJmbG93Iik9PT0iaGlkZGVuIilyZXR1cm4gZmFsc2U7Yj1iJiZiPT09ImxlZnQiPyJzY3JvbGxMZWZ0Ijoic2Nyb2xsVG9wIjt2YXIgZD1mYWxzZTtpZihhW2JdPjApcmV0dXJuIHRydWU7YVtiXT0xO2Q9YVtiXT4wO2FbYl09MDtyZXR1cm4gZH0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGE+YiYmYTxiK2R9LGlzT3ZlcjpmdW5jdGlvbihhLGIsZCxlLGgsaSl7cmV0dXJuIGMudWkuaXNPdmVyQXhpcyhhLGQsaCkmJmMudWkuaXNPdmVyQXhpcyhiLGUsaSl9fSl9fSkoalF1ZXJ5KTs= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ui.core.js,importbuddy/js/ui.core.js ###PACKDATA,FILE_START,/_importbuddy/importbuddy/lib/index.php,importbuddy/lib/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/lib/index.php,importbuddy/lib/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_assets.php,importbuddy/views/_assets.php PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdzdHlsZS5jc3MnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnbnByb2dyZXNzLmNzcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhbmltYXRlLmNzcycgKTsKCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2pxdWVyeS5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAndWkuY29yZS5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAndG9vbHRpcC5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnbnByb2dyZXNzLmpzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdpbXBvcnRidWRkeS5qcycgKTs= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_assets.php,importbuddy/views/_assets.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_dbreplace.php,importbuddy/views/_dbreplace.php PD9waHAKaWYgKCAhIGlzX2FkbWluKCkgKSB7IC8vIE5vdCBpbiBXb3JkUHJlc3MgKG9yIG5vdCBsb2dnZWQgaW4pLiBDaGVjayBpZiBpbiBJbXBvcnRCdWRkeS4KCWlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgfHwgKCB0cnVlICE9PSBQQl9JTVBPUlRCVUREWSApICkgeyAvLyBOb3QgaW4gSW1wb3J0QnVkZHkuCgkJZGllKCAnPGh0bWw+PC9odG1sPicgKTsKCX0KCS8vIEluIEltcG9ydEJ1ZGR5IHNvIGNoZWNrIGF1dGhlbnRpY2F0aW9uLgoJQXV0aDo6cmVxdWlyZV9hdXRoZW50aWNhdGlvbigpOyAvLyBEaWUgaWYgbm90IGxvZ2dlZCBpbi4KfQoKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnICk7Cmdsb2JhbCAkd3BkYjsKCgplY2hvICc8YSBuYW1lPSJkYXRhYmFzZV9yZXBsYWNlIj48L2E+JzsKZWNobyAnVGhpcyB0b29sIGFsbG93cyB5b3UgdG8gYXV0b21hdGljYWxseSByZXBsYWNlIHRleHQgY29udGFpbmVkIHRocm91Z2hvdXQgeW91ciBXb3JkUHJlc3MgZGF0YWJhc2UuPGJyPic7CmVjaG8gJzxicj48Yj5Ob3RlOjwvYj4gSW1wb3J0QnVkZHkgYXV0b21hdGljYWxseSBoYW5kbGVzIG1pZ3JhdGluZyAmIHJlcGxhY2luZyB5b3VyIHNpdGUgVVJMcyBhbmQgZmlsZSBwYXRocyBkdXJpbmcgcmVzdG9yZS9taWdyYXRpb247IHRoaXMgdG9vbCBpcyBub3QgbmVlZGVkIGZvciBub3JtYWwgYmFja3VwIC8gcmVzdG9yZSBvcGVyYXRpb25zLic7CmVjaG8gJzxwPjxiPlRpcDo8L2I+IFdoZW4gcmVwbGFjaW5nIGEgc2l0ZSBhZGRyZXNzIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIFVSTCBzbyBtdWx0aXBsZSBwYXNzZXMgYXQgcmVwbGFjZW1lbnRzIG1heSBuZWVkIHRvIGJlIG1hZGUuIEllLiBodHRwOi8vc2l0ZS5jb20sIGh0dHA6Ly88Yj53d3cuPC9iPnNpdGUuY29tLCBodHRwPGI+czwvYj46Ly9zaXRlLmNvbSwgZXRjLjwvcD4nOwplY2hvICc8cD48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9idWxsZXRfZXJyb3IucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7Ij4gQ2F1dGlvbjogVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlLiBVc2Ugd2l0aCBjYXJlOyBpbXByb3BlciB1c2UgbWF5IHJlc3VsdCBpbiBkYXRhIGxvc3MuPC9wPic7CmVjaG8gJzxicj4nOwoKCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkYXRhYmFzZV9yZXBsYWNlJyApID09ICcxJyApIHsKCQoJZ2xvYmFsICRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXM7CgkkcGJfYmFja3VwYnVkZHlfanNfc3RhdHVzID0gdHJ1ZTsKCQoJCgllY2hvICc8ZGl2IGlkPSJwYl9pbXBvcnRidWRkeV93b3JraW5nIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nX2xhcmdlLmdpZiIgdGl0bGU9IldvcmtpbmcuLi4gUGxlYXNlIHdhaXQgYXMgdGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLiI+PC9kaXY+JzsKCWVjaG8gJzxzY3JpcHQ+alF1ZXJ5KCIjcGJfYmFja3VwYnVkZHlfc3RhdHVzX3dyYXAiKS5zaG93KCk7PC9zY3JpcHQ+JzsKCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJLy9lY2hvICc8ZGl2IGlkPSJwYl9iYWNrdXBidWRkeV9yZXBsYWNlX3dvcmtpbmciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmdfbGFyZ2UuZ2lmIiB0aXRsZT0iV29ya2luZy4uLiBQbGVhc2Ugd2FpdCBhcyB0aGlzIG1heSB0YWtlIGEgbW9tZW50Li4uIj48L2Rpdj4nOwoJCgkvLyBJbnN0YW50aWF0ZSBkYXRhYmFzZSByZXBsYWNlbWVudCBjbGFzcy4KCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9kYnJlcGxhY2UvZGJyZXBsYWNlLnBocCcgKTsKCSRkYnJlcGxhY2UgPSBuZXcgcGx1Z2luYnVkZHlfZGJyZXBsYWNlKCAnJywgMSwgNjAqNjAqMjQgKTsKCQoJLy8gU2V0IHVwIHZhcmlhYmxlcyBieSBnZXR0aW5nIFBPU1QgZGF0YS4KCSRuZWVkbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpkYmVzY2FwZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbmVlZGxlJyApICk7CglpZiAoICRuZWVkbGUgPT0gJycgKSB7CgkJZWNobyAnPGI+RXJyb3IgIzQ0NTY1ODIuIE1pc3NpbmcgbmVlZGxlLiBZb3UgbXVzdCBlbnRlciB0ZXh0IHRvIHNlYXJjaCBmb3IuJzsKCQllY2hvICc8YnI+PGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyZwYXJlbnRfY29uZmlnPScgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncGFyZW50X2NvbmZpZycgKSApIC4gJyIgY2xhc3M9ImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIj4mbGFycjsgJyAuICBfXyggJ2JhY2snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2E+JzsKCQlyZXR1cm47Cgl9CgkkcmVwbGFjZW1lbnQgPSBiYWNrdXBidWRkeV9jb3JlOjpkYmVzY2FwZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncmVwbGFjZW1lbnQnICkgKTsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2luZyBgJyAuICRuZWVkbGUgLiAnYCB3aXRoIGAnIC4gJHJlcGxhY2VtZW50IC4gJ2AuJyApOwoJLyoKCWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWF5YmVfc2VyaWFsaXplZCcgKSA9PSAndHJ1ZScgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQWNjb3VudGluZyBmb3Igc2VyaWFsaXplZCBkYXRhIGJhc2VkIG9uIHNldHRpbmdzLicgKTsKCQkkbWF5YmVfc2VyaWFsaXplZCA9IHRydWU7Cgl9IGVsc2UgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ05PVCBhY2NvdW50aW5nIGZvciBzZXJpYWxpemVkIGRhdGEgYmFzZWQgb24gc2V0dGluZ3MuIFVzZSB3aXRoIGNhdXRpb24uJyApOwoJCSRtYXliZV9zZXJpYWxpemVkID0gZmFsc2U7Cgl9CgkqLwoJCgkKCS8vIFJlcGxhY2UgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGFibGUgcmVwbGFjZW1lbnQgc2VsZWN0ZWQuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3RhYmxlX3NlbGVjdGlvbicgKSA9PSAnYWxsJyApIHsgLy8gQWxsIHRhYmxlcy4KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNpbmcgaW4gYWxsIHRhYmxlcyBiYXNlZCBvbiBzZXR0aW5ncy4nICk7CgkJCgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFUyIsIEFSUkFZX04gKTsKCQlmb3JlYWNoKCAkcmVzdWx0cyBhcyAkcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNpbmcgaW4gdGFibGUgYCcgLiAkcmVzdWx0WzBdIC4gJ2AuJyApOwoJCQkkZGJyZXBsYWNlLT5icnV0ZWZvcmNlX3RhYmxlKCAkcmVzdWx0WzBdLCBhcnJheSggJG5lZWRsZSApLCBhcnJheSggJHJlcGxhY2VtZW50ICkgKTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjZW1lbnQgZmluaXNoZWQuJyApOwoJCQoJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd0YWJsZV9zZWxlY3Rpb24nICkgPT0gJ3NpbmdsZV90YWJsZScgKSB7CgkJCgkJJHRhYmxlID0gYmFja3VwYnVkZHlfY29yZTo6ZGJlc2NhcGUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3RhYmxlJyApICk7IC8vIFNpbmdsZSBzcGVjaWZpZWQgdGFibGUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjaW5nIGluIHNpbmdsZSB0YWJsZSBgJyAuICR0YWJsZSAuICdgIGJhc2VkIG9uIHNldHRpbmdzLicgKTsKCQkkZGJyZXBsYWNlLT5icnV0ZWZvcmNlX3RhYmxlKCAkdGFibGUsIGFycmF5KCAkbmVlZGxlICksIGFycmF5KCAkcmVwbGFjZW1lbnQgKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2VtZW50IGZpbmlzaGVkLicgKTsKCQkKCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAndGFibGVfc2VsZWN0aW9uJyApID09ICdwcmVmaXgnICkgeyAvLyBNYXRjaGluZyB0YWJsZSBwcmVmaXguCgkJCgkJJHByZWZpeCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmRiZXNjYXBlKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd0YWJsZV9wcmVmaXgnICkgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNpbmcgaW4gYWxsIHRhYmxlcyBtYXRjaGluZyBwcmVmaXggYCcgLiAkcHJlZml4IC4gJ2AuJyApOwoJCQoJCSRlc2NhcGVkX3ByZWZpeCA9IHN0cl9yZXBsYWNlKCAnXycsICdcXycsICRwcmVmaXggKTsKCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgVEFCTEVTIExJS0UgJ3skZXNjYXBlZF9wcmVmaXh9JSciLCBBUlJBWV9OICk7CgkJZm9yZWFjaCggJHJlc3VsdHMgYXMgJHJlc3VsdCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjaW5nIGluIHRhYmxlIGAnIC4gJHJlc3VsdFswXSAuICdgLicgKTsKCQkJJGRicmVwbGFjZS0+YnJ1dGVmb3JjZV90YWJsZSggJHJlc3VsdFswXSwgYXJyYXkoICRuZWVkbGUgKSwgYXJyYXkoICRyZXBsYWNlbWVudCApICk7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2VtZW50IGZpbmlzaGVkLicgKTsKCQkKCX0gZWxzZSB7CgkJZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmpRdWVyeSgiI3BiX2ltcG9ydGJ1ZGR5X3dvcmtpbmciKS5oaWRlKCk7PC9zY3JpcHQ+JzsKCQlkaWUoICdFcnJvciAjNDQ1Njg5MzQ4OTM0OTgzNC4gVW5rbm93biBtZXRob2QuJyApOwoJfQoJCgllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+alF1ZXJ5KCIjcGJfaW1wb3J0YnVkZHlfd29ya2luZyIpLmhpZGUoKTs8L3NjcmlwdD4nOwoJZWNobyAnPGJyPjxhIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmcGFyZW50X2NvbmZpZz0nIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgKSAuICciIGNsYXNzPSJidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiI+JmxhcnI7ICcgLiAgX18oICdiYWNrJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPic7CgkKCSRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXMgPSBmYWxzZTsKCXJldHVybjsKfQoKCiR0YWJsZXMgPSBhcnJheSgpOwokcHJlZml4ZXMgPSBhcnJheSgpOwoKLy8gTWFrZSBzdXJlIHRoaXMgV1AncyBwcmVmaXggaXMgaW4gdGhlcmUgZm9yIHN1cmUgKHVzZWZ1bCBpZiBzb21lb25lIHVzZXMgYSBwcmVmaXggdGhhdCBoYXMgYW4gdW5kZXJzY29yZSBpbiBpdDsgdGhleSBzaG91bGRudCBidXQgdGhleSBkbykuCmdsb2JhbCAkdGFibGVfcHJlZml4OwokcHJlZml4ZXNbXSA9ICR0YWJsZV9wcmVmaXg7CgovLyBDYWxjdWxhdGUgcHJlZml4ZXMgZm91bmQgaW4gdGhpcyBkYXRhYmFzZS4gRG9lcyBub3QgaGFuZGxlIG11bHRpcGxlLXVuZGVyc2NvcmUKJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFUyIsIEFSUkFZX04gKTsKZm9yZWFjaCggJHJlc3VsdHMgYXMgJHJlc3VsdCApIHsKCSR0YWJsZXNbXSA9ICRyZXN1bHRbMF07CglpZiAoIHByZWdfbWF0Y2goICcvW2EtekEtWjAtOV0qXyhbMC05XStfKSovaScsICRyZXN1bHRbMF0sICRtYXRjaGVzICkgKSB7CgkJJHByZWZpeGVzW10gPSAkbWF0Y2hlc1swXTsKCX0KfQoKJHByZWZpeGVzID0gYXJyYXlfdW5pcXVlKCAkcHJlZml4ZXMgKTsKbmF0c29ydCggJHByZWZpeGVzICk7CgoKPz4KCgo8ZGl2PgoJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpOz8+JmRhdGFiYXNlX3JlcGxhY2U9MSZwYXJlbnRfY29uZmlnPTw/cGhwIGVjaG8gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgKTsgPz4iIG1ldGhvZD0icG9zdCI+CgkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0icmVwbGFjZSI+CgkJCgkJPGg0PlJlcGxhY2UgPD9waHAgcGJfYmFja3VwYnVkZHk6OnRpcCggJ1RleHQgeW91IHdhbnQgdG8gYmUgc2VhcmNoZWQgZm9yIGFuZCByZXBsYWNlZC4gRXZlcnl0aGluZyBpbiB0aGUgYm94IGlzIGNvbnNpZGVyZWQgb25lIG1hdGNoIGFuZCBtYXkgc3BhbiBtdWx0aXBsZSBsaW5lcy4nICk7ID8+PC9oND4KCQk8dGV4dGFyZWEgbmFtZT0ibmVlZGxlIiBzdHlsZT0id2lkdGg6IDEwMCU7Ij48L3RleHRhcmVhPgoJCTxicj4KCQkKCQk8aDQ+V2l0aCA8P3BocCBwYl9iYWNrdXBidWRkeTo6dGlwKCAnVGV4dCB5b3Ugd2FudCB0byByZXBsYWNlIHdpdGguIEFueSB0ZXh0IGZvdW5kIG1hdGNoaW5nIHRoZSBib3ggYWJvdmUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoaXMgdGV4dC4gRXZlcnl0aGluZyBpbiB0aGUgYm94IGlzIGNvbnNpZGVyZWQgb25lIG1hdGNoIGFuZCBtYXkgc3BhbiBtdWx0aXBsZSBsaW5lcy4nICk7ID8+PC9oND4KCQk8dGV4dGFyZWEgbmFtZT0icmVwbGFjZW1lbnQiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPjwvdGV4dGFyZWE+CgkJCgkJPGg0PkluIHRhYmxlKHMpPC9oND4KCQk8bGFiZWwgc3R5bGU9ImZsb2F0OiBub25lOyIgZm9yPSJ0YWJsZV9zZWxlY3Rpb25fYWxsIj48aW5wdXQgaWQ9InRhYmxlX3NlbGVjdGlvbl9hbGwiICBjaGVja2VkPSdjaGVja2VkJyB0eXBlPSJyYWRpbyIgbmFtZT0idGFibGVfc2VsZWN0aW9uIiB2YWx1ZT0iYWxsIj4gYWxsIHRhYmxlczwvbGFiZWw+CgkJPGxhYmVsIHN0eWxlPSJmbG9hdDogbm9uZTsiIGZvcj0idGFibGVfc2VsZWN0aW9uX3ByZWZpeCI+PGlucHV0IGlkPSJ0YWJsZV9zZWxlY3Rpb25fcHJlZml4IiB0eXBlPSJyYWRpbyIgbmFtZT0idGFibGVfc2VsZWN0aW9uIiB2YWx1ZT0icHJlZml4Ij4gd2l0aCBwcmVmaXg6PC9sYWJlbD4KCQk8c2VsZWN0IG5hbWU9InRhYmxlX3ByZWZpeCIgaWQ9InRhYmxlX3NlbGVjdGlvbl9wcmVmaXgiIG9uY2xpY2s9ImpRdWVyeSgnI3RhYmxlX3NlbGVjdGlvbl9wcmVmaXgnKS5jbGljaygpOyI+CgkJCTw/cGhwCgkJCWZvcmVhY2goICRwcmVmaXhlcyBhcyAkcHJlZml4ICkgewoJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRwcmVmaXggLiAnIj4nIC4gJHByZWZpeCAuICc8L29wdGlvbj4nOwoJCQl9CgkJCT8+CgkJPC9zZWxlY3Q+CgkJPGxhYmVsIHN0eWxlPSJmbG9hdDogbm9uZTsiIGZvcj0idGFibGVfc2VsZWN0aW9uX3RhYmxlIj48aW5wdXQgaWQ9InRhYmxlX3NlbGVjdGlvbl90YWJsZSIgdHlwZT0icmFkaW8iIG5hbWU9InRhYmxlX3NlbGVjdGlvbiIgdmFsdWU9InNpbmdsZV90YWJsZSI+IHNpbmdsZTo8L2xhYmVsPgoJCTxzZWxlY3QgbmFtZT0idGFibGUiIGlkPSJ0YWJsZV9zZWxlY3Rpb25fdGFibGUiIG9uY2xpY2s9ImpRdWVyeSgnI3RhYmxlX3NlbGVjdGlvbl90YWJsZScpLmNsaWNrKCk7Ij4KCQkJPD9waHAKCQkJZm9yZWFjaCggJHRhYmxlcyBhcyAkdGFibGUgKSB7CgkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSInIC4gJHRhYmxlIC4gJyI+JyAuICR0YWJsZSAuICc8L29wdGlvbj4nOwoJCQl9CgkJCT8+CgkJPC9zZWxlY3Q+CgkJPGg0PkluIGRhdGFiYXNlPC9oND4KCQkiPD9waHAgZWNobyAkZGF0YWJhc2VTZXR0aW5nc1snbmFtZSddOyA/PiIgb24gaG9zdCAiPD9waHAgZWNobyAkZGF0YWJhc2VTZXR0aW5nc1snaG9zdCddOyA/PiIgd2l0aCB1c2VybmFtZSAiPD9waHAgZWNobyAkZGF0YWJhc2VTZXR0aW5nc1sndXNlcm5hbWUnXTsgPz4iLgoJCTw/cGhwCgkJaWYgKCBzdWJzdHJfY291bnQoICR0YWJsZV9wcmVmaXgsICdfJyApID4gMSApIHsKCQkJZWNobyAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPldhcm5pbmc8L3NwYW4+ICc7CgkJCV9lKCAiU2l0ZSB0YWJsZSBwcmVmaXggY29udGFpbnMgbXVsdGlwbGUgdW5kZXJzY29yZXMuIFByZWZpeCBsaXN0IG1heSBiZSBpbmFjY3VyYXRlIGlmIHRoZXNlIGFyZSBub3QgTXVsdGlzaXRlIHN1YnNpdGVzLiIsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCX0KCQkvKgoJCTxoND5XaXRoIGFkdmFuY2VkIG9wdGlvbnM8L2g0PgoJCTxsYWJlbCBmb3I9Im1heWJlX3NlcmlhbGl6ZWQiPjxpbnB1dCBpZD0ibWF5YmVfc2VyaWFsaXplZCIgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1heWJlX3NlcmlhbGl6ZWQiIHZhbHVlPSJ0cnVlIiBjaGVja2VkPSJjaGVja2VkIj4gVHJlYXQgZmllbGRzIGFzIHBvc3NpYmx5IGNvbnRhaW5pbmcgc2VyaWFsaXplZCBkYXRhICh1bmNoZWNrIHdpdGggY2F1dGlvbjsgc2xvd2VyKS48L2xhYmVsPgoJCSovCgkJPz48YnI+PGJyPgoJCgkJPHA+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkJlZ2luIFJlcGxhY2VtZW50IiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IiAvPiA8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPkNhdXRpb247IHRoaXMgY2Fubm90IGJlIHVuZG9uZS4gU2VyaWFsaXplZCBkYXRhIGlzIGhhbmRsZWQgYnkgdGhpcyByZXBsYWNlbWVudC48L3NwYW4+CgkJPC9wPgoJPC9mb3JtPgo8L2Rpdj4K ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_dbreplace.php,importbuddy/views/_dbreplace.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_footer.php,importbuddy/views/_footer.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+Cgo8L2Rpdj4KPC9kaXY+CgoKPC9ib2R5Pgo8L2h0bWw+Cg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_footer.php,importbuddy/views/_footer.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_header.php,importbuddy/views/_header.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgIGRpcj0ibHRyIiBsYW5nPSJlbi1VUyI+Cgk8aGVhZD4KCQk8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CgkJPHRpdGxlPkltcG9ydEJ1ZGR5IHY8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddOyA/PiBSZXN0b3JlIC8gTWlncmF0aW9uIFRvb2wgLSBQb3dlcmVkIGJ5IEJhY2t1cEJ1ZGR5PC90aXRsZT4KCQk8bWV0YSBuYW1lPSJST0JPVFMiIGNvbnRlbnQ9Ik5PSU5ERVgsIE5PRk9MTE9XIj4KCQkKCQk8P3BocAoJCXJlcXVpcmUoICdfYXNzZXRzLnBocCcgKTsKCQk/PgoJCQoJCTxsaW5rIHJlbD0iaWNvbiIgdHlwZT0iaW1hZ2UvcG5nIiBocmVmPSJpbXBvcnRidWRkeS9pbWFnZXMvZmF2aWNvbi5wbmciPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQkJd2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oIGVycm9yTXNnLCB1cmwsIGxpbmVOdW1iZXIsIGNvbE51bWJlciwgZXJyb3IgKXsKCQkJCWFsZXJ0KCAiRXJyb3IgIzQzOTc0MzogQSBqYXZhc2NyaXB0IGVycm9yIG9jY3VycmVkIHdoaWNoIE1BWSBwcmV2ZW50IHRoZSByZXN0b3JlIGZyb20gY29udGludWluZy4gX0lGXyB0aGUgcHJvY2VzcyBsZXRzIHlvdSBwcm9jZWVkIHRoZW4gaWdub3JlIHRoaXMgbWVzc2FnZS4gQ2hlY2sgdGhlIFN0YXR1cyBMb2cgb3IgYnJvd3NlciBlcnJvciBjb25zb2xlIGZvciB0cmFjZSBkZXRhaWxzLlxuXG5NZXNzYWdlOiBgIiArIGVycm9yTXNnICsgImAuXG5VUkw6IGAiICsgdXJsICsgImAuXG5MaW5lOiBgIiArIGxpbmVOdW1iZXIgKyAiYCIgKTsKCQkJCWJhY2t1cGJ1ZGR5X2xvZyggJ0phdmFzY3JpcHQgRXJyb3IuIE1lc3NhZ2U6IGAnICsgZXJyb3JNc2cgKyAnYCwgVVJMOiBgJyArIHVybCArICdgLCBMaW5lOiBgJyArIGxpbmVOdW1iZXIgKyAnYCwgQ29sOiBgJyArIGNvbE51bWJlciArICdgLCBUcmFjZTogYCcgKyBlcnJvci5zdGFjayArICdgLicgKTsgLy8gQXR0ZW1wdCB0byBsb2cuCgkJCX0KCQkJCgkJCXZhciBzdGF0dXNCb3g7IC8vIE1ha2UgZ2xvYmFsLgoJCQl2YXIgYmFja3VwYnVkZHlfZXJyb3JzX2VuY291bnRlcmVkID0gMDsgLy8gbnVtYmVyIG9mIGVycm9ycyBzZW50IHZpYSBsb2cuCgkJCQoJCQlmdW5jdGlvbiBwYl9zdGF0dXNfYXBwZW5kKCBqc29uICkgewoJCQkJaWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHN0YXR1c0JveCApIHsgLy8gTm8gc3RhdHVzIGJveCB5ZXQgc28gbWF5IG5lZWQgdG8gY3JlYXRlIGl0LgoJCQkJCXN0YXR1c0JveCA9IGpRdWVyeSggJyNiYWNrdXBidWRkeV9tZXNzYWdlcycgKTsKCQkJCQlpZiggc3RhdHVzQm94Lmxlbmd0aCA9PSAwICkgeyAvLyBObyBzdGF0dXMgYm94IHlldCBzbyBzdXBwcmVzcy4KCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJaWYgKCAnc3RyaW5nJyA9PSAoIHR5cGVvZiBqc29uICkgKSB7CgkJCQkJYmFja3VwYnVkZHlfbG9nKCBqc29uICk7CgkJCQkJY29uc29sZS5sb2coICdTdGF0dXMgbG9nIHJlY2VpdmVkIHN0cmluZzogJyArIGpzb24gKTsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQkKCQkJCS8vIFVzZWQgaW4gQmFja3VwQnVkZHkgX2JhY2t1cC1wZXJmb3JtLnBocCBhbmQgSW1wb3J0QnVkZHkgX2hlYWRlci5waHAKCQkJCWpzb24uZGF0ZSA9IG5ldyBEYXRlKCk7CgkJCQlqc29uLmRhdGUgPSBuZXcgRGF0ZSggICgganNvbi50aW1lICogMTAwMCApICsganNvbi5kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMCApOwoJCQkJdmFyIHNlY29uZHMgPSBqc29uLmRhdGUuZ2V0U2Vjb25kcygpOwoJCQkJaWYgKCBzZWNvbmRzIDwgMTAgKSB7CgkJCQkJc2Vjb25kcyA9ICcwJyArIHNlY29uZHM7CgkJCQl9CgkJCQlqc29uLmRhdGUgPSBiYWNrdXBidWRkeV9ob3VycGFkKCBqc29uLmRhdGUuZ2V0SG91cnMoKSApICsgJzonICsganNvbi5kYXRlLmdldE1pbnV0ZXMoKSArICc6JyArIHNlY29uZHM7CgkJCQkKCQkJCXRyaWdnZXJFdmVudCA9ICdiYWNrdXBidWRkeV8nICsganNvbi5ldmVudDsKCQkJCQoJCQkJCgkJCQkvLyBMb2cgbm9uLXRleHQgZXZlbnRzLgoJCQkJaWYgKCAoICdkZXRhaWxzJyAhPT0ganNvbi5ldmVudCApICYmICggJ21lc3NhZ2UnICE9PSBqc29uLmV2ZW50ICkgJiYgKCAnZXJyb3InICE9PSBqc29uLmV2ZW50ICkgKSB7CgkJCQkJLy9jb25zb2xlLmxvZyggJ05vbi10ZXh0IGV2ZW50IGAnICsgdHJpZ2dlckV2ZW50ICsgJ2AuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQkvL2NvbnNvbGUubG9nKCBqc29uLmRhdGEgKTsKCQkJCX0KCQkJCS8vY29uc29sZS5sb2coICd0cmlnZ2VyOiAnICsgdHJpZ2dlckV2ZW50ICk7CgkJCQkKCQkJCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykudHJpZ2dlciggdHJpZ2dlckV2ZW50LCBbanNvbl0gKTsKCQkJCQoJCQkJCgkJCX0gLy8gRW5kIGZ1bmN0aW9uIHBiX3N0YXR1c19hcHBlbmQoKS4KCQkJCgkJCQoJCQkvLyBVc2VkIGluIEJhY2t1cEJ1ZGR5IF9iYWNrdXAtcGVyZm9ybS5waHAgYW5kIEltcG9ydEJ1ZGR5IF9oZWFkZXIucGhwIGFuZCBfcm9sbGJhY2sucGhwCgkJCWZ1bmN0aW9uIGJhY2t1cGJ1ZGR5X2xvZygganNvbiwgY2xhc3NUeXBlICkgewoJCQkJaWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHN0YXR1c0JveCApIHsgLy8gTm8gc3RhdHVzIGJveCB5ZXQgc28gbWF5IG5lZWQgdG8gY3JlYXRlIGl0LgoJCQkJCXN0YXR1c0JveCA9IGpRdWVyeSggJyNiYWNrdXBidWRkeV9tZXNzYWdlcycgKTsKCQkJCQlpZiggc3RhdHVzQm94Lmxlbmd0aCA9PSAwICkgeyAvLyBObyBzdGF0dXMgYm94IHlldCBzbyBzdXBwcmVzcy4KCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJbWVzc2FnZSA9ICcnOwoJCQkJCgkJCQlpZiAoICdzdHJpbmcnID09ICggdHlwZW9mIGpzb24gKSApIHsKCQkJCQlpZiAoICcnICE9PSBjbGFzc1R5cGUgKSB7CgkJCQkJCWpzb24gPSAnPHNwYW4gY2xhc3M9ImJhY2t1cGJ1ZGR5X2xvZ18nICsgY2xhc3NUeXBlICsgJyI+JyArIGpzb24gKyAnPC9zcGFuPic7CgkJCQkJfQoJCQkJCW1lc3NhZ2UgPSAiLS0tLS0tLS0tLS1cdFx0LS0tLS0tLVx0LS0tLS0tLVx0IiArIGpzb247CgkJCQl9IGVsc2UgewoJCQkJCWlmICggJycgIT09IGNsYXNzVHlwZSApIHsKCQkJCQkJanNvbi5kYXRhID0gJzxzcGFuIGNsYXNzPSJiYWNrdXBidWRkeV9sb2dfJyArIGNsYXNzVHlwZSArICciPicgKyBqc29uLmRhdGEgKyAnPC9zcGFuPic7CgkJCQkJfQoJCQkJCW1lc3NhZ2UgPSBqc29uLmRhdGUgKyAnLicgKyBqc29uLnUgKyAiIFx0IiArIGpzb24ucnVuICsgInNlYyBcdCIgKyBqc29uLm1lbSArICJNQlx0IiArIGpzb24uZGF0YTsKCQkJCX0KCQkJCQoJCQkJc3RhdHVzQm94LmFwcGVuZCggIlxyXG4iICsgbWVzc2FnZSApOwoJCQkJc3RhdHVzQm94LnNjcm9sbFRvcCggc3RhdHVzQm94WzBdLnNjcm9sbEhlaWdodCAtIHN0YXR1c0JveC5oZWlnaHQoKSApOwoJCQkJCgkJCX0KCQkJCgkJCQoJCQkvLyBUcmlnZ2VyIGFuIGVycm9yIHRvIGJlIGxvZ2dlZCwgZGlzcGxheWVkLCBldGMuCgkJCS8vIFJldHVybnMgdXBkYXRlZCBtZXNzYWdlIHdpdGggdHJvdWJsZSBVUkwsIGV0Yy4KCQkJLy8gVXNlZCBpbiBCYWNrdXBCdWRkeSBfYmFja3VwLXBlcmZvcm0ucGhwIGFuZCBJbXBvcnRCdWRkeSBfaGVhZGVyLnBocAoJCQlmdW5jdGlvbiBiYWNrdXBidWRkeUVycm9yKCBtZXNzYWdlICkgewoKCQkJCS8vIEdldCBzdGFydCBvZiBhbnkgZXJyb3IgbnVtYmVycy4KCQkJCXRyb3VibGVVUkwgPSAnJzsKCQkJCWVycm9yX251bWJlcl9iZWdpbiA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCAnZXJyb3IgIycgKTsKCgkJCQlpZiAoIGVycm9yX251bWJlcl9iZWdpbiA+PSAwICkgewoJCQkJCWVycm9yX251bWJlcl9iZWdpbiArPSA3OyAvLyBTaGlmdCBvdmVyIGluZGV4IHRvIGFmdGVyICdlcnJvciAjJy4KCQkJCQllcnJvcl9udW1iZXJfZW5kID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICc6JywgZXJyb3JfbnVtYmVyX2JlZ2luICk7CgkJCQkJaWYgKCBlcnJvcl9udW1iZXJfZW5kIDwgMCApIHsgLy8gRW5kIHN0aWxsIG5vdCBmb3VuZC4KCQkJCQkJZXJyb3JfbnVtYmVyX2VuZCA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCAnLicsIGVycm9yX251bWJlcl9iZWdpbiApOwoJCQkJCX0KCQkJCQlpZiAoIGVycm9yX251bWJlcl9lbmQgPCAwICkgeyAvLyBFbmQgc3RpbGwgbm90IGZvdW5kLgoJCQkJCQllcnJvcl9udW1iZXJfZW5kID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICcgJywgZXJyb3JfbnVtYmVyX2JlZ2luICk7CgkJCQkJfQoJCQkJCWVycm9yX251bWJlciA9IG1lc3NhZ2Uuc2xpY2UoIGVycm9yX251bWJlcl9iZWdpbiwgZXJyb3JfbnVtYmVyX2VuZCApOwoJCQkJCXRyb3VibGVVUkwgPSAnaHR0cDovL2l0aGVtZXMuY29tL2NvZGV4L3BhZ2UvQmFja3VwQnVkZHk6X0Vycm9yX0NvZGVzIycgKyBlcnJvcl9udW1iZXI7CgkJCQl9CgoJCQkJaWYgKCAnJyAhPT0gdHJvdWJsZVVSTCApIHsKCQkJCQkvLyBEaXNwbGF5IGVycm9yIGluIGVycm9yIGRpdiB3aXRoIGNsYXNzIGVycm9yX2FsZXJ0X2JveC4KCQkJCQltZXNzYWdlID0gbWVzc2FnZSArICcgPGEgaHJlZj0iJyArIHRyb3VibGVVUkwgKyAnIiB0YXJnZXQ9Il9ibGFuayI+Q2xpY2sgdG8gPGI+dmlldyBlcnJvciBkZXRhaWxzPC9iPiBpbiB0aGUgS25vd2xlZGdlIEJhc2U8L2E+JzsKCQkJCX0KCQkJCWpRdWVyeSggJy5iYWNrdXBidWRkeV9lcnJvcl9saXN0JyApLmFwcGVuZCggJzxsaT4nICsgIG1lc3NhZ2UgKyAnPC9saT4nICk7CgkJCQlqUXVlcnkoICcuZXJyb3JfYWxlcnRfYm94JyApLnNob3coKTsKCgkJCQkvLyBEaXNwbGF5IGVycm9yIGJveCB0byBtYWtlIGl0IGNsZWFyIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLgoJCQkJYmFja3VwYnVkZHlfZXJyb3JzX2VuY291bnRlcmVkKys7CgkJCQlqUXVlcnkoICcjYmFja3VwYnVkZHlfZXJyb3JzX25vdGljZV9jb3VudCcgKS50ZXh0KCBiYWNrdXBidWRkeV9lcnJvcnNfZW5jb3VudGVyZWQgKTsKCQkJCWpRdWVyeSggJyNiYWNrdXBidWRkeV9lcnJvcnNfbm90aWNlJyApLnNsaWRlRG93bigpOwoKCQkJCS8vIElmIHRoZSB3b3JkIGVycm9yIGlzIG5vd2hlcmUgaW4gdGhlIGVycm9yIG1lc3NhZ2UgdGhlbiBhZGQgaW4gZXJyb3IgcHJlZml4LgoJCQkJaWYgKCBtZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZiggJ2Vycm9yJyApIDwgMCApIHsKCQkJCQltZXNzYWdlID0gJ0VSUk9SOiAnICsgbWVzc2FnZTsKCQkJCX0KCgoJCQkJcmV0dXJuIG1lc3NhZ2U7IC8vIFJldHVybiB1cGRhdGVkIGVycm9yIG1lc3NhZ2Ugd2l0aCB0cm91YmxlIFVSTC4KCQkJfSAvLyBlbmQgYmFja3VwYnVkZHlFcnJvcigpLgoKCgkJCS8vIFVzZWQgaW4gQmFja3VwQnVkZHkgX2JhY2t1cC1wZXJmb3JtLnBocCBhbmQgSW1wb3J0QnVkZHkgX2hlYWRlci5waHAKCQkJZnVuY3Rpb24gYmFja3VwYnVkZHlXYXJuaW5nKCBtZXNzYWdlICkgewoJCQkJalF1ZXJ5KCAnLmJhY2t1cGJ1ZGR5X3dhcm5pbmdfbGlzdCcgKS5hcHBlbmQoICc8bGk+JyArICBtZXNzYWdlICsgJzwvbGk+JyApOwoJCQkJLy9qUXVlcnkoICcud2FybmluZ19hbGVydF9ib3gnICkuc2hvdygpOwoJCQkJcmV0dXJuICdXYXJuaW5nOiAnICsgbWVzc2FnZTsKCQkJfSAvLyBlbmQgYmFja3VwYnVkZHlXYXJuaW5nKCkuCgkJCQoJCQkvLyBsZWZ0IGhvdXIgcGFkIHdpdGggemVyb3MKCQkJZnVuY3Rpb24gYmFja3VwYnVkZHlfaG91cnBhZChuKSB7IHJldHVybiAoIjAiICsgbikuc2xpY2UoLTIpOyB9CgkJCQoJCQlmdW5jdGlvbiByYW5kb21TdHJpbmcobGVuZ3RoLCBjaGFycykgewoJCQkJdmFyIHJlc3VsdCA9ICcnOwoJCQkJZm9yICh2YXIgaSA9IGxlbmd0aDsgaSA+IDA7IC0taSkgcmVzdWx0ICs9IGNoYXJzW01hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChjaGFycy5sZW5ndGggLSAxKSldOwoJCQkJcmV0dXJuIHJlc3VsdDsKCQkJfQoJCQkKCQkJCgkJPC9zY3JpcHQ+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaW1wb3J0YnVkZHkvanMvanF1ZXJ5LmxlYW5Nb2RhbC5taW4uanMiPjwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImltcG9ydGJ1ZGR5L2pzL2Vqcy5qcyI+PC9zY3JpcHQ+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaW1wb3J0YnVkZHkvanMvbWFpbi5qcyI+PC9zY3JpcHQ+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaW1wb3J0YnVkZHkvanMvcmVzdG9yZUV2ZW50cy5qcyI+PC9zY3JpcHQ+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQlFSlMuY29uZmlnKHtjYWNoZTogZmFsc2V9KTsKCQkJCgkJCXdpbmRvdy5yZXN0b3JlRGF0YSA9IHt9OwoJCQkKCQkJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSgnLmxlYW5Nb2RhbCcpLmxlYW5Nb2RhbCgKCQkJCQl7IHRvcCA6IDQ1LCBvdmVybGF5IDogMC40LCBjbG9zZUJ1dHRvbjogIi5tb2RhbF9jbG9zZSIgfQoJCQkJKTsKCQkJCQoJCQkJLyogTUQ1IEhhc2ggQnV0dG9uIENsaWNrZWQgKi8KCQkJCWpRdWVyeSggJy52aWV3X2hhc2hfY2xpY2snICkuY2xpY2soIGZ1bmN0aW9uKCkgewoJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19sb2FkaW5nJykuc2hvdygpOwoJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19yZXNwb25zZScpLmhpZGUoKTsKCQkJCQkKCQkJCQl2YXIgYmFja3VwRmlsZSA9IGpRdWVyeSh0aGlzKS5hdHRyKCAnZGF0YS1maWxlJyApOwoJCQkJCWpRdWVyeS5hamF4KHsKCQkJCQkJdHlwZTogJ1BPU1QnLAoJCQkJCQl1cmw6ICdpbXBvcnRidWRkeS5waHAnLAoJCQkJCQlkYXRhOiB7CgkJCQkJCQlhamF4OiAnZmlsZV9oYXNoJywKCQkJCQkJCWZpbGU6IGJhY2t1cEZpbGUKCQkJCQkJfSwKCQkJCQkJZGF0YVR5cGU6ICdqc29uJwoJCQkJCX0pLmRvbmUoIGZ1bmN0aW9uKGRhdGEpIHsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X3Jlc3BvbnNlJykuaHRtbCggJzxiPkNoZWNrc3VtIChNRDUgaGFzaCk6PC9iPiA8aW5wdXQgdHlwZT0idGV4dCIgcmVhZG9ubHk9InRydWUiIHZhbHVlPSInICsgZGF0YS5oYXNoICsgJyIgc3R5bGU9IndpZHRoOiA0MDBweDsiPicgKTsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X2xvYWRpbmcnKS5oaWRlKCk7CgkJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19yZXNwb25zZScpLnNob3coKTsKCQkJCQl9KS5mYWlsKCBmdW5jdGlvbigganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duICl7CgkJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19yZXNwb25zZScpLmh0bWwoICdFcnJvcjogYCcgKyBqcVhIUi5yZXNwb25zZVRleHQgKyAnYC4nICk7CgkJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19sb2FkaW5nJykuaGlkZSgpOwoJCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfcmVzcG9uc2UnKS5zaG93KCk7CgkJCQkJfSk7CgkJCQl9KTsKCQkJCQoJCQkJCgkJCQkKCQkJCWpRdWVyeSggJy5tYWluX2JveCcgKS5vbiggJ3N1Ym1pdCcsICdmb3JtJywgZnVuY3Rpb24oZSkgewoJCQkJCWlmICggJ21pbmlGcmFtZScgPT0galF1ZXJ5KHRoaXMpLmF0dHIoICd0YXJnZXQnICkgKSB7CgkJCQkJCU5Qcm9ncmVzcy5zdGFydCgpOwoJCQkJCX0KCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0pOwoJCQkJCgkJCQkvLyBQcmUtbG9hZCBmaW5hbCBzdGVwcyBzbyBpdCBjYW4gYmUgZGlzcGxheWVkIGV2ZW4gdGhvdWdoIGRlbGV0ZWQuCgkJCQl3aW5kb3cuc3RlcFRlbXBsYXRlQ2xlYW51cFNldHRpbmdzID0gbmV3IEVKUyh7dXJsOiAnaW1wb3J0YnVkZHkvdmlld3MvY2xlYW51cFNldHRpbmdzLmh0bSd9KTsKCQkJCXdpbmRvdy5zdGVwVGVtcGxhdGVmaW5hbENsZWFudXAgPSBuZXcgRUpTKHt1cmw6ICdpbXBvcnRidWRkeS92aWV3cy9maW5hbENsZWFudXAuaHRtJ30pOwoJCQkJCgkJCX0pOwoJCQkKCQkJCgkJCWZ1bmN0aW9uIGJiX2FjdGlvbiggYWN0aW9uLCBub3RlICkgewoJCQkJY29uc29sZS5sb2coICdiYl9hY3Rpb246IGAnICsgYWN0aW9uICsgJ2AuJyApOwoJCQkJaWYgKCAndW56aXBTdWNjZXNzJyA9PSBhY3Rpb24gKSB7CgkJCQl9IGVsc2UgaWYgKCAnaWZyYW1lTG9hZGVkJyA9PSBhY3Rpb24gKSB7IC8vIEhpZGUgaWZyYW1lIGxvYWRpbmcgZ3JhcGhpYy4KCQkJCQkvL05Qcm9ncmVzcy5kb25lKCk7CgkJCQl9IGVsc2UgaWYgKCAnaW1wb3J0aW5nVGFibGUnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNpbXBvcnRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnUmVzdG9yaW5nICcgKyBub3RlICsgJyAuLi4nICk7IC8vIG5vdGUgY29udGFpbnMgdGFibGUgbmFtZQoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlUmVzdG9yZVN1Y2Nlc3MnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNpbXBvcnRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnRGF0YWJhc2UgUmVzdG9yZSBTdWNjZXNzZnVsJyApLmFkZENsYXNzKCAnYW5pbWF0ZWQgZmFkZUluRG93bicgKTsKCQkJCX0gZWxzZSBpZiAoICdkYXRhYmFzZVJlc3RvcmVTa2lwcGVkJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjaW1wb3J0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ0RhdGFiYXNlIFJlc3RvcmUgU2tpcHBlZCcgKS5hZGRDbGFzcyggJ2FuaW1hdGVkIHN3aW5nJyApOwoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlUmVzdG9yZUZhaWxlZCcgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI2ltcG9ydGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdEYXRhYmFzZSBSZXN0b3JlIEZhaWxlZCcgKS5hZGRDbGFzcyggJ2FuaW1hdGVkIHdvYmJsZScgKTsKCQkJCX0gZWxzZSBpZiAoICdkYXRhYmFzZU1pZ3JhdGlvblN1Y2Nlc3MnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNtaWdyYXRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnRGF0YWJhc2UgTWlncmF0aW9uIFN1Y2Nlc3NmdWwnICkuYWRkQ2xhc3MoICdhbmltYXRlZCBmYWRlSW5Eb3duJyApOwoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlTWlncmF0aW9uU2tpcHBlZCcgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI21pZ3JhdGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdEYXRhYmFzZSBNaWdyYXRpb24gU2tpcHBlZCcgKS5hZGRDbGFzcyggJ2FuaW1hdGVkIHN3aW5nJyApOwoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlTWlncmF0aW9uRmFpbGVkJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjbWlncmF0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ0RhdGFiYXNlIE1pZ3JhdGlvbiBGYWlsZWQnICkuYWRkQ2xhc3MoICdhbmltYXRlZCB3b2JibGUnICk7CgkJCQl9IGVsc2UgaWYgKCAnZmlsZXNSZXN0b3JlU3VjY2VzcycgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI3VuemlwcGluZ0ZpbGVzLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdDb21wbGV0ZWQgUmVzdG9yaW5nIEZpbGVzJyApLmFkZENsYXNzKCAnYW5pbWF0ZWQgZmFkZUluRG93bicgKTsKCQkJCX0gZWxzZSBpZiAoICdmaWxlc1Jlc3RvcmVTa2lwcGVkJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjdW56aXBwaW5nRmlsZXMtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ1NraXBwZWQgUmVzdG9yaW5nIEZpbGVzJyApLmFkZENsYXNzKCAnYW5pbWF0ZWQgc3dpbmcnICk7CgkJCQl9IGVsc2UgewoJCQkJCWNvbnNvbGUubG9nKCAnVW5rbm93biBKUyBiYl9hY3Rpb24gYCcgKyBhY3Rpb24gKyAnYCB3aXRoIG5vdGUgYCcgKyBub3RlICsgJ2AuJyApOwoJCQkJfQoJCQl9CgkJCQoJCQkKCQkJZnVuY3Rpb24gYmJfc2hvd1N0ZXAoIHN0ZXAsIGRhdGEgKSB7CgkJCQl3aW5kb3cucmVzdG9yZURhdGEgPSBkYXRhOwoJCQkJalF1ZXJ5KCcuc3RlcC13cmFwJykuaGlkZSgpOwoJCQkJY29uc29sZS5sb2coICdTaG93IHN0ZXA6IGAnICsgc3RlcCArICdgLicgKTsKCQkJCWNvbnNvbGUuZGlyKCB3aW5kb3cucmVzdG9yZURhdGEgKTsKCQkJCWJhY2t1cGJ1ZGR5X2xvZyggJ0xvYWRpbmcgc3RlcCBgJyArIHN0ZXAgKyAnYC4nKTsKCQkJCQoJCQkJLy9qUXVlcnkoJy5zdGVwLScgKyBzdGVwICsgJy13cmFwJykuc2hvdygpOwoJCQkJaWYgKCAnZmluaXNoZWQnID09IHN0ZXAgKSB7IC8vIEluIGNhc2Ugd2UgY2Fubm90IGxvYWQgZmluYWwgdGVtcGxhdGUsIGF0IGxlYXN0IHNheSBmaW5pc2hlZC4KCQkJCQlqUXVlcnkoJy5tYWluX2JveF9mb290JykuaHRtbCggJzxoMz5GaW5pc2hlZDwvaDM+JyApOwoJCQkJfQoJCQkJCgkJCQlpZiAoICdjbGVhbnVwU2V0dGluZ3MnID09IHN0ZXAgKSB7IC8vIFByZWxvYWRlZCB0ZW1wbGF0ZS4KCQkJCQlqUXVlcnkoJy5tYWluX2JveCcpLmh0bWwoIHdpbmRvdy5zdGVwVGVtcGxhdGVDbGVhbnVwU2V0dGluZ3MucmVuZGVyKGRhdGEpICk7CgkJCQl9IGVsc2UgaWYgKCAnZmluYWxDbGVhbnVwJyA9PSBzdGVwICkgewoJCQkJCWpRdWVyeSgnLm1haW5fYm94JykuaHRtbCggandpbmRvdy5zdGVwVGVtcGxhdGVmaW5hbENsZWFudXAucmVuZGVyKGRhdGEpICk7CgkJCQl9IGVsc2UgeyAvLyBOb3JtYWwgc3RlcC4KCQkJCQlpZiAoIHN0ZXAgPT0gJ2RhdGFiYXNlU2V0dGluZ3MnICkgewoJCQkJCQkvLyBFbmNvZGUgZG91YmxlIHF1b3RlcyBiZWZvcmUgcGFzc2luZyB0byB2YWx1ZT0iIgoJCQkJCQlkYXRhLmRhdC5kYl9wYXNzd29yZCA9IGRhdGEuZGF0LmRiX3Bhc3N3b3JkLnJlcGxhY2UoLyIvZywgJyZxdW90OycpOwoJCQkJCX0KCQkJCQlqUXVlcnkoJy5tYWluX2JveCcpLmh0bWwoIG5ldyBFSlMoe3VybDogJ2ltcG9ydGJ1ZGR5L3ZpZXdzLycgKyBzdGVwICsgJy5odG0nfSkucmVuZGVyKGRhdGEpICk7CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQlmdW5jdGlvbiB0aXAoIHRpcCApIHsKCQkJCXJldHVybiAnPGEgY2xhc3M9InBsdWdpbmJ1ZGR5X3RpcCIgdGl0bGU9IicgKyB0aXAgKyAnIj48aW1nIHNyYz0iaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHkvaW1hZ2VzL3BsdWdpbmJ1ZGR5X3RpcC5wbmciIGFsdD0iKD8pIj48L2E+JzsKCQkJfQoJCQkKCQkJCgkJPC9zY3JpcHQ+CgkJPHN0eWxlPgoJCQkjYmFja3VwYnVkZHlfbWVzc2FnZXMgewoJCQkJYmFja2dyb3VuZDogI2ZmZjsKCQkJCWJvcmRlcjogMXB4IHNvbGlkICNDRkNGQ0Y7CgkJCQktbW96LWJvcmRlci1yYWRpdXM6IDI1cHg7CgkJCQloZWlnaHQ6IDIwMHB4OwoJCQkJb3ZlcmZsb3c6IHNjcm9sbDsKCQkJCXBhZGRpbmc6IDEycHg7CgkJCQl3aGl0ZS1zcGFjZTogcHJlOwoJCQkJd2lkdGg6IDEwMCU7CgkJCQltYXJnaW46IDA7CgkJCQlib3gtc2l6aW5nOiBib3JkZXItYm94OwoJCQkJcmVzaXplOiBib3RoOwoJCQl9CgkJCS5iYWNrdXBidWRkeV9sb2dfZXJyb3IgewoJCQkJY29sb3I6IHJlZDsKCQkJCWZvbnQtd2VpZ2h0OiBib2xkOwoJCQl9CgkJCS5iYWNrdXBidWRkeV9sb2dfd2FybmluZyB7CgkJCQljb2xvcjogb3JhbmdlOwoJCQkJZm9udC13ZWlnaHQ6IGJvbGQ7CgkJCX0KCQkJLmJhY2t1cGJ1ZGR5X2xvZ19ub3RpY2UgewoJCQkJY29sb3I6IGJsdWU7CgkJCQlmb250LXdlaWdodDogYm9sZDsKCQkJfQoJCQkjYmFja3VwYnVkZHlfbWVzc2FnZXM6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKCQkJCS13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKCQkJCXdpZHRoOiAxMXB4OwoJCQkJaGVpZ2h0OiAxMXB4OwoJCQl9CgkJCSNiYWNrdXBidWRkeV9tZXNzYWdlczo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewoJCQkJYm9yZGVyLXJhZGl1czogOHB4OwoJCQkJYm9yZGVyOiAycHggc29saWQgd2hpdGU7IC8qIHNob3VsZCBtYXRjaCBiYWNrZ3JvdW5kLCBjYW4ndCBiZSB0cmFuc3BhcmVudCAqLwoJCQkJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAuNSk7CgkJCX3igIsKCQk8L3N0eWxlPgoJPC9oZWFkPgoJCTw/cGhwCgkJLy9pZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGlzcGxheV9tb2RlJ10gPT0gJ25vcm1hbCcgKSB7CgkJCWVjaG8gJzxib2R5JzsKCQkJaWYgKCAnZW1iZWQnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlzcGxheV9tb2RlJyApICkgeyBlY2hvICcgc3R5bGU9ImJhY2tncm91bmQ6ICNGRkY7Iic7IH0KCQkJZWNobyAnPic7CgkJCWlmICggJ2VtYmVkJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2Rpc3BsYXlfbW9kZScgKSApIHsKCQkJCWVjaG8gJzxkaXYgY2xhc3M9InRvcE5hdiI+JzsKCQkJCQkKCQkJCQlpZiAoIHRydWUgPT09IEF1dGg6OmlzX2F1dGhlbnRpY2F0ZWQoKSApIHsgLy8gT25seSBkaXNwbGF5IHRoZXNlIGxpbmtzIGlmIGxvZ2dlZCBpbi4KCQkJCQkJZWNobyAnPGEgJzsKCQkJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3N0ZXAnICkgIT0gJycgKSB7IGVjaG8gJ2NsYXNzPSJhY3RpdmVQYWdlIiAnOyB9CgkJCQkJCWVjaG8gJ2hyZWY9ImltcG9ydGJ1ZGR5LnBocCI+UmVzdG9yZSAvIE1pZ3JhdGU8L2E+JzsKCQkJCQkJCgkJCQkJCWVjaG8gJzxhICc7CgkJCQkJCWlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYWdlJyApID09ICdzZXJ2ZXJpbmZvJyApIHsgZWNobyAnY2xhc3M9ImFjdGl2ZVBhZ2UiICc7IH0KCQkJCQkJZWNobyAnaHJlZj0iP3BhZ2U9c2VydmVyaW5mbyI+U2VydmVyIEluZm9ybWF0aW9uPC9hPic7CgkJCQkJCQoJCQkJCQllY2hvICc8YSAnOwoJCQkJCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncGFnZScgKSA9PSAnZGJyZXBsYWNlJyApIHsgZWNobyAnY2xhc3M9ImFjdGl2ZVBhZ2UiICc7IH0KCQkJCQkJZWNobyAnaHJlZj0iP3BhZ2U9ZGJyZXBsYWNlIj5EYXRhYmFzZSBUZXh0IFJlcGxhY2U8L2E+JzsKCQkJCQkJCgkJCQkJCWVjaG8gJzxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9jb2RleC9wYWdlL0JhY2t1cEJ1ZGR5IiB0YXJnZXQ9Il9ibGFuayI+S25vd2xlZGdlIEJhc2U8L2E+JzsKCQkJCQkJZWNobyAnPGEgaHJlZj0iaHR0cDovL2l0aGVtZXMuY29tL3N1cHBvcnQvIiB0YXJnZXQ9Il9ibGFuayI+U3VwcG9ydDwvYT4nOwoJCQkJCX0KCQkJCQkKCQkJCQkkc2ltcGxlVmVyc2lvbiA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddOwoJCQkJCWlmICggc3RycG9zKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSwgJyAnICkgPiAwICkgewoJCQkJCQkkc2ltcGxlVmVyc2lvbiA9IHN1YnN0ciggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sIDAsIHN0cnBvcyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sICcgJyApICk7CgkJCQkJfQoJCQkJCWVjaG8gJzxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9wdXJjaGFzZS9iYWNrdXBidWRkeS8iIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iVmlzaXQgQmFja3VwQnVkZHkgV2Vic2l0ZSBpbiBOZXcgV2luZG93IiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyI+PGltZyBzcmM9ImltcG9ydGJ1ZGR5L2ltYWdlcy9pY29uX21lbnVfMzJ4MzIucG5nIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPiZuYnNwOyZuYnNwO0ltcG9ydEJ1ZGR5IHYnIC4gJHNpbXBsZVZlcnNpb24gLiAnIGZvciBCYWNrdXBCdWRkeTwvYT4nOwoJCQkJZWNobyAnPC9kaXY+JzsKCQkJfQoJCT8+CgkJCgkJPGRpdiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBoZWlnaHQ6IDcwcHg7IG1hcmdpbi10b3A6IDUwcHg7IHdpZHRoOiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuOyI+CgkJCTxkaXYgc3R5bGU9Im1heC13aWR0aDogMTAwMHB4OyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyI+CgkJCQk8IS0tIDxzcGFuIGlkPSJyZXN0b3JlYnVkZHlfaWZyYW1lX3BsYWNlaG9sZGVyIj5XZWxjb21lIHN0ZXAgMTwvc3Bhbj4gLS0+CgkJCQk8c2NyaXB0PmlmcmFtZVBvc3RJbml0ID0gZmFsc2U7PC9zY3JpcHQ+CgkJCQk8aWZyYW1lIG9uTG9hZD0iaWYgKCB0cnVlID09PSBpZnJhbWVQb3N0SW5pdCApIHsgTlByb2dyZXNzLmRvbmUoKTsgfSIgbmFtZT0ibWluaUZyYW1lIiBpZD0ibWluaUZyYW1lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSI3MHB4IiBmcmFtZWJvcmRlcj0iMCIgcGFkZGluZz0iMCIgbWFyZ2luPSIwIj5FcnJvciAjNDU4NDU5NDU3OS4gQnJvd3NlciBub3QgY29tcGF0aWJsZSB3aXRoIGlmcmFtZXMuPC9pZnJhbWU+CgkJCQk8c2NyaXB0PmlmcmFtZVBvc3RJbml0ID0gdHJ1ZTs8L3NjcmlwdD4KCQkJPC9kaXY+CgkJPC9kaXY+CgkJCgkJPGRpdiBzdHlsZT0iZGlzcGxheTogbm9uZTsiIGlkPSJwYl9pbXBvcnRidWRkeV9ibGFua2FsZXJ0Ij48P3BocCBwYl9iYWNrdXBidWRkeTo6YWxlcnQoICcjVElUTEUjICNNRVNTQUdFIycsIHRydWUsICc5MDIxJyApOyA/PjwvZGl2PgoJCQoJCTxkaXYgY2xhc3M9Im1haW5fYm94X3dyYXAiPgoJCQkKCQkJCgkJCTw/cGhwIGlmICggdHJ1ZSA9PT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgeyAvLyBPbmx5IHJlY29yZCBsb2dnaW5nIGlmIGF1dGhlbnRpY2F0ZWQuID8+CgkJCQk8ZGl2IGNsYXNzPSJtYWluX2JveF9oZWFkIj4KCQkJCQk8c3BhbiBpZD0icGFnZVRpdGxlIj4mbmJzcDs8L3NwYW4+CgkJCQkJPGEgc3R5bGU9ImZvbnQtc2l6ZTogMC42ZW07IGZsb2F0OiByaWdodDsgbWFyZ2luLXRvcDogNnB4OyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJqUXVlcnkoJyNwYl9iYWNrdXBidWRkeV9zdGF0dXNfd3JhcCcpLnRvZ2dsZSgpOyI+RGlzcGxheSBTdGF0dXMgTG9nPC9hPgoJCQkJPC9kaXY+CgkJCQk8P3BocAoJCQkJZWNobyBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ2ltcG9ydCddLT5zdGF0dXNfYm94KCAnU3RhdHVzIExvZyBmb3IgZm9yIEltcG9ydEJ1ZGR5IGZyb20gQmFja3VwQnVkZHkgdicgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSAuICcuLi4nICk7CgkJCQk/PgoJCQkJCgkJCQk8c2NyaXB0PmltcG9ydGJ1ZGR5X2xvYWRSZXN0b3JlRXZlbnRzKCk7PC9zY3JpcHQ+CgkJCQk8P3BocAoJCQl9IGVsc2UgeyA/PgoJCQkJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCI+CgkJCQkJPHNwYW4gaWQ9InBhZ2VUaXRsZSI+Jm5ic3A7PC9zcGFuPgoJCQkJPC9kaXY+CgkJCQkKCQkJPD9waHAgfSA/PgoJCQk8ZGl2IGNsYXNzPSJtYWluX2JveF9oZWFkIGVycm9yX2FsZXJ0X2JveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxzcGFuIGNsYXNzPSJlcnJvcl9hbGVydF90aXRsZSI+RXJyb3Iocyk8L3NwYW4+CgkJCQk8dWwgY2xhc3M9ImJhY2t1cGJ1ZGR5X2Vycm9yX2xpc3QiPgoJCQkJCTwhLS0gPGxpPkVycm9yICMxMjNvbmx5QXRlc3Q6IEFuIGVycm9yIGhhcyBOT1QgaGFwcGVuZWQuIFRoaXMgaXMgYSBvbmx5IHRlc3QuPC9saT4gLS0+CgkJCQk8L3VsPgoJCQk8L2Rpdj4KCQkJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCB3YXJuaW5nX2FsZXJ0X2JveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxzcGFuIGNsYXNzPSJlcnJvcl93YXJuaW5nX3RpdGxlIj5BbGVydChzKTwvc3Bhbj4KCQkJCTx1bCBjbGFzcz0iYmFja3VwYnVkZHlfd2FybmluZ19saXN0Ij4KCQkJCQk8IS0tIDxsaT5FcnJvciAjMTIzb25seUF0ZXN0OiBBIHdhcm5pbmcgaGFzIE5PVCBoYXBwZW5lZC4gVGhpcyBpcyBhIG9ubHkgdGVzdC48L2xpPiAtLT4KCQkJCTwvdWw+CgkJCTwvZGl2PgoJCQkKCQkJCgkJCTxkaXYgY2xhc3M9Im1haW5fYm94Ij4KCQkJCgkJCQoJCQkK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_header.php,importbuddy/views/_header.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_html_1_stash.php,importbuddy/views/_html_1_stash.php PCEtLSBfaHRtbF8xX3N0YXNoLnBocCAtLT4KPD9waHAKZ2xvYmFsICR3cF92ZXJzaW9uOwokd3BfdmVyc2lvbiA9IDE7CgpmdW5jdGlvbiBzdGFzaEFQSSggJHNldHRpbmdzLCAkYWN0aW9uLCAkYWRkaXRpb25hbFBhcmFtcyA9IGFycmF5KCkgKSB7CgkkYXBpX3VybCA9ICdodHRwczovL3N0YXNoLWFwaS5pdGhlbWVzLmNvbSc7CgkKCWdsb2JhbCAkd3BfdmVyc2lvbjsKCSR1cmxfcGFyYW1zID0gYXJyYXkoCgkJJ2FjdGlvbicgICAgPT4gJGFjdGlvbiwKCQkndXNlcicgICAgICA9PiAkc2V0dGluZ3NbJ2l0eGFwaV91c2VybmFtZSddLAoJCSd3cCcgICAgICAgID0+ICR3cF92ZXJzaW9uLAoJCSdiYicJCT0+IDAsCgkJJ2liJwkJPT4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sCgkJJ3NpdGUnICAgICAgPT4gJ2ltcG9ydGJ1ZGR5JywKCQkndGltZXN0YW1wJyA9PiB0aW1lKCkKCSk7CgkKCWlmICggaXNzZXQoICRzZXR0aW5nc1snaXR4YXBpX3Bhc3N3b3JkJyBdICkgKSB7IC8vIFVzZWQgb24gaW5pdGl0YWwgY29ubmVjdGlvbiB0byAgCgkJJHBhcmFtcyA9IGFycmF5KCAnYXV0aF90b2tlbicgPT4gJHNldHRpbmdzWydpdHhhcGlfcGFzc3dvcmQnXSApOyAvLyBpdHhhcGlfcGFzc3dvcmQgaXMgYSBIQVNIIG9mIHVzZXIncyBwYXNzd29yZC4KCX0gZWxzZWlmICggaXNzZXQoICRzZXR0aW5nc1snaXR4YXBpX3Rva2VuJyBdICkgKSB7IC8vIFVzZWQgb24gaW5pdGl0YWwgY29ubmVjdGlvbiB0byAgCgkJJHBhcmFtcyA9IGFycmF5KCAndG9rZW4nID0+ICRzZXR0aW5nc1snaXR4YXBpX3Rva2VuJ10gKTsgLy8gaXR4YXBpX3Bhc3N3b3JkIGlzIGEgSEFTSCBvZiB1c2VyJ3MgcGFzc3dvcmQuCgl9IGVsc2UgewoJCSRlcnJvciA9ICdCYWNrdXBCdWRkeSBFcnJvciAjNzkzNzQ5NDM2OiBObyB2YWxpZCB0b2tlbiAoaXR4YXBpX3Rva2VuKSBvciBoYXNoZWQgcGFzc3dvcmQgKGl0eGFwaV9wYXNzd29yZCkgc3BlY2lmaWVkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLic7CgkJdHJpZ2dlcl9lcnJvciggJGVycm9yLCBFX1VTRVJfTk9USUNFICk7CgkJcmV0dXJuICRlcnJvcjsKCX0KCQoJJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCAkYWRkaXRpb25hbFBhcmFtcyApOwoJJGJvZHkgPSBhcnJheSggJ3JlcXVlc3QnID0+IGpzb25fZW5jb2RlKCAkcGFyYW1zICkgKTsKCQoJLyoKCWVjaG8gJ0JPRFk6PHByZT4nOwoJcHJpbnRfciggJGJvZHkgKTsKCWVjaG8gJzwvcHJlPic7CgkqLwoJCgkkcG9zdF91cmwgPSAkYXBpX3VybCAuICcvPycgLiBodHRwX2J1aWxkX3F1ZXJ5KCAkdXJsX3BhcmFtcywgbnVsbCwgJyYnICk7CgkKCSRyZXF1ZXN0ID0gbmV3IFJlcXVlc3RDb3JlKCAkcG9zdF91cmwgKTsKCSRyZXF1ZXN0LT5zZXRfbWV0aG9kKCAnUE9TVCcgKTsKCSRyZXF1ZXN0LT5zZXRfYm9keSggJGJvZHkgKTsKCSRyZXNwb25zZSA9ICRyZXF1ZXN0LT5zZW5kX3JlcXVlc3QodHJ1ZSk7CgkKCS8qCgllY2hvICdSRVNQT05TRTo8cHJlPic7CglwcmludF9yKCAkcmVzcG9uc2UtPmJvZHkgKTsKCWVjaG8gJzwvcHJlPic7CgkqLwoJCglpZiggISAkcmVzcG9uc2UtPmlzT0soKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnU3Rhc2ggcmVxdWVzdCBmb3IgZmlsZXMgZmFpbGVkLicgKTsKCQlyZXR1cm4gJHJlc3BvbnNlLT5ib2R5OwoJfSBlbHNlIHsKCQkvLyBTZWUgaWYgd2UgZ290IGEganNvbiByZXNwb25zZS4KCQlpZiAoICEgJHJlc3BvbnNlX2RlY29kZWQgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UtPmJvZHksIHRydWUpICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnU3Rhc2ggZGlkIG5vdCBnZXQgdmFsaWQganNvbiByZXNwb25zZS4nICk7CgkJfQoJCQoJCS8vIEZpbmFsbHkgc2VlIGlmIHRoZSBBUEkgcmV0dXJuZWQgYW4gZXJyb3IuCgkJaWYgKCBpc3NldCggJHJlc3BvbnNlX2RlY29kZWRbJ2Vycm9yJ10gKSApIHsgICAgICAgICAgICAKCQkJaWYgKCBpc3NldCggJHJlc3BvbnNlX2RlY29kZWRbJ2Vycm9yJ11bJ21lc3NhZ2UnXSApICkgewoJCQkJJGVycm9yID0gJ0Vycm9yICMzOTc1Mjg5M2EuIFNlcnZlciByZXBvcnRlZCBhbiBlcnJvciBwZXJmb3JtaW5nIGFjdGlvbiBgJyAuICRhY3Rpb24gLiAnYCB3aXRoIGFkZGl0aW9uYWwgcGFyYW1zOiBgJyAuIHByaW50X3IoICRhZGRpdGlvbmFsUGFyYW1zLCB0cnVlICkgLiAnYC4gRGV0YWlsczogYCcgLiBwcmludF9yKCAkcmVzcG9uc2VfZGVjb2RlZFsnZXJyb3InXSwgdHJ1ZSApIC4gJ2AuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJGVycm9yICk7CgkJCQlyZXR1cm4gJHJlc3BvbnNlX2RlY29kZWRbJ2Vycm9yJ11bJ21lc3NhZ2UnXTsKCQkJfSBlbHNlIHsKCQkJCSRlcnJvciA9ICdFcnJvciAjMzgyMzk3My4gUmVjZWl2ZWQgU3Rhc2ggQVBJIGVycm9yIGJ1dCBubyBtZXNzYWdlIGZvdW5kLiBEZXRhaWxzOiBgJyAuIHByaW50X3IoICRyZXNwb25zZV9kZWNvZGVkLCB0cnVlICkgLiAnYC4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAkZXJyb3IgKTsKCQkJCXJldHVybiAkZXJyb3I7CgkJCX0KCQl9IGVsc2UgeyAvLyBOTyBFUlJPUlMKCQkJcmV0dXJuICRyZXNwb25zZV9kZWNvZGVkOwoJCX0KCX0KfQo/PgoKCjxzdHlsZT4KLndpZGVmYXQgdGQgewoJcGFkZGluZzogMjBweCA3cHg7Cglmb250LXNpemU6IDE0cHg7Cn0KLndpZGVmYXQgdGQgYTpob3ZlciB7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLndpZGVmYXQgdGQgZm9ybSB7CgltYXJnaW4tdG9wOiAtMTJweDsKCWZvbnQtc2l6ZTogMTJweDsKfQouc3Rhc2hfYmFja3VwX2ZpbGUgewoJZm9udC1zaXplOiAxLjJlbTsKfQo8L3N0eWxlPgo8P3BocAokSVRYQVBJX0tFWSA9ICdpeGhvN2RrMHAyNDRuMG9iJzsKJElUWEFQSV9VUkwgPSAnaHR0cDovL2FwaS5pdGhlbWVzLmNvbSc7CgoKCiRjcmVkZW50aWFsc19mb3JtID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X3NldHRpbmdzKCAncHJlX3NldHRpbmdzJywgZmFsc2UsICd1cGxvYWQ9c3Rhc2gjcGx1Z2luYnVkZHktdGFicy1zdGFzaCcgKTsgLy8gbmFtZSwgc2F2ZXBvaW50fGZhbHNlLCBhZGRpdGlvbmFsIHF1ZXJ5c3RyaW5nCi8qCiRjcmVkZW50aWFsc19mb3JtLT5hZGRfc2V0dGluZyggYXJyYXkoCgkndHlwZScJCT0+CQknaGlkZGVuJywKCSduYW1lJwkJPT4JCSdwYXNzX2hhc2gnLAoJJ2RlZmF1bHQnCT0+CQlQQl9QQVNTV09SRCwKKSApOwoKJGNyZWRlbnRpYWxzX2Zvcm0tPmFkZF9zZXR0aW5nKCBhcnJheSgKCSd0eXBlJwkJPT4JCSdoaWRkZW4nLAoJJ25hbWUnCQk9PgkJJ29wdGlvbnMnLAoJJ2RlZmF1bHQnCT0+CQlodG1sc3BlY2lhbGNoYXJzKCBzZXJpYWxpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICksCikgKTsKKi8KCiRjcmVkZW50aWFsc19mb3JtLT5hZGRfc2V0dGluZyggYXJyYXkoCgkndHlwZScJCT0+CQkndGV4dCcsCgknbmFtZScJCT0+CQknaXR4YXBpX3VzZXJuYW1lJywKCSd0aXRsZScJCT0+CQlfXyggJ2lUaGVtZXMgdXNlcm5hbWUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSdydWxlcycJCT0+CQkncmVxdWlyZWR8c3RyaW5nWzEtNDVdJywKKSApOwokY3JlZGVudGlhbHNfZm9ybS0+YWRkX3NldHRpbmcoIGFycmF5KAoJJ3R5cGUnCQk9PgkJJ3Bhc3N3b3JkJywKCSduYW1lJwkJPT4JCSdpdHhhcGlfcGFzc3dvcmRfcmF3JywKCSd0aXRsZScJCT0+CQlfXyggJ2lUaGVtZXMgcGFzc3dvcmQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSdydWxlcycJCT0+CQkncmVxdWlyZWR8c3RyaW5nWzEtNDVdJywKKSApOwoKJHNldHRpbmdzX3Jlc3VsdCA9ICRjcmVkZW50aWFsc19mb3JtLT5wcm9jZXNzKCk7CiRsb2dpbl93ZWxjb21lID0gJzxjZW50ZXI+JyAuIF9fKCAnTG9nIGluIHRvIFN0YXNoIHdpdGggeW91ciBpVGhlbWVzLmNvbSBtZW1iZXIgYWNjb3VudC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8YnI+PGJyPic7CgppZiAoIGNvdW50KCAkc2V0dGluZ3NfcmVzdWx0ICkgPT0gMCApIHsgLy8gTm8gZm9ybSBzdWJtaXR0ZWQuCgkKCWVjaG8gJGxvZ2luX3dlbGNvbWU7CgkkY3JlZGVudGlhbHNfZm9ybS0+ZGlzcGxheV9zZXR0aW5ncyggJ0Nvbm5lY3QgdG8gU3Rhc2gnICk7CgkKfSBlbHNlIHsgLy8gRm9ybSBzdWJtaXR0ZWQuCglpZiAoIGNvdW50KCAkc2V0dGluZ3NfcmVzdWx0WydlcnJvcnMnXSApID4gMCApIHsgLy8gRm9ybSBlcnJvcnMuCgkJZWNobyAkbG9naW5fd2VsY29tZTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoIGltcGxvZGUoICc8YnI+JywgJHNldHRpbmdzX3Jlc3VsdFsnZXJyb3JzJ10gKSApOwoJCSRjcmVkZW50aWFsc19mb3JtLT5kaXNwbGF5X3NldHRpbmdzKCAnQ29ubmVjdCB0byBTdGFzaCcgKTsKCQkKCX0gZWxzZSB7IC8vIE5vIGZvcm0gZXJyb3JzOyBwcm9jZXNzIQoJCQoJCXJlcXVpcmVfb25jZSggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy9saWIvcmVxdWVzdGNvcmUvcmVxdWVzdGNvcmUuY2xhc3MucGhwJyApOwoJCS8vcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL2xpYi9zdGFzaDIvaW5pdC5waHAnICk7CgkJcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL2xpYi9zdGFzaDIvY2xhc3MuaXR4X2hlbHBlcjIucGhwJyApOwoJCQoJCWdsb2JhbCAkd3BfdmVyc2lvbjsKCQkkaXR4YXBpX3VzZXJuYW1lID0gc3RydG9sb3dlciggJHNldHRpbmdzX3Jlc3VsdFsnZGF0YSddWydpdHhhcGlfdXNlcm5hbWUnXSApOwoJCSRwYXNzd29yZF9oYXNoID0gaVRoZW1lc19DcmVkZW50aWFsczo6Z2V0X3Bhc3N3b3JkX2hhc2goICRpdHhhcGlfdXNlcm5hbWUsICRzZXR0aW5nc19yZXN1bHRbJ2RhdGEnXVsnaXR4YXBpX3Bhc3N3b3JkX3JhdyddICk7CgkJJGFjY2Vzc190b2tlbiA9IElUWEFQSV9IZWxwZXIyOjpnZXRfYWNjZXNzX3Rva2VuKCAkaXR4YXBpX3VzZXJuYW1lLCAkcGFzc3dvcmRfaGFzaCwgJ2ltcG9ydGJ1ZGR5JywgJHdwX3ZlcnNpb24gKTsKCQkKCQkkc2V0dGluZ3MgPSBhcnJheSgKCQkJJ2l0eGFwaV91c2VybmFtZScgPT4gJGl0eGFwaV91c2VybmFtZSwKCQkJJ2l0eGFwaV9wYXNzd29yZCcgPT4gJGFjY2Vzc190b2tlbiwKCQkpOwoJCSRyZXNwb25zZSA9IHN0YXNoQVBJKCAkc2V0dGluZ3MsICdjb25uZWN0JyApOwoJCQoJCSRsb2dnZWRfaW4gPSBmYWxzZTsKCQlpZiAoICEgaXNfYXJyYXkoICRyZXNwb25zZSApICkgeyAvLyBFcnJvciBtZXNzYWdlLgoJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjMzk4Mzc5NCBmcm9tIHNlcnZlcjogYCcgLiBwcmludF9yKCAkcmVzcG9uc2UsIHRydWUgKSAuJ2AuJyApOwoJCQkkY3JlZGVudGlhbHNfZm9ybS0+ZGlzcGxheV9zZXR0aW5ncyggJ1N1Ym1pdCcgKTsKCQl9IGVsc2UgewoJCQlpZiAoIGlzc2V0KCAkcmVzcG9uc2VbJ2Vycm9yJ10gKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yOiAnIC4gJHJlc3BvbnNlWydlcnJvciddWydtZXNzYWdlJ10gKTsKCQkJCSRjcmVkZW50aWFsc19mb3JtLT5kaXNwbGF5X3NldHRpbmdzKCAnU3VibWl0JyApOwoJCQl9IGVsc2UgewoJCQkJaWYgKCBpc3NldCggJHJlc3BvbnNlWyd0b2tlbiddICkgKSB7CgkJCQkJJHNldHRpbmdzWydpdHhhcGlfdG9rZW4nXSA9ICRyZXNwb25zZVsndG9rZW4nXTsKCQkJCQkkaXR4YXBpX3Rva2VuID0gJHNldHRpbmdzWydpdHhhcGlfdG9rZW4nXTsKCQkJCQl1bnNldCggJHNldHRpbmdzWydpdHhhcGlfcGFzc3dvcmQnXSApOyAvLyBObyBsb25nZXJuIGVlZGVkIHNpbmNlIHdlIGhhdmUgdG9rZW4gbm93LgoJCQkJCSRsb2dnZWRfaW4gPSB0cnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjMzQ5NzQ3MzQzMjM6IFVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlLiBUb2tlbiBtaXNzaW5nLiBDaGVjayB5b3VyIGxvZ2luIGFuZCB0cnkgYWdhaW4uIERldGFpbGVkIHJlc3BvbnNlOiBgJyAuIHByaW50X3IoICRyZXNwb25zZSwgdHJ1ZSApIC4nYC4nICk7CgkJCQkJJGNyZWRlbnRpYWxzX2Zvcm0tPmRpc3BsYXlfc2V0dGluZ3MoICdTdWJtaXQnICk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJaWYgKCB0cnVlID09PSAkbG9nZ2VkX2luICkgewoJCQkvLyBHZXQgZmlsZXMuCgkJCSRzdGFzaF9maWxlcyA9IHN0YXNoQVBJKCAkc2V0dGluZ3MsICdmaWxlcycgKTsKCQkJCgkJCQoJCQkKCQkJLyoKCQkJZWNobyAnRklMRVM6PHByZT4nOwoJCQlwcmludF9yKCAkc3Rhc2hfZmlsZXMgKTsKCQkJZWNobyAnPC9wcmU+JzsKCQkJKi8KCQkJCgkJCQoJCQkKCQkJLy8gRmluYWxseSBzZWUgaWYgdGhlIEFQSSByZXR1cm5lZCBhbiBlcnJvci4KCQkJaWYgKCAhIGlzX2FycmF5KCAkc3Rhc2hfZmlsZXMgKSApIHsgICAgICAgICAgICAKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1N0YXNoIEVycm9yOiAnIC4gJHN0YXNoX2ZpbGVzICk7CgkJCQkkY3JlZGVudGlhbHNfZm9ybS0+ZGlzcGxheV9zZXR0aW5ncyggJ1N1Ym1pdCcgKTsKCQkJfSBlbHNlIHsgLy8gTk8gRVJST1JTCgkJCQkKCQkJCQoJCQkJLy8gU29ydCBpbiBvcmRlciAmIGV4Y2x1ZGUgdW53YW50ZWQgYmFja3VwIHR5cGVzLgoJCQkJJGJhY2t1cF9saXN0X3RlbXAgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCggKGFycmF5KSRzdGFzaF9maWxlcyBhcyAkaSA9PiAkc3Rhc2hfZmlsZSApIHsKCQkJCQkkZmlsZSA9ICRzdGFzaF9maWxlWydmaWxlbmFtZSddOwoJCQkJCSR1cmwgPSAkc3Rhc2hfZmlsZVsndXJsJ107CgkJCQkJJHNpemUgPSAkc3Rhc2hfZmlsZVsnc2l6ZSddOwoJCQkJCSRtb2RpZmllZCA9ICRzdGFzaF9maWxlWyd1cGxvYWRlZF90aW1lc3RhbXAnXTsKCQkJCQkKCQkJCQkvLyBBdm9pZCBjb2xsaW9uIGZvciBzb3J0aW5nLgoJCQkJCXdoaWxlKCBpc3NldCggJGJhY2t1cF9saXN0X3RlbXBbICRtb2RpZmllZCBdICkgKSB7CgkJCQkJCSRtb2RpZmllZCArPSAwLjE7CgkJCQkJfQoJCQkJCQoJCQkJCWlmICggJ2RiJyA9PSAkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGUnXSkgewoJCQkJCQkkYmFja3VwX3R5cGUgPSAnRGF0YWJhc2UnOwoJCQkJCX0gZWxzZWlmKCAnZnVsbCcgPT0gJHN0YXNoX2ZpbGVbJ2JhY2t1cF90eXBlJ10gKSB7CgkJCQkJCSRiYWNrdXBfdHlwZSA9ICdGdWxsJzsKCQkJCQl9IGVsc2VpZiggJ3RoZW1lcycgPT0gJHN0YXNoX2ZpbGVbJ2JhY2t1cF90eXBlJ10gKSB7IC8vIE9taXQgZnJvbSBsaXN0LgoJCQkJCQl1bnNldCggJHN0YXNoX2ZpbGVzWyAkaSBdICk7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0gZWxzZWlmKCAncGx1Z2lucycgPT0gJHN0YXNoX2ZpbGVbJ2JhY2t1cF90eXBlJ10gKSB7IC8vIE9taXQgZnJvbSBsaXN0LgoJCQkJCQl1bnNldCggJHN0YXNoX2ZpbGVzWyAkaSBdICk7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0gZWxzZWlmKCAnbWVkaWEnID09ICRzdGFzaF9maWxlWydiYWNrdXBfdHlwZSddICkgeyAvLyBPbWl0IGZyb20gbGlzdC4KCQkJCQkJdW5zZXQoICRzdGFzaF9maWxlc1sgJGkgXSApOwoJCQkJCQljb250aW51ZTsKCQkJCQl9IGVsc2VpZiggJ2ZpbGVzJyA9PSAkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGUnXSApIHsKCQkJCQkJJGJhY2t1cF90eXBlID0gJ0ZpbGVzJzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkYmFja3VwX3R5cGUgPSAnVW5rbm93bic7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQkkc3Rhc2hfZmlsZVsnYmFja3VwX3R5cGVfcHJldHR5J10gPSAkYmFja3VwX3R5cGU7CgkJCQkJCgkJCQkJJGJhY2t1cF9saXN0X3RlbXBbICRtb2RpZmllZCBdID0gJHN0YXNoX2ZpbGU7CgkJCQl9CgkJCQlrcnNvcnQoICRiYWNrdXBfbGlzdF90ZW1wICk7CgkJCQkkc3Rhc2hfZmlsZXMgPSAkYmFja3VwX2xpc3RfdGVtcDsKCQkJCXVuc2V0KCAkYmFja3VwX2xpc3RfdGVtcCApOwoJCQkJCgkJCQkKCQkJCQoJCQkJLy8gU3BsaXQgdXAgaW50byBzaXRlcy4KCQkJCSRiYWNrdXBfbGlzdHMgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCggJHN0YXNoX2ZpbGVzIGFzICRzdGFzaF9maWxlICkgewoJCQkJCSRiYWNrdXBfbGlzdHNbICRzdGFzaF9maWxlWydzaXRlJ10gXVtdID0gJHN0YXNoX2ZpbGU7CgkJCQl9CgkJCQl1bnNldCggJHN0YXNoX2ZpbGVzICk7CgkJCQkKCQkJCQoJCQkJCgkJCQkvLyBSZW5kZXIgdGFibGUgbGlzdGluZyBmaWxlcy4KCQkJCWlmICggY291bnQoICRiYWNrdXBfbGlzdHMgKSA9PSAwICkgewoJCQkJCWVjaG8gJzxiPic7CgkJCQkJX2UoICdZb3UgaGF2ZSBub3Qgc2VudCBhbnkgYmFja3VwcyB0byBTdGFzaCB5ZXQgKG9yIGZpbGVzIGFyZSBzdGlsbCB0cmFuc2ZlcnJpbmcpLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkJCWVjaG8gJzwvYj4nOwoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkvLyBMb29wIHRocm91Z2ggZWFjaCBzaXRlLgoJCQkJCWZvcmVhY2goICRiYWNrdXBfbGlzdHMgYXMgJHN0YXNoX2ZpbGVzICkgeyAvLyBFYWNoIHNpdGUuCgkJCQkJCQoJCQkJCQkvLyBMb29wIHRocm91Z2ggZWFjaCBmaWxlIHdpdGhpbiB0aGlzIHNpdGUuCgkJCQkJCSRkaXNwbGF5X2xpc3QgPSBhcnJheSgpOwoJCQkJCQlmb3JlYWNoKCAkc3Rhc2hfZmlsZXMgYXMgJHN0YXNoX2ZpbGUgKSB7IC8vIEVhY2ggYmFja3VwIGluIHNpdGUuCgkJCQkJCQkkc2l0ZSA9ICRzdGFzaF9maWxlWydzaXRlJ107CgkJCQkJCQkKCQkJCQkJCSRkaXNwbGF5X2xpc3RbXSA9IGFycmF5KAoJCQkJCQkJCSRzdGFzaF9maWxlWydiYWNrdXBfdHlwZV9wcmV0dHknXSwKCQkJCQkJCQknPHNwYW4gY2xhc3M9InN0YXNoX2JhY2t1cF9maWxlIj4nIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAkc3Rhc2hfZmlsZVsndXBsb2FkZWRfdGltZXN0YW1wJ10gKSwgJ2wsIEYgaiwgWSAtIGc6aSBBJyApIC4gJzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj4oJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT50aW1lX2FnbyggJHN0YXNoX2ZpbGVbJ3VwbG9hZGVkX3RpbWVzdGFtcCddICkgLiAnIGFnbyk8L3NwYW4+PC9hPjxicj48YSBocmVmPSInIC4gJHN0YXNoX2ZpbGVbJ3VybCddIC4gJyI+JyAuICRzdGFzaF9maWxlWydiYXNlbmFtZSddIC4gJzwvYT4nLAoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRzdGFzaF9maWxlWydzaXplJ10gKSwKCQkJCQkJCQknPGZvcm0gYWN0aW9uPSI/I3BsdWdpbmJ1ZGR5LXRhYnMtc2VydmVyIiBtZXRob2Q9IlBPU1QiPgoJCQkJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXNzX2hhc2giIHZhbHVlPSInIC4gUEJfUEFTU1dPUkQgLiAnIj4KCQkJCQkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idXBsb2FkIiB2YWx1ZT0ic3Rhc2giPgoJCQkJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcHRpb25zIiB2YWx1ZT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoIHNlcmlhbGl6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKSAuICciPgoJCQkJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsaW5rIiB2YWx1ZT0iJyAuICRzdGFzaF9maWxlWyd1cmwnXSAuICciPgoJCQkJCQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJSZXN0b3JlIiBjbGFzcz0iYnV0dG9uLXByaW1hcnkiPgoJCQkJCQkJCTwvZm9ybT4nLAoJCQkJCQkJCQoJCQkJCQkJKTsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJZWNobyAnPGgzPlNpdGU6ICcgLiAkc2l0ZSAuICc8L2gzPic7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmxpc3RfdGFibGUoCgkJCQkJCQkkZGlzcGxheV9saXN0LAoJCQkJCQkJYXJyYXkoCgkJCQkJCQkJLy8nYWN0aW9uJwkJPT4JcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnJmN1c3RvbT1yZW1vdGVjbGllbnQmZGVzdGluYXRpb25faWQ9JyAuIGh0bWxlbnRpdGllcyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXN0aW5hdGlvbl9pZCcgKSApIC4gJyZyZW1vdGVfcGF0aD0nIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3JlbW90ZV9wYXRoJyApICksCgkJCQkJCQkJJ2NvbHVtbnMnCQk9PglhcnJheSggJ1R5cGUnLCAnVXBsb2FkZWQ8aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9zb3J0X2Rvd24ucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiIHRpdGxlPSJTb3J0ZWQgbW9zdCByZWNlbnQgZmlyc3QiPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+KENsaWNrIHRvIGRvd25sb2FkKTwvc3Bhbj4nLCAnRmlsZSBTaXplJywgJ0FjdGlvbicgKSwKCQkJCQkJCQknY3NzJwkJCT0+CQknd2lkdGg6IDEwMCU7JywKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQkJZWNobyAnPGJyPjxicj4nOwoJCQkJCQkKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCQoJCQl9IC8vIGVuZCBubyBlcnJvcnMgZ2V0dGluZyBmaWxlIGluZm8gZnJvbSBBUEkuCgkJfSAvLyBlbmQgbG9nZ2VkIGluLgoJfQoJCn0gLy8gZW5kIGZvcm0gc3VibWl0dGVkLgoKPz4KCjxicj48aHI+CjxjZW50ZXI+Cgk8YSBocmVmPSJodHRwczovL3N5bmMuaXRoZW1lcy5jb20vc3Rhc2giIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkiPk1hbmFnZSB5b3VyIFN0YXNoIGZpbGVzIHZpYSBpVGhlbWVzIFN5bmM8L2E+CjwvY2VudGVyPgo8YnI+Cg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_html_1_stash.php,importbuddy/views/_html_1_stash.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_iframe_footer.php,importbuddy/views/_iframe_footer.php CTxzY3JpcHQ+Ly9iYl9hY3Rpb24oICdpZnJhbWVMb2FkZWQnICk7PC9zY3JpcHQ+CjwvaHRtbD4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_iframe_footer.php,importbuddy/views/_iframe_footer.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_iframe_header.php,importbuddy/views/_iframe_header.php PGh0bWw+Cjw/cGhwCnJlcXVpcmUoICdfYXNzZXRzLnBocCcgKTsKCgoKaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIE5PUk1BTCwgTk9UIERFUExPWU1FTlQuCj8+Cgk8c2NyaXB0PgoJCXZhciB3aW4gPSB3aW5kb3cuZGlhbG9nQXJndW1lbnRzIHx8IG9wZW5lciB8fCBwYXJlbnQgfHwgdG9wOwoJCXdpbi53aW5kb3cuc2Nyb2xsVG8oMCwwKTsKCQkKCQlmdW5jdGlvbiBwYl9zdGF0dXNfYXBwZW5kKCBzdGF0dXNfc3RyaW5nICkgewoJCQkvL3ZhciB3aW4gPSB3aW5kb3cuZGlhbG9nQXJndW1lbnRzIHx8IG9wZW5lciB8fCBwYXJlbnQgfHwgdG9wOwoJCQl3aW4ucGJfc3RhdHVzX2FwcGVuZCggc3RhdHVzX3N0cmluZyApOwoJCX0KCQlmdW5jdGlvbiBwYl9zdGF0dXNfdW5kb3VybCggdW5kb191cmwgKSB7CgkJCS8vdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CgkJCXdpbi5wYl9zdGF0dXNfdW5kb3VybCggdW5kb191cmwgKTsKCQl9CgkJCgkJCgkJCgkJZnVuY3Rpb24gcGFnZVRpdGxlKCB0aXRsZSApIHsKCQkJCgkJCXdpbi5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoIHRpdGxlICk7CgkJfQoJCQoJCWZ1bmN0aW9uIGJiX2FjdGlvbiggYWN0aW9uLCBub3RlICkgewoJCQl3aW4uYmJfYWN0aW9uKCBhY3Rpb24sIG5vdGUgKTsKCQl9CgkJCgkJZnVuY3Rpb24gYmJfcmVzdG9yZURhdGEoIGRhdGEgKSB7CgkJCXdpbi5iYl9yZXN0b3JlRGF0YSggZGF0YSApOwoJCX0KCQkKCQlmdW5jdGlvbiBiYl9zaG93U3RlcCggc3RlcCwgZGF0YSApIHsKCQkJd2luLmJiX3Nob3dTdGVwKCBzdGVwLCBkYXRhICk7CgkJfQoJCQoJPC9zY3JpcHQ+Cjw/cGhwIH0gZWxzZSB7IC8vIERFUExPWU1FTlQgPz4KCTxzY3JpcHQ+CgkJZnVuY3Rpb24gcGJfc3RhdHVzX2FwcGVuZCgpIHsKCQl9CgkJCgkJZnVuY3Rpb24gcGJfc3RhdHVzX3VuZG91cmwoIHVuZG9fdXJsICkgewoJCX0KCQkKCQlmdW5jdGlvbiBwYWdlVGl0bGUoIHRpdGxlICkgewoJCX0KCQkKCQlmdW5jdGlvbiBiYl9hY3Rpb24oIGFjdGlvbiwgbm90ZSApIHsKCQl9CgkJCgkJZnVuY3Rpb24gYmJfcmVzdG9yZURhdGEoIGRhdGEgKSB7CgkJfQoJCQoJCWZ1bmN0aW9uIGJiX3Nob3dTdGVwKCBzdGVwLCBkYXRhICkgewoJCX0KCTwvc2NyaXB0Pgo8P3BocCB9ID8+ ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_iframe_header.php,importbuddy/views/_iframe_header.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/cleanupSettings.htm,importbuddy/views/cleanupSettings.htm PCUgaWYgKCBwb3RlbnRpYWxQcm9ibGVtcy5sZW5ndGggPiAwICkgeyAlPgoJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCB3YXJuaW5nX2FsZXJ0X2JveCI+CgkJPHNwYW4gY2xhc3M9ImVycm9yX3dhcm5pbmdfdGl0bGUiPk9uZSBvciBtb3JlIHBvdGVudGlhbCBwcm9ibGVtcyBtYXkgaGF2ZSBiZWVuIGZvdW5kOjwvc3Bhbj4KCQk8dWwgY2xhc3M9ImJhY2t1cGJ1ZGR5X3dhcm5pbmdfbGlzdCI+CgkJCTwlIGpRdWVyeS5lYWNoKCBwb3RlbnRpYWxQcm9ibGVtcywgZnVuY3Rpb24oIGtleSwgcG90ZW50aWFsUHJvYmxlbSApeyAlPgoJCQk8bGk+PCU9cG90ZW50aWFsUHJvYmxlbSU+PC9saT4KCQkJPCUgfSk7ICU+CgkJPC91bD4KCTwvZGl2Pjxicj4KPCUgfSAlPgoKPCUgaWYgKCAnMScgPT0gYmxvZ1B1YmxpY1N0YXR1cyApIHsKCXNvdXJjZVNpdGVQdWJsaWNTdGF0dXNUZXh0ID0gJ1B1YmxpYyAtIERvIG5vdCBkaXNjb3VyYWdlIHNlYXJjaCBlbmdpbmVzIGZyb20gaW5kZXhpbmcgdGhpcyBzaXRlJzsKfSBlbHNlIGlmICggJzAnID09IGJsb2dQdWJsaWNTdGF0dXMgKSB7Cglzb3VyY2VTaXRlUHVibGljU3RhdHVzVGV4dCA9ICdQcml2YXRlIC0gRGlzY291cmFnZSBzZWFyY2ggZW5naW5lcyBmcm9tIGluZGV4aW5nIHRoaXMgc2l0ZSc7Cn0gZWxzZSB7Cglzb3VyY2VTaXRlUHVibGljU3RhdHVzVGV4dCA9ICdDdXJyZW50IHN0YXR1cyBub3QgZGV0ZWN0ZWQnOwp9CiU+CgoKCgo8aDM+VmVyaWZ5IHNpdGUgYmVmb3JlIHByb2NlZWRpbmcgdG8gY2xlYW51cDo8L2gzPgo8YSBocmVmPSI8JT1ob21ldXJsJT4iIHRhcmdldD0iX2JsYW5rIj48JT1ob21ldXJsJT48L2E+Cjxicj48YnI+CgoKPHNjcmlwdD4KalF1ZXJ5KCAnLmV4cGFuZGVyJyApLmNsaWNrKCBmdW5jdGlvbigpewoJalF1ZXJ5KHRoaXMpLm5leHQoJy5jb250ZW50Jykuc2xpZGVUb2dnbGUoKTsKfSk7Cjwvc2NyaXB0PgoKPGgzPkNvbW1vbiBpc3N1ZXMgJiB0aXBzOjwvaDM+CjxkaXYgY2xhc3M9ImV4cGFuZGVyLWJveCI+Cgk8YSBjbGFzcz0iZXhwYW5kZXIiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSI+Q2xpY2tpbmcgb24gYSBwb3N0IHJlc3VsdHMgaW4gYSA0MDQgTm90IEZvdW5kPC9hPgoJPGRpdiBjbGFzcz0iY29udGVudCI+CgkJVHlwaWNhbGx5IGNhdXNlZCBieSBhIHByb2JsZW0gd2l0aCB5b3VyIC5odGFjY2VzcyBmaWxlLCB0aGVyZSBpcyBhIHNpbXBsZSBmaXg6IExvZyBpbnRvIHlvdXIgd3AtYWRtaW4sIG5hdmlnYXRlIHRvIFNldHRpbmdzOiBQZXJtYWxpbmtzIGluIHRoZSBXb3JkUHJlc3MgbWVudSBhbmQgY2xpY2sgdGhlICJTYXZlIiBidXR0b24gdG8gdXBkYXRlIHBlcm1hbGluayBzZXR0aW5ncyB0byB5b3VyIC5odGFjY2VzcyBmaWxlLiBUaGlzIHR5cGljYWxseSByZXNvbHZlcyB0aGlzIHByb2JsZW0uCgk8L2Rpdj4KPC9kaXY+CjxkaXYgY2xhc3M9ImV4cGFuZGVyLWJveCI+Cgk8YSBjbGFzcz0iZXhwYW5kZXIiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSI+TG9nZ2luZyBpbiByZWRpcmVjdHMgYmFjayB0byB0aGUgb2xkIHNpdGU8L2E+Cgk8ZGl2IGNsYXNzPSJjb250ZW50Ij4KCQlUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IGVudGVyaW5nIHRoZSBzb3VyY2Ugc2l0ZSBVUkwgYXMgdGhlIGRlc3RpbmF0aW9uIFVSTCBvbiBTdGVwIDMuICBSZS1yZXN0b3JpbmcgdXNpbmcgdGhlIGNvcnJlY3QgVVJMIHNob3VsZCBmaXggdGhpcyBwcm9ibGVtLgoJPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJleHBhbmRlci1ib3giPgoJPGEgY2xhc3M9ImV4cGFuZGVyIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiPlNvdXJjZSBzaXRlIGhhcyBjaGFuZ2VkIHRvIHRoZSBkZXN0aW5hdGlvbiBVUkw8L2E+Cgk8ZGl2IGNsYXNzPSJjb250ZW50Ij4KCQlUaGlzIGlzIGNhdXNlZCBpZiB5b3UgcmVzdG9yZWQgb3ZlciB5b3VyIHNvdXJjZSBzaXRlIGRhdGFiYXNlIGJ5IGVudGVyaW5nIHRoZSBzb3VyY2Ugc2l0ZSBkYXRhYmFzZSBzZXR0aW5ncyBvbiBTdGVwIDMuIFRoaXMgbWVhbnMgdGhhdCB5b3VyIG5ldyBzaXRlIEFORCB5b3VyIG9sZCBzaXRlIGFyZSBub3cgdXNpbmcgdGhlIHNhbWUgZGF0YWJhc2UgYnV0IHRoZSBkYXRhYmFzZSBoYXMgYmVlbiBtaWdyYXRlZCB0byB3b3JrIHdpdGggdGhlIG5ldyBVUkwuIFlvdSBtYXkgcmUtcmVzdG9yZSBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHVzaW5nIGNvcnJlY3Qgc2V0dGluZ3Mgb3IgdXNlIHRoZSBtYXNzIGRhdGFiYXNlIHJlcGxhY2VtZW50IHRvb2wuICBZb3UgbWF5IGNvcnJlY3QgdGhlIG1vZGlmaWVkIFVSTCBvbiB0aGUgc291cmNlIHNpdGUgYnkgdXNpbmcgdGhlIFNlcnZlciBUb29scyBwYWdlJ3MgTWFzcyBUZXh0IFJlcGxhY2UgdG9vbCB3aXRoaW4gdGhlIERhdGFiYXNlIHRhYi4KCTwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iZXhwYW5kZXItYm94Ij4KCTxhIGNsYXNzPSJleHBhbmRlciIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIj5GaWxlIHBlcm1pc3Npb25zIGhhdmUgY2hhbmdlZDwvYT4KCTxkaXYgY2xhc3M9ImNvbnRlbnQiPgoJCUN1c3RvbSBmaWxlIHBlcm1pc3Npb25zIG1heSBiZSBzZXJ2ZXItc3BlY2lmaWMgYW5kIG1heSBub3Qgc3RheSB0aGUgc2FtZSBhcyB0aGUgc291cmNlIHNpdGUuIElmIHlvdSBtYWRlIGFueSBjdXN0b20gZmlsZSBwZXJtaXNzaW9uIGNoYW5nZXMgKGVpdGhlciBtYW51YWxseSBvciB2aWEgYSBwbHVnaW4gc3VjaCBhcyBhIFNlY3VyaXR5IHBsdWdpbikgeW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IHJlLWFwcGx5IHRoZW0uICBOb3QgYWxsIHNlcnZlcnMgd2lsbCBmdW5jdGlvbiBwcm9wZXJseSB3aXRoIHRoZSBzYW1lIHBlcm1pc3Npb25zLgoJPC9kaXY+CjwvZGl2Pgo8YnI+PGJyPgoKCgo8Zm9ybSBvblN1Ym1pdD0ialF1ZXJ5KCcjY2xlYW51cFNldHRpbmdzLXJlc3RvcmVEYXRhJykudmFsKCB3aW5kb3cuYnRvYSggZW5jb2RlVVJJQ29tcG9uZW50KCBKU09OLnN0cmluZ2lmeSggd2luZG93LnJlc3RvcmVEYXRhICkgKSApICk7IiBhY3Rpb249Ij9hamF4PTYiIHRhcmdldD0ibWluaUZyYW1lIiBtZXRob2Q9InBvc3QiPjwhLS0gdGhpcyBmb3JtIGlzIG9ubHkgc3VibWl0dGVkIGFmdGVyIHJ1bm5pbmcgdGhyb3VnaCBqYXZhc2NyaXB0LiBzdWJtaXR0aW5nIGFjdHVhbCBmb3JtIGluc3RlYWQgb2YgdXNpbmcgalF1ZXJ5IHBvc3Qgc28gd2UgY2FuIHRhcmdldCBpZnJhbWUuIC0tPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIGlkPSJjbGVhbnVwU2V0dGluZ3MtcmVzdG9yZURhdGEiIHZhbHVlPSIiPgoJCgkKCQoJPGRpdiBjbGFzcz0ibWFpbl9ib3hfZm9vdCI+CgkJCgkJPGgzPlNpdGUgU2VhcmNoIEVuZ2luZSBWaXNpYmlsaXR5PC9oMz4KCQk8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHRleHQtYWxpZ246IGxlZnQ7Ij4KCQkJPGxhYmVsIGZvcj0ic2V0X2Jsb2dfcHVibGljLWtlZXAiIHN0eWxlPSJmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNldF9ibG9nX3B1YmxpYyIgaWQ9InNldF9ibG9nX3B1YmxpYy1rZWVwIiB2YWx1ZT0iIiBjaGVja2VkPSJjaGVja2VkIj5ObyBjaGFuZ2UgKGRlZmF1bHQpOiA8JT1zb3VyY2VTaXRlUHVibGljU3RhdHVzVGV4dCU+PC9sYWJlbD48YnI+CgkJCTxsYWJlbCBmb3I9InNldF9ibG9nX3B1YmxpYy1wdWJsaWMiIHN0eWxlPSJmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNldF9ibG9nX3B1YmxpYyIgaWQ9InNldF9ibG9nX3B1YmxpYy1wdWJsaWMiIHZhbHVlPSIxIj5QdWJsaWMgLSBEbyBub3QgZGlzY291cmFnZSBzZWFyY2ggZW5naW5lcyBmcm9tIGluZGV4aW5nIHRoaXMgc2l0ZTwvbGFiZWw+PGJyPgoJCQk8bGFiZWwgZm9yPSJzZXRfYmxvZ19wdWJsaWMtcHJpdmF0ZSIgc3R5bGU9ImZvbnQtc2l6ZTogMTJweDsiPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ic2V0X2Jsb2dfcHVibGljIiBpZD0ic2V0X2Jsb2dfcHVibGljLXByaXZhdGUiIHZhbHVlPSIwIj5Qcml2YXRlIC0gRGlzY291cmFnZSBzZWFyY2ggZW5naW5lcyBmcm9tIGluZGV4aW5nIHRoaXMgc2l0ZTwvbGFiZWw+PGJyPgoJCTwvZGl2PgoJCQkKCQk8YnI+PGJyPgoJCQoJCTxoMz5JbXBvcnRCdWRkeSBDbGVhbnVwOjwvaDM+CgkJPHRhYmxlIHN0eWxlPSJtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFsaWduOiBsZWZ0OyI+PHRyPjx0ZD4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX2JhY2t1cCIgc3R5bGU9IndpZHRoOiBhdXRvOyBmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlbGV0ZV9iYWNrdXAiIGlkPSJkZWxldGVfYmFja3VwIiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIGJhY2t1cCB6aXAgYXJjaGl2ZTwvbGFiZWw+CgkJCTxicj4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX3RlbXAiIHN0eWxlPSJ3aWR0aDogYXV0bzsgZm9udC1zaXplOiAxMnB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZWxldGVfdGVtcCIgaWQ9ImRlbGV0ZV90ZW1wIiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIHRlbXBvcmFyeSBpbXBvcnQgZmlsZXM8L2xhYmVsPgoJCTwvdGQ+PHRkPgoJCQk8bGFiZWwgZm9yPSJkZWxldGVfaW1wb3J0YnVkZHkiIHN0eWxlPSJ3aWR0aDogYXV0bzsgZm9udC1zaXplOiAxMnB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZWxldGVfaW1wb3J0YnVkZHkiIGlkPSJkZWxldGVfaW1wb3J0YnVkZHkiIHZhbHVlPSIxIiBjaGVja2VkPiBEZWxldGUgSW1wb3J0QnVkZHkgdG9vbCBmaWxlczwvbGFiZWw+CgkJCTxicj4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX2ltcG9ydGJ1ZGR5X2RpcmVjdG9yeSIgc3R5bGU9IndpZHRoOiBhdXRvOyBmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlbGV0ZV9pbXBvcnRidWRkeV9kaXJlY3RvcnkiIGlkPSJkZWxldGVfaW1wb3J0YnVkZHlfZGlyZWN0b3J5IiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIEltcG9ydEJ1ZGR5IGRpcmVjdG9yeTwvbGFiZWw+CgkJCTxicj4KCQkJPGxhYmVsIGZvcj0iZGVsZXRlX2ltcG9ydGJ1ZGR5bG9nIiBzdHlsZT0id2lkdGg6IGF1dG87IGZvbnQtc2l6ZTogMTJweDsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGVsZXRlX2ltcG9ydGJ1ZGR5bG9nIiBpZD0iZGVsZXRlX2ltcG9ydGJ1ZGR5bG9nIiB2YWx1ZT0iMSIgY2hlY2tlZD4gRGVsZXRlIGltcG9ydGJ1ZGR5LnR4dCBsb2cgZmlsZTwvbGFiZWw+CgkJPC90ZD48L3RyPjwvdGFibGU+CgkJCgkJPGJyPgoJCTxjZW50ZXI+CgkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im5leHRTdGVwIiB2YWx1ZT0iRmluaXNoIENsZWFudXAiIGNsYXNzPSJpdC1idXR0b24gcGJfZGF0YWJhc2VfbmV4dF90ZXN0Ij4KCQk8L2NlbnRlcj4KCQoJPC9kaXY+CjwvZm9ybT4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/cleanupSettings.htm,importbuddy/views/cleanupSettings.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/cpanelTutorial.htm,importbuddy/views/cpanelTutorial.htm PG9iamVjdCBjbGFzc2lkPSJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiIGNvZGViYXNlPSJodHRwOi8vZnBkb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj03LDAsMCwwIiBpZD0iQ2FwdGl2YXRlMSI+Cgk8cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSJodHRwOi8vd3d3LmNwYW5lbC5uZXQvbWVkaWEvdHV0b3JpYWxzL215c3Fsd2l6YXJkLnN3ZiI+Cgk8cGFyYW0gbmFtZT0icXVhbGl0eSIgdmFsdWU9ImhpZ2giPjxwYXJhbSBuYW1lPSJsb29wIiB2YWx1ZT0iMCI+Cgk8ZW1iZWQgc3JjPSJodHRwOi8vd3d3LmNwYW5lbC5uZXQvbWVkaWEvdHV0b3JpYWxzL215c3Fsd2l6YXJkLnN3ZiIgd2lkdGg9IjEwMCUiIGhlaWdodD0iNTAwIiBsb29wPSIwIiBxdWFsaXR5PSJsb3ciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgbWVudT0iZmFsc2UiPgo8L29iamVjdD4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/cpanelTutorial.htm,importbuddy/views/cpanelTutorial.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/databaseSettings.htm,importbuddy/views/databaseSettings.htm PHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5kYl90ZXN0X2NvbnRhaW5lciB7CgkJY2xlYXI6IGJvdGg7CgkJZGlzcGxheTogbm9uZTsKCQliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOwoJCQoJCWJvcmRlci1yYWRpdXM6IDRweDsKCQktbW96LWJvcmRlci1yYWRpdXM6IDRweDsKCQktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCQlib3JkZXI6IDFweCBzb2xpZCAjREZERkRGOwoJCQoJCW1hcmdpbi1yaWdodDoxMHB4OwoJCXBhZGRpbmc6OHB4OwoJfQo8L3N0eWxlPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaW1wb3J0YnVkZHkvanMvanF1ZXJ5LmxlYW5Nb2RhbC5taW4uanMiPjwvc2NyaXB0PgoKCgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cgl2YXIgZGF0YWJhc2VQYXNzZWQgPSBmYWxzZTsKCQoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkKCQlsb2FkVG9vbHRpcHMoKTsKCQkKCQlqUXVlcnkoICcjZGF0YWJhc2UtYm94IGlucHV0JyApLmNoYW5nZSggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS50ZXh0KCcnKS5oaWRlKCk7CgkJfSk7CgkJCgkJalF1ZXJ5KCcuc2V0dGluZ0NvcHkgYScgKS5jbGljayggZnVuY3Rpb24oZSl7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJaWYgKCBqUXVlcnkodGhpcykuaGFzQ2xhc3MoICdzZXR0aW5nQ29weUFsbCcgKSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlzb3VyY2VWYWwgPSBqUXVlcnkodGhpcykuY2xvc2VzdCgndGQnKS5wcmV2KCd0ZCcpLmZpbmQoJ2lucHV0W3R5cGU9InRleHQiXScpLnZhbCgpOwoJCQlkZXN0aW5hdGlvbiA9IGpRdWVyeSh0aGlzKS5jbG9zZXN0KCd0ZCcpLm5leHQoJ3RkJykuZmluZCgnaW5wdXRbdHlwZT0idGV4dCJdJyk7CgkJCWRlc3RpbmF0aW9uLnZhbCggc291cmNlVmFsICk7CgkJfSk7CgkJalF1ZXJ5KCcuc2V0dGluZ0NvcHlBbGwgYScgKS5jbGljayggZnVuY3Rpb24oZSl7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJcGFyZW50VGFibGUgPSBqUXVlcnkodGhpcykuY2xvc2VzdCgndGFibGUnKTsKCQkJcGFyZW50VGFibGUuZmluZCgndHInKS5lYWNoKCBmdW5jdGlvbigpewoJCQkJc2V0dGluZ0NvcHlJdGVtID0galF1ZXJ5KHRoaXMpLmZpbmQoJy5zZXR0aW5nQ29weScpOwoJCQkJaWYgKCAhIHNldHRpbmdDb3B5SXRlbS5oYXNDbGFzcyggJ3NldHRpbmdDb3B5QWxsJyApICkgewoJCQkJCXNldHRpbmdDb3B5SXRlbS5maW5kKCdhJykudHJpZ2dlcignY2xpY2snKTsKCQkJCX0KCQkJfSk7CgkJfSk7CgkJCgkJCgkJCgkJalF1ZXJ5KCcjcGJfYmFja3VwYnVkZHlfbWFsd2FyZXNjYW5sb2FkaW5nJykuc2xpZGVUb2dnbGUoKTsKCQkKCQlqUXVlcnkoICcuZGJfc2V0dGluZycgKS5jaGFuZ2UoIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5yZW1vdmVDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQl9KTsKCQkKCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5jbGljayggZnVuY3Rpb24oZSkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQoJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkudGV4dCgnJykuaGlkZSgpOwoJCQkKCQkJaWYgKCAoICcnID09IGpRdWVyeSgnI215c3FsX3NlcnZlcicpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF9kYXRhYmFzZScpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF91c2VybmFtZScpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF9wcmVmaXgnKS52YWwoKSApICkgewoJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyAgYW5pbWF0ZWQgaW5maW5pdGUgdGFkYSI+TWlzc2luZyBGaWVsZHM8L3NwYW4+ICZuYnNwOyZuYnNwOyBBbGwgZGF0YWJhc2Ugc2V0dGluZ3MgKGV4Y2VwdCBvcHRpb25hbCBwYXNzd29yZCkgYXJlIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGVudGVyZWQgdG8gY29udGludWUuJyApLnNob3coKTsKCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlOUHJvZ3Jlc3Muc3RhcnQoKTsKCQkJCgkJCWpRdWVyeSgnLmlucHV0LWF0dGVudGlvbicgKS5yZW1vdmVDbGFzcyggJ2lucHV0LWF0dGVudGlvbicgKTsKCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykucmVtb3ZlQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQoJCQl2YXIgc2VydmVyID0galF1ZXJ5KCcjbXlzcWxfc2VydmVyJykudmFsKCk7CgkJCXZhciBkYXRhYmFzZSA9IGpRdWVyeSgnI215c3FsX2RhdGFiYXNlJykudmFsKCk7CgkJCXZhciB1c2VybmFtZSA9IGpRdWVyeSgnI215c3FsX3VzZXJuYW1lJykudmFsKCk7CgkJCXZhciBwYXNzd29yZCA9IGpRdWVyeSgnI215c3FsX3Bhc3N3b3JkJykudmFsKCk7CgkJCXZhciBwcmVmaXggPSBqUXVlcnkoJyNteXNxbF9wcmVmaXgnKS52YWwoKTsKCQkJdmFyIGRhdGFiYXNlTWV0aG9kU3RyYXRlZ3kgPSBqUXVlcnkoICcjZGF0YWJhc2VNZXRob2RTdHJhdGVneScpLnZhbCgpOwoJCQkKCQkJYmFja3VwYnVkZHlfbG9nKCAnQ2FsbGluZyBteXNxbF90ZXN0IEFKQVguJyk7CgkJCWpRdWVyeS5hamF4KCdpbXBvcnRidWRkeS5waHAnLAoJCQkJewoJCQkJCW1ldGhvZDogJ1BPU1QnLAoJCQkJCWRhdGE6IHsKCQkJCQkJCWFqYXg6ICdteXNxbF90ZXN0JywKCQkJCQkJCXNlcnZlcjogc2VydmVyLAoJCQkJCQkJZGF0YWJhc2U6IGRhdGFiYXNlLAoJCQkJCQkJdXNlcm5hbWU6IHVzZXJuYW1lLAoJCQkJCQkJcGFzc3dvcmQ6IHBhc3N3b3JkLAoJCQkJCQkJcHJlZml4OiBwcmVmaXgKCQkJCQl9LAoJCQkJCWVycm9yOiBmdW5jdGlvbigganFYSFIsIHRleHRTdGF0dXMgKSB7CgkJCQkJCW1lc3NhZ2UgPSAnRVJST1IgIzMyOTcyMzogVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UgZnJvbSBBSkFYLiBTZWUgU3RhdHVzIExvZyBmb3IgbW9yZSBkZXRhaWxzLiBSZXNwb25zZTogYCcgKyB0ZXh0U3RhdHVzICsgJ2AsIEhUVFAgU3RhdHVzOiBgJyArIGpxWEhSLnN0YXR1cyArICdgLCBTdGF0dXMgVGV4dDogYCcgKyBqcVhIUi5zdGF0dXNUZXh0ICsgJ2AsIFJlc3BvbnNlIFRleHQ6IGAnICsganFYSFIucmVzcG9uc2VUZXh0ICsgJ2AuJzsKCQkJCQkJYWxlcnQoIG1lc3NhZ2UgKTsKCQkJCQkJYmFja3VwYnVkZHlfbG9nKCBtZXNzYWdlICk7CgkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfSwKCQkJCQlzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7CgkJCQkJCU5Qcm9ncmVzcy5kb25lKCk7CgkJCQkJCWRhdGEgPSBqUXVlcnkudHJpbSggZGF0YSApOwoJCQkJCQliYWNrdXBidWRkeV9sb2coICdNeVNRTCB0ZXN0IHJlc3VsdHM6IGAnICsgZGF0YSArICdgLicgKTsKCQkJCQkJaWYgKCBkYXRhLmluZGV4T2YoIm11c3QgbG9nIGluIikgIT0gLTEpIHsKCQkJCQkJCWFsZXJ0KCAnWW91ciBzZXNzaW9uIGhhcyBleHBpcmVkLiBQbGVhc2UgcmV0dXJuIHRvIHRoZSByZXN0b3JlIGhvbWVwYWdlIGFuZCBsb2cgYmFjayBpbi4nICk7CgkJCQkJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5hZGRDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfQoKCQkJCQkJLy8gUGFyc2UganNvbi4KCQkJCQkJdHJ5IHsKCQkJCQkJCXJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApOwoJCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJCW1lc3NhZ2UgPSAnRVJST1IgIzgzOTk4MzogRmFpbHVyZSBwYXJzaW5nIHJldHVybmVkIHNlcnZlciBkYXRhLiBTZWUgU3RhdHVzIExvZyBmb3IgbW9yZSBkZXRhaWxzLiBEZXRhaWxzOiBgJyArIGUubWVzc2FnZSArICdgLiBSZXNwb25zZTogYCcgKyBkYXRhICsgJ2AuJzsKCQkJCQkJCWFsZXJ0KCBtZXNzYWdlICk7CgkJCQkJCQliYWNrdXBidWRkeV9sb2coIG1lc3NhZ2UgKTsKCQkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJCWNvbnNvbGUubG9nKCByZXNwb25zZSApOwoJCQkJCQkKCQkJCQkJCgkJCQkJCS8vIE9WRVJBTEwgRVJST1IKCQkJCQkJaWYgKCAnJyAhPSByZXNwb25zZS5vdmVyYWxsX2Vycm9yICkgewoJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5FcnJvcjwvc3Bhbj4gJm5ic3A7Jm5ic3A7ICcgKyByZXNwb25zZS5vdmVyYWxsX2Vycm9yICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCQoJCQkJCQkvLyBFUlJPUlMKCQkJCQkJaWYgKCBmYWxzZSA9PT0gcmVzcG9uc2UuY29ubmVjdCApIHsKCQkJCQkJCWpRdWVyeSggJyNteXNxbF9zZXJ2ZXIsI215c3FsX3VzZXJuYW1lLCNteXNxbF9wYXNzd29yZCcgKS5hZGRDbGFzcyggJ2lucHV0LWF0dGVudGlvbicgKTsKCQkJCQkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS5odG1sKCAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmcgYW5pbWF0ZWQgaW5maW5pdGUgdGFkYSI+RGF0YWJhc2UgRXJyb3I8L3NwYW4+ICZuYnNwOyZuYnNwOyBVbmFibGUgdG8gY29ubmVjdCAvIGF1dGhlbnRpY2F0ZSB0byBNeVNRTCBzZXJ2ZXIuICcgKyByZXNwb25zZS5jb25uZWN0X2Vycm9yICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmICggZmFsc2UgPT09IHJlc3BvbnNlLnNlbGVjdGRiICkgewoJCQkJCQkJalF1ZXJ5KCAnI215c3FsX2RhdGFiYXNlJyApLmFkZENsYXNzKCAnaW5wdXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBFcnJvcjwvc3Bhbj4gJm5ic3A7Jm5ic3A7IFVuYWJsZSB0byBzZWxlY3QgZGF0YWJhc2UuIFZlcmlmeSB0aGUgZGF0YWJhc2UgZXhpc3RzICYgdGhlIHVzZXIgd2FzIGdyYW50ZWQgQUxMIHByaXZpbGVnZXMuICcgKyByZXNwb25zZS5zZWxlY3RkYl9lcnJvciApLnNob3coKTsKCQkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIGZhbHNlID09PSByZXNwb25zZS5jcmVhdGVkcm9wdGFibGUgKSB7CgkJCQkJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkuaHRtbCggJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIGFuaW1hdGVkIGluZmluaXRlIHRhZGEiPkRhdGFiYXNlIEVycm9yPC9zcGFuPiAmbmJzcDsmbmJzcDsgVW5hYmxlIHRvIGNyZWF0ZSAmIGRyb3AgdGVzdCB0YWJsZS4gVmVyaWZ5IHRoZSBlbnRlcmVkIHVzZXIgaGFzIEFMTCBwcml2aWxlZ2VzIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLiAnICsgcmVzcG9uc2UuY3JlYXRlZHJvcHRhYmxlX2Vycm9yICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJaWYgKCBmYWxzZSA9PT0gcmVzcG9uc2UucHJlZml4ICkgewoJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBFcnJvcjwvc3Bhbj4gJm5ic3A7Jm5ic3A7IFRoZSBzcGVjaWZpZWQgcHJlZml4IGRvZXMgbm90IHRoZSBiYXJlIG1pbmltdW0gY3JpdGVyaWEgZm9yIFdvcmRQcmVzcy4gSXQgc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQgb2YgbGV0dGVycyAob3IgbnVtYmVycywgYnV0IG5vdCBhdCB0aGUgYmVnaW5uaW5nKSBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLiA8Yj5FaXRoZXIgY2hhbmdlIHRoZSBwcmVmaXggb3Igc2VsZWN0IHRvIGlnbm9yZSB0aGlzIHdhcm5pbmcgYmVsb3cgdG8gcHJvY2VlZC48L2I+IEV4YW1wbGVzOiB3cF8sIHdwMl8sIG15d29yZHByZXNzXywgZHVzdGluczJuZGJsb2dfJyApLnNob3coKTsKCQkJCQkJCWpRdWVyeSggJyNkYl93aXBlX29wdGlvbnMnICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCQoJCQkJCQkKCQkJCQkJLy8gUFJFRklYIFdBUk5JTkdTCgkJCQkJCXByZWZpeF93YXJuX2lnbm9yZSA9IGpRdWVyeSggJyNpZ25vcmVfcHJlZml4X3dhcm5pbmdzX2NoZWNrYm94JyApLmlzKCI6Y2hlY2tlZCIpOwoJCQkJCQkKCQkJCQkJaWYgKCAoIHRydWUgPT09IHJlc3BvbnNlLnByZWZpeF93YXJuICkgJiYgKCB0cnVlID09PSB3aW5kb3cucmVzdG9yZURhdGEucmVzdG9yZURhdGFiYXNlICkgKSB7CgkJCQkJCQlpZiAoICFwcmVmaXhfd2Fybl9pZ25vcmUgKSB7CgkJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBXYXJuaW5nPC9zcGFuPiAmbmJzcDsmbmJzcDsgQSBwcmVmaXggaW4gdGhlIGZvcm1hdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlIGlzIDxiPmhpZ2hseSByZWNvbW1lbmRlZDwvYj4gdG8gY29uZm9ybSB0byBXb3JkUHJlc3MgJiBCYWNrdXBCdWRkeSBjb252ZW50aW9ucyAmIGV4cGVjdGF0aW9ucy4gVGhpcyBtYXkgYWxzbyBjYXVzZSB3YXJuaW5ncyBvZiB0YWJsZXMgYWxyZWFkeSBleGlzdGluZyB0aGF0IGRvIG5vdC4gPGI+RWl0aGVyIGNoYW5nZSB0aGUgcHJlZml4IG9yIHNlbGVjdCB0byBpZ25vcmUgdGhpcyB3YXJuaW5nIGJlbG93IHRvIHByb2NlZWQuPC9iPiBFeGFtcGxlczogd3BfLCB3cDJfLCBteXdvcmRwcmVzc18sIGR1c3RpbnMybmRibG9nXycgKS5zaG93KCk7CgkJCQkJCQkJalF1ZXJ5KCAnI2RiX3dpcGVfb3B0aW9ucycgKS5zaG93KCk7CgkJCQkJCQkJalF1ZXJ5KCAnI2lnbm9yZV9wcmVmaXhfd2FybmluZ3MnICkuc2hvdygpOwoJCQkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJfSBlbHNlIHsgLy8gTm8gcHJlZml4IGZvcm1hdCB3YXJuaW5nIHNvIGhpZGUgb3B0aW9uIHRvIGJ5cGFzcy4KCQkJCQkJCWpRdWVyeSggJyNpZ25vcmVfcHJlZml4X3dhcm5pbmdzX2NoZWNrYm94JyApLmF0dHIoJ2NoZWNrZWQnLCBmYWxzZSk7CgkJCQkJCQlqUXVlcnkoICcjaWdub3JlX3ByZWZpeF93YXJuaW5ncycpLmhpZGUoKTsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJLy8gUHJlZml4IGV4aXN0cy4KCQkJCQkJaWYoICAoIHRydWUgPT09IHJlc3BvbnNlLnByZWZpeF9leGlzdHMgKSAmJiAoIHRydWUgPT09IHdpbmRvdy5yZXN0b3JlRGF0YS5yZXN0b3JlRGF0YWJhc2UgKSApIHsKCQkJCQkJCWlmICggKCAhIGpRdWVyeSggJyN3aXBlX3ByZWZpeCcpLmlzKCAnOmNoZWNrZWQnICkgKSAmJiAoICEgalF1ZXJ5KCAnI3dpcGVfZGF0YWJhc2UnKS5pcyggJzpjaGVja2VkJyApICkgKSB7CgkJCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyBhbmltYXRlZCBpbmZpbml0ZSB0YWRhIj5EYXRhYmFzZSBXYXJuaW5nPC9zcGFuPiAmbmJzcDsmbmJzcDsgVGhlIHNwZWNpZmllZCBwcmVmaXggYXBwZWFycyB0byBhbHJlYWR5IGV4aXN0IGluIHRoaXMgZGF0YWJhc2UuIFJlc3RvcmluZyBtYXkgb3ZlcndyaXRlIGV4aXN0aW5nIFdvcmRQcmVzcyBkYXRhLiA8Yj5DaGFuZ2UgdGhlIHByZWZpeCwgc2VsZWN0IHRvIGRlbGV0ZSBleGlzdGluZyB0YWJsZXMgYmVsb3csIG9yIHVzZSB0aGUgYWR2YW5jZWQgb3B0aW9uIHRvIGlnbm9yZSBTUUwgZXJyb3JzIHRvIHByb2NlZWQuPC9iPicgKS5zaG93KCk7CgkJCQkJCQkJalF1ZXJ5KCAnI2RiX3dpcGVfb3B0aW9ucycgKS5zaG93KCk7CgkJCQkJCQkJaWYgKCAgalF1ZXJ5KCcjaWdub3JlX3NxbF9lcnJvcnMnKS5pcyggJzpjaGVja2VkJyApICkgewoJCQkJCQkJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkuaHRtbCggJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIGFuaW1hdGVkIGluZmluaXRlIHRhZGEiPkRhdGFiYXNlIFdhcm5pbmc8L3NwYW4+ICZuYnNwOyZuYnNwOyBUaGUgc3BlY2lmaWVkIHByZWZpeCBhcHBlYXJzIHRvIGFscmVhZHkgZXhpc3QgaW4gdGhpcyBkYXRhYmFzZS4gSG93ZXZlciwgdGhlIGFkdmFuY2VkIG9wdGlvbiB0byBpZ25vcmUgZXhpc3RpbmcgdGFibGVzICYgU1FMIGVycm9ycyB3YXMgc2VsZWN0ZWQuIFVzZSBleHRyZW1lIGNhdXRpb24uJyApLnNob3coKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5hZGRDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQkKCQkJCQkJLy8gU2V0IHVwIGRhdGFiYXNlIHNldHRpbmdzIGluIHJlc3RvcmVEYXRhLgoJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5zZXJ2ZXIgPSBzZXJ2ZXI7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLmRhdGFiYXNlID0gZGF0YWJhc2U7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLnVzZXJuYW1lID0gdXNlcm5hbWU7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLnByZWZpeCA9IHByZWZpeDsKCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MuZGF0YWJhc2VNZXRob2RTdHJhdGVneSA9IGRhdGFiYXNlTWV0aG9kU3RyYXRlZ3k7CgkJCQkJCgkJCQkJCWlmICggalF1ZXJ5KCAnI3dpcGVfcHJlZml4JykuaXMoICc6Y2hlY2tlZCcgKSApIHsKCQkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLndpcGVQcmVmaXggPSB0cnVlOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Mud2lwZVByZWZpeCA9IGZhbHNlOwoJCQkJCQl9CgkJCQkJCWlmICggalF1ZXJ5KCAnI3dpcGVfZGF0YWJhc2UnKS5pcyggJzpjaGVja2VkJyApICkgewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Mud2lwZURhdGFiYXNlID0gdHJ1ZTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLndpcGVEYXRhYmFzZSA9IGZhbHNlOwoJCQkJCQl9CgkJCQkJCWlmICggalF1ZXJ5KCAnI2lnbm9yZV9zcWxfZXJyb3JzJykuaXMoICc6Y2hlY2tlZCcgKSApIHsKCQkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLmlnbm9yZVNxbEVycm9ycyA9IHRydWU7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5pZ25vcmVTcWxFcnJvcnMgPSBmYWxzZTsKCQkJCQkJfQoJCQkJCQlpZiAoIGpRdWVyeSggJyNkYl9mb3JjZV9zc2wnKS5pcyggJzpjaGVja2VkJyApICkgewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MuZGJfZm9yY2Vfc3NsID0gdHJ1ZTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLmRiX2ZvcmNlX3NzbCA9IGZhbHNlOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBEZXRlcm1pbmUgU1FMIGZpbGVzIHRvIHJlc3RvcmUgYmFzZWQgb24gYWR2YW5jZWQgY2hlY2tlZCBpdGVtcy4gT3ZlcndyaXRlcyBwcmlvciB2YWx1ZSBvZiB0aGlzIHZhci4KCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Muc3FsRmlsZXMgPSBbXTsKCQkJCQkJalF1ZXJ5KCcuZGF0YWJhc2VGaWxlOmNoZWNrZWQnKS5lYWNoKCBmdW5jdGlvbigpewoJCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Muc3FsRmlsZXMucHVzaCggalF1ZXJ5KHRoaXMpLnZhbCgpICk7CgkJCQkJCX0pOwoJCQkJCQkKCQkJCQkJLy8gVXBkYXRlIG1heCBleGVjdXRpb24gdGltZS4KCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLm1heEV4ZWN1dGlvblRpbWUgPSBqUXVlcnkoJyNtYXhfZXhlY3V0aW9uX3RpbWUnKS52YWwoKTsKCQkJCQkJCgkJCQkJCS8vIE1hZGUgaXQgaGVyZSBzbyBtdXN0IGhhdmUgYmVlbiBzdWNjZXNzLgoJCQkJCQljb25zb2xlLmRpciggd2luZG93LnJlc3RvcmVEYXRhICk7CgkJCQkJCQoJCQkJCQlqUXVlcnkoJyNiYWNrdXBidWRkeS1kYlNldHRpbmdzRm9ybS1yZXN0b3JlRGF0YScpLnZhbCggd2luZG93LmJ0b2EoIGVuY29kZVVSSUNvbXBvbmVudCggSlNPTi5zdHJpbmdpZnkoIHdpbmRvdy5yZXN0b3JlRGF0YSApICkgKSApOyAvLyB3aW5kb3cuYnRvYSgpIGJhc2U2NCBlbmNvZGVzIHRvIGdldCBhcm91bmQgdHJhbnNmZXIgaXNzdWVzICsgQ2hyb21lIFhTUyBhdWRpdG9yLiBlbmNvZGVVUklDb21wb25lbnQgbmVlZGVkIHRvIGtlZXAgVVRGOCBmcm9tIGdldHRpbmcgbXVja2VkIHVwIGdvaW5nIG92ZXIgdG8gUEhQJ3MganNvbl9kZWNvZGUoKS4gQmxlY2ghCgkJCQkJCWpRdWVyeSgnI2RhdGFiYXNlLWJveCcpLmhpZGUoKTsJCgkJCQkJCWpRdWVyeSgnI2RhdGFiYXNlLWJveC13b3JraW5nJykuaHRtbCggbmV3IEVKUyh7dXJsOiAnaW1wb3J0YnVkZHkvdmlld3MvaW1wb3J0aW5nRGF0YWJhc2UuaHRtJ30pLnJlbmRlcigpICk7CgkJCQkJCWpRdWVyeSggJyNiYWNrdXBidWRkeS1kYlNldHRpbmdzRm9ybScpLnN1Ym1pdCgpOwoJCQkJCQkKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCX0KCQkJKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0pOwoJCQoJCQoJCWpRdWVyeSgnLmNyZWF0ZWRiX21vZGFsX2xpbmsnKS5jbGljayggZnVuY3Rpb24oKSB7CgkJCXVybCA9IGpRdWVyeSgnI3NpdGVfdXJsJykudmFsKCk7CgkJCXZhciBob3N0bmFtZSA9IGpRdWVyeSgnPGE+JykucHJvcCgnaHJlZicsIHVybCkucHJvcCgnaG9zdG5hbWUnKTsKCQkJLy9hbGVydCggaG9zdG5hbWUgKTsKCQkJalF1ZXJ5KCAnI2NwYW5lbF91cmwnICkudmFsKCBob3N0bmFtZSApOwoJCQkvL2pRdWVyeSggJy5jcGFuZWxfdXJsX2Z1bGwnICkuaHRtbCggJ2h0dHA6Ly8nICsgaG9zdG5hbWUgKyAnOjIwODIvJyApOwoJCQkKCQl9KTsKCQlqUXVlcnkoICcjY3BhbmVsX3VybCcgKS5jaGFuZ2UoIGZ1bmN0aW9uKCkgewoJCQkvL2pRdWVyeSggJy5jcGFuZWxfdXJsX2Z1bGwnICkuaHRtbCggJ2h0dHA6Ly8nICsgalF1ZXJ5KHRoaXMpLnZhbCgpICsgJzoyMDgyLycgKTsKCQl9KTsKCQlqUXVlcnkoJy5sZWFuTW9kYWwnKS5sZWFuTW9kYWwoCgkJCXsgdG9wIDogNDUsIG92ZXJsYXkgOiAwLjQsIGNsb3NlQnV0dG9uOiAiLm1vZGFsX2Nsb3NlIiB9CgkJKTsKCQkKCQlqUXVlcnkoICcuY3BhbmVsX3VzZXInICkuY2hhbmdlKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggJy5jcGFuZWxfdXNlcl9taXJyb3InICkuaHRtbCggalF1ZXJ5KCAnI2NwYW5lbF91c2VyJyApLnZhbCgpLnN1YnN0cmluZygwLDgpICsgJ18nICk7CgkJfSk7CgkJCgkJalF1ZXJ5KCAnLmNwYW5lbF9jcmVhdGVkYl9jcmVhdGUnICkuY2xpY2soIGZ1bmN0aW9uKCkgewoJCQkvLyBWYWxpZGF0ZSBkYiBzdHVmZiBpcyBhbGwgYWxwaGFudW1lcmljLgoJCQlpZiAoCgkJCQkoIGZhbHNlID09IC9eW2EtekEtWjAtOV0rJC8udGVzdCggalF1ZXJ5KCcjY3BhbmVsX2RibmFtZScpLnZhbCgpICkgKQoJCQkJfHwKCQkJCSggZmFsc2UgPT0gL15bYS16QS1aMC05XSskLy50ZXN0KCBqUXVlcnkoJyNjcGFuZWxfZGJ1c2VyJykudmFsKCkgKSApCgkJCQkpIHsKCQkJCWFsZXJ0KCAnRGF0YWJhc2UgdmFsdWVzIChleGNlcHQgcGFzc3dvcmQpIG11c3QgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvbmx5IGFuZCBubyBzcGFjZXMuIENvcnJlY3QgdGhpcyBhbmQgdHJ5IGFnYWluLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJLy8gVmFsaWRhdGUgaW5wdXQgbGVuZ3Rocy4KCQkJaWYgKCBqUXVlcnkoJyNjcGFuZWxfZGJwYXNzJykudmFsKCkubGVuZ3RoIDwgNSApIHsKCQkJCWFsZXJ0KCAnRGF0YWJhc2UgcGFzc3dvcmRzIG11c3QgYmUgNSBvciBtb3JlIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJTlByb2dyZXNzLnN0YXJ0KCk7CgkJCQoJCQlqUXVlcnkucG9zdCgKCQkJCSdpbXBvcnRidWRkeS5waHA/YWpheD1jcGFuZWxfY3JlYXRlZGInLAoJCQkJalF1ZXJ5KCAnI2NwYW5lbF9jcmVhdGVkYl9mb3JtJyApLnNlcmlhbGl6ZSgpLCBmdW5jdGlvbihkYXRhKSB7CgkJCQkJTlByb2dyZXNzLmRvbmUoKTsKCQkJCQkKCQkJCQlkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKCQkJCQlqUXVlcnkoJyNpdGhlbWVzX2xvYWRpbmcnKS5odG1sKCBkYXRhICk7CgkJCQkJalF1ZXJ5KCAnLmNwYW5lbF9jcmVhdGVkYl9sb2FkaW5nJyApLmhpZGUoKTsKCQkJCQkKCQkJCQkvL2FsZXJ0KCAnc2xpY2U6ICcgKyBkYXRhLnNsaWNlKCAtNyApICk7CgkJCQkJaWYgKCBkYXRhLnNsaWNlKCAwLDcgKSA9PSAnU3VjY2VzcycgKSB7CgkJCQkJCQoJCQkJCQlqUXVlcnkoICcjbXlzcWxfZGF0YWJhc2UnICkudmFsKCBqUXVlcnkoICcjY3BhbmVsX3VzZXInICkudmFsKCkgKyAnXycgKyBqUXVlcnkoJyNjcGFuZWxfZGJuYW1lJykudmFsKCkgKTsKCQkJCQkJalF1ZXJ5KCAnI215c3FsX3VzZXJuYW1lJyApLnZhbCggalF1ZXJ5KCAnI2NwYW5lbF91c2VyJyApLnZhbCgpICsgJ18nICsgalF1ZXJ5KCcjY3BhbmVsX2RidXNlcicpLnZhbCgpICk7CgkJCQkJCWpRdWVyeSggJyNteXNxbF9wYXNzd29yZCcgKS52YWwoIGpRdWVyeSgnI2NwYW5lbF9kYnBhc3MnKS52YWwoKSApOwoJCQkJCQkKCQkJCQkJYWxlcnQoIGRhdGEgKyAiXG5cbiIgKyAnWW91ciBkYXRhYmFzZSBzZXR0aW5ncyB3aWxsIG5vdyBiZSBzZXQuJyApOwoJCQkJCQlqUXVlcnkoJy5tb2RhbF9jbG9zZScpLnRyaWdnZXIoJ2NsaWNrJyk7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCWFsZXJ0KCBkYXRhICk7CgkJCQkJCS8valF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdidXR0b25fZGlzYWJsZWQnICk7CgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkpOwoJCQkKCQkJcmV0dXJuIGZhbHNlOwoJCX0pOwoJCQoJfSk7Cjwvc2NyaXB0PgoKPGRpdiBpZD0iZGF0YWJhc2UtYm94Ij4KCTxkaXYgY2xhc3M9ImRhdGFiYXNlLWRlc2NyaXB0aW9uIj4KCQk8cD5NYW51YWxseSBlbnRlciB5b3VyIGRhdGFiYXNlIHNldHRpbmdzIGJlbG93IG9yIHNlbGVjdCBvbmUgb2YgdGhlIG9wdGlvbnMgYmVsb3cgdG8gYXNzaXN0IHlvdS4gVGhlIDxpPmNQYW5lbCBEYXRhYmFzZSBXaXphcmQ8L2k+IGFsbG93cyB5b3UgdG8gZW50ZXIgeW91ciBjUGFuZWwgY3JlZGVudGlhbHMgdG8gY3JlYXRlIGEgZGF0YWJhc2UgJiBhdXRvLWZpbGwgaXRzIHNldHRpbmdzIGJlbG93LiBUaGUgPGk+Y1BhbmVsIFR1dG9yaWFsPC9pPiBidXR0b24gc2hvd3MgeW91IHRoZSBzaW1wbGVzdCB3YXkgdG8gbWFudWFsbHkgY3JlYXRlIGEgZGF0YWJhc2UuIFNlZSB5b3VyIGhvc3QncyBkb2N1bWVudGF0aW9uIGZvciBub24tY1BhbmVsIGhvc3RpbmcuIElmIHlvdSBhcmUgcmVzdG9yaW5nIGEgc2l0ZSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBsb2NhdGlvbiAoZm9yIGluc3RhbmNlIGFmdGVyIGJlaW5nIGhhY2tlZCkgeW91IG1heSByZXRhaW4gdGhlIHNhbWUgZGF0YWJhc2Ugc2V0dGluZ3MgYnkgY2xpY2tpbmcgdGhlIGFwcHJvcHJpYXRlICJjb3B5IiBsaW5rcyBiZXR3ZWVuIHNldHRpbmdzIGJlbG93LjwvcD4KCQk8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMjVweDsgdGV4dC1hbGlnbjogY2VudGVyOyI+CgkJCTxidXR0b24gaHJlZj0iI3BiX2NyZWF0ZWRiX21vZGFsIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkgbGVhbk1vZGFsIGNyZWF0ZWRiX21vZGFsX2xpbmsiIHN0eWxlPSJmb250LXNpemU6IDE0cHg7IG1hcmdpbi1ib3R0b206IDEzcHg7Ij5jUGFuZWwgRGF0YWJhc2UgV2l6YXJkPC9idXR0b24+CgkJCTxidXR0b24gaHJlZj0iI3BiX2NwYW5lbHR1dG9yaWFsX21vZGFsIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkgbGVhbk1vZGFsIGNyZWF0ZWRiX21vZGFsX2xpbmsiIHN0eWxlPSJmb250LXNpemU6IDE0cHg7Ij5jUGFuZWwgRGF0YWJhc2UgVHV0b3JpYWw8L2J1dHRvbj4KCQk8L2Rpdj4KCQk8YnIgc3R5bGU9ImNsZWFyOiBib3RoOyI+Cgk8L2Rpdj4KCQoJCgkKCTxocj4KCQoJCgk8Zm9ybSBhY3Rpb249Ij9hamF4PTQiIHRhcmdldD0ibWluaUZyYW1lIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJkYl9zZXR0aW5nIiAgaWQ9ImJhY2t1cGJ1ZGR5LWRiU2V0dGluZ3NGb3JtIj48IS0tIHRoaXMgZm9ybSBpcyBvbmx5IHN1Ym1pdHRlZCBhZnRlciBydW5uaW5nIHRocm91Z2ggamF2YXNjcmlwdC4gc3VibWl0dGluZyBhY3R1YWwgZm9ybSBpbnN0ZWFkIG9mIHVzaW5nIGpRdWVyeSBwb3N0IHNvIHdlIGNhbiB0YXJnZXQgaWZyYW1lLiAtLT4KCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZXN0b3JlRGF0YSIgdmFsdWU9IiIgaWQ9ImJhY2t1cGJ1ZGR5LWRiU2V0dGluZ3NGb3JtLXJlc3RvcmVEYXRhIj48IS0tIHRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCB3aWxsIG5lZWQgcGFyc2VkIGJ5IFBIUCBvbiB0aGUgcmVjZWl2aW5nIGVuZC4gcG9wdWxhdGVkIG9uIHN1Ym1pdCBhZnRlciBkYiB0ZXN0IHBhc3Nlcy4gLS0+CgkJCgkJCgkJPHRhYmxlIGNsYXNzPSJzZXR0aW5nc1RhYmxlIj4KCQkJCgkJCTx0cj48dGggc3R5bGU9IndpZHRoOiAzMCU7Ij4mbmJzcDs8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDMwJTsiPk9sZCBEYXRhYmFzZTwvdGg+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5IHNldHRpbmdDb3B5QWxsIiB3aWR0aD0iMTAlIiBzdHlsZT0icGFkZGluZzogMTBweDsiPgoJCQkJCTxhIGhyZWY9IiMiIHRpdGxlPSJDbGljayB0byBjb3B5IGFsbCBvbGQgZGF0YWJhc2Ugc2V0dGluZ3Mgb3Zlci4iPiZyYXJyOzwvYT4KCQkJCTwvdGQ+PHRoIHN0eWxlPSJ3aWR0aDogMzAlOyI+TmV3IERhdGFiYXNlPC90aD48L3RyPgoJCQkKCQkJPHRyPjwhLS0gTVlTUUwgU0VSVkVSIC0tPgoJCQkJPHRkPgoJCQkJCURhdGFiYXNlIFNlcnZlciA8c3BhbiBjbGFzcz0ibGlnaHQiPihNeVNRTCk8L3NwYW4+IDwlPSB0aXAoICdUaGlzIGlzIHRoZSBhZGRyZXNzIHRvIHRoZSBteVNRTCBzZXJ2ZXIgd2hlcmUgeW91ciBkYXRhYmFzZSB3aWxsIGJlIHN0b3JlZC4gOTklIG9mIHRoZSB0aW1lIHRoaXMgaXMgbG9jYWxob3N0LiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgbXlTUUwgc2VydmVyIHdpbGwgYmUgcHJvdmlkZWQgdG8geW91IGJ5IHlvdXIgaG9zdCBpZiBpdCBkaWZmZXJzLicgKSAlPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmcgb2xkX3NldHRpbmciIHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGF0LmRiX3NlcnZlciAlPiIgcmVhZG9ubHk9InJlYWRvbmx5Ij4KCQkJCTwvdGQ+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBvbGQgc2V0dGluZyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9InRleHQiIGlkPSJteXNxbF9zZXJ2ZXIiIHZhbHVlPSIiIHRhYmluZGV4PSIxIj4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCQoJCQk8dHI+PCEtLSBEQVRBQkFTRSBOQU1FIC0tPgoJCQkJPHRkPgoJCQkJCURhdGFiYXNlIE5hbWUgPCU9IHRpcCggJ1RoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHlvdSB3YW50IHRvIGltcG9ydCB5b3VyIGJsb2cgaW50by4gVGhlIGRhdGFiYXNlIHVzZXIgbXVzdCBoYXZlIHBlcm1pc3Npb25zIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoaXMgZGF0YWJhc2UuICBJZiB5b3UgYXJlIG1pZ3JhdGluZyB0aGlzIGJsb2cgdG8gYSBuZXcgaG9zdCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSB0aGlzIGRhdGFiYXNlIChpZSB1c2luZyBDUGFuZWwgb3IgcGhwbXlhZG1pbikgYW5kIGNyZWF0ZSBhIG15c3FsIGRhdGFiYXNlIHVzZXIgd2l0aCBwZXJtaXNzaW9ucy4nICkgJT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIG9sZF9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRhdC5kYl9uYW1lICU+IiByZWFkb25seT0icmVhZG9ubHkiPgoJCQkJPC90ZD4KCQkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiPgoJCQkJCTxhIGhyZWY9IiMiIHRpdGxlPSJDbGljayB0byBjb3B5IG9sZCBzZXR0aW5nIG92ZXIuIj4mcmFycjs8L2E+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0idGV4dCIgaWQ9Im15c3FsX2RhdGFiYXNlIiB2YWx1ZT0iIiB0YWJpbmRleD0iMiI+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQkKCQkJPHRyPjwhLS0gREFUQUJBU0UgVVNFUiAtLT4KCQkJCTx0ZD4KCQkJCQlEYXRhYmFzZSBVc2VyIDwlPSB0aXAoICdUaGlzIGlzIHRoZSBkYXRhYmFzZSB1c2VyIGFjY291bnQgdGhhdCBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIG5hbWUgaW4gdGhlIGlucHV0IGFib3ZlLiAgVGhpcyB1c2VyIG11c3QgYmUgZ2l2ZW4gcGVybWlzc2lvbiB0byB0aGlzIGRhdGFiYXNlIGZvciB0aGUgaW1wb3J0IHRvIHdvcmsuJyApICU+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyBvbGRfc2V0dGluZyIgdHlwZT0idGV4dCIgdmFsdWU9IjwlPSBkYXQuZGJfdXNlciAlPiIgcmVhZG9ubHk9InJlYWRvbmx5Ij4KCQkJCTwvdGQ+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBvbGQgc2V0dGluZyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9InRleHQiIGlkPSJteXNxbF91c2VybmFtZSIgdmFsdWU9IiIgdGFiaW5kZXg9IjMiPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJCgkJCTx0cj48IS0tIERBVEFCQVNFIFBBU1MgLS0+CgkJCQk8dGQ+CgkJCQkJRGF0YWJhc2UgUGFzc3dvcmQgPCU9IHRpcCggJ1RoaXMgaXMgdGhlIHBhc3N3b3JkIGZvciB0aGUgZGF0YWJhc2UgdXNlci4nICkgJT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIG9sZF9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRhdC5kYl9wYXNzd29yZCAlPiIgcmVhZG9ubHk9InJlYWRvbmx5Ij4KCQkJCTwvdGQ+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBvbGQgc2V0dGluZyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9InRleHQiIGlkPSJteXNxbF9wYXNzd29yZCIgdmFsdWU9IiIgdGFiaW5kZXg9IjQiPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJCgkJCTx0cj48IS0tIERBVEFCQVNFIFBSRUZJWCAtLT4KCQkJCTx0ZD4KCQkJCQlEYXRhYmFzZSBQcmVmaXggPCU9IHRpcCggJ1RoaXMgaXMgdGhlIHByZWZpeCBnaXZlbiB0byBhbGwgdGFibGVzIGluIHRoZSBkYXRhYmFzZS4gIElmIHlvdSBhcmUgY2xvbmluZyB0aGUgc2l0ZSBvbiB0aGUgc2FtZSBzZXJ2ZXIgQU5EIHRoZSBzYW1lIGRhdGFiYXNlIG5hbWUgdGhlbiB5b3Ugd2lsbCB3YW50IHRvIGNoYW5nZSB0aGlzIG9yIGVsc2UgdGhlIGltcG9ydGVkIGRhdGFiYXNlIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyB0YWJsZXMuIFRoaXMgc2hvdWxkIE5PVCBpbmNsdWRlIG1vcmUgdGhhbiBvbmUgdW5kZXJzY29yZS4gRXhhbXBsZSAxOiB3cF8sIEV4YW1wbGUgMjogd3A0XywgRXhhbXBsZSAzOiBkdXN0aW5zYmxvZ18nICkgJT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIG9sZF9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRhdC5kYl9wcmVmaXggJT4iIHJlYWRvbmx5PSJyZWFkb25seSI+CgkJCQk8L3RkPgoJCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSI+CgkJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgb2xkIHNldHRpbmcgb3Zlci4iPiZyYXJyOzwvYT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiBpZD0ibXlzcWxfcHJlZml4IiB2YWx1ZT0iIiB0YWJpbmRleD0iNSI+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQkKCQk8L3RhYmxlPgoJCQoJCQoJCQoJCTxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDM1cHg7IG1hcmdpbi1ib3R0b206IDM1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPgoJCQk8ZGl2IGlkPSJkYl90ZXN0X2NvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDA7IHBhZGRpbmc6IDI1cHg7IHRleHQtYWxpZ246IGxlZnQ7IiBjbGFzcz0icm91bmQtd3JhcCI+CgkJCTwvZGl2PgoJCQkKCQkJPGRpdiBpZD0iaWdub3JlX3ByZWZpeF93YXJuaW5ncyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDI1cHg7Ij4KCQkJCTxiPklnbm9yZSBwcmVmaXggd2FybmluZ3M/PC9iPgoJCQkJJm5ic3A7Jm5ic3A7CgkJCQk8bGFiZWw+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iaWdub3JlX2RidGVzdF93YXJuaW5ncyIgaWQ9Imlnbm9yZV9wcmVmaXhfd2FybmluZ3NfY2hlY2tib3giIHZhbHVlPSIxIj4KCQkJCQlZZXMsIHByb2NlZWQgd2l0aCB0aGlzIHByZWZpeC4KCQkJCTwvbGFiZWw+CgkJCTwvZGl2PgoKCgkJCTwlIGlmICggZmFsc2UgPT09IHJlc3RvcmVEYXRhYmFzZSApIHsgJT4KCQkJCTxkaXY+CgkJCQkJRGF0YWJhc2Ugd2lsbCA8Yj5ub3Q8L2I+IGJlIHJlc3RvcmVkIGZyb20gdGhlIGJhY2t1cCBiYXNlZCBvbiB5b3VyIHNlbGVjdGlvbiBvbiBTdGVwIDEuCgkJCQk8L2Rpdj4KCQkJPCUgfSAlPgoJCgkJCTxkaXYgaWQ9ImRiX3dpcGVfb3B0aW9ucyIgc3R5bGU9IjwlIGlmICggZmFsc2UgPT09IHJlc3RvcmVEYXRhYmFzZSApIHsgJT4gZGlzcGxheTogbm9uZTsgPCUgfSAlPiI+CgkJCQk8Yj5EZWxldGUgZXhpc3RpbmcgZGF0YWJhc2UgdGFibGVzPzwvYj4KCQkJCSZuYnNwOyZuYnNwOwoJCQkJPGxhYmVsPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJ3aXBlX3ByZWZpeCIgaWQ9IndpcGVfcHJlZml4Ij4KCQkJCQlNYXRjaGluZyBQcmVmaXggPCU9IHRpcCggJ1doZW4gc2VsZWN0ZWQgSW1wb3J0QnVkZHkgd2lsbCBmaXJzdCBkZWxldGUgYW55IGFuZCBhbGwgZGF0YWJhc2VzIHRhYmxlcyBvbiB0aGUgbmV3IHNlcnZlciB0aGF0IGJlZ2luIHdpdGggdGhlIG5ldyBwcmVmaXguIEZvciBleGFtcGxlLCBpZiB5b3VyIG5ldyBkYXRhYmFzZSBwcmVmaXggYWJvdmUgaXMgd3BfLCBhbnkgdGFibGUgb24gdGhlIG5ldyBzZXJ2ZXIgc3RhcnRpbmcgd2l0aCB3cF8gaW4gdGhlIG5hbWUgc3VjaCBhcyB3cF9vcHRpb25zLCB3cF9wb3N0cywgd3BfLiosIHdpbGwgYmUgZHJvcHBlZCAvIGRlbGV0ZWQuIFRoZSBvbGQgZGF0YWJhc2Ugc2VydmVyIGlzIG5ldmVyIG1vZGlmaWVkIGV2ZXIgKHVubGVzcyBpdCBpcyB0aGUgc2FtZSBzZXJ2ZXIgYXMgdGhlIG5ldyBzZXJ2ZXIpLicgKSAlPgoJCQkJPC9sYWJlbD4KCQkJCSZuYnNwOyZuYnNwOwoJCQkJPGxhYmVsPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJ3aXBlX2RhdGFiYXNlIiBpZD0id2lwZV9kYXRhYmFzZSIgb25DbGljaz0ialF1ZXJ5KHRoaXMpLmNsb3Nlc3QoJ2xhYmVsJykuZmluZCgnc3BhbicpLnRvZ2dsZSgpOyI+CgkJCQkJRGVsZXRlIEFsbCA8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij5Vc2UgQ2F1dGlvbjwvc3Bhbj4KCQkJCTwvbGFiZWw+CgkJCTwvZGl2PgoJCgkJCQoJCgkKCQoJCgkKCQk8L2Rpdj48IS0tIC93cmFwIC0tPgoJCQoJCTxkaXYgY2xhc3M9Im1haW5fYm94X2Zvb3QiPgoJCQk8YnI+CgkJCTxjZW50ZXI+CgkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJuZXh0U3RlcCIgdmFsdWU9Ik5leHQgU3RlcCIgY2xhc3M9Iml0LWJ1dHRvbiBwYl9kYXRhYmFzZV9uZXh0X3Rlc3QiPgoJCQkJPGJ1dHRvbiBocmVmPSIjcGJfYWR2YW5jZWRfbW9kYWwiIGNsYXNzPSJpdC1idXR0b24gaXQtc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIj5BZHZhbmNlZCBPcHRpb25zPC9idXR0b24+CgkJCTwvY2VudGVyPgoJCQkKCQk8L2Rpdj4KCQoJCgkKCQoJCTxkaXYgaWQ9InBiX2FkdmFuY2VkX21vZGFsIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCQk8aDI+QWR2YW5jZWQgT3B0aW9uczwvaDI+CgkJCQkJRXhlcmNpc2UgY2F1dGlvbiB1c2luZyBhZHZhbmNlZCBvcHRpb25zLiBBZGRpdGlvbmFsIG9wdGlvbnMgYXZhaWxhYmxlIG9uIHN1YnNlcXVlbnQgc3RlcHMuCgkJCQk8L2Rpdj4KCQkJCTxkaXYgY2xhc3M9Im1vZGFsX2NvbnRlbnQiPgoJCQkJCQoJCQkJCTxsYWJlbD5EYXRhYmFzZSBNZXRob2QgU3RyYXRlZ3k6IDwvbGFiZWw+CgkJCQkJPHNlbGVjdCBuYW1lPSJkYXRhYmFzZU1ldGhvZFN0cmF0ZWd5IiBpZD0iZGF0YWJhc2VNZXRob2RTdHJhdGVneSI+CgkJCQkJCTxvcHRpb24gdmFsdWU9InBocCIgU0VMRUNURUQ+UEhQLWJhc2VkOiBTdXBwb3J0cyBhdXRvbWF0ZWQgY2h1bmtlZCByZXN1bWluZyAtIGRlZmF1bHQ8L29wdGlvbj4KCQkJCQkJPG9wdGlvbiB2YWx1ZT0iY29tbWFuZGxpbmUiPkNvbW1hbmRsaW5lOiBGYXN0IGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHJlc3VtaW5nPC9vcHRpb24+CgkJCQkJCTxvcHRpb24gdmFsdWU9ImFsbCI+QWxsIEF2YWlsYWJsZTogKCBQSFAgW2NodW5raW5nXSA+IENvbW1hbmRsaW5lIHZpYSBleGVjKCkgICk8L29wdGlvbj4KCQkJCQk8L3NlbGVjdD4KCQkJCQkJCgkJCQkJPGJyPgoJCQkJCQoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBpZD0iaWdub3JlX3NxbF9lcnJvcnMiIG5hbWU9Imlnbm9yZV9zcWxfZXJyb3JzIj4gSWdub3JlIFNRTCBlcnJvcnMgJiBleGlzdGluZyBXb3JkUHJlc3MgdGFibGVzLiA8JT0gdGlwKCAnV2hlbiBjaGVja2VkIEltcG9ydEJ1ZGR5IHdpbGwgYWxsb3cgaW1wb3J0aW5nIGRhdGFiYXNlIHRhYmxlcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBleGlzdGluZyB0YWJsZXMuIFRoaXMgcmVzdWx0cyBpbiBhIG1lcmdlIG9mIHRoZSBleGlzdGluZyBkYXRhIHdpdGggdGhlIGltcG9ydGVkIGRhdGFiYXNlIGJlaW5nIG1lcmdlZC4gTm90ZSB0aGF0IHRoaXMgaXMgZG9lcyBOT1QgdXBkYXRlIGV4aXN0aW5nIGRhdGEgYW5kIG9ubHkgQUREUyBuZXcgZGF0YWJhc2UgdGFibGUgcm93cy4gQWxsIG90aGVyIFNRTCBjb25mbGljdCBlcnJvcnMgd2lsbCBiZSBzdXBwcmVzc2VkIGFzIHdlbGwuIFVzZSB0aGlzIGZlYXR1cmUgd2l0aCBjYXV0aW9uLicgKSAlPjxicj4KCQkJCQlNYXhpbXVtIHRpbWUgcGVyIGNodW5rIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBkYXRhYmFzZTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im1heF9leGVjdXRpb25fdGltZSIgaWQ9Im1heF9leGVjdXRpb25fdGltZSIgdmFsdWU9IjwlPSBtYXhFeGVjdXRpb25UaW1lICU+IiBzaXplPSI1Ij4gc2Vjb25kcy4gPCU9IHRpcCggJ1RoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIEltcG9ydEJ1ZGR5IHNob3VsZCBhbGxvdyBhIGRhdGFiYXNlIGltcG9ydCBjaHVuayB0byBydW4uIEltcG9ydEJ1ZGR5IGJ5IGRlZmF1bHQgbGltaXRzIGVhY2ggY2h1bmsgdG8geW91ciBNYXhpbXVtIFBIUCBydW50aW1lLiBJZiB5b3VyIGRhdGFiYXNlIGltcG9ydCBzdGVwIGlzIHRpbWluZyBvdXQgdGhlbiBsb3dlcmluZyB0aGlzIHZhbHVlIHdpbGwgaW5zdHJ1Y3QgdGhlIHNjcmlwdCB0byBsaW1pdCBlYWNoIGBjaHVua2AgdG8gYWxsb3cgaXQgdG8gZmluaXNoIHdpdGhpbiB0aGlzIHRpbWUgcGVyaW9kLiBSYWlzaW5nIHRoaXMgdmFsdWUgYWJvdmUgeW91ciBzZXJ2ZXJzIGxpbWl0cyB3aWxsIG5vdCBpbmNyZWFzZSBvciBvdmVycmlkZSBzZXJ2ZXIgc2V0dGluZ3MuJyApICU+CgkJCQkJCgkJCQkJPGJyPgoJCQkJCQoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJkYl9mb3JjZV9zc2wiIGlkPSJkYl9mb3JjZV9zc2wiPgoJCQkJCSZuYnNwOyZuYnNwOwoJCQkJCTxsYWJlbCBmb3I9ImRiX2ZvcmNlX3NzbCI+Rm9yY2UgU1NMIGNvbm5lY3Rpb24gd2l0aCBEYXRhYmFzZT88L2xhYmVsPiA8JT0gdGlwKCAnQ2hlY2sgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgY29uZmlndXJlZCB5b3VyIE15U1FMIGRhdGFiYXNlIHRvIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucyB2aWEgU1NMLiBXQVJOSU5HOiBUaGlzIHdpbGwgY2F1c2UgZXJyb3JzIGlmIHlvdXIgZGF0YWJhc2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gYWNjZXB0IFNTTCBjb25uZWN0aW9ucy4nICkgJT4KCgkJCQkJPGJyPgoJCQkJCTxicj4KCgkJCQkJPGxhYmVsPkRhdGFiYXNlIGZpbGVzIHRvIHJlc3RvcmU6IDwvbGFiZWw+CgkJCQkJPGRpdiBjbGFzcz0iZGF0YWJhc2VfcmVzdG9yZV90YWJsZV9zZWxlY3QiPgoJCQkJCQk8JQoJCQkJCQlkYXRhYmFzZVNldHRpbmdzLnNxbEZpbGVzLmZvckVhY2goZnVuY3Rpb24oZWwsIGluZGV4KSB7CgkJCQkJCQklPgoJCQkJCQkJPGxhYmVsPjxpbnB1dCBjbGFzcz0iZGF0YWJhc2VGaWxlIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGF0YWJhc2VGaWxlc1tdIiB2YWx1ZT0iPCU9IGVsICU+IiBDSEVDS0VEPiA8JT0gZWwgJT48L2xhYmVsPjxicj4KCQkJCQkJCTwlCgkJCQkJCX0pOwoJCQkJCQklPgoJCQkJCTwvZGl2PgoJCQkJCQoJCQkJPC9kaXY+CgkJCTwvZGl2PgoJCTwvZGl2PgoJCgkKCQoJPC9mb3JtPgoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgk8ZGl2IGlkPSJwYl9jcmVhdGVkYl9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCQk8aDI+Y1BhbmVsIERhdGFiYXNlIFdpemFyZDwvaDI+CgkJCQlRdWlja2x5IGNyZWF0ZSBhIG5ldyBjUGFuZWwgZGF0YWJhc2UgcmlnaHQgaGVyZS4KCQkJPC9kaXY+CgkJCTxkaXYgY2xhc3M9Im1vZGFsX2NvbnRlbnQiPgoJCQkJCgkJCQk8Zm9ybSBpZD0iY3BhbmVsX2NyZWF0ZWRiX2Zvcm0iPgoJCQkJCQoJCQkJCTx0YWJsZSB3aWR0aD0iMTAwJSI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD4KCQkJCQkJCQljUGFuZWwgTG9naW4gVVJMCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogbXlkb21haW4uY29tXSBFbnRlciB0aGUgY1BhbmVsIGRvbWFpbiB0byBjb21wbGV0ZSB0aGUgVVJMIHlvdSBnbyB0byB0byBhY2Nlc3MgY1BhbmVsLiAgRm9yIGluc3RhbmNlIGlmIHlvdXIgY1BhbmVsIGxvZ2luIGlzIGF0IGh0dHA6Ly9teWRvbWFpbi5jb206MjA4Mi8gdGhlbiB5b3VyIGRvbWFpbiBpcyBteWRvbWFpbi5jb20uJyApICU+CgkJCQkJCQk8L3RkPgoJCQkJCQkJPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPgoJCQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjcGFuZWxfcHJvdG9jb2wiIGlkPSJjcGFuZWxfcHJvdG9jb2wiIHZhbHVlPSJodHRwOi8vIiBzdHlsZT0id2lkdGg6IDg1cHg7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX3VybCIgaWQ9ImNwYW5lbF91cmwiIHN0eWxlPSJ3aWR0aDogMTg2cHg7Ij46PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNwYW5lbF9wb3J0IiBpZD0iY3BhbmVsX3BvcnQiIHN0eWxlPSJ3aWR0aDogNjJweDsiIHZhbHVlPSIyMDgyIj4vCgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJY1BhbmVsIHVzZXJuYW1lCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogYnVkZHldIFRoaXMgaXMgdGhlIHVzZXJuYW1lIHlvdSB1c2UgdG8gbG9nIGludG8geW91ciBjUGFuZWwuJyApICU+CgkJCQkJCQk8L3RkPgoJCQkJCQkJPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPgoJCQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjcGFuZWxfdXNlciIgY2xhc3M9ImNwYW5lbF91c2VyIiBpZD0iY3BhbmVsX3VzZXIiIHN0eWxlPSJ3aWR0aDogMjY1cHg7Ij4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD4KCQkJCQkJCQljUGFuZWwgcGFzc3dvcmQKCQkJCQkJCQk8JT0gdGlwKCAnW0V4OiBpNDk4aERzaWZINDg3aHNTXSBUaGlzIGlzIHRoZSBwYXNzd29yZCB5b3UgdXNlIHRvIGxvZyBpbnRvIHlvdXIgY1BhbmVsLicgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX3Bhc3MiIGlkPSJjcGFuZWxfcGFzcyIgc3R5bGU9IndpZHRoOiAyNjVweDsiIC8+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPGhyIHN0eWxlPSJtYXJnaW46IDhweDsiPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPgoJCQkJCQkJCU5ldyBkYXRhYmFzZSBuYW1lCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogYm9ic2Jsb2ddIFRoZSBkYXRhYmFzZSBuYW1lIHlvdSB3YW50IHRvIGNyZWF0ZS4gTm90ZTogY1BhbmVsIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgZGF0YWJhc2VzIHdpdGggdGhlIGNQYW5lbCBhY2NvdW50IHVzZXJuYW1lIGFuZCBhbiB1bmRlcnNjb3JlLiBleCBpZiB5b3VyIGNQYW5lbCB1c2VybmFtZSBpcyAiYnVkZHkiOiBidWRkeV9ib2JzYmxvZycgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8c3BhbiBjbGFzcz0iY3BhbmVsX3VzZXJfbWlycm9yIj48L3NwYW4+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNwYW5lbF9kYm5hbWUiIGlkPSJjcGFuZWxfZGJuYW1lIiBzdHlsZT0id2lkdGg6IDI2NXB4OyIgbWF4bGVuZ3RoPSI1NiI+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJTmV3IGRhdGFiYXNlIHVzZXJuYW1lCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogYm9iXSBUaGUgdXNlcm5hbWUgeW91IHdhbnQgdG8gYWRkIHRvIGdyYW50IGFjY2VzcyB0byB0aGlzIGRhdGFiYXNlIHlvdSB3YW50IHRvIGNyZWF0ZS4gTm90ZTogY1BhbmVsIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgZGF0YWJhc2UgdXNlcm5hbWVzIHdpdGggdGhlIGNQYW5lbCBhY2NvdW50IHVzZXJuYW1lIGFuZCBhbiB1bmRlcnNjb3JlLiBleCBpZiB5b3VyIGNQYW5lbCB1c2VybmFtZSBpcyAiYnVkZHkiOiBidWRkeV9ib2InICkgJT4KCQkJCQkJCTwvdGQ+CgkJCQkJCQk8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+CgkJCQkJCQkJPHNwYW4gY2xhc3M9ImNwYW5lbF91c2VyX21pcnJvciI+PC9zcGFuPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjcGFuZWxfZGJ1c2VyIiBpZD0iY3BhbmVsX2RidXNlciIgc3R5bGU9IndpZHRoOiAyNjVweDsiIG1heGxlbmd0aD0iNyI+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJTmV3IGRhdGFiYXNlIHVzZXIgcGFzc3dvcmQKCQkJCQkJCQk8JT0gdGlwKCAnVGhlIHBhc3N3b3JkIHlvdSB3b3VsZCBsaWtlIHRvIGFzc2lnbiB0byB0aGUgZGF0YWJhc2UgdXNlciBjcmVhdGVkLicgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX2RicGFzcyIgaWQ9ImNwYW5lbF9kYnBhc3MiIHN0eWxlPSJ3aWR0aDogMjY1cHg7IiB2YWx1ZT0iPCU9IHJhbmRvbVN0cmluZygxNiwgJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJykgJT4iPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJCTxicj48YnI+CgkJCQkJPGNlbnRlcj4KCQkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIERhdGFiYXNlIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IGNwYW5lbF9jcmVhdGVkYl9jcmVhdGUiPgoJCQkJCTwvY2VudGVyPgoJCgkJCQk8L2Zvcm0+CgkJCTwvZGl2PgoJCgkJPC9kaXY+Cgk8L2Rpdj4KCQoJCgk8ZGl2IGlkPSJwYl9jcGFuZWx0dXRvcmlhbF9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCQk8aDI+Y1BhbmVsIERhdGFiYXNlIFR1dG9yaWFsPC9oMj4KCQkJCUxlYXJuIGhvdyB0byBxdWlja2x5IGNyZWF0ZSB5b3VyIG93biBjUGFuZWwgZGF0YWJhc2UuCgkJCTwvZGl2PgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQoJCQkJPG9sPgoJCQkJCTxsaT5JbiBjUGFuZWwsIHNlbGVjdCA8Yj5NeVNRTCBEYXRhYmFzZSBXaXphcmQ8L2I+IGZyb20gdGhlIDxpPkRhdGFiYXNlczwvaT4gc2VjdGlvbi4gTmV4dCBzdGVwLjwvbGk+CgkJCQkJPGxpPkVudGVyIGEgPGk+bmFtZTwvaT4gZm9yIHRoZSBuZXcgZGF0YWJhc2UgeW91IHdpc2ggdG8gY3JlYXRlLiBOZXh0IHN0ZXAuPC9saT4KCQkJCQk8bGk+RW50ZXIgYSA8aT51c2VybmFtZTwvaT4gYW5kIDxpPnBhc3N3b3JkPC9pPiB0byBjcmVhdGUgdGhlIGRhdGFiYXNlIHVzZXIuIE5leHQgc3RlcC48L2xpPgoJCQkJCTxsaT5TZWxlY3QgPGI+QWxsIFByaXZpbGVnZXM8L2I+IHRvIHNldCBwZXJtaXNzaW9ucyB0aGUgdXNlciBoYXMgdG8gdGhlIGRhdGFiYXNlLiBEb25lLjwvbGk+CgkJCQkJPGxpPkJhY2sgaW4gSW1wb3J0QnVkZHksIGVudGVyIHRob3NlIHNhbWUgZGF0YWJhc2Ugc2V0dGluZ3MgZm9yIHRoZSA8aT5OZXcgRGF0YWJhc2U8L2k+LjwvbGk+CgkJCQk8L29sPgoJCQkJPGJyPgoJCgkJCQk8ZGl2IG9uQ2xpY2s9ImpRdWVyeSh0aGlzKS5odG1sKCBuZXcgRUpTKHt1cmw6ICdpbXBvcnRidWRkeS92aWV3cy9jcGFuZWxUdXRvcmlhbC5odG0nfSkucmVuZGVyKCkgKTsiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IGN1cnNvcjogcG9pbnRlcjsiPjxoMj5DbGljayB0byBkaXNwbGF5IDMwLXNlY29uZCB0dXRvcmlhbCB2aWRlby48L2gyPjwvZGl2PgoJCgkJCTwvZGl2PgoJCTwvZGl2PgoJPC9kaXY+Cgo8L2Rpdj4KCjwhLS0gLS0+CjxkaXYgaWQ9ImRhdGFiYXNlLWJveC13b3JraW5nIj4KPC9kaXY+Cg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/databaseSettings.htm,importbuddy/views/databaseSettings.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/dbreplace.php,importbuddy/views/dbreplace.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgokcGFnZV90aXRsZSA9ICdEYXRhYmFzZSBUZXh0IFJlcGxhY2UgVG9vbCc7CnJlcXVpcmVfb25jZSggJ19oZWFkZXIucGhwJyApOwo/PgoKPGRpdiBjbGFzcz0id3JhcCI+Cjw/cGhwCiRjb25maWdGaWxlID0gJyc7CmlmICggISBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApICkgeyAvLyBOb3JtYWwgY29uZmlnIGZpbGUgbm90IGZvdW5kIHNvIHdhcm4gb3Igc2VlIGlmIHBhcmVudCBjb25maWcgbWF5IGV4aXN0LgoJJHBhcmVudENvbmZpZ01lc3NhZ2UgPSAnJzsKCSRwYXJlbnRDb25maWcgPSAgZGlybmFtZSggQUJTUEFUSCApIC4gJy93cC1jb25maWcucGhwJzsKCWlmICggQGZpbGVfZXhpc3RzKCAkcGFyZW50Q29uZmlnICkgKSB7IC8vIFBhcmVudCBjb25maWcgZXhpc3RzIHNvIG9mZmVyIGl0IGFzIGFuIG9wdGlvbiBvciBwb3NzaWJseSB1c2UgaXQgaWYgdXNlciBoYXMgc2VsZWN0ZWQgdG8gZG8gc28uCgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgPT0gJ3RydWUnICkgeyAvLyBVc2VyIG9wdGVkIHRvIHVzZSBwYXJlbnQgY29uZmlnLgoJCQkkY29uZmlnRmlsZSA9ICRwYXJlbnRDb25maWc7CgkJfSBlbHNlIHsgLy8gVXNlciBoYXMgbm90IG9wdGVkIHRvIHVzZSBwYXJlbnQgY29uZmlnIHlldCBzbyBzZXQgbWVzc2FnZSB0byBvZmZlciBpdC4KCQkJJHBhcmVudENvbmZpZ01lc3NhZ2UgPSAnPGJyPjxicj48Yj5Ib3dldmVyPC9iPiwgYSB3cC1jb25maWcucGhwIGZpbGUgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFzIGAnIC4gJHBhcmVudENvbmZpZyAuICdgLiA8YSBocmVmPSI/cGFnZT1kYnJlcGxhY2UmcGFyZW50X2NvbmZpZz10cnVlIj48Yj5DbGljayBoZXJlPC9iPjwvYT4gaWYgeW91IHdvdWxkIGxpa2UgdG8gcnVuIHRoaXMgdG9vbCB1c2luZyB0aGlzIHdwLWNvbmZpZy5waHAgZmlsZSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4nOwoJCX0KCX0KCWlmICggJycgPT0gJGNvbmZpZ0ZpbGUgKSB7CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnPGI+RXJyb3I6PC9iPiBUaGlzIHRvb2wgcmVxdWlyZXMgYW4gZXhpc3RpbmcgV29yZFByZXNzIGluc3RhbGxhdGlvbiB0byBwZXJmb3JtIGRhdGFiYXNlIHJlcGxhY2VtZW50cyBvbi4gTm8gV29yZFByZXNzIHdwLWNvbmZpZy5waHAgY29uZmlndXJhdGlvbiBmaWxlIHdhcyBmb3VuZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaW1wb3J0YnVkZHkucGhwLiAnIC4gJHBhcmVudENvbmZpZ01lc3NhZ2UgLiAnIDxicj48YnI+IDxiPk5vdGU6PC9iPiBJbXBvcnRCdWRkeSBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgbWlncmF0aW5nICYgcmVwbGFjaW5nIHlvdXIgc2l0ZSBVUkxzIGFuZCBmaWxlIHBhdGhzIGR1cmluZyByZXN0b3JlL21pZ3JhdGlvbjsgdGhpcyB0b29sIGlzIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCBiYWNrdXAgLyByZXN0b3JlIG9wZXJhdGlvbnMuJywgdHJ1ZSApOwoJfQp9IGVsc2UgeyAvLyBVc2Ugbm9ybWFsIGNvbmZpZyBmaWxlLgoJJGNvbmZpZ0ZpbGUgPSBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnOwp9CgppZiAoICcnICE9ICRjb25maWdGaWxlICkgewoJCgkvLyBSZWFkIGluIHdwLWNvbmZpZy5waHAgZmlsZSBjb250ZW50cy4KCSRjb25maWdDb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkY29uZmlnRmlsZSApOwoJaWYgKCBmYWxzZSA9PT0gJGNvbmZpZ0NvbnRlbnRzICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yOiBVbmFibGUgdG8gcmVhZCB3cC1jb25maWcucGhwIGNvbmZpZ3VyYXRpb24gZmlsZS4nICk7CgkJcmV0dXJuOwoJfQoJCgkvLyBHcmFiIGRhdGFiYXNlIHNldHRpbmdzIGZyb20gd3AtY29uZmlnLnBocCBjb250ZW50cy4KCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX05BTUUoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWyduYW1lJ10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX1VTRVIoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWyd1c2VybmFtZSddID0gJG1hdGNoZXNbNF07CglwcmVnX21hdGNoKCAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9QQVNTV09SRChcJ3wiKSxbXHNdKihcJ3wiKSguKikoXCd8IilbXHNdKlwpOy9pJywgJGNvbmZpZ0NvbnRlbnRzLCAkbWF0Y2hlcyApOwoJJGRhdGFiYXNlU2V0dGluZ3NbJ3Bhc3N3b3JkJ10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX0hPU1QoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWydob3N0J10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvXCR0YWJsZV9wcmVmaXhbXHNdKj1bXHNdKihcJ3wiKSguKikoXCd8Iik7L2knLCAkY29uZmlnQ29udGVudHMsICRtYXRjaGVzICk7CgkkZGF0YWJhc2VTZXR0aW5nc1sncHJlZml4J10gPSAkbWF0Y2hlc1syXTsKCQoJLy9wcmludF9yKCAkZGF0YWJhc2VTZXR0aW5ncyApOwoJCgkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJZ2xvYmFsICR3cGRiOwoJJHdwZGIgPSBuZXcgd3BkYiggJGRhdGFiYXNlU2V0dGluZ3NbJ3VzZXJuYW1lJ10sICRkYXRhYmFzZVNldHRpbmdzWydwYXNzd29yZCddLCAkZGF0YWJhc2VTZXR0aW5nc1snbmFtZSddLCAkZGF0YWJhc2VTZXR0aW5nc1snaG9zdCddICk7CglpZiAoIGZhbHNlID09PSAkd3BkYi0+ZGJoICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICM4NTgzODM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGRhdGFiYXNlIHVzaW5nIHNldHRpbmdzIGluIHdwLWNvbmZpZy5waHAuIFZlcmlmeSBjb25uZWN0aW9uIHNldHRpbmdzLicgKTsKCX0gZWxzZSB7CgkJcmVxdWlyZV9vbmNlKCAnX2RicmVwbGFjZS5waHAnICk7Cgl9Cn0KPz4KPC9kaXY+Cgo8P3BocApyZXF1aXJlX29uY2UoICdfZm9vdGVyLnBocCcgKTs= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/dbreplace.php,importbuddy/views/dbreplace.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/finalCleanup.htm,importbuddy/views/finalCleanup.htm VGhpcyBzdGVwIGhhbmRsZXMgZGVsZXRpbmcgZmlsZXMuIEluIHJhcmUgaW5zdGFuY2VzIG9uIHNvbWUgc2VydmVycyB5b3UgbWF5IHJlY2VpdmUgZXJyb3JzIGxvYWRpbmcgZmlsZXMgb3IgYW4gdW5zdHlsZWQgcGFnZSBoZXJlIGR1ZSB0byBmaWxlcyBnZXR0aW5nIGRlbGV0aW5nIHByZW1hdHVyZWx5IGJlZm9yZSB0aGUgcGFnZSBjb21wbGV0ZXMgbG9hZGluZy4gVGhpcyBtYXkgc2FmZWx5IGJlIGlnbm9yZWQuIEl0IGlzIGNvbW1vbiB0byBub3QgYmUgYWJsZSB0byBkZWxldGUgc29tZSBmaWxlcyBkdWUgdG8gcGVybWlzc2lvbiBlcnJvcnMuIFlvdSBtYXkgbWFudWFsbHkgZGVsZXRlIHRoZW0uIDxiPmltcG9ydGJ1ZGR5LnBocDwvYj4gc2hvdWxkIGFsd2F5cyBiZSBkZWxldGVkIGFmdGVyIHJlc3RvcmUgZm9yIGJlc3Qgc2VjdXJpdHkuCgo8aDMgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPllvdXIgc2l0ZSBpcyByZWFkeSB0byBnbyBhdAo8YSBocmVmPSI8JT1ob21ldXJsJT4iIHRhcmdldD0iX2JsYW5rIj48Yj48JT1ob21ldXJsJT48L2I+PC9hPjxicj48YnI+ClRoYW5rIHlvdSBmb3IgY2hvb3NpbmcgQmFja3VwQnVkZHkhPC9oMz4KCgo8L2Rpdj48L2Rpdj48YnI+PGJyPjxicj4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/finalCleanup.htm,importbuddy/views/finalCleanup.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/finished.htm,importbuddy/views/finished.htm PGgxIGNsYXNzPSJhbmltYXRlZCBmYWRlSW5Eb3duIj5SZXN0b3JlIEZpbmlzaGVkLjwvaDE+Cgo8aDM+WW91ciBzaXRlIHNob3VsZCBiZSByZWFkeSB0byBnbyBhdDo8YnI+PGJyPjxhIGhyZWY9IjwlPWhvbWV1cmwlPiIgdGFyZ2V0PSJfYmxhbmsiPjwlPWhvbWV1cmwlPjwvYT48L2gzPjxicj4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/finished.htm,importbuddy/views/finished.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/home.php,importbuddy/views/home.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+CjxzY3JpcHQ+CglqUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdTdGVwIDE6IFNlbGVjdCBCYWNrdXAgdG8gUmVzdG9yZScgKTsKCQoJZnVuY3Rpb24gYmFja3VwUmVzdG9yZVN1Z2dlc3QoIGJhY2t1cFR5cGUgKSB7CgkJaWYgKCAnZGInID09IGJhY2t1cFR5cGUgKSB7IC8vIERCIGhhcyBubyBmaWxlcyAoZXhjZXB0IFNRTCBvZiBjb3Vyc2UpIHNvIHNraXAgcm9vdCBmaWxlIGV4dHJhY3Rpb24uCgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVGaWxlcyJdJyApLnByb3AoICdjaGVja2VkJywgZmFsc2UgKS5hdHRyKCAnZGlzYWJsZWQnLCB0cnVlICk7CgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVEYXRhYmFzZSJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJfSBlbHNlIGlmICggJ2ZpbGVzJyA9PSBiYWNrdXBUeXBlICkgeyAvLyBGaWxlcyBoYXMgbm8gREIgc28gZGlzYWJsZSBEQi4KCQkJalF1ZXJ5KCAnaW5wdXRbbmFtZT0icmVzdG9yZUZpbGVzIl0nICkucHJvcCggJ2NoZWNrZWQnLCB0cnVlICkuYXR0ciggJ2Rpc2FibGVkJywgZmFsc2UgKTsKCQkJalF1ZXJ5KCAnaW5wdXRbbmFtZT0icmVzdG9yZURhdGFiYXNlIl0nICkucHJvcCggJ2NoZWNrZWQnLCBmYWxzZSApLmF0dHIoICdkaXNhYmxlZCcsIHRydWUgKTsKCQl9IGVsc2UgeyAvLyBkZWZhdWx0IHJlc3RvcmUgYWxsCgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVGaWxlcyJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVEYXRhYmFzZSJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJfQoJfQoJCglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCWpRdWVyeSggJy5zZWxlY3RhYmxlQmFja3VwQXJjaGl2ZScgKS5jbGljayggZnVuY3Rpb24oKXsKCQkJYmFja3VwVHlwZSA9IGpRdWVyeSh0aGlzKS5hdHRyKCAnZGF0YS10eXBlJyApOwoJCQliYWNrdXBSZXN0b3JlU3VnZ2VzdCggYmFja3VwVHlwZSApOwoJCX0pOwoJCQoJCXN0YXJ0aW5nQmFja3VwVHlwZSA9IGpRdWVyeSggJy5zZWxlY3RhYmxlQmFja3VwQXJjaGl2ZTpjaGVja2VkJyApLmF0dHIoICdkYXRhLXR5cGUnICk7CgkJYmFja3VwUmVzdG9yZVN1Z2dlc3QoIHN0YXJ0aW5nQmFja3VwVHlwZSApOwoJfSk7Cjwvc2NyaXB0PgoKCjw/cGhwCmVjaG8gJzxkaXYgY2xhc3M9InN0ZXAtd3JhcCBzdGVwLXNlbGVjdEJhY2t1cC13cmFwIj4nOwoKCgovLyBEaXNwbGF5IHByZS1mbGlnaHQgc2NhbiB3YXJuaW5ncyAmIGVycm9ycy4KJHByZWZsaWdodFJlc3VsdHMgPSBwcmVmbGlnaHRTY2FuKCk7CmlmICggY291bnQoICRwcmVmbGlnaHRSZXN1bHRzICkgPiAwICkgewoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBpbXBsb2RlKCAnPGhyPicsICRwcmVmbGlnaHRSZXN1bHRzICkgKTsKfQp1bnNldCggJHByZWZsaWdodFJlc3VsdHMgKTsKCgoKLy8kc3RlcCA9ICcxJzsKLy9lY2hvICc8c2NyaXB0PnBhZ2VUaXRsZSggIlN0ZXAgPHNwYW4gY2xhc3M9XCJzdGVwX251bWJlclwiPicgLiAkc3RlcCAuICc8L3NwYW4+IG9mIDY6IENob29zZSB5b3VyIGJhY2t1cCBmaWxlIiApOzwvc2NyaXB0Pic7CgppZiAoICdzdGFzaCcgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd1cGxvYWQnICkgKSB7CglyZXF1aXJlKCAnX2h0bWxfMV9zdGFzaC5waHAnICk7CgllY2hvICc8L2Rpdj4nOwoJcmV0dXJuOwp9Cj8+CgoKCgoKCgoKCgo8ZGl2IGNsYXNzPSJ3cmFwIj4KCjw/cGhwCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdmaWxlJyApICE9ICcnICkgewoJJGJhY2t1cF9hcmNoaXZlcyA9IGFycmF5KCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2ZpbGUnICkgKTsKCWVjaG8gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDE1cHg7IGJhY2tncm91bmQ6ICNGRkZGRkY7Ij5SZXN0b3JpbmcgZnJvbSBiYWNrdXAgPGk+JyAuIGh0bWxlbnRpdGllcyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdmaWxlJyApICkgLiAnPC9pPjwvZGl2PgoJPGZvcm0gYWN0aW9uPSI/YWpheD0yIiBtZXRob2Q9InBvc3QiIHRhcmdldD0icmVzdG9yZWJ1ZGR5X2lmcmFtZSI+JzsKCWVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZpbGUiIHZhbHVlPSInIC4gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdmaWxlJyApIC4gJyI+JzsKfSBlbHNlIHsKCT8+CgkKCTxkaXYgY2xhc3M9ImJhY2t1cF9zZWxlY3RfYnV0dG9ucyI+CgkJPGJ1dHRvbiBocmVmPSIjcGJfdXBsb2FkX21vZGFsIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkgbGVhbk1vZGFsIGNyZWF0ZWRiX21vZGFsX2xpbmsiIHN0eWxlPSJmb250LXNpemU6IDE0cHg7Ij5VcGxvYWQgYSBCYWNrdXA8L2J1dHRvbj4KCQk8YnV0dG9uIGhyZWY9IiNwYl9zdGFzaF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyI+UmVzdG9yZSBmcm9tIFN0YXNoIC8gU3Rhc2ggTGl2ZTwvYnV0dG9uPgoJPC9kaXY+CgkKCTw/cGhwCgkkYmFja3VwX2FyY2hpdmVzID0gZ2V0X2FyY2hpdmVzX2xpc3QoKTsKCWlmICggMCA9PSBjb3VudCggJGJhY2t1cF9hcmNoaXZlcyApICkgeyAvLyBObyBiYWNrdXBzIGZvdW5kLgoJCQoJCS8vIExvb2sgZm9yIG1hbnVhbGx5IHVuemlwcGVkCgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnPGI+Tm8gQmFja3VwQnVkZHkgWmlwIGJhY2t1cCBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSBgJyAuIEFCU1BBVEggLiAnYDwvYj4gLSAKCQkJWW91IG11c3QgdXBsb2FkIGEgYmFja3VwIGZpbGUgYnkgRlRQIChpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGlzIGltcG9ydGJ1ZGR5LnBocCBmaWxlKSwgdGhlIHVwbG9hZCB0YWIsIG9yIGltcG9ydCBmcm9tIFN0YXNoIHZpYSB0aGUgU3Rhc2ggdGFiIGFib3ZlIHRvIGNvbnRpbnVlLgoJCQk8Yj5EbyBub3QgcmVuYW1lIHRoZSBiYWNrdXAgZmlsZSBmcm9tIGl0cyBvcmlnaW5hbCBmaWxlbmFtZS48L2I+IElmIHlvdSBtYW51YWxseSBleHRyYWN0ZWQvdW56aXBwZWQsIHVwbG9hZCB0aGUgYmFja3VwIGZpbGUsCgkJCXNlbGVjdCBpdCwgdGhlbiBzZWxlY3QgPGk+QWR2YW5jZWQgVHJvdWJsZXNob290aW5nIE9wdGlvbnM8L2k+ICYgY2xpY2sgPGk+U2tpcCBaaXAgRXh0cmFjdGlvbjwvaT4uIFJlZnJlc2ggdGhpcyBwYWdlIG9uY2UgeW91IGhhdmUgdXBsb2FkZWQgdGhlIGJhY2t1cC4nICk7CgkJCgl9IGVsc2UgeyAvLyBGb3VuZCBvbmUgb3IgbW9yZSBiYWNrdXBzLgoJCT8+CgkJCTxmb3JtIGFjdGlvbj0iP2FqYXg9MiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Im1pbmlGcmFtZSI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXNzX2hhc2giIHZhbHVlPSI8P3BocCBlY2hvIFBCX1BBU1NXT1JEOyA/PiI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcHRpb25zIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCBzZXJpYWxpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICk7ID8+JyIgLz4KCQk8P3BocAoJCWVjaG8gJzxkaXYgY2xhc3M9ImJhY2t1cF9zZWxlY3RfdGV4dCI+QmFja3VwcyBpbiA8c3Bhbj4nIC4gQUJTUEFUSCAuICc8L3NwYW4+PC9kaXY+JzsKCQllY2hvICc8dWwgY2xhc3M9InJvdW5kLXdyYXAiPic7CgkJJGJhY2t1cF9jb3VudCA9IGNvdW50KCAkYmFja3VwX2FyY2hpdmVzICk7CgkJJGkgPSAwOwoJCWZvcmVhY2goICRiYWNrdXBfYXJjaGl2ZXMgYXMgJGJhY2t1cF9pZCA9PiAkYmFja3VwX2FyY2hpdmUgKSB7CgkJCSRpKys7CgkJCQoJCQkKCQkJJGJhY2t1cF90eXBlID0gJyc7CgkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJyc7CgkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3R5cGUnXSA9PSAnJyApIHsKCQkJCWlmICggc3RyaXN0ciggJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10sICctZGItJyApICE9PSBmYWxzZSApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdEYXRhYmFzZSBPbmx5IEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlID0gJ2RiJzsKCQkJCX0gZWxzZWlmICggc3RyaXN0ciggJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10sICctZnVsbC0nICkgIT09IGZhbHNlICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ0Z1bGwgQmFja3VwJzsKCQkJCQkkYmFja3VwX3R5cGUgPSAnZnVsbCc7CgkJCQl9IGVsc2VpZiAoIHN0cmlzdHIoICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddLCAnLWZpbGVzLScgKSAhPT0gZmFsc2UgKSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnRmlsZXMgT25seSBCYWNrdXAnOwoJCQkJCSRiYWNrdXBfdHlwZSA9ICdmaWxlcyc7CgkJCQl9IGVsc2VpZiAoIHN0cmlzdHIoICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddLCAnLWV4cG9ydC0nICkgIT09IGZhbHNlICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ011bHRpc2l0ZSBTdWJzaXRlIEV4cG9ydCc7CgkJCQkJJGJhY2t1cF90eXBlID0gJ2V4cG9ydCc7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd0eXBlJ10gPT0gJ2RiJyApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdEYXRhYmFzZSBPbmx5IEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlID0gJ2RiJzsKCQkJCX0gZWxzZWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3R5cGUnXSA9PSAnZnVsbCcgKSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnRnVsbCBCYWNrdXAnOwoJCQkJCSRiYWNrdXBfdHlwZSA9ICdmdWxsJzsKCQkJCX0gZWxzZWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3R5cGUnXSA9PSAnZmlsZXMnICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ0ZpbGVzIE9ubHkgQmFja3VwJzsKCQkJCQkkYmFja3VwX3R5cGUgPSAnZmlsZXMnOwoJCQkJfSBlbHNlaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddID09ICdleHBvcnQnICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ011bHRpc2l0ZSBTdWJzaXRlIEV4cG9ydCc7CgkJCQkJJGJhY2t1cF90eXBlID0gJ2V4cG9ydCc7CgkJCQl9IGVsc2UgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3R5cGUnXSAuICcgQmFja3VwJzsKCQkJCQkkYmFja3VwX3R5cGUgPSAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddOwoJCQkJfQoJCQl9CgkJCQoJCQkKCQkJZWNobyAnPGxpPic7CgkJCQoJCQllY2hvICc8aW5wdXQgY2xhc3M9InNlbGVjdGFibGVCYWNrdXBBcmNoaXZlIiB0eXBlPSJyYWRpbyIgJzsKCQkJaWYgKCAkYmFja3VwX2lkID09IDAgKSB7CgkJCQllY2hvICdjaGVja2VkPSJjaGVja2VkIiAnOwoJCQl9CgkJCWVjaG8gJ25hbWU9ImZpbGUiIHZhbHVlPSInIC4gJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10gLiAnIiBkYXRhLXR5cGU9IicgLiAkYmFja3VwX3R5cGUgLiAnIj4gJyAuICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddOwoJCQllY2hvICc8c3BhbiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyI+JyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIGZpbGVzaXplKCBBQlNQQVRIIC4gJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10gKSApIC4gJzwvc3Bhbj4nOwoJCQkKCQkJZWNobyAnPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24iIHN0eWxlPSJtYXJnaW4tbGVmdDogMjJweDsgbWFyZ2luLXRvcDogNnB4OyBmb250LXN0eWxlOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAyNnB4OyI+JzsKCQkJJG1ldGEgPSBhcnJheSgpOwoJCQkKCQkJZWNobyAkYmFja3VwX3R5cGVfdGV4dDsKCQkJCgkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ2NyZWF0ZWQnXSAhPSAnJyApIHsKCQkJCWVjaG8gJyBmcm9tICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ2NyZWF0ZWQnXSApOwoJCQl9CgkJCQoJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd3cF92ZXJzaW9uJ10gIT0gJycgKSB7CgkJCQllY2hvICcgb24gV29yZFByZXNzIHYnIC4gJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3dwX3ZlcnNpb24nXTsKCQkJfQoJCQkvKgoJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydiYl92ZXJzaW9uJ10gIT0gJycgKSB7CgkJCQllY2hvICcgJiBCYWNrdXBCdWRkeSB2JyAuICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydiYl92ZXJzaW9uJ107CgkJCX0KCQkJKi8KCQkJCgkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3NpdGV1cmwnXSAhPSAnJyApIHsKCQkJCWVjaG8gJzxicj5TaXRlOiAnIC4gJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3NpdGV1cmwnXTsKCQkJfQoJCQkKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsncHJvZmlsZSddICE9ICcnICkgewoJCQkJZWNobyAnPGJyPlByb2ZpbGU6ICcgLiBodG1sZW50aXRpZXMoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydwcm9maWxlJ10gKTsKCQkJfQoJCQkKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnbm90ZSddICE9ICcnICkgewoJCQkJZWNobyAnPGJyPk5vdGU6ICcgLiBodG1sZW50aXRpZXMoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydub3RlJ10gKSAuICc8YnI+JzsKCQkJfQoJCQkKCQkJCgkJCQoJCQkvLyBTaG93IG1ldGEgYnV0dG9uIGlmIG1ldGEgaW5mbyBhdmFpbGFibGUuCgkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3R5cGUnXSAhPSAnJyApIHsKCQkJCSRmaWxlX2hhc2ggPSBtZDUoICRiYWNrdXBfYXJjaGl2ZVsnZmlsZSddICk7CgkJCQllY2hvICc8YSBocmVmPSIjaGFzaF92aWV3IiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi10ZXJ0aWFyeSBsZWFuTW9kYWwgdmlld19oYXNoX2NsaWNrIiBzdHlsZT0iIGZsb2F0OiByaWdodDsiIGlkPSJ2aWV3X2hhc2hfJyAuICRpIC4gJyIgZGF0YS1maWxlPSInIC4gJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10gLiAnIj5WaWV3IENoZWNrc3VtPC9hPic7CgkJCQllY2hvICc8YSBocmVmPSIjaW5mb18nIC4gJGZpbGVfaGFzaCAuICciIGNsYXNzPSJidXR0b24gYnV0dG9uLXRlcnRpYXJ5IGxlYW5Nb2RhbCIgc3R5bGU9ImZsb2F0OiByaWdodDsiIGlkPSJ2aWV3X21ldGFfJyAuICRpIC4gJyI+VmlldyBNZXRhPC9hPic7CgkJCQk/PgoJCQkJPGRpdiBpZD0iaGFzaF92aWV3IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCQkJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCQkJCTxoMj5WaWV3IENoZWNrc3VtPC9oMj4KCQkJCQkJPC9kaXY+CgkJCQkJCTxkaXYgY2xhc3M9Im1vZGFsX2NvbnRlbnQiPgoJCQkJCQkJPHNwYW4gaWQ9Imhhc2hfdmlld19sb2FkaW5nIj48aW1nIHNyYz0iaW1wb3J0YnVkZHkvaW1hZ2VzL2xvYWRpbmcuZ2lmIj4gQ2FsY3VsYXRpbmcgYmFja3VwIGZpbGUgQ2hlY2tzdW0gKE1ENSBoYXNoKS4uLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50Li4uPC9zcGFuPgoJCQkJCQkJPHNwYW4gaWQ9Imhhc2hfdmlld19yZXNwb25zZSI+PC9zcGFuPgoJCQkJCQk8L2Rpdj4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCQkJPGRpdiBpZD0iPD9waHAgZWNobyAnaW5mb18nIC4gJGZpbGVfaGFzaDsgPz4iIHN0eWxlPSJkaXNwbGF5OiBub25lOyBoZWlnaHQ6IDkwJTsiPgoJCQkJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCQkJCTxoMj5CYWNrdXAgTWV0YSBJbmZvcm1hdGlvbjwvaDI+CgkJCQkJCTwvZGl2PgoJCQkJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQkJCTw/cGhwCgkJCQkJCQkkY29tbWVudF9tZXRhID0gYXJyYXkoKTsKCQkJCQkJCWZvcmVhY2goICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddIGFzICRjb21tZW50X2xpbmVfbmFtZSA9PiAkY29tbWVudF9saW5lX3ZhbHVlICkgeyAvLyBMb29wIHRocm91Z2ggYWxsIG1ldGEgZmllbGRzIGluIHRoZSBjb21tZW50IGFycmF5IHRvIGRpc3BsYXkuCgkJCQkJCQkJCgkJCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkcmVzcG9uc2UgPSBiYWNrdXBidWRkeV9jb3JlOjpwcmV0dHlfbWV0YV9pbmZvKCAkY29tbWVudF9saW5lX25hbWUsICRjb21tZW50X2xpbmVfdmFsdWUgKSApICkgewoJCQkJCQkJCQkkY29tbWVudF9tZXRhW10gPSAkcmVzcG9uc2U7CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQkJaWYgKCBjb3VudCggJGNvbW1lbnRfbWV0YSApID4gMCApIHsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJCQkJCQkJCQkkY29tbWVudF9tZXRhLAoJCQkJCQkJCQlhcnJheSgKCQkJCQkJCQkJCSdjb2x1bW5zJwkJPT4JYXJyYXkoICdNZXRhIEluZm9ybWF0aW9uJywgJ1ZhbHVlJyApLAoJCQkJCQkJCQkJJ2NzcycJCQk9Pgknd2lkdGg6IDEwMCU7IG1pbi13aWR0aDogMjAwcHg7JywKCQkJCQkJCQkJKQoJCQkJCQkJCSk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWVjaG8gJzxpPk5vIG1ldGEgZGF0YSBmb3VuZCBpbiB6aXAgY29tbWVudC4gU2tpcHBpbmcgbWV0YSBpbmZvcm1hdGlvbiBkaXNwbGF5LjwvaT4nOwoJCQkJCQkJfQoJCQkJCQkJPz4KCQkJCQkJPC9kaXY+CgkJCQkJPC9kaXY+CgkJCQk8L2Rpdj4KCQkJCTw/cGhwCgkJCX0gLy8gZW5kIGlmIHR5cGUgbm90IGJsYW5rLgoJCQkKCQkJCgkJCQoJCQkvL2VjaG8gaW1wbG9kZSggJyAtICcsICRtZXRhICk7CgkJCWVjaG8gJzwvZGl2Pic7CgkJCWVjaG8gJzwvbGk+JzsKCQl9CgkJZWNobyAnPC91bD4nOwoJfQoJPz4KCQo8P3BocAp9IC8vIEVuZCBmaWxlIG5vdCBnaXZlbiBpbiBxdWVyeXN0cmluZy4KCgoKCgovLyBJZiBvbmUgb3IgbW9yZSBiYWNrdXAgZmlsZXMgd2FzIGZvdW5kIHRoZW4gcHJvdmlkZSBhIGJ1dHRvbiB0byBjb250aW51ZS4KaWYgKCAoICFlbXB0eSggJGJhY2t1cF9hcmNoaXZlcyApICkgfHwgKCAnc3Rhc2gnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3VwbG9hZCcgKSApICkgewoJZWNobyAnPC9kaXY+PCEtLSAvd3JhcCAtLT4nOwoJPz4KCQoJCgk8ZGl2IGNsYXNzPSJtYWluX2JveF9mb290Ij4KCQk8Y2VudGVyPgoJCQkKCQkJPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMjBweDsgbWFyZ2luLWJvdHRvbTogMzBweDsiPgoJCQkJPGI+V2hhdCB3b3VsZCB5b3UgbGlrZSB0byByZXN0b3JlIGZyb20gdGhlIGJhY2t1cD88L2I+CgkJCQkmbmJzcDsmbmJzcDsKCQkJCTxsYWJlbCBzdHlsZT0iZmxvYXQ6IGluaGVyaXQ7Ij4KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlc3RvcmVGaWxlcyIgdmFsdWU9IjEiIENIRUNLRUQ+IEZpbGVzCgkJCQk8L2xhYmVsPgoJCQkJJm5ic3A7Jm5ic3A7CgkJCQk8bGFiZWwgc3R5bGU9ImZsb2F0OiBpbmhlcml0OyI+CgkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZXN0b3JlRGF0YWJhc2UiIHZhbHVlPSIxIiBDSEVDS0VEPiBEYXRhYmFzZQoJCQkJPC9sYWJlbD4KCQkJPC9kaXY+CgkJCQoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJSZXN0b3JlIEJhY2t1cCIgY2xhc3M9Iml0LWJ1dHRvbiI+CgkJCTxidXR0b24gaWQ9ImFkdmFuY2VkX29wdGlvbnNfYnV0dG9uIiBocmVmPSIjcGJfYWR2YW5jZWRfbW9kYWwiIGNsYXNzPSJpdC1idXR0b24gaXQtc2Vjb25kYXJ5IGxlYW5Nb2RhbCI+QWR2YW5jZWQgT3B0aW9uczwvYnV0dG9uPgoJCTwvY2VudGVyPgoJPC9kaXY+Cjw/cGhwCn0gZWxzZSB7CgkvL3BiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1VwbG9hZCBhIGJhY2t1cCBmaWxlIHRvIGNvbnRpbnVlLicgKTsKCWVjaG8gJzxiciAvPjxiciAvPjxiciAvPic7CgllY2hvICc8Yj5Zb3UgbXVzdCB1cGxvYWQgYSBiYWNrdXAgZmlsZSBieSBGVFAsIHRoZSB1cGxvYWQgdGFiLCBvciBpbXBvcnQgZnJvbSBTdGFzaCB0byBjb250aW51ZS48L2I+JzsKCWVjaG8gJzwvZGl2PjwhLS0gL3dyYXAgLS0+JzsKfQo/PgoKCgoKCgoKPGRpdiBpZD0icGJfYWR2YW5jZWRfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+QWR2YW5jZWQgT3B0aW9uczwvaDI+CgkJCUV4ZXJjaXNlIGNhdXRpb24uIEFkZGl0aW9uYWwgb3B0aW9ucyBhdmFpbGFibGUgb24gc3Vic2VxdWVudCBzdGVwcy4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCgkJCQoJCQlVbnppcCBTdHJhdGVneToKCQkJPHNlbGVjdCBuYW1lPSJ6aXBNZXRob2RTdHJhdGVneSI+CgkJCQk8b3B0aW9uIHZhbHVlPSJhbGwiIFNFTEVDVEVEPkFsbCBBdmFpbGFibGUgKCB1bnppcCB2aWEgZXhlYygpICZndDsgWmlwQXJjaGl2ZSAmZ3Q7IFBjbFppcCApIC0gZGVmYXVsdDwvb3B0aW9uPgoJCQkJPG9wdGlvbiB2YWx1ZT0iemlwYXJjaGl2ZSI+Q29tcGF0aWJpbGl0eTogWmlwQXJjaGl2ZTwvb3B0aW9uPgoJCQkJPG9wdGlvbiB2YWx1ZT0icGNsemlwIj5Db21wYXRpYmlsaXR5OiBQY2xaaXA8L29wdGlvbj4KCQkJPC9zZWxlY3Q+CgkJCTxicj48YnI+CgkJCQoJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1pZ3JhdGVIdGFjY2VzcyIgdmFsdWU9IjEiIENIRUNLRUQ+IE1pZ3JhdGUgLmh0YWNjZXNzIGZpbGUgVVJMcyAmIHBhdGhzIChpZiBVUkwgY2hhbmdlcykuPGJyPgoJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNraXBVbnppcCIgdmFsdWU9IjEiPiBTa2lwIHVuemlwcGluZyBvciBvcGVuaW5nIGFyY2hpdmUgKGZvciBtYW51YWwgZXh0cmFjdGlvbikuCgkJCTxicj48YnI+CgoJCQkKCQkJCgkJPC9kaXY+Cgk8L2Rpdj4KPC9kaXY+CgoKCgoKCjw/cGhwCmVjaG8gJzwvZm9ybT4nOwo/PgoKCgo8L2Rpdj48IS0tIGVuZCB3cmFwcGVyIGRpdiAtLT4KCgoKCjxkaXYgaWQ9InBiX3VwbG9hZF9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCTxoMj5VcGxvYWQgQmFja3VwPC9oMj4KCQkJU21hbGxlciBiYWNrdXBzIGNhbiBiZSB1cGxvYWRlZCBoZXJlIGRpcmVjdGx5IGZyb20geW91ciBjb21wdXRlci4gTGFyZ2VyIGJhY2t1cHMgd29yayBiZXN0IG92ZXIgRlRQIG9yIG90aGVyIG1ldGhvZHMuCgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkJCQoJCQkKCQkJPGZvcm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXNzX2hhc2giIHZhbHVlPSI8P3BocCBlY2hvIFBCX1BBU1NXT1JEOyA/PiI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ1cGxvYWQiIHZhbHVlPSJsb2NhbCI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcHRpb25zIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCBzZXJpYWxpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICk7ID8+JyI+CgkJCQlDaG9vc2UgYSBsb2NhbCBiYWNrdXAgdG8gdXBsb2FkOjxicj4KCQkJCTxwPgoJCQkJCTxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiBzdHlsZT0id2lkdGg6IDEwMCU7Ij4KCQkJCTwvcD4KCQkJCTxicj4KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQgQmFja3VwIiBjbGFzcz0idG9nZ2xlIGJ1dHRvbiI+CgkJCTwvZm9ybT4KCQkJCgkJCQoJCTwvZGl2PgoJPC9kaXY+CjwvZGl2PgoKCgoKPGRpdiBpZD0icGJfc3Rhc2hfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+UmVzdG9yZSBCYWNrdXAgZnJvbSBTdGFzaDwvaDI+CgkJCUJhY2t1cHMgc3RvcmVkIGluIHlvdXIgaVRoZW1lcyBTdGFzaCBtYXkgYmUgcmV0cmlldmVkIGZvciByZXN0b3JpbmcgaGVyZS4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCgkJCQoJCQk8P3BocCByZXF1aXJlKCAnX2h0bWxfMV9zdGFzaC5waHAnICk7ID8+CgkJCQoJCQkKCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/home.php,importbuddy/views/home.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/importingDatabase.htm,importbuddy/views/importingDatabase.htm PGNlbnRlcj4KCTxoMz5SZXN0b3JpbmcgRGF0YWJhc2UgLi4uPC9oMz4KCTxoNCBpZD0iaW1wb3J0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlIj48L2g0Pgo8L2NlbnRlcj4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/importingDatabase.htm,importbuddy/views/importingDatabase.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/index.php,importbuddy/views/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/index.php,importbuddy/views/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/login.php,importbuddy/views/login.php PHNjcmlwdD5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcgKTs8L3NjcmlwdD4KPD9waHAKCgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgewoJZ2xvYmFsICRwYl9sb2dpbl9hdHRlbXB0czsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgcGFzc3dvcmQuIFBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgeW91IHByb3ZpZGVkIHdpdGhpbiBCYWNrdXBCdWRkeSBTZXR0aW5ncy4gQXR0ZW1wdCAjJyAuICRwYl9sb2dpbl9hdHRlbXB0cyAuICcuJyApOwoJZWNobyAnPGJyPic7Cn0KPz4KCjxwPkVudGVyIHlvdXIgSW1wb3J0QnVkZHkgcGFzc3dvcmQgYmVsb3cgdG8gYmVnaW4uPC9wPgoKPGZvcm0gbWV0aG9kPSJwb3N0Ij4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImxvZ2luIj4KCTxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIHN0eWxlPSJ3aWR0aDogMjUwcHg7Ij4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkF1dGhlbnRpY2F0ZSIgY2xhc3M9Iml0LWJ1dHRvbiI+CjwvZm9ybT4K ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/login.php,importbuddy/views/login.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/migratingDatabase.htm,importbuddy/views/migratingDatabase.htm PGNlbnRlcj4KCTxoMz5NaWdyYXRpbmcgRGF0YWJhc2UgLi4uPC9oMz4KCTxoNCBpZD0ibWlncmF0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlIj48L2g0Pgo8L2NlbnRlcj4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/migratingDatabase.htm,importbuddy/views/migratingDatabase.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/unzippingFiles.htm,importbuddy/views/unzippingFiles.htm PGNlbnRlcj4KCTxoMz5QbGVhc2Ugd2FpdCB3aGlsZSB5b3VyIGZpbGVzIGFyZSByZXN0b3JlZCAuLi48L2gzPgoJPGg0IGlkPSJ1bnppcHBpbmdGaWxlcy1wcm9ncmVzc01lc3NhZ2UiPlJlc3RvcmluZyBGaWxlczwvaDQ+CjwvY2VudGVyPg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/unzippingFiles.htm,importbuddy/views/unzippingFiles.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/urlReplaceSettings.htm,importbuddy/views/urlReplaceSettings.htm CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImltcG9ydGJ1ZGR5L2pzL2pxdWVyeS5sZWFuTW9kYWwubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQlqUXVlcnkoJy5sZWFuTW9kYWwnKS5sZWFuTW9kYWwoCgkJCQl7IHRvcCA6IDQ1LCBvdmVybGF5IDogMC40LCBjbG9zZUJ1dHRvbjogIi5tb2RhbF9jbG9zZSIgfQoJCSk7Cgl9KTsKPC9zY3JpcHQ+CgoKCjxmb3JtIG9uU3VibWl0PSJqUXVlcnkoJyN1cmxSZXBsYWNlLXJlc3RvcmVEYXRhJykudmFsKCB3aW5kb3cuYnRvYSggZW5jb2RlVVJJQ29tcG9uZW50KCBKU09OLnN0cmluZ2lmeSggd2luZG93LnJlc3RvcmVEYXRhICkgKSApICk7IiBhY3Rpb249Ij9hamF4PTUiIHRhcmdldD0ibWluaUZyYW1lIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJkYl9zZXR0aW5nIj48IS0tIHRoaXMgZm9ybSBpcyBvbmx5IHN1Ym1pdHRlZCBhZnRlciBydW5uaW5nIHRocm91Z2ggamF2YXNjcmlwdC4gc3VibWl0dGluZyBhY3R1YWwgZm9ybSBpbnN0ZWFkIG9mIHVzaW5nIGpRdWVyeSBwb3N0IHNvIHdlIGNhbiB0YXJnZXQgaWZyYW1lLiAtLT4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiBpZD0idXJsUmVwbGFjZS1yZXN0b3JlRGF0YSIgdmFsdWU9IiI+PCEtLSB0aGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBuZWVkIHBhcnNlZCBieSBQSFAgb24gdGhlIHJlY2VpdmluZyBlbmQuIHBvcHVsYXRlZCBvbiBzdWJtaXQgYWZ0ZXIgZGIgdGVzdCBwYXNzZXMuIC0tPgoKCgoKCgoKCgk8dGFibGUgY2xhc3M9InNldHRpbmdzVGFibGUiPgoJCTx0cj48dGggc3R5bGU9IndpZHRoOiAzMCU7Ij4mbmJzcDs8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDMwJTsiPk9sZCBVUkw8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDEwJTsiPiZuYnNwOzwvdGg+PHRoIHN0eWxlPSJ3aWR0aDogMzAlOyI+TmV3IFVSTDwvdGg+PC90cj4KCQoJCgkKCQk8dHI+PCEtLSBXT1JEUFJFU1MgQUREUkVTUyAoQUxMIFNJVEUgVFlQRVMpIC0tPgoJCQk8dGQ+CgkJCQlXb3JkUHJlc3MgQWRkcmVzcyA8c3BhbiBjbGFzcz0ibGlnaHQiPihTaXRlIFVSTCk8L3NwYW4+IDxhIGNsYXNzPSJwbHVnaW5idWRkeV90aXAiIHRpdGxlPSJUaGlzIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHlvdSB3YW50IHRoZSBmaW5hbCBXb3JkUHJlc3Mgc2l0ZSB5b3UgYXJlIHJlc3RvcmluZyAvIG1pZ3JhdGluZyB0byByZXNpZGUuIEV4OiBodHRwOi8vZm9vLmNvbS93cCI+PGltZyBzcmM9ImltcG9ydGJ1ZGR5L3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV90aXAucG5nIiBhbHQ9Iig/KSI+PC9hPgoJCQk8L3RkPgoJCQk8dGQ+CgkJCQk8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Im9sZF9zZXR0aW5nIiB2YWx1ZT0iPCU9IGRhdC5zaXRldXJsICU+IiBESVNBQkxFRD4KCQkJPC90ZD4KCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSI+CgkJCQk8YSBocmVmPSIjIj4mcmFycjs8L2E+CgkJCTwvdGQ+CgkJCTx0ZD4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRlZmF1bHRVUkwgJT4iIG5hbWU9InNpdGV1cmwiPgoJCQk8L3RkPgoJCTwvdHI+CgkJPGJyIC8+PGJyIC8+CgkJPCUgaWYgKCBkYXQuaXNfbXVsdGlzaXRlID09PSB0cnVlICkgeyAvLyBtdWx0aXNpdGUgJT4KCQk8dHI+PCEtLSBNVUxUSVNJVEUgRE9NQUlOIC0tPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4KCQkJCU11bHRpc2l0ZSBEb21haW4gPCU9IHRpcCggJ1RoaXMgaXMgdGhlIE11bHRpU2l0ZSBtYWluIGRvbWFpbi4gRXg6IGZvby5jb20uIFdBUk5JTkc6IENoYW5naW5nIHRoaXMgbWF5IHJlc3VsdCBpbiBVUkwgcHJvYmxlbXMuIFVzZSBjYXV0aW9uLicgKSAlPgoJCQkJPGJyPgoJCQkJPHNwYW4gY2xhc3M9ImxpZ2h0Ij4oSG9tZSBVUkwpPC9zcGFuPgoJCQk8L3RkPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ib2xkX3NldHRpbmciIHZhbHVlPSI8JT0gZGF0LmRvbWFpbiAlPiIgRElTQUJMRUQ+CgkJCTwvdGQ+CgkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+CgkJCQk8YSBocmVmPSIjIj4mcmFycjs8L2E+CgkJCTwvdGQ+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGVmYXVsdERvbWFpbiAlPiIgbmFtZT0iaG9tZXVybCI+CgkJCQk8YnI+Tm90ZTogVGhpcyBVUkwgYWJvdmUgd2lsbCBhbHNvIGJlIHRoZSBuZXcgTXVsdGlzaXRlIE5ldHdvcmsgVVJMLgoJCQk8L3RkPgoJCTwvdHI+CgkKCQk8JSB9IGVsc2UgeyAlPgoJCQoJCTx0cj48IS0tIENVU1RPTSBIT01FIFVSTCAtLT4KCQkJPHRkPgoJCQkJPGxhYmVsIHN0eWxlPSJ3aWR0aDogMTAwJTsiIGZvcj0iY2hlY2tfY3VzdG9tX2hvbWUiPgoJCQkJCUN1c3RvbSBTaXRlIEFkZHJlc3MgPHNwYW4gY2xhc3M9ImxpZ2h0Ij4oSG9tZSBVUkwpPC9zcGFuPiA8JT0gdGlwKCAnT1BUSU9OQUwuIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgc2l0ZSBhZGRyZXNzLiBUaGlzIGlzIHRoZSBob21lIGFkZHJlc3Mgd2hlcmUgeW91ciBtYWluIHNpdGUgcmVzaWRlcy4gVGhpcyBtYXkgZGlmZmVyIGZyb20geW91ciBXb3JkUHJlc3MgVVJMLiBGb3IgZXhhbXBsZTogaHR0cDovL2Zvby5jb20nICkgJT4KCQkJCTwvbGFiZWw+CgkJCTwvdGQ+CgkJCTx0ZD4KCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY3VzdG9tSG9tZUVuYWJsZWQiIHZhbHVlPSJvbiIgb25DbGljaz0ialF1ZXJ5KCcjY3VzdG9tX2hvbWUnKS50b2dnbGUoKTsiIHN0eWxlPSJ3aWR0aDogYXV0bzsiPiA8c3BhbiBjbGFzcz0ibGlnaHQiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiPk9wdGlvbmFsLiBEaXNhYmxlZCBieSBkZWZhdWx0Ljwvc3Bhbj4KCQkJPC90ZD4KCQkJPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CgkJPC90cj4KCQk8dHIgaWQ9ImN1c3RvbV9ob21lIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwhLS0gU0lURSBBRERSRVNTIChTVEFOREFMT05FIE9OTFkpIC0tPgoJCQk8dGQ+CgkJCQkmbmJzcDsKCQkJPC90ZD4KCQkJPHRkPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJvbGRfc2V0dGluZyIgdmFsdWU9IjwlPSBkYXQuaG9tZXVybCAlPiIgRElTQUJMRUQ+CgkJCTwvdGQ+CgkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiPgoJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgb2xkIHNldHRpbmcgb3Zlci4iPiZyYXJyOzwvYT4KCQkJPC90ZD4KCQkJPHRkPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGVmYXVsdFVSTCAlPiIgbmFtZT0iaG9tZXVybCI+CgkJCTwvdGQ+CgkJPC90cj4KCQoJCTwlIH0gLy8gZW5kIG5vbi1tdWx0aXNpdGUgJT4KCQoJCgk8L3RhYmxlPgoJPGJyPjxicj48YnI+CgkKCQoJCgkKCTxkaXYgY2xhc3M9Im1haW5fYm94X2Zvb3QiPgoJCTxicj4KCQk8Y2VudGVyPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJuZXh0U3RlcCIgdmFsdWU9Ik5leHQgU3RlcCIgY2xhc3M9Iml0LWJ1dHRvbiI+CgkJCTxidXR0b24gaHJlZj0iI3BiX2FkdmFuY2VkX21vZGFsIiBjbGFzcz0iaXQtYnV0dG9uIGl0LXNlY29uZGFyeSBsZWFuTW9kYWwiPkFkdmFuY2VkIE9wdGlvbnM8L2J1dHRvbj4KCQk8L2NlbnRlcj4KCgk8L2Rpdj4KCQoJCgkKCTxkaXYgaWQ9InBiX2FkdmFuY2VkX21vZGFsIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCTxoMj5BZHZhbmNlZCBPcHRpb25zPC9oMj4KCQkJCUV4ZXJjaXNlIGNhdXRpb24gdXNpbmcgYWR2YW5jZWQgb3B0aW9ucy4gQWRkaXRpb25hbCBvcHRpb25zIGF2YWlsYWJsZSBvbiBzdWJzZXF1ZW50IHN0ZXBzLgoJCQk8L2Rpdj4KCQkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9Im1pZ3JhdGVEYXRhYmFzZSIKCQkJCQkgICBvbmNsaWNrPSIKCQkJCQlpZiAoIGpRdWVyeSh0aGlzKS5pcyggJzpjaGVja2VkJyApICkgeyAvLyBPbiBjaGVja2luZyB0aGlzIGJveCwgd2UgbmVlZCB0byBoaWRlIG9wdGlvbnM7IHVuY2hlY2tpbmcgc2hvdyBvcHRpb25zLgoJCQkJCQkJalF1ZXJ5KCAnI2RhdGFiYXNlX21pZ3JhdGVfb3B0aW9ucycgKS5zbGlkZURvd24oKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWpRdWVyeSggJyNkYXRhYmFzZV9taWdyYXRlX29wdGlvbnMnICkuc2xpZGVVcCgpOwoJCQkJCQl9CgkJCQkJCWpRdWVyeSggJyNkYXRhYmFzZV9taWdyYXRlX29wdGlvbnMgPiBpbnB1dCcgKS5yZW1vdmVBdHRyKCdjaGVja2VkJyk7IC8vIFVuY2hlY2sgYWxsIG9wdGlvbnMgd2l0aGluLgoJCQkJCSIgQ0hFQ0tFRD4gTWlncmF0ZSBVUkxzL3BhdGhzIGluIGRhdGFiYXNlIGZyb20gb2xkIGxvY2F0aW9uIHRvIG5ldy4gPGJyPgoJCQkJPGRpdiBpZD0iZGF0YWJhc2VfbWlncmF0ZV9vcHRpb25zIj4KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJtaWdyYXRlRGF0YWJhc2VCcnV0ZUZvcmNlIiBDSEVDS0VEPiBNaWdyYXRlIFVSTFMvcGF0aHMgaW4gZGF0YWJhc2UgaW4gYWxsIGxvY2F0aW9ucyB1c2luZyBicnV0ZSBmb3JjZS4gPCU9IHRpcCggJ0J5IGRlZmF1bHQgQmFja3VwQnVkZHkgd2lsbCBleHRlbnNpdmVseSBleGFtaW5lIGFuZCBtaWdyYXRlIHVua25vd24gZGF0YWJhc2UgdGFibGVzLiAgU29tZXRpbWVzIGhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgdGltZW91dHMgb24gbGFyZ2VyIHNpdGVzLiAgWW91IG1heSBza2lwIHRoaXMgaW50ZW5zaXZlIHByb2NlZHVyZSB0byByZWR1Y2UgcmVxdWlyZWQgcnVudGltZSBmb3IgZGF0YWJhc2UgbWlncmF0aW9uIHN0ZXBzLiBOb3RlIHRoYXQgc29tZSBVUkxzIG9yIHBhdGhzIG1heSBub3QgYmUgdXBkYXRlZCBpZiBza2lwcGluZyB0aGlzIHN0ZXAuICBBbGwgbWFqb3IgV29yZFByZXNzIFVSTHMgYW5kIHBhdGhzIHdpbGwgc3RpbGwgYmUgdXBkYXRlZCBob3dldmVyLicgKSAlPjxicj4KCQkJCQlNYXhpbXVtIHRpbWUgcGVyIGNodW5rIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBkYXRhYmFzZTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im1heF9leGVjdXRpb25fdGltZSIgaWQ9Im1heF9leGVjdXRpb25fdGltZSIgdmFsdWU9IjwlPSBtYXhFeGVjdXRpb25UaW1lICU+IiBzaXplPSI1Ij4gc2Vjb25kcy4gPCU9IHRpcCggJ1RoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIEltcG9ydEJ1ZGR5IHNob3VsZCBhbGxvdyBhIGRhdGFiYXNlIGltcG9ydCBjaHVuayB0byBydW4uIEltcG9ydEJ1ZGR5IGJ5IGRlZmF1bHQgbGltaXRzIGVhY2ggY2h1bmsgdG8geW91ciBNYXhpbXVtIFBIUCBydW50aW1lLiBJZiB5b3VyIGRhdGFiYXNlIGltcG9ydCBzdGVwIGlzIHRpbWluZyBvdXQgdGhlbiBsb3dlcmluZyB0aGlzIHZhbHVlIHdpbGwgaW5zdHJ1Y3QgdGhlIHNjcmlwdCB0byBsaW1pdCBlYWNoIGBjaHVua2AgdG8gYWxsb3cgaXQgdG8gZmluaXNoIHdpdGhpbiB0aGlzIHRpbWUgcGVyaW9kLiBSYWlzaW5nIHRoaXMgdmFsdWUgYWJvdmUgeW91ciBzZXJ2ZXJzIGxpbWl0cyB3aWxsIG5vdCBpbmNyZWFzZSBvciBvdmVycmlkZSBzZXJ2ZXIgc2V0dGluZ3MuJyApICU+CgkJCQk8L2Rpdj4KCQkJCTxicj4KCQkJCQoJCQk8L2Rpdj4KCQk8L2Rpdj4KCTwvZGl2PgoJCgkKPC9mb3JtPg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/urlReplaceSettings.htm,importbuddy/views/urlReplaceSettings.htm ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/2.php,importbuddy/controllers/ajax/2.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCAyOiBSZXN0b3JpbmcgRmlsZXMnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDIuJyApOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAndW56aXBwaW5nRmlsZXMnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoKaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIE5PVCBkZXBsb3ltZW50LiBkZXBsb3ltZW50IG1vZGUgcHJlLWxvYWRzIHN0YXRlIGRhdGEgaW4gYSBmaWxlIGluc3RlYWQgb2YgcGFzc2luZyB2aWEgcG9zdC4KCS8vIERldGVybWluZSBzZWxlY3RlZCBhcmNoaXZlIGZpbGUuCgkkYXJjaGl2ZUZpbGUgPSBBQlNQQVRIIC4gc3RyX3JlcGxhY2UoIGFycmF5KCAnXFwnLCAnLycgKSwgJycsIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGUnICkgKTsKCSRleGlzdGluZ19zdGF0ZSA9IGFycmF5KCk7Cn0gZWxzZSB7IC8vIERlcGxveW1lbnQuCglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSA+IDAgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMgZXhpc3QuIEFwcGx5IHRoZW0uCgkJJGFyY2hpdmVGaWxlID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddWydhcmNoaXZlJ107CgkJJGV4aXN0aW5nX3N0YXRlID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddOwoJCSRleGlzdGluZ19zdGF0ZVsndGVtcFBhdGgnXSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvdGVtcF8nIC4gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDEyICkgLiAnLyc7Cgl9IGVsc2UgewoJCWRpZSggJ0Vycm9yICM4NDM3OTc5NDMyMjMzNzg5NDogTWlzc2luZyBleHBlY3RlZCBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlLicgKTsKCX0KfQoKaWYgKCAhIGZpbGVfZXhpc3RzKCAkYXJjaGl2ZUZpbGUgKSApIHsKCWRpZSggJ0Vycm9yICM4MzQ5ODQ6IFNwZWNpZmllZCBiYWNrdXAgYXJjaGl2ZSBgJyAuIGh0bWxlbnRpdGllcyggJGFyY2hpdmVGaWxlICkgLiAnYCBub3QgZm91bmQuIERpZCB5b3UgZGVsZXRlIGl0PyBJZiB0aGUgZmlsZSBleGlzdHMsIHRyeSBhZ2FpbiBvciB2ZXJpZnkgcHJvcGVyIHJlYWQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgUEhQIHRvIGFjY2VzcyB0aGUgZmlsZS4nICk7Cn0KCmlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3NraXBVbnppcCcgKSApIHsKCSRza2lwVW56aXAgPSB0cnVlOwp9IGVsc2UgewoJJHNraXBVbnppcCA9IGZhbHNlOwp9CgoKJHNpbXBsZVZlcnNpb24gPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXTsKaWYgKCBzdHJwb3MoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLCAnICcgKSA+IDAgKSB7Cgkkc2ltcGxlVmVyc2lvbiA9IHN1YnN0ciggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sIDAsIHN0cnBvcyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sICcgJyApICk7Cn0KPz4KPCEtLSBJbXBvcnRCdWRkeSB2ZXJzaW9uIHVzYWdlIHN0YXRzIC0tPgo8IS0tIDxpbWcgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiIHNyYz0iaHR0cHM6Ly90Mms2cjJ5d3BqLmV4ZWN1dGUtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL3YxL2JiP3U9PD9waHAgZWNobyBtZDUoIHNpdGVfdXJsKCkgKTsgPz4mdj08P3BocCBlY2hvICRzaW1wbGVWZXJzaW9uOyA/PiZ0PTw/cGhwIGVjaG8gbWljcm90aW1lKHRydWUpID8+Ij4gLS0+Cjw/cGhwCgovLyBJbnN0YW50aWF0ZSByZXN0b3JlIGNsYXNzLgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL3Jlc3RvcmUucGhwJyApOwokcmVzdG9yZSA9IG5ldyBiYWNrdXBidWRkeV9yZXN0b3JlKCAncmVzdG9yZScsICRleGlzdGluZ19zdGF0ZSApOwokc3RhdHVzID0gJHJlc3RvcmUtPnN0YXJ0KCAkYXJjaGl2ZUZpbGUsICRza2lwVW56aXAgKTsKaWYgKCBmYWxzZSA9PT0gJHN0YXR1cyApIHsKCSRlcnJvcnMgPSAkcmVzdG9yZS0+Z2V0RXJyb3JzKCk7CglpZiAoIGNvdW50KCAkZXJyb3JzICkgPiAwICkgewoJCSRlcnJvck1zZyA9ICdFcnJvcnMgd2VyZSBlbmNvdW50ZXJlZDogJyAuIGltcGxvZGUoICcsICcsICRlcnJvcnMgKSAuICcgSWYgc2Vla2luZyBzdXBwb3J0IHBsZWFzZSBjbGljayB0byBTaG93IEFkdmFuY2VkIERldGFpbHMgYWJvdmUgYW5kIHByb3ZpZGUgYSBjb3B5IG9mIHRoZSBsb2cuJzsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3JNc2cgKTsKCX0gZWxzZSB7CgkJJGVycm9yTXNnID0gJ0Vycm9yICM4OTQzODM6IFVua25vd24gZXJyb3Igc3RhcnRpbmcgcmVzdG9yZS4gU2VlIGFkdmFuY2VkIHN0YXR1cyBsb2cgZm9yIGRldGFpbHMuJzsKCX0KCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJGVycm9yTXNnICk7CglyZXR1cm47Cn0KCiRyZXN0b3JlLT5fc3RhdGVbJ2RlZmF1bHRVUkwnXSA9ICRyZXN0b3JlLT5nZXREZWZhdWx0VXJsKCk7CiRyZXN0b3JlLT5fc3RhdGVbJ2RlZmF1bHREb21haW4nXSA9ICRyZXN0b3JlLT5nZXREZWZhdWx0RG9tYWluKCk7CmlmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBkZXBsb3ltZW50IG1vZGUgcHJlLWxvYWRzIHN0YXRlIGRhdGEgaW4gYSBmaWxlIGluc3RlYWQgb2YgcGFzc2luZyB2aWEgcG9zdC4KCSRyZXN0b3JlLT5fc3RhdGUgPSBwYXJzZV9vcHRpb25zKCAkcmVzdG9yZS0+X3N0YXRlICk7Cn0KJHJlc3RvcmUtPl9zdGF0ZVsnc2tpcFVuemlwJ10gPSAkc2tpcFVuemlwOwoKLy8gU2V0IHVwIHN0YXRlIHZhcmlhYmxlcy4KaWYgKCAoICdkYicgPT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0J11bJ2JhY2t1cF90eXBlJ10gKSB8fCAoIGZhbHNlID09ICRyZXN0b3JlLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlcyddICkgKSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBiYWNrdXAgT1Igbm90IHJlc3RvcmluZyBmaWxlcy4nICk7CgkkcmVzdG9yZS0+X3N0YXRlWyd0ZW1wUGF0aCddID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS90ZW1wXycgLiBwYl9iYWNrdXBidWRkeTo6cmFuZG9tX3N0cmluZyggMTIgKSAuICcvJzsKCSRyZXN0b3JlLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlUm9vdCddID0gJHJlc3RvcmUtPl9zdGF0ZVsndGVtcFBhdGgnXTsKCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10sICRkaWUgPSBmYWxzZSApOwp9IGVsc2UgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdG9yaW5nIGZpbGVzLicgKTsKCSRyZXN0b3JlLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlUm9vdCddID0gQUJTUEFUSDsgLy8gUmVzdG9yZSBmaWxlcyBpbnRvIGN1cnJlbnQgcm9vdC4KfQoKLy8gUGFyc2Ugc3VibWl0dGVkIG9wdGlvbnMgZm9yIHNhdmluZyB0byBzdGF0ZS4KZnVuY3Rpb24gcGFyc2Vfb3B0aW9ucyggJHJlc3RvcmVEYXRhICkgewoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRmlsZXMnICkgKSB7ICRyZXN0b3JlRGF0YVsncmVzdG9yZUZpbGVzJ10gPSB0cnVlOyB9IGVsc2UgeyAkcmVzdG9yZURhdGFbJ3Jlc3RvcmVGaWxlcyddID0gZmFsc2U7IH0KCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhYmFzZScgKSApIHsgJHJlc3RvcmVEYXRhWydyZXN0b3JlRGF0YWJhc2UnXSA9IHRydWU7IH0gZWxzZSB7ICRyZXN0b3JlRGF0YVsncmVzdG9yZURhdGFiYXNlJ10gPSBmYWxzZTsgfQoJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWlncmF0ZUh0YWNjZXNzJyApICkgeyAkcmVzdG9yZURhdGFbJ21pZ3JhdGVIdGFjY2VzcyddID0gdHJ1ZTsgfSBlbHNlIHsgJHJlc3RvcmVEYXRhWydtaWdyYXRlSHRhY2Nlc3MnXSA9IGZhbHNlOyB9CgkKCWlmICggKCAnYWxsJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd6aXBNZXRob2RTdHJhdGVneScgKSApIHx8ICggJ3ppcGFyY2hpdmUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ppcE1ldGhvZFN0cmF0ZWd5JyApICkgfHwgKCAncGNsemlwJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd6aXBNZXRob2RTdHJhdGVneScgKSApICkgewoJCSRyZXN0b3JlRGF0YVsnemlwTWV0aG9kU3RyYXRlZ3knXSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ppcE1ldGhvZFN0cmF0ZWd5JyApOwoJfQoJCglyZXR1cm4gJHJlc3RvcmVEYXRhOwoJCn0gLy8gRW5kIHBhcnNlX29wdGlvbnMoKS4KCgovLyBUdXJuIG9uIG1haW50ZW5hbmNlIG1vZGUgZm9yIFdvcmRQcmVzcyB0byBwcmV2ZW50IGJyb3dzaW5nIHRoZSBzaXRlIHVudGlsIGl0IGlzIGZ1bGx5IGltcG9ydGVkLgokcmVzdG9yZS0+bWFpbnRlbmFuY2VPbigpOwoKCmlmICggdHJ1ZSAhPT0gJHJlc3RvcmUtPl9zdGF0ZVsnc2tpcFVuemlwJ10gKSB7CgoJLy8gVW56aXAgYmFja3VwIGFyY2hpdmUuIEZvciBEQi1vbmx5IG9ubHkgcmVzdG9yZXMgU1FMIGZpbGVzIHRvIHRlbXAgZGlyZWN0b3J5LiBGb3IgZmlsZXMsIHVuemlwcyBhbGwgdG8gQUJTUEFUSC4KCSRyZXN1bHRzID0gJHJlc3RvcmUtPnJlc3RvcmVGaWxlcygpOwoJaWYgKCB0cnVlICE9PSAkcmVzdWx0cyApIHsgLy8gVW56aXAgZmFpbGVkLgoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ZpbGUgZXh0cmFjdGlvbiBwcm9jZXNzIGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LiBVbmFibGUgdG8gY29udGludWUgdG8gbmV4dCBzdGVwLiBNYW51YWxseSBleHRyYWN0IHRoZSBiYWNrdXAgWklQIGZpbGUgYW5kIGNob29zZSB0byAiU2tpcCBGaWxlIEV4dHJhY3Rpb24iIGZyb20gdGhlIGFkdmFuY2VkIG9wdGlvbnMgb24gU3RlcCAxLiBEZXRhaWxzOiAnIC4gJHJlc3RvcmUtPmdldEVycm9ycygpLCB0cnVlLCAnOTAwNScgKTsKCQkKCX0gZWxzZSB7IC8vIFVuemlwIHN1Y2Nlc3MuCgkJCgkJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICd1bnppcFN1Y2Nlc3MnICk7PC9zY3JpcHQ+IjsKCQkKCQlpZiAoIGZhbHNlID09PSAkcmVzdG9yZS0+X3N0YXRlWydyZXN0b3JlRmlsZXMnXSApIHsgLy8gU2tpcCByZXN0b3JpbmcgZmlsZXMuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NLSVBQSU5HIHJlc3RvcmUgb2YgZmlsZXMgYmFzZWQgb24gc2V0dGluZ3MgZnJvbSBTdGVwIDEuJyApOwoJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2ZpbGVzUmVzdG9yZVNraXBwZWQnICk7PC9zY3JpcHQ+IjsKCQl9IGVsc2UgeyAvLyBVbnppcCBhbGwgZmlsZXMgYW5kL29yIGRhdGFiYXNlIHNxbCBmaWxlcy4KCQkJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICdmaWxlc1Jlc3RvcmVTdWNjZXNzJyApOzwvc2NyaXB0PiI7CgkJfQoKCX0KCQp9IGVsc2UgewoJJHJlc3VsdHMgPSB0cnVlOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29tcGxldGVseSBza2lwcGluZyBBTEwgZmlsZSBleHRyYWN0aW9uIGJhc2VkIG9uIHNraXBVbnppcCBhZHZhbmNlZCBzZXR0aW5nLicgKTsKCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZmlsZXNSZXN0b3JlU2tpcHBlZCcgKTs8L3NjcmlwdD4iOwp9CgoKLy8gT24gdW56aXAgc3VjY2VzcyBPUiBza2lwcGluZyB1bnppcC4KcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoaW5nIHN0ZXAgMi4nICk7CmlmICggKCBmYWxzZSA9PT0gJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVzJ10gKSB8fCAoIHRydWUgPT09ICRyZXN1bHRzICkgKSB7CgkkcmVzdG9yZS0+cmVuYW1lSHRhY2Nlc3NUZW1wKCk7IC8vIFJlbmFtZSAuaHRhY2Nlc3MgdG8gLmh0YWNjZXNzLmJiX3RlbXAgdW50aWwgZW5kIG9mIG1pZ3JhdGlvbi4KCS8vc2xlZXAoMSk7IC8vIEdpdmUgdGltZSBmb3IgZmlsZSByZW5hbWU/CgkkcmVzdG9yZS0+ZGV0ZXJtaW5lRGF0YWJhc2VGaWxlcygpOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gbG9hZCBTdGVwIDMuJyApOwoJPz4KCTxzY3JpcHQ+CgkJc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJcGFnZVRpdGxlKCAnU3RlcCAzOiBEYXRhYmFzZSBTZXR0aW5ncycgKTsKCQkJYmJfc2hvd1N0ZXAoICdkYXRhYmFzZVNldHRpbmdzJywgPD9waHAgZWNobyBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApOyA/PiApOwoJCX0sIDIwMDApOwoJPC9zY3JpcHQ+Cgk8P3BocAp9CgoKZWNobyAnPHNjcmlwdD5OUHJvZ3Jlc3MuZG9uZSgpOzwvc2NyaXB0Pic7CgoKLy8gTG9hZCBmb290ZXIuCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2Zvb3RlcicpOwoKLy8gRGVwbG95bWVudCBwcm9jZWVkLgppZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCSRkZXBsb3lNb2RlT24gPSAnMSc7CgkkbmV4dFN0ZXBOdW0gPSA0OwoJZWNobyAnPCEtLSBBVVRPUFJPQ0VFRCBUTyBTVEVQICcgLiAkbmV4dFN0ZXBOdW0gLiAnIC0tPic7CgkKCQoJLy9lY2hvICc8c2NyaXB0PmNvbnNvbGUubG9nKCAiJyAuIHByaW50X3IoICRyZXN0b3JlLT5fc3RhdGUsIHRydWUgKSAuICciICk7PC9zY3JpcHQ+JzsKCQoJCgkvLyBXcml0ZSBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlcy4KCWdsb2JhbCAkaW1wb3J0YnVkZHlfZmlsZTsKCSRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRpbXBvcnRidWRkeV9maWxlICk7Cgkkc3RhdGVfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRGaWxlU2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnV3JpdGluZyB0byBzdGF0ZSBmaWxlIGAnIC4gJHN0YXRlX2ZpbGUgLiAnYC4nICk7CglpZiAoIGZhbHNlID09PSAoICRmaWxlX2hhbmRsZSA9IEBmb3BlbiggJHN0YXRlX2ZpbGUsICd3JyApICkgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMzMjg5Mzc6IFRlbXAgc3RhdGUgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zLiAoJyAuICRzdGF0ZV9maWxlIC4gJyknICk7CgkJcmV0dXJuIGZhbHNlOwoJfQoJaWYgKCBmYWxzZSA9PT0gZndyaXRlKCAkZmlsZV9oYW5kbGUsICI8P3BocCBkaWUoJ0FjY2VzcyBEZW5pZWQuJyk7IC8vIDwhLS0gPz5cbiIgLiBiYXNlNjRfZW5jb2RlKCBzZXJpYWxpemUoICRyZXN0b3JlLT5fc3RhdGUgKSApICkgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMyMzg5MzczOiBVbmFibGUgdG8gd3JpdGUgdG8gc3RhdGUgZmlsZS4nICk7Cgl9IGVsc2UgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyb3RlIHRvIHN0YXRlIGZpbGUuJyApOwoJfQoJZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCT8+Cgk8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iP2FqYXg9PD9waHAgZWNobyAkbmV4dFN0ZXBOdW07ID8+JnY9PD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3YnICk7ID8+JmRlcGxveT10cnVlJmRpcmVjdGlvbj08P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlyZWN0aW9uJyApOyA/PiZkaXNwbGF5X21vZGU9ZW1iZWQiIGlkPSJkZXBsb3ktYXV0b1Byb2NlZWQiPgoJCTwhLS0gaW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZXN0b3JlRGF0YSIgdmFsdWU9Ijw/cGhwIC8vZWNobyBiYXNlNjRfZW5jb2RlKCB1cmxlbmNvZGUoIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApOyA/PiIgLS0+CgkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibXktc3VibWl0IiB2YWx1ZT0iTmV4dCBTdGVwIiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuOyI+Cgk8L2Zvcm0+Cgk8c2NyaXB0PmpRdWVyeSggJyNkZXBsb3ktYXV0b1Byb2NlZWQnICkuc3VibWl0KCk7PC9zY3JpcHQ+Cgk8P3BocAp9IGVsc2UgewoJJGRlcGxveU1vZGVPbiA9ICcwJzsKfQoKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CiRpbl9wYWdlID0gdHJ1ZTsKaW5jbHVkZSggJ19zdGF0cy5waHAnICk7Cg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/2.php,importbuddy/controllers/ajax/2.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/4.php,importbuddy/controllers/ajax/4.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA0OiBSZXN0b3JpbmcgRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDQuJyApOwpwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCmdsb2JhbCAkd3BkYjsKCgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsgLy8gZGVwbG95bWVudCBtb2RlIHByZS1sb2FkcyBzdGF0ZSBkYXRhIGluIGEgZmlsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgdmlhIHBvc3QuCgkvLyBQYXJzZSBzdWJtaXR0ZWQgcmVzdG9yZURhdGEgcmVzdG9yZSBzdGF0ZSBmcm9tIHByZXZpb3VzIHN0ZXAuCgkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKTsKCQoJCgkvLyBEZWNvZGUgc3VibWl0dGVkIGRhdGEsIHJlcG9ydGluZyBkZXRhaWxzIG9uIGZhaWx1cmUuCgkkZGVjb2RlRmFpbFJlYXNvbiA9ICcnOwoJaWYgKCBmYWxzZSA9PT0gKCAkcmVzdG9yZURhdGEgPSBiYXNlNjRfZGVjb2RlKCAkcmVzdG9yZURhdGEgKSApICkgeyAvLyBmYWxzZSBpZiBmYWlsZWQKCQkkZGVjb2RlRmFpbFJlYXNvbiA9ICdFUlJPUiAjODM4OTNiOiBSZXN0b3JlIGhhbHRlZC4gVW5hYmxlIHRvIGJhc2U2NF9kZWNvZGUoKSBzdWJtaXR0ZWQgZm9ybSBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuJzsKCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJJHJlc3RvcmVEYXRhID0gdXJsZGVjb2RlKCAkcmVzdG9yZURhdGEgKTsKCQlpZiAoIG51bGwgPT09ICggJHJlc3RvcmVEYXRhID0ganNvbl9kZWNvZGUoICRyZXN0b3JlRGF0YSwgdHJ1ZSApICkgKSB7IC8vIG51bGwgaWYgZmFpbGVkCgkJCSRtZXNzYWdlID0gJ0VSUk9SICM4Mzg5M2E6IFJlc3RvcmUgaGFsdGVkLiBVbmFibGUgdG8gZGVjb2RlIEpTT04gcmVzdG9yZSBiYXNlNjQgZGVjb2RlZCBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBiYXNlNjRfZGVjb2RlKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApICkgLiAnYC4gQmVmb3JlIGJhc2U2NCBkZWNvZGU6IGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuIChOb3RlOiBBIGN1c3RvbWVyIGhhcyByZXBvcnRlZCBydW5uaW5nIG91dCBvZiBkaXNrIHNwYWNlIGFzIGEgcG9zc2libGUgY2F1c2UuIFRoaXMgaXMgbm90IGNvbmZpcm1lZCBidXQgY291bGQgYmUgdXNlZnVsIHRvIGNoZWNrLiknOwoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2pzb25fbGFzdF9lcnJvcicgKSApIHsKCQkgCQkkbWVzc2FnZSAuPSAnIGpzb25fbGFzdF9lcnJvcjogYCcgLiBqc29uX2xhc3RfZXJyb3IoKSAuICdgLic7CgkJIAl9CgkJIAkkZGVjb2RlRmFpbFJlYXNvbiA9ICRtZXNzYWdlOwoJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N1Y2Nlc3MgZGVjb2Rpbmcgc3VibWl0dGVkIGVuY29kZWQgZGF0YS4nICk7CgkJfQoJfQoJLy8gUmVwb3J0IGZhaWx1cmUgYW5kIGZhdGFsbHkgaGFsdC4KCWlmICggJycgIT09ICRkZWNvZGVGYWlsUmVhc29uICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCWRpZSgpOwoJfQoJCgkKfSBlbHNlIHsKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApICYmICggY291bnQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApID4gMCApICkgeyAvLyBEZWZhdWx0IHN0YXRlIG92ZXJyaWRlcyBleGlzdC4gQXBwbHkgdGhlbS4KCQkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ107Cgl9IGVsc2UgewoJCWRpZSggJ0Vycm9yICM0NjQzMjI1OiBNaXNzaW5nIGV4cGVjdGVkIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGUuJyApOwoJfQp9CgoKCi8vIEluc3RhbnRpYXRlIHJlc3RvcmUgY2xhc3MuCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvcmVzdG9yZS5waHAnICk7CiRyZXN0b3JlID0gbmV3IGJhY2t1cGJ1ZGR5X3Jlc3RvcmUoICdyZXN0b3JlJywgJHJlc3RvcmVEYXRhICk7CnVuc2V0KCAkcmVzdG9yZURhdGEgKTsgLy8gQWNjZXNzIHZpYSAkcmVzdG9yZS0+X3N0YXRlIHRvIG1ha2Ugc3VyZSBpdCBpcyBhbHdheXMgdXAgdG8gZGF0ZS4KCgppZiAoIGZhbHNlID09PSAkcmVzdG9yZS0+X3N0YXRlWydyZXN0b3JlRGF0YWJhc2UnXSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIHJlc3RvcmUgU0tJUFBFRCBiYXNlZCBvbiBTdGVwIDEgc2V0dGluZ3MuJyApOwoJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICdkYXRhYmFzZVJlc3RvcmVTa2lwcGVkJyApOzwvc2NyaXB0PiI7Cn0gZWxzZSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb25uZWN0aW5nIHRvIGRhdGFiYXNlLicgKTsKCQoJLy8gQ29ubmVjdCBJbXBvcnRCdWRkeSB0byB0aGUgZGF0YWJhc2Ugd2l0aCB0aGVzZSBzZXR0aW5ncy4KCSRyZXN0b3JlLT5jb25uZWN0RGF0YWJhc2UoKTsKCQoJCgkvLyBDQVVUSU9OOiBXaXBlIGRhdGFiYXNlIHRhYmxlcyB3aXRoIG1hdGNoaW5nIHByZWZpeCBpZiBvcHRpb24gd2FzIHNlbGVjdGVkLgoJaWYgKCBUUlVFID09PSAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3dpcGVQcmVmaXgnXSApIHsKCQlpZiAoICggISBpc3NldCggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVGaWxlcyddICkgKSAmJiAoICcnID09ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSApICkgeyAvLyBPbmx5IGRvIHRoaXMgaWYgbm90IGluIHByb2Nlc3Mgb2YgcmVzdW1pbmcuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1dpcGluZyBleGlzdGluZyBkYXRhYmFzZSB0YWJsZXMgd2l0aCB0aGUgcHJlZml4IGAnIC4gICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10gLiAnYCBiYXNlZCBvbiBzZXR0aW5ncy4uLicgKTsKCQkJaWYgKCBUUlVFICE9PSBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ2ltcG9ydCddLT53aXBlUHJlZml4KCAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddLCBUUlVFICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHdpcGUgZGF0YWJhc2UgdGFibGVzIG1hdGNoaW5nIHByZWZpeC4nICk7CgkJCX0KCQl9Cgl9CgkKCQoJLy8gREFOR0VSOiBXaXBlIGRhdGFiYXNlIG9mIEFMTCBUQUJMRVMgaWYgb3B0aW9uIHdhcyBzZWxlY3RlZC4KCWlmICggVFJVRSA9PT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd3aXBlRGF0YWJhc2UnXSApIHsKCQlpZiAoICggISBpc3NldCggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVGaWxlcyddICkgKSAmJiAoICcnID09ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSApICkgeyAvLyBPbmx5IGRvIHRoaXMgaWYgbm90IGluIHByb2Nlc3Mgb2YgcmVzdW1pbmcuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1dpcGluZyBBTEwgZXhpc3RpbmcgZGF0YWJhc2UgdGFibGVzIGJhc2VkIG9uIHNldHRpbmdzICh1c2Ugd2l0aCBjYXV0aW9uKS4uLicgKTsKCQkJaWYgKCBUUlVFICE9PSBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ2ltcG9ydCddLT53aXBlRGF0YWJhc2UoIFRSVUUgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gd2lwZSBlbnRpcmUgZGF0YWJhc2UgYXMgY29uZmlndXJlZCBpbiB0aGUgc2V0dGluZ3MuJyApOwoJCQl9CgkJfQoJfQoKCS8vIFJlc3RvcmUgdGhlIGRhdGFiYXNlLgoJaWYgKCAndHJ1ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7CgkJLy8gRHJvcCBhbnkgcHJldmlvdXMgaW5jb21wbGV0ZSBkZXBsb3ltZW50IC8gcm9sbGJhY2sgdGFibGVzLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Ryb3BwaW5nIGFueSBleGlzdGluZyB0ZW1wb3JhcnkgZGVwbG95bWVudCBvciByb2xsYmFjayB0YWJsZXMuJyApOwoJCQoJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFICggKCB0YWJsZV9uYW1lIExJS0UgJ2JibmV3LVxfJScgKSBPUiAoIHRhYmxlX25hbWUgTElLRSAnYmJvbGQtXF8lJyApICkgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiLCBBUlJBWV9BICk7CgkJaWYgKCBjb3VudCggJHJlc3VsdHMgKSA+IDAgKSB7CgkJCWZvcmVhY2goICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCQlpZiAoIGZhbHNlID09PSAkd3BkYi0+cXVlcnkoICJEUk9QIFRBQkxFIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRbJ3RhYmxlX25hbWUnXSApIC4gImAiICkgKSB7CgkJCQkJcmV0dXJuICR0aGlzLT5fZXJyb3IoICdFcnJvciAjMzcyODM3NjgzOiBVbmFibGUgdG8gY29weSBvdmVyIEJhY2t1cEJ1ZGR5IHNldHRpbmdzIGZyb20gbGl2ZSBzaXRlIHRvIGluY29taW5nIGRhdGFiYXNlIGluIHRlbXAgdGFibGUuIERldGFpbHM6IGAnIC4gJHdwZGItPmxhc3RfZXJyb3IgLiAnYC4nICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXJyb3IgIzg0OTM5ODQ6IFVuYWJsZSB0byBkcm9wIHRlbXAgcm9sbGJhY2svZGVwbG95IHRhYmxlIGAnIC4gJHJlc3VsdFsndGFibGVfbmFtZSddIC4gJ2AuIERldGFpbHM6IGAnIC4gJHdwZGItPmxhc3RfZXJyb3IgLiAnYC4nICk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd0ZW1wUHJlZml4J10gPSAnYmJuZXctJyAuIHN1YnN0ciggJHJlc3RvcmUtPl9zdGF0ZVsnc2VyaWFsJ10sIDAsIDQgKSAuICdfJyAuICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J107Cgl9CgkKCQoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gcmVzdG9yZSBkYXRhYmFzZS4nICk7CgkKCSRyZXN0b3JlUmVzdWx0ID0gJHJlc3RvcmUtPnJlc3RvcmVEYXRhYmFzZSggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd0ZW1wUHJlZml4J10gKTsKCQoJCgkKCWlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgewoJCQoJCWlmICggaXNfYXJyYXkoICRyZXN0b3JlUmVzdWx0ICkgKSB7IC8vIENodW5raW5nLiBSZXN1bWUgc2FtZSBzdGVwLgoJCQkkbmV4dFN0ZXBOdW0gPSA0OwoJCX0gZWxzZSB7IC8vIE5leHQgc3RlcC4KCQkJJG5leHRTdGVwTnVtID0gNTsKCQl9CgkJZWNobyAnPCEtLSBBVVRPUFJPQ0VFRCBUTyBTVEVQICcgLiAkbmV4dFN0ZXBOdW0gLiAnIC0tPic7CgkJCgkJCgkJLy9lY2hvICc8c2NyaXB0PmNvbnNvbGUubG9nKCAiJyAuIHByaW50X3IoICRyZXN0b3JlLT5fc3RhdGUsIHRydWUgKSAuICciICk7PC9zY3JpcHQ+JzsKCQkKCQkKCQkvLyBXcml0ZSBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlcy4KCQlnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CgkJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCQkkc3RhdGVfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRGaWxlU2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyaXRpbmcgdG8gc3RhdGUgZmlsZSBgJyAuICRzdGF0ZV9maWxlIC4gJ2AuJyApOwoJCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gQGZvcGVuKCAkc3RhdGVfZmlsZSwgJ3cnICkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMyODM0NjQ6IFRlbXAgc3RhdGUgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zLiAoJyAuICRzdGF0ZV9maWxlIC4gJyknICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKCBmYWxzZSA9PT0gZndyaXRlKCAkZmlsZV9oYW5kbGUsICI8P3BocCBkaWUoJ0FjY2VzcyBEZW5pZWQuJyk7IC8vIDwhLS0gPz5cbiIgLiBiYXNlNjRfZW5jb2RlKCBzZXJpYWxpemUoICRyZXN0b3JlLT5fc3RhdGUgKSApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMjM4OTM3MzogVW5hYmxlIHRvIHdyaXRlIHRvIHN0YXRlIGZpbGUuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyb3RlIHRvIHN0YXRlIGZpbGUuJyApOwoJCX0KCQlmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCT8+CgkJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTw/cGhwIGVjaG8gJG5leHRTdGVwTnVtOyA/PiZ2PTw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd2JyApOyA/PiZkZXBsb3k9dHJ1ZSZkaXJlY3Rpb249PD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RpcmVjdGlvbicgKTsgPz4mZGlzcGxheV9tb2RlPWVtYmVkIiBpZD0iZGVwbG95LWF1dG9Qcm9jZWVkIj4KCQkJPCEtLSBpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiB2YWx1ZT0iPD9waHAgLy9lY2hvIGJhc2U2NF9lbmNvZGUoIHVybGVuY29kZSgganNvbl9lbmNvZGUoICRyZXN0b3JlLT5fc3RhdGUgKSApICk7ID8+IiAtLT4KCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibXktc3VibWl0IiB2YWx1ZT0iTmV4dCBTdGVwIiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuOyI+CgkJPC9mb3JtPgoJCTxzY3JpcHQ+alF1ZXJ5KCAnI2RlcGxveS1hdXRvUHJvY2VlZCcgKS5zdWJtaXQoKTs8L3NjcmlwdD4KCQk8P3BocAoJCQoJfSBlbHNlIHsgLy8gTm9ybWFsIGltcG9ydC4KCQkKCQlpZiAoIFRSVUUgIT09ICRyZXN0b3JlUmVzdWx0ICkgewoJCQlpZiAoIGlzX2FycmF5KCAkcmVzdG9yZVJlc3VsdCApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgcmVzdG9yZSBkaWQgbm90IGZ1bGx5IGNvbXBsZXRlIHRoaXMgcGFzcy4gQ2h1bmtpbmcgaW4gcHJvZ3Jlc3MuIFJlc3VtaW5nIHdoZXJlIGxlZnQgb2ZmLiBJZiB0aGUgcHJvY2VzcyBkb2VzIG5vdCBwcm9jZWVkIGNoZWNrIHlvdXIgYnJvd3NlciBlcnJvciBjb25zb2xlIG9yIFBIUCBlcnJvciBsb2cuJyApOwoJCQkJPz4KCgkJCQk8Zm9ybSBpZD0icmVzdG9yZUNodW5rRm9ybSIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTQiPgoJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiB2YWx1ZT0iPD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCB1cmxlbmNvZGUoIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApOyA/PiI+CgkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0Rm9ybSIgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSIgdmFsdWU9Ik5leHQgU3RlcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTwvZm9ybT4KCQkJCTxzY3JpcHQ+CgkJCQkJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkJCQkJalF1ZXJ5KCAnI3Jlc3RvcmVDaHVua0Zvcm0nICkuc3VibWl0KCk7CgkJCQkJfSk7CgkJCQk8L3NjcmlwdD4KCQkJPD9waHAKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciByZXN0b3JpbmcgZGF0YWJhc2UuIFNlZSBzdGF0dXMgbG9nIGZvciBkZXRhaWxzLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIHJlc3RvcmUgZmFpbGVkLicgKTsKCQkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZGF0YWJhc2VSZXN0b3JlRmFpbGVkJyApOzwvc2NyaXB0PiI7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCQoJCQlyZXR1cm47CgkJfSBlbHNlIHsgLy8gU3VjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgcmVzdG9yZSBjb21wbGV0ZWQuJyApOwoJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2RhdGFiYXNlUmVzdG9yZVN1Y2Nlc3MnICk7PC9zY3JpcHQ+IjsKCQl9CgkJCgl9Cn0KCgpwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hpbmcgc3RlcCA0LicgKTsKZWNobyAiPHNjcmlwdD4KCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7CgkJcGFnZVRpdGxlKCAnU3RlcCA1OiBTaXRlIFVSTCBTZXR0aW5ncycgKTsKCQliYl9zaG93U3RlcCggJ3VybFJlcGxhY2VTZXR0aW5ncycsICIgLiBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApIC4gIiApOwoJfSwgMjAwMCApOwoJPC9zY3JpcHQ+IjsKCgpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnX2lmcmFtZV9mb290ZXInKTsKCg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/4.php,importbuddy/controllers/ajax/4.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/5.php,importbuddy/controllers/ajax/5.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA1OiBNaWdyYXRpbmcgRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDUuJyApOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAnbWlncmF0aW5nRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoKCi8vIEZpbmFsIGZ1bmN0aW9ucyB0byBydW4gYWZ0ZXIgREIgbWlncmF0aW9uIGlzIGRvbmUuIEluIGZ1bmN0aW9uIHNpbmNlIHRoaXMgaXMgY2FsbGVkIGJvdGggaW4gc3RhbmRhcmQgYW5kIGF0IGVuZCBvZiBkZXBsb3ltZW50LgpmdW5jdGlvbiBmaW5hbEFjdGlvbnMoICRyZXN0b3JlICkgewoJCgkvLyBNaWdyYXRlIGh0YWNjZXNzLgoJaWYgKCBUUlVFICE9PSAkcmVzdG9yZS0+X3N0YXRlWydtaWdyYXRlSHRhY2Nlc3MnXSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGluZyBtaWdyYXRpb24gb2YgLmh0YWNjZXNzIGZpbGUgYmFzZWQgb24gc2V0dGluZ3MuJyApOwoJfSBlbHNlIHsKCQkkcmVzdG9yZS0+bWlncmF0ZUh0YWNjZXNzKCk7Cgl9CgoJLy8gUmVuYW1lIC5odGFjY2Vzcy5iYl90ZW1wIGJhY2sgdG8gLmh0YWNjZXNzLgoJJHJlc3RvcmUtPnJlbmFtZUh0YWNjZXNzVGVtcEJhY2soKTsKCQoJLy8gUmVtb3ZlIGFueSB0ZW1wb3JhcnkgLm1haW50ZW5hbmNlIGZpbGUgY3JlYXRlZCBieSBJbXBvcnRCdWRkeS4KCSRyZXN0b3JlLT5tYWludGVuYW5jZU9mZiggJG9ubHlPdXJDcmVhdGVkRmlsZSA9IHRydWUgKTsKCQoJLy8gUmVtb3ZlIGFueSB0ZW1wb3JhcnkgaW5kZXguaHRtIGZpbGUgY3JlYXRlZCBieSBJbXBvcnRCdWRkeS4KCSRyZXN0b3JlLT5zY3J1YkluZGV4RmlsZXMoKTsKCQoJJHJlc3RvcmUtPl9zdGF0ZVsnYmxvZ1B1YmxpY1N0YXR1cyddID0gJHJlc3RvcmUtPmdldEJsb2dQdWJsaWNTZXR0aW5nKCk7CgkKCS8vIFRPRE86IE1ha2UgdGhlc2UgdGhuaW5ncyBiZSBhYmxlIHRvIG91dHB1dCBzdHVmZiBpbnRvIHRoZSBjbGVhbnVwU2V0dGluZ3MuaHRtIHRlbXBsYXRlLiBBZGQgZnVuY3Rpb25zPwoJLy8gVXBkYXRlIHdwY29uZmlnIGlmIG5lZWRlZC4KCSR3cGNvbmZpZ19yZXN1bHQgPSAkcmVzdG9yZS0+bWlncmF0ZVdwQ29uZmlnKCk7CglpZiAoICR3cGNvbmZpZ19yZXN1bHQgIT09IHRydWUgKSB7CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3I6IFVuYWJsZSB0byB1cGRhdGUgd3AtY29uZmlnLnBocCBmaWxlLiBWZXJpZnkgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoZSB3cC1jb25maWcucGhwIGZpbGUgdGhlbiByZWZyZXNoIHRoaXMgcGFnZS4gWW91IG1heSBtYW51YWxseSB1cGRhdGUgeW91ciB3cC1jb25maWcucGhwIGZpbGUgYnkgY2hhbmdpbmcgaXQgdG8gdGhlIGZvbGxvd2luZzo8dGV4dGFyZWEgcmVhZG9ubHk9InJlYWRvbmx5IiBzdHlsZT0id2lkdGg6IDgwJTsiPicgLiAkd3Bjb25maWdfcmVzdWx0IC4gJzwvdGV4dGFyZWE+JyApOwoJfQoJCgkvLyBTY2FuIGZvciAndHJvdWJsZScgc3VjaCBhcyBhIHJlbWFpbmluZyAubWFpbnRlbmFuY2UgZmlsZSwgaW5kZXguaHRtLCBpbmRleC5odG1sLCBtaXNzaW5nIHdwLWNvbmZpZy5waHAsIG1pc3NpbmcgLmh0YWNjZXNzLCBldGMgZXRjLgoJJHByb2JsZW1zID0gJHJlc3RvcmUtPnRyb3VibGVTY2FuKCk7CglpZiAoIGNvdW50KCAkcHJvYmxlbXMgKSA+IDAgKSB7CgkJJHJlc3RvcmUtPl9zdGF0ZVsncG90ZW50aWFsUHJvYmxlbXMnXSA9ICRwcm9ibGVtczsKCQkkdHJvdWJsZV90ZXh0ID0gJyc7CgkJZm9yZWFjaCggJHByb2JsZW1zIGFzICRwcm9ibGVtICkgewoJCQkkdHJvdWJsZV90ZXh0IC49ICc8bGk+JyAuICRwcm9ibGVtIC4gJzwvbGk+JzsKCQl9CgkJJHRyb3VibGVfdGV4dCA9ICc8dWw+JyAuICR0cm91YmxlX3RleHQgLiAnPC91bD4nOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ09uZSBvciBtb3JlIHBvdGVudGlhbCBpc3N1ZXMgZGV0ZWN0ZWQgdGhhdCBtYXkgcmVxdWlyZSB5b3VyIGF0dGVudGlvbjogJyAuICR0cm91YmxlX3RleHQgKTsKCX0KCQoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgZmluYWwgYWN0aW9ucyBmdW5jdGlvbi4nICk7CgkKfSAvLyBFbmQgZmluYWxBY3Rpb25zKCkuCgoKCmlmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBkZXBsb3ltZW50IG1vZGUgcHJlLWxvYWRzIHN0YXRlIGRhdGEgaW4gYSBmaWxlIGluc3RlYWQgb2YgcGFzc2luZyB2aWEgcG9zdC4KCS8vIFBhcnNlIHN1Ym1pdHRlZCByZXN0b3JlRGF0YSByZXN0b3JlIHN0YXRlIGZyb20gcHJldmlvdXMgc3RlcC4KCSRyZXN0b3JlRGF0YSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApOwoJCgkKCS8vIERlY29kZSBzdWJtaXR0ZWQgZGF0YSwgcmVwb3J0aW5nIGRldGFpbHMgb24gZmFpbHVyZS4KCSRkZWNvZGVGYWlsUmVhc29uID0gJyc7CglpZiAoIGZhbHNlID09PSAoICRyZXN0b3JlRGF0YSA9IGJhc2U2NF9kZWNvZGUoICRyZXN0b3JlRGF0YSApICkgKSB7IC8vIGZhbHNlIGlmIGZhaWxlZAoJCSRkZWNvZGVGYWlsUmVhc29uID0gJ0VSUk9SICM4Mzg5M2I6IFJlc3RvcmUgaGFsdGVkLiBVbmFibGUgdG8gYmFzZTY0X2RlY29kZSgpIHN1Ym1pdHRlZCBmb3JtIGRhdGEgYCcgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApICkgLiAnYC4nOwoJfSBlbHNlIHsgLy8gU3VjY2Vzcy4KCQkkcmVzdG9yZURhdGEgPSB1cmxkZWNvZGUoICRyZXN0b3JlRGF0YSApOwoJCWlmICggbnVsbCA9PT0gKCAkcmVzdG9yZURhdGEgPSBqc29uX2RlY29kZSggJHJlc3RvcmVEYXRhLCB0cnVlICkgKSApIHsgLy8gbnVsbCBpZiBmYWlsZWQKCQkJJG1lc3NhZ2UgPSAnRVJST1IgIzgzODkzYjogUmVzdG9yZSBoYWx0ZWQuIFVuYWJsZSB0byBkZWNvZGUgSlNPTiByZXN0b3JlIGJhc2U2NCBkZWNvZGVkIGRhdGEgYCcgLiBodG1sZW50aXRpZXMoIGJhc2U2NF9kZWNvZGUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApICkgKSAuICdgLiBCZWZvcmUgYmFzZTY0IGRlY29kZTogYCcgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApICkgLiAnYC4nOwoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2pzb25fbGFzdF9lcnJvcicgKSApIHsKCQkgCQkkbWVzc2FnZSAuPSAnIGpzb25fbGFzdF9lcnJvcjogYCcgLiBqc29uX2xhc3RfZXJyb3IoKSAuICdgLic7CgkJIAl9CgkJIAkkZGVjb2RlRmFpbFJlYXNvbiA9ICRtZXNzYWdlOwoJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N1Y2Nlc3MgZGVjb2Rpbmcgc3VibWl0dGVkIGVuY29kZWQgZGF0YS4nICk7CgkJfQoJfQoJLy8gUmVwb3J0IGZhaWx1cmUgYW5kIGZhdGFsbHkgaGFsdC4KCWlmICggJycgIT09ICRkZWNvZGVGYWlsUmVhc29uICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCWRpZSgpOwoJfQoJCgkKfSBlbHNlIHsKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApICYmICggY291bnQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApID4gMCApICkgeyAvLyBEZWZhdWx0IHN0YXRlIG92ZXJyaWRlcyBleGlzdC4gQXBwbHkgdGhlbS4KCQkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ107Cgl9IGVsc2UgewoJCWRpZSggJ0Vycm9yICM4NDM3OTc5NDQ6IE1pc3NpbmcgZXhwZWN0ZWQgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZS4nICk7Cgl9Cn0KCgovLyBJbnN0YW50aWF0ZSByZXN0b3JlIGNsYXNzLgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL3Jlc3RvcmUucGhwJyApOwokcmVzdG9yZSA9IG5ldyBiYWNrdXBidWRkeV9yZXN0b3JlKCAncmVzdG9yZScsICRyZXN0b3JlRGF0YSApOwp1bnNldCggJHJlc3RvcmVEYXRhICk7IC8vIEFjY2VzcyB2aWEgJHJlc3RvcmUtPl9zdGF0ZSB0byBtYWtlIHN1cmUgaXQgaXMgYWx3YXlzIHVwIHRvIGRhdGUuCmlmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBXZSBkb250IGFjY2VwdCBzdWJtaXR0ZWQgZm9ybSBvcHRpb25zIGR1cmluZyBkZXBsb3kuCglpZiAoICEgaXNfYXJyYXkoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVN0ZXBzJ10gKSApIHsgLy8gU2tpcCBwYXJzZSBvcHRpb25zIGlmIG5vdCBjaHVua2luZy4KCQkkcmVzdG9yZS0+X3N0YXRlID0gcGFyc2Vfb3B0aW9ucyggJHJlc3RvcmUtPl9zdGF0ZSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vdCByZXN1bWluZzsgcGFyc2luZyBvcHRpb25zLicgKTsKCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdW1pbmc7IHNraXBwaW5nIG9wdGlvbnMgcGFyc2UuJyApOwoJfQp9CgovKgplY2hvICc8cHJlPic7CnByaW50X3IoICRyZXN0b3JlLT5fc3RhdGUgKTsKZWNobyAnPC9wcmU+JzsKKi8KCi8vIFBhcnNlIHN1Ym1pdHRlZCBvcHRpb25zL3NldHRpbmdzLgpmdW5jdGlvbiBwYXJzZV9vcHRpb25zKCAkcmVzdG9yZURhdGEgKSB7CglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdtaWdyYXRlRGF0YWJhc2UnICkgKSB7ICRyZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlRGF0YWJhc2UnXSA9IHRydWU7IH0gZWxzZSB7ICRyZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlRGF0YWJhc2UnXSA9IGZhbHNlOyB9CglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdtaWdyYXRlRGF0YWJhc2VCcnV0ZUZvcmNlJyApICkgeyAkcmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZURhdGFiYXNlQnJ1dGVGb3JjZSddID0gdHJ1ZTsgfSBlbHNlIHsgJHJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnXSA9IGZhbHNlOyB9CgoJJHJlc3RvcmVEYXRhWydzaXRldXJsJ10gPSBwcmVnX3JlcGxhY2UoICd8LyokfCcsICcnLCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdzaXRldXJsJyApICk7IC8vIFN0cmlwIHRyYWlsaW5nIHNsYXNoZXMuCgkkcmVzdG9yZURhdGFbJ2hvbWV1cmwnXSA9IHByZWdfcmVwbGFjZSggJ3wvKiR8JywgJycsIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2hvbWV1cmwnICkgKTsgLy8gU3RyaXAgdHJhaWxpbmcgc2xhc2hlcy4KCWlmICggKCAnb24nICE9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2N1c3RvbUhvbWVFbmFibGVkJyApICkgfHwgKCAnJyA9PSAkcmVzdG9yZURhdGFbJ2hvbWV1cmwnXSApICkgeyAvLyBIb21lIHVybCB3YXMgYmxhbmsgT1IgdGhleSBkaWQgbm90IGNoZWNrIHRvIGN1c3RvbWl6ZSB0aGUgaG9tZSB1cmwgc28ganVzdCBzZXQgaXQgdG8gc2l0ZXVybC4KCQkkcmVzdG9yZURhdGFbJ2hvbWV1cmwnXSA9ICRyZXN0b3JlRGF0YVsnc2l0ZXVybCddOwoJfQoJJHJlc3RvcmVEYXRhWydtYXhFeGVjdXRpb25UaW1lJ10gPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdtYXhfZXhlY3V0aW9uX3RpbWUnICk7CgkKCXJldHVybiAkcmVzdG9yZURhdGE7Cn0KCgovLyBJZiBkZXBsb3ltZW50IGFuZCBubyB0YWJsZXMgaW1wb3J0ZWQgdGhlbiBza2lwIG1pZ3JhdGlvbi4KcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU1FMIGZpbGVzIGltcG9ydGVkOiAnIC4gY291bnQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXSApIC4gJzsgRGVwbG95PzogJyAuIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICk7CmlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgewoJaWYgKCAwID09IGNvdW50KCAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXBsb3kgbW9kZSBhbmQgbm8gU1FMIGZpbGVzIGltcG9ydGVkIHNvIHNraXBwaW5nIGRhdGFiYXNlIG1pZ3JhdGlvbiBzdGVwLicgKTsKCQkkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZSddID0gZmFsc2U7CgkJCgkJZmluYWxBY3Rpb25zKCAkcmVzdG9yZSApOwoJCSRuZXh0U3RlcE51bSA9IDY7CgkJZWNobyAnPCEtLSBBVVRPUFJPQ0VFRCBUTyBTVEVQICcgLiAkbmV4dFN0ZXBOdW0gLiAnIC0tPic7Cgl9IGVsc2UgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlcGxveSBtb2RlIGJ1dCBTUUwgZmlsZXMgaW1wb3J0ZWQgKGAnIC4gY291bnQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXSApIC4gJ2AgdG90YWwpIHNvIG5vdCBza2lwcGluZyBkYXRhYmFzZSBtaWdyYXRpb24gc3RlcC4nICk7Cgl9Cn0KCgppZiAoIFRSVUUgIT09ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZURhdGFiYXNlJ10gKSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGluZyBtaWdyYXRpb24gb2YgZGF0YWJhc2UgYmFzZWQgb24gYWR2YW5jZWQgc2V0dGluZ3MuJyApOwoJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICdkYXRhYmFzZU1pZ3JhdGlvblNraXBwZWQnICk7PC9zY3JpcHQ+IjsKCSRtaWdyYXRlUmVzdWx0cyA9IHRydWU7Cn0gZWxzZSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBkYXRhYmFzZSBtaWdyYXRpb24gcHJvY2VkdXJlcy4nICk7CgkKCS8vIENvbm5lY3QgSW1wb3J0QnVkZHkgdG8gdGhlIGRhdGFiYXNlLgoJJHJlc3RvcmUtPmNvbm5lY3REYXRhYmFzZSgpOwoJCgkkb3ZlcnJpZGVQcmVmaXggPSAnJzsKCWlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgewoJCSRvdmVycmlkZVByZWZpeCA9ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndGVtcFByZWZpeCddOwoJfQoJCglyZXF1aXJlX29uY2UoICdpbXBvcnRidWRkeS9jbGFzc2VzL19taWdyYXRlX2RhdGFiYXNlLnBocCcgKTsKCSRtaWdyYXRlID0gbmV3IGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiggJ3N0YW5kYWxvbmUnLCAkcmVzdG9yZS0+X3N0YXRlLCAkbmV0d29ya1ByZWZpeCA9ICcnLCAkb3ZlcnJpZGVQcmVmaXggKTsKCSRtaWdyYXRlUmVzdWx0cyA9ICRtaWdyYXRlLT5taWdyYXRlKCk7CgkKCQoJCglpZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCQlpZiAoIGlzX2FycmF5KCAkbWlncmF0ZVJlc3VsdHMgKSApIHsgLy8gUmV0dXJuIHRvIHNhbWUgc3RlcCBmb3IgY29udGludWluZyBjaHVua2luZy4KCQkJJG5leHRTdGVwTnVtID0gNTsKCQl9IGVsc2UgewoJCQkvL2Vycm9yX2xvZyggJ1NUQVRFOiAnIC4gcHJpbnRfciggJHJlc3RvcmUtPl9zdGF0ZSwgdHJ1ZSApICk7CgkJCS8vIERvbid0IGF0dGVtcHQgdG8gc3dhcCBvdXQgYmFja3VwYnVkZHkgc2V0dGluZ3MgZnJvbSBvcHRpb25zIHRhYmxlIGlmIG9wdGlvbnMgdGFibGUgd2Fzbid0IHB1bGxlZC4KCQkJaWYgKCBpc3NldCggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0J11bJ3RhYmxlc19zaXplcyddICkgJiYgKCAhIGlzc2V0KCAkcmVzdG9yZS0+X3N0YXRlWydkYXQnXVsndGFibGVzX3NpemVzJ11bICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddWydkYl9wcmVmaXgnXSAuICdvcHRpb25zJyBdICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09wdGlvbnMgdGFibGUgd2FzIG5vdCBiYWNrZWQgdXAuIFNraXBwaW5nIHN3YXAgb3V0IG9mIEJhY2t1cEJ1ZGR5IHNldHRpbmdzLicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09wdGlvbnMgdGFibGUgd2FzIGJhY2tlZCB1cC4gU3dhcHBpbmcgb3V0IG9mIEJhY2t1cEJ1ZGR5IHNldHRpbmdzLicgKTsKCQkJCWlmICggdHJ1ZSAhPT0gJHJlc3RvcmUtPnN3YXBEYXRhYmFzZUJCU2V0dGluZ3MoKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyOTIzNzM6IFVuYWJsZSB0byBzd2FwIG91dCBCYWNrdXBCdWRkeSBzZXR0aW5ncy4gVGhpcyBtYXkgbm90IGJlIGEgZmF0YWwgZXJyb3IuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBzd2FwcGluZyBCYWNrdXBCdWRkeSBzZXR0aW5ncy4nICk7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFN3YXAgb3V0IG5ldyBhbmQgb2xkIGRhdGFiYXNlIHByZWZpeGVzLgoJCQlpZiAoIHRydWUgIT09ICRyZXN0b3JlLT5zd2FwRGF0YWJhc2VzKCkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg0Mzc4OiBVbmFibGUgdG8gc3dhcCBvdXQgdGVtcG9yYXJ5IGRhdGFiYXNlIHByZWZpeGVzLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdoYWx0U2NyaXB0JywgJycgKTsgLy8gSGFsdCBKUyBvbiBwYWdlLgoJCQkJcmV0dXJuOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3dhcHBpbmcgZGF0YWJhc2UgYmFzZWQgb24gdGVtcG9yYXJ5IGFuZCBsaXZlIHByZWZpeGVzLicgKTsKCQkJfQoJCQkKCQkJZmluYWxBY3Rpb25zKCAkcmVzdG9yZSApOwoJCQkkbmV4dFN0ZXBOdW0gPSA2OwoJCX0KCQllY2hvICc8IS0tIEFVVE9QUk9DRUVEIFRPIFNURVAgJyAuICRuZXh0U3RlcE51bSAuICcgLS0+JzsKCQkKCX0gZWxzZSB7IC8vIFN0YW5kYXJkIGltcG9ydCAobm90IGRlcGxveSkKCQkKCQlpZiAoIFRSVUUgPT09ICRtaWdyYXRlUmVzdWx0cyApIHsgLy8gQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIGNvbXBsZXRlZC4nICk7CgkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZGF0YWJhc2VNaWdyYXRpb25TdWNjZXNzJyApOzwvc2NyaXB0PiI7CgkJfSBlbHNlaWYgKCBpc19hcnJheSggJG1pZ3JhdGVSZXN1bHRzICkgKSB7IC8vIENodW5raW5nLgoJCQkkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVTdGVwcyddID0gKGFycmF5KSRtaWdyYXRlUmVzdWx0c1swXTsKCQkJJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSA9ICRtaWdyYXRlUmVzdWx0c1sxXTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIGRpZCBub3QgZnVsbHkgY29tcGxldGUgaW4gZmlyc3QgcGFzcy4gQ2h1bmtpbmcgaW4gcHJvZ3Jlc3MuIFJlc3VtaW5nIHdoZXJlIGxlZnQgb2ZmLicgKTsKCQkJPz4KCQkJPGZvcm0gaWQ9Im1pZ3JhdGVDaHVua0Zvcm0iIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI/YWpheD01Ij4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiB2YWx1ZT0iPD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCB1cmxlbmNvZGUoIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApOyA/PiI+CgkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXRGb3JtIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IiB2YWx1ZT0iTmV4dCBTdGVwIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCQk8L2Zvcm0+CgkJCTxzY3JpcHQ+CgkJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCQkJCWpRdWVyeSggJyNtaWdyYXRlQ2h1bmtGb3JtJyApLnN1Ym1pdCgpOwoJCQkJfSk7CgkJCTwvc2NyaXB0PgoJCQk8P3BocAoJCX0gZWxzZSB7IC8vIEZhaWxlZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIGZhaWxlZC4gUmVzdWx0OiBgJyAuICRtaWdyYXRlUmVzdWx0cyAuICdgLicgKTsKCQkJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICdkYXRhYmFzZU1pZ3JhdGlvbkZhaWxlZCcgKTs8L3NjcmlwdD4iOwoJCX0KCQkKCX0KfQoKCgppZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCQoJLy8gV3JpdGUgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMuCglnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CgkkaW1wb3J0RmlsZVNlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkaW1wb3J0YnVkZHlfZmlsZSApOwoJJHN0YXRlX2ZpbGUgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0RmlsZVNlcmlhbCAuICctc3RhdGUucGhwJzsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyaXRpbmcgdG8gc3RhdGUgZmlsZSBgJyAuICRzdGF0ZV9maWxlIC4gJ2AuJyApOwoJaWYgKCBmYWxzZSA9PT0gKCAkZmlsZV9oYW5kbGUgPSBAZm9wZW4oICRzdGF0ZV9maWxlLCAndycgKSApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMzI4OTM3OiBUZW1wIHN0YXRlIGZpbGUgaXMgbm90IGNyZWF0YWJsZS93cml0YWJsZS4gQ2hlY2sgeW91ciBwZXJtaXNzaW9ucy4gKCcgLiAkc3RhdGVfZmlsZSAuICcpJyApOwoJCXJldHVybiBmYWxzZTsKCX0KCWlmICggZmFsc2UgPT09IGZ3cml0ZSggJGZpbGVfaGFuZGxlLCAiPD9waHAgZGllKCdBY2Nlc3MgRGVuaWVkLicpOyAvLyA8IS0tID8+XG4iIC4gYmFzZTY0X2VuY29kZSggc2VyaWFsaXplKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMjM4OTM3MzogVW5hYmxlIHRvIHdyaXRlIHRvIHN0YXRlIGZpbGUuJyApOwoJfSBlbHNlIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcm90ZSB0byBzdGF0ZSBmaWxlLicgKTsKCX0KCWZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkKCWlmICggNiA9PSAkbmV4dFN0ZXBOdW0gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGVwbG95bWVudCBmaW5pc2hlZCAoaW1wb3J0YnVkZHkpLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGVwbG95RmluaXNoZWQnLCAnRmluaXNoZWQuJyApOwoJfSBlbHNlIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaHVua2luZyBkYXRhYmFzZSBtaWdyYXRpb24gc28gYWJvdXQgdG8gcnVuIHN0ZXAgYCcgLiAkbmV4dFN0ZXBOdW0gLiAnYC4nICk7Cgl9Cgk/PgoJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTw/cGhwIGVjaG8gJG5leHRTdGVwTnVtOyA/PiZ2PTw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd2JyApOyA/PiZkZXBsb3k9dHJ1ZSZkaXJlY3Rpb249PD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RpcmVjdGlvbicgKTsgPz4mZGlzcGxheV9tb2RlPWVtYmVkIiBpZD0iZGVwbG95LWF1dG9Qcm9jZWVkIj4KCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZXN0b3JlRGF0YSIgdmFsdWU9Ijw/cGhwIGVjaG8gYmFzZTY0X2VuY29kZSggdXJsZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKTsgPz4iPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im15LXN1Ym1pdCIgdmFsdWU9Ik5leHQgU3RlcCIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiPgoJPC9mb3JtPgoJPHNjcmlwdD5zZXRUaW1lb3V0KCBmdW5jdGlvbigpeyBqUXVlcnkoICcjZGVwbG95LWF1dG9Qcm9jZWVkJyApLnN1Ym1pdCgpOyB9LCAzMDAwICk7PC9zY3JpcHQ+Cgk8P3BocAoJcmV0dXJuOwoJCn0gZWxzZSB7IC8vIFN0YW5kYXJkIGltcG9ydAoJCgkvLyBTdWNjZXNzIChvciBtaWdyYXRlIHdhcyBza2lwcGVkKS4KCWlmICggdHJ1ZSA9PT0gJG1pZ3JhdGVSZXN1bHRzICkgewoJCQoJCWZpbmFsQWN0aW9ucyggJHJlc3RvcmUgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hpbmcgc3RlcCA1LicgKTsKCQllY2hvICI8c2NyaXB0PgoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7CgkJCXBhZ2VUaXRsZSggJ1N0ZXAgNjogVmVyaWZ5IFNpdGUgJiBGaW5pc2gnICk7CgkJCWJiX3Nob3dTdGVwKCAnY2xlYW51cFNldHRpbmdzJywgIiAuIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgLiAiICk7CgkJfSwgMjAwMCApOwoJCTwvc2NyaXB0PiI7CgkJCgl9Cgp9CgoKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ19pZnJhbWVfZm9vdGVyJyk7Cgo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/5.php,importbuddy/controllers/ajax/5.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/6.php,importbuddy/controllers/ajax/6.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2hlYWRlcicpOwpwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA2OiBDbGVhbnVwICYgQ29tcGxldGlvbicgKTs8L3NjcmlwdD4iOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAnY2xlYW51cFNldHRpbmdzJyApOzwvc2NyaXB0PiI7CnBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoKCgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsgLy8gZGVwbG95bWVudCBtb2RlIHByZS1sb2FkcyBzdGF0ZSBkYXRhIGluIGEgZmlsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgdmlhIHBvc3QuCgkvLyBQYXJzZSBzdWJtaXR0ZWQgcmVzdG9yZURhdGEgcmVzdG9yZSBzdGF0ZSBmcm9tIHByZXZpb3VzIHN0ZXAuCgkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKTsKCQoJCgkvLyBEZWNvZGUgc3VibWl0dGVkIGRhdGEsIHJlcG9ydGluZyBkZXRhaWxzIG9uIGZhaWx1cmUuCgkkZGVjb2RlRmFpbFJlYXNvbiA9ICcnOwoJaWYgKCBmYWxzZSA9PT0gKCAkcmVzdG9yZURhdGEgPSBiYXNlNjRfZGVjb2RlKCAkcmVzdG9yZURhdGEgKSApICkgeyAvLyBmYWxzZSBpZiBmYWlsZWQKCQkkZGVjb2RlRmFpbFJlYXNvbiA9ICdFUlJPUiAjODM4OTNiOiBSZXN0b3JlIGhhbHRlZC4gVW5hYmxlIHRvIGJhc2U2NF9kZWNvZGUoKSBzdWJtaXR0ZWQgZm9ybSBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuJzsKCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJJHJlc3RvcmVEYXRhID0gdXJsZGVjb2RlKCAkcmVzdG9yZURhdGEgKTsKCQlpZiAoIG51bGwgPT09ICggJHJlc3RvcmVEYXRhID0ganNvbl9kZWNvZGUoICRyZXN0b3JlRGF0YSwgdHJ1ZSApICkgKSB7IC8vIG51bGwgaWYgZmFpbGVkCgkJCSRtZXNzYWdlID0gJ0VSUk9SICM4Mzg5M2M6IFJlc3RvcmUgaGFsdGVkLiBVbmFibGUgdG8gZGVjb2RlIEpTT04gcmVzdG9yZSBiYXNlNjQgZGVjb2RlZCBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCBiYXNlNjRfZGVjb2RlKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApICkgLiAnYC4gQmVmb3JlIGJhc2U2NCBkZWNvZGU6IGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKSApIC4gJ2AuJzsKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdqc29uX2xhc3RfZXJyb3InICkgKSB7CgkJIAkJJG1lc3NhZ2UgLj0gJyBqc29uX2xhc3RfZXJyb3I6IGAnIC4ganNvbl9sYXN0X2Vycm9yKCkgLiAnYC4nOwoJCSAJfQoJCSAJJGRlY29kZUZhaWxSZWFzb24gPSAkbWVzc2FnZTsKCQl9IGVsc2UgeyAvLyBTdWNjZXNzLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdWNjZXNzIGRlY29kaW5nIHN1Ym1pdHRlZCBlbmNvZGVkIGRhdGEuJyApOwoJCX0KCX0KCS8vIFJlcG9ydCBmYWlsdXJlIGFuZCBmYXRhbGx5IGhhbHQuCglpZiAoICcnICE9PSAkZGVjb2RlRmFpbFJlYXNvbiApIHsKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICRtZXNzYWdlICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQlkaWUoKTsKCX0KCQoJCn0gZWxzZSB7CglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSA+IDAgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMgZXhpc3QuIEFwcGx5IHRoZW0uCgkJJHJlc3RvcmVEYXRhID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddOwoJCQoJCS8qCgkJZWNobyAnPHByZT4nOwoJCXByaW50X3IoICRyZXN0b3JlRGF0YSApOwoJCWVjaG8gJzwvcHJlPic7CgkJKi8KCX0gZWxzZSB7CgkJZGllKCAnRXJyb3IgIzMyNzgzMjE6IE1pc3NpbmcgZXhwZWN0ZWQgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZS4nICk7Cgl9Cn0KCgovLyBJbnN0YW50aWF0ZSByZXN0b3JlIGNsYXNzLgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL3Jlc3RvcmUucGhwJyApOwokcmVzdG9yZSA9IG5ldyBiYWNrdXBidWRkeV9yZXN0b3JlKCAncmVzdG9yZScsICRyZXN0b3JlRGF0YSApOwp1bnNldCggJHJlc3RvcmVEYXRhICk7IC8vIEFjY2VzcyB2aWEgJHJlc3RvcmUtPl9zdGF0ZSB0byBtYWtlIHN1cmUgaXQgaXMgYWx3YXlzIHVwIHRvIGRhdGUuCmlmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBXZSBkb250IGFjY2VwdCBzdWJtaXR0ZWQgZm9ybSBvcHRpb25zIGR1cmluZyBkZXBsb3kuCgkkcmVzdG9yZS0+X3N0YXRlID0gcGFyc2Vfb3B0aW9ucyggJHJlc3RvcmUtPl9zdGF0ZSApOwp9IGVsc2UgeyAvLyBEZXBsb3ltZW50IHNob3VsZCBzbGVlcCB0byBoZWxwIGdpdmUgdGltZSBmb3IgdGhlIHNvdXJjZSBzaXRlIHRvIGdyYWIgdGhlIGxhc3Qgc3RhdHVzIGxvZy4KCXNsZWVwKCA1ICk7Cn0KCiRmb290ZXIgPSBmaWxlX2dldF9jb250ZW50cyggcGJfYmFja3VwYnVkZHk6OiRfcGx1Z2luX3BhdGggLiAnL3ZpZXdzL19pZnJhbWVfZm9vdGVyLnBocCcgKTsKCmlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgewoJZWNobyAnPGg1PkZpbmlzaGVkIGRlcGxveWluZyBwdXNoZWQgZGF0YSAmIHRlbXBvcmFyeSBmaWxlIGNsZWFudXAuPC9oNT4nOwp9CmVjaG8gIjxzY3JpcHQ+YmJfc2hvd1N0ZXAoICdmaW5pc2hlZCcsICIgLiBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApIC4gIiApOzwvc2NyaXB0PiI7CgoKCi8vIFJlcGxhY2VzIHNsZWVwaW5nIDYgc2Vjb25kcy4gTW9yZSByZWxpYWJsZSBidXQgdXNlcyBsb3RzIG9mIENQVS4KJHN0b3BfdGltZV9saW1pdCA9IDY7CnBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JlZ2dpbmluZyBgJyAuICRzdG9wX3RpbWVfbGltaXQgLiAnYCBzZWNvbmQgc2xlZXAgd2hpbGUgZmlsZXMgZGVsZXRlLicgKTsKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCB0cnVlICk7CiR0ID0gMDsgLy8gVGltZSA9IDA7CndoaWxlKCAkdCA8ICRzdG9wX3RpbWVfbGltaXQgKSB7Cgkkbm93ID0gdGltZSgpOwoJd2hpbGUgKCB0aW1lKCkgPCAoICRub3cgKyAxICkgKSB7IHRydWU7IH0KCSR0Kys7Cn0KCgoKCmNsZWFudXAoICRyZXN0b3JlLT5fc3RhdGUsICRyZXN0b3JlICk7CgplY2hvICRmb290ZXI7IC8vIFdlIG11c3QgcHJlbG9hZCB0aGUgZm9vdGVyIGZpbGUgY29udGVudHMgc2luY2Ugd2UgYXJlIGFib3V0IHRvIGRlbGV0ZSBpdC4KCgoKLy8gUGFyc2Ugc3VibWl0dGVkIG9wdGlvbnMvc2V0dGluZ3MuCmZ1bmN0aW9uIHBhcnNlX29wdGlvbnMoICRyZXN0b3JlRGF0YSApIHsKCQoJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZGVsZXRlX2JhY2t1cCcgKSApIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlQXJjaGl2ZSddID0gdHJ1ZTsKCX0gZWxzZSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUFyY2hpdmUnXSA9IGZhbHNlOwoJfQoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdkZWxldGVfdGVtcCcgKSApIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlVGVtcEZpbGVzJ10gPSB0cnVlOwoJfSBlbHNlIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlVGVtcEZpbGVzJ10gPSBmYWxzZTsKCX0KCQoJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZGVsZXRlX2ltcG9ydGJ1ZGR5JyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRCdWRkeSddID0gdHJ1ZTsKCX0gZWxzZSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydEJ1ZGR5J10gPSBmYWxzZTsKCX0KCQoJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZGVsZXRlX2ltcG9ydGJ1ZGR5X2RpcmVjdG9yeScgKSApIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0QnVkZHlEaXJlY3RvcnknXSA9IHRydWU7Cgl9IGVsc2UgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRCdWRkeURpcmVjdG9yeSddID0gZmFsc2U7Cgl9CgkKCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2RlbGV0ZV9pbXBvcnRidWRkeWxvZycgKSApIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0TG9nJ10gPSB0cnVlOwoJfSBlbHNlIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0TG9nJ10gPSBmYWxzZTsKCX0KCQoJLy8gU2VhcmNoIGVuZ2luZSB2aXNpYmlsaXR5IChzZXRfYmxvZ19wdWJsaWMgd3Bfb3B0aW9ucykuCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdzZXRfYmxvZ19wdWJsaWMnICkgKSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ3NldF9ibG9nX3B1YmxpYyddID0gdHJ1ZTsKCQllcnJvcl9sb2coJzk5OXllcycgKTsKCX0gZWxzZWlmICggJzAnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3NldF9ibG9nX3B1YmxpYycgKSApIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnc2V0X2Jsb2dfcHVibGljJ10gPSBmYWxzZTsKCQllcnJvcl9sb2coJzk5OW5vcGUnICk7Cgl9CgkKCXJldHVybiAkcmVzdG9yZURhdGE7Cn0KCgoKLyoJY2xlYW51cCgpCiAqCQogKglDbGVhbnMgdXAgYW55IHRlbXBvcmFyeSBmaWxlcyBsZWZ0IGJ5IGltcG9ydGJ1ZGR5LgogKgkKICoJQHJldHVybgkJbnVsbAogKi8KZnVuY3Rpb24gY2xlYW51cCggJHJlc3RvcmVEYXRhLCAkcmVzdG9yZSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIGltcG9ydGJ1ZGR5IGNsZWFudXAgcHJvY2VkdXJlcy4nICk7CgkKCWlmICggJycgIT09ICRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydzZXRfYmxvZ19wdWJsaWMnXSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGFuZ2luZyBibG9nX3B1YmxpYyBzZWFyY2ggZW5naW5lIHZpc2liaWxpdHkgYmFzZWQgb24gc2VsZWN0ZWQgc2V0dGluZy4nICk7CgkJJHJlc3RvcmUtPnNldEJsb2dQdWJsaWMoICRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydzZXRfYmxvZ19wdWJsaWMnXSApOwoJfSBlbHNlIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdObyBjaGFuZ2UgdG8gYmxvZ19wdWJsaWMgc2VhcmNoIGVuZ2luZSB2aXNpYmlsaXR5IGJhc2VkIG9uIHNlbGVjdGVkIHNldHRpbmcuJyApOwoJfQoJCglpZiAoIHRydWUgIT09ICRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVBcmNoaXZlJ10gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBlZCBkZWxldGluZyBiYWNrdXAgYXJjaGl2ZS4nICk7Cgl9IGVsc2UgewoJCXJlbW92ZV9maWxlKCAkcmVzdG9yZURhdGFbJ2FyY2hpdmUnXSwgJ2JhY2t1cCAuWklQIGZpbGUgKCcgLiAkcmVzdG9yZURhdGFbJ2FyY2hpdmUnXSAuICcpJywgdHJ1ZSApOwoJfQoJCglpZiAoIHRydWUgIT09ICRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVUZW1wRmlsZXMnXSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGVkIGRlbGV0aW5nIHRlbXBvcmFyeSBmaWxlcy4nICk7Cgl9IGVsc2UgewoJCS8vIEZ1bGwgYmFja3VwIC5zcWwgZmlsZQoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ3dwLWNvbnRlbnQvdXBsb2Fkcy90ZW1wXycuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLicvZGIuc3FsJywgJ2RiLnNxbCAoYmFja3VwIGRhdGFiYXNlIGR1bXApJywgZmFsc2UgKTsKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvdGVtcF8nLiAkcmVzdG9yZURhdGFbJ3NlcmlhbCddIC4nL2RiXzEuc3FsJywgJ2RiXzEuc3FsIChiYWNrdXAgZGF0YWJhc2UgZHVtcCknLCBmYWxzZSApOwoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLicvZGJfMS5zcWwnLCAnZGJfMS5zcWwgKGJhY2t1cCBkYXRhYmFzZSBkdW1wKScsIGZhbHNlICk7CgkJLy8gREIgb25seSBzcWwgZmlsZQoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ2RiLnNxbCcsICdkYi5zcWwgKGJhY2t1cCBkYXRhYmFzZSBkdW1wKScsIGZhbHNlICk7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnZGJfMS5zcWwnLCAnZGJfMS5zcWwgKGJhY2t1cCBkYXRhYmFzZSBkdW1wKScsIGZhbHNlICk7CgkJCgkJLy8gRnVsbCBiYWNrdXAgZGF0IGZpbGUKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvdGVtcF8nIC4gJHJlc3RvcmVEYXRhWydzZXJpYWwnXSAuICcvYmFja3VwYnVkZHlfZGF0LnBocCcsICdiYWNrdXBidWRkeV9kYXQucGhwIChiYWNrdXAgZGF0YSBmaWxlKScsIGZhbHNlICk7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLiAnL2JhY2t1cGJ1ZGR5X2RhdC5waHAnLCAnYmFja3VwYnVkZHlfZGF0LnBocCAoYmFja3VwIGRhdGEgZmlsZSknLCBmYWxzZSApOwoJCS8vIERCIG9ubHkgZGF0IGZpbGUKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICdiYWNrdXBidWRkeV9kYXQucGhwJywgJ2JhY2t1cGJ1ZGR5X2RhdC5waHAgKGJhY2t1cCBkYXRhIGZpbGUpJywgZmFsc2UgKTsKCQkKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHJlc3RvcmVEYXRhWydzZXJpYWwnXSAuICcvJywgJ1RlbXBvcmFyeSBiYWNrdXAgZGlyZWN0b3J5JywgZmFsc2UgKTsKCQkKCQkvLyBUZW1wIHJlc3RvcmUgZGlyLgoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L3RlbXBfJy4gJHJlc3RvcmVEYXRhWydzZXJpYWwnXSAuJy8nLCAnVGVtcG9yYXJ5IHJlc3RvcmUgZGlyZWN0b3J5JywgZmFsc2UgKTsKCQkKCQkvLyBSZW1vdmUgc3RhdGUgZmlsZSAoZGVwbG95bWVudC9kZWZhdWx0IHNldHRpbmdzKS4KCQlnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CgkJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCQkkc3RhdGVfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRGaWxlU2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJCXJlbW92ZV9maWxlKCAkc3RhdGVfZmlsZSwgJ0RlZmF1bHQgc3RhdGUgZGF0YSBmaWxlJywgZmFsc2UgKTsKCX0KCQoJZ2xvYmFsICRpbXBvcnRidWRkeV9maWxlOwoJaWYgKCB0cnVlICE9PSAkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0QnVkZHknXSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGVkIGRlbGV0aW5nICcgLiAkaW1wb3J0YnVkZHlfZmlsZSAuICcgKHRoaXMgc2NyaXB0KS4nICk7Cgl9IGVsc2UgewoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJGltcG9ydGJ1ZGR5X2ZpbGUsICRpbXBvcnRidWRkeV9maWxlIC4gJyAodGhpcyBzY3JpcHQpJywgdHJ1ZSApOwoJfQoJCglpZiAoIHRydWUgIT09ICRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRCdWRkeURpcmVjdG9yeSddICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwZWQgZGVsZXRpbmcgaW1wb3J0YnVkZHkgZGlyZWN0b3J5LicgKTsKCX0gZWxzZSB7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvJywgJ0ltcG9ydEJ1ZGR5IERpcmVjdG9yeScsIHRydWUgKTsKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICdpbXBvcnRidWRkeS9fc2V0dGluZ3NfZGF0LnBocCcsICdfc2V0dGluZ3NfZGF0LnBocCAodGVtcG9yYXJ5IHNldHRpbmdzIGZpbGUpJywgZmFsc2UgKTsKCX0KCQoJLy8gRGVsZXRlIGxvZyBmaWxlIGxhc3QuCglpZiAoIHRydWUgIT09ICRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRMb2cnXSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGVkIGRlbGV0aW5nIGltcG9ydCBsb2cgKGRlbGV0ZUltcG9ydEJ1ZGR5RGlyZWN0b3J5IG1heSBvdmVycmlkZSkuJyApOwoJfSBlbHNlIHsKCQlyZW1vdmVfZmlsZSggJ2ltcG9ydGJ1ZGR5LScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JywgJ2ltcG9ydGJ1ZGR5LScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0IGxvZyBmaWxlJywgdHJ1ZSApOwoJfQp9CgoKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2JhY2t1cGJ1ZGR5X21pbGVzdG9uZScsICdmaW5pc2hfaW1wb3J0YnVkZHknICk7CgoKLy8gVXNlZCBieSBjbGVhbnVwKCkgYWJvdmUuCmZ1bmN0aW9uIHJlbW92ZV9maWxlKCAkZmlsZSwgJGRlc2NyaXB0aW9uLCAkZXJyb3Jfb25fbWlzc2luZyA9IGZhbHNlICkgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGVsZXRpbmcgYCcgLiAkZGVzY3JpcHRpb24gLiAnYC4uLicgKTsKCglAY2htb2QoICRmaWxlLCAwNzU1ICk7IC8vIEhpZ2ggcGVybWlzc2lvbnMgdG8gZGVsZXRlLgoJCglpZiAoIGlzX2RpciggJGZpbGUgKSApIHsgLy8gZGlyZWN0b3J5LgoJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJGZpbGUgKTsKCQlpZiAoIGZpbGVfZXhpc3RzKCAkZmlsZSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3Rvcnk6IGAnIC4gJGRlc2NyaXB0aW9uIC4gJ2AuIFlvdSBzaG91bGQgbWFudWFsbHkgZGVsZXRlIGl0LicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdEZWxldGVkLicsIGZhbHNlICk7IC8vIE5vIGxvZ2dpbmcgb2YgdGhpcyBhY3Rpb24gdG8gcHJldmVudCByZWNyZWF0aW5nIGxvZy4KCQl9Cgl9IGVsc2UgeyAvLyBmaWxlCgkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGUgKSApIHsKCQkJaWYgKCB0cnVlICE9PSBAdW5saW5rKCAkZmlsZSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBkZWxldGUgZmlsZTogYCcgLiAkZGVzY3JpcHRpb24gLiAnYC4gWW91IHNob3VsZCBtYW51YWxseSBkZWxldGUgaXQuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGVsZXRlZC4nLCBmYWxzZSApOyAvLyBObyBsb2dnaW5nIG9mIHRoaXMgYWN0aW9uIHRvIHByZXZlbnQgcmVjcmVhdGluZyBsb2cuCgkJCX0KCQl9Cgl9Cn0gLy8gRW5kIHJlbW92ZV9maWxlKCkuCgoKCmRpZSgpOyAvLyBEb24ndCB3YW50IHRvIGFjY2lkZW50bHkgZ28gYmFjayB0byBhbnkgZmlsZXMgd2hpY2ggbWF5IGJlIGdvbmUuCgo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/6.php,importbuddy/controllers/ajax/6.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/_stats.php,importbuddy/controllers/ajax/_stats.php PD9waHAKLy8gQW5vbnltaXplZCBzdGF0cyBvbiB2ZXJzaW9uIGFkb3B0aW9uLgoKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CmlmICggKCAhIGlzc2V0KCAkaW5fcGFnZSApICkgfHwgKCB0cnVlICE9PSAkaW5fcGFnZSApICkgewoJcmV0dXJuOwp9CmVycm9yX3JlcG9ydGluZygwKTsKCmlmICggZGF0ZSggJ1knICkgPj0gMjAxOCApIHsKCUB1bmxpbmsoIF9fRklMRV9fICk7CglyZXR1cm47Cn0KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICdjdXJsX3ZlcnNpb24nICkgKSB7CglyZXR1cm47Cn0KCiRzaW1wbGVWZXJzaW9uID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ107CmlmICggc3RycG9zKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSwgJyAnICkgPiAwICkgewoJJHNpbXBsZVZlcnNpb24gPSBzdWJzdHIoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLCAwLCBzdHJwb3MoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLCAnICcgKSApOwp9Cgokc291cmNlVHlwZSA9ICd1JzsKJGRlc3RpbmF0aW9uVHlwZSA9ICd1JzsKCmZ1bmN0aW9uIGdldF9ob3N0X3R5cGUoICRob3N0ICkgewoJaWYgKCBGQUxTRSA9PT0gc3Ryc3RyKCAkaG9zdCwgJy4nICkgKSB7IC8vIE5vIHBlcmlvZCBpbiBob3N0bmFtZS9JUC4KCQkkdHlwZSA9ICdsJzsKCX0gZWxzZWlmICggJzEyNy4wLjAuMScgPT0gJGhvc3QgKSB7CgkJJHR5cGUgPSAnbCc7Cgl9IGVsc2VpZiAoICcuZGV2JyA9PSBzdHJ0b2xvd2VyKCBzdWJzdHIoICRob3N0LCAtNCApICkgKSB7CgkJJHR5cGUgPSAnbCc7Cgl9IGVsc2UgewoJCSR0eXBlID0ncCc7Cgl9CgkKCXJldHVybiAkdHlwZTsKfQoKJGlzUmVzdG9yZSA9ICctMSc7CiRwYXJzZWRVUkwgPSBwYXJzZV91cmwoIHNpdGVfdXJsKCkgKTsKJGhvc3QgPSAkcGFyc2VkVVJMWydob3N0J107CiRoYXNoID0gbWQ1KCBzaXRlX3VybCgpICk7CmlmICggaXNzZXQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddICkgJiYgaXNzZXQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddWydzaXRldXJsJ10gKSApIHsKCSRzb3VyY2VUeXBlID0gZ2V0X2hvc3RfdHlwZSggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0J11bJ3NpdGV1cmwnXSApOwoJJGlzUmVzdG9yZSA9ICcwJzsKCQoJLy8gRGV0ZXJtaW5lIGlmIHJlc3RvcmUuCgkkZGVzdFBhcnNlZCA9IHBhcnNlX3VybCggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0J11bJ3NpdGV1cmwnXSApOwoJaWYgKCAhIGlzc2V0KCAkcGFyc2VkVVJMWydwYXRoJ10gKSApIHsgJHBhcnNlZFVSTFsncGF0aCddID0gJyc7IH0KCWlmICggISBpc3NldCggJGRlc3RQYXJzZWRbJ3BhdGgnXSApICkgeyAkZGVzdFBhcnNlZFsncGF0aCddID0gJyc7IH0KCWlmICggKCAkcGFyc2VkVVJMWydob3N0J10gLiBydHJpbSggJHBhcnNlZFVSTFsncGF0aCddLCAnLycgKSApID09ICggJGRlc3RQYXJzZWRbJ2hvc3QnXSAuIHJ0cmltKCAkZGVzdFBhcnNlZFsncGF0aCddLCAnLycgICkgKSApIHsKCQkkaXNSZXN0b3JlID0gJzEnOwoJfQoJCn0KJGRlc3RpbmF0aW9uVHlwZSA9IGdldF9ob3N0X3R5cGUoICRob3N0ICk7CgokemlwU2l6ZSA9IC0xOwppZiAoIGlzc2V0KCAkcmVzdG9yZS0+X3N0YXRlWydhcmNoaXZlJ10gKSAmJiAoIEBmaWxlX2V4aXN0cyggJHJlc3RvcmUtPl9zdGF0ZVsnYXJjaGl2ZSddICkgKSApIHsKCWlmICggZmFsc2UgIT09ICggJGZpbGVTaXplID0gQGZpbGVzaXplKCAkcmVzdG9yZS0+X3N0YXRlWydhcmNoaXZlJ10gKSApICkgewoJCSR6aXBTaXplID0gcm91bmQoICRmaWxlU2l6ZSAvICgxMDI0KjEwMjQpLCAwICk7IC8vIEluIEtCLCByb3VuZGVkIHdpdGggMCBkZWNpbWFscy4KCX0KfQoKJGJhY2t1cFR5cGUgPSAndSc7CmlmICggaXNzZXQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddICkgJiYgaXNzZXQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBfdHlwZSddICkgKSB7CgkkYmFja3VwVHlwZSA9ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBfdHlwZSddOwp9CgokYmFja3VwQWdlID0gLTE7CmlmICggaXNzZXQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddICkgJiYgaXNzZXQoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBfdGltZSddICkgJiYgKCAkcmVzdG9yZS0+X3N0YXRlWydkYXQnXVsnYmFja3VwX3RpbWUnXSA+IDAgKSApIHsKCSRiYWNrdXBBZ2UgPSByb3VuZCggKCB0aW1lKCkgLSAkcmVzdG9yZS0+X3N0YXRlWydkYXQnXVsnYmFja3VwX3RpbWUnXSApIC8gKCA2MCo2MCoyNCApLCAwICk7IC8vIERheXMgb2xkLiBSb3VuZGVkIG9mZiB0byBjbG9zZXN0IGRheSBhbW91bnQuCglpZiAoICRiYWNrdXBBZ2UgPCAwICkgeyAvLyBTaG91bGQgbm90IGhhcHBlbi4gYmFkIHRpbWUgc29tZXdoZXJlPwoJCSRiYWNrdXBBZ2UgPSAtMTsKCX0KfQoKZnVuY3Rpb24gZ2V0X2NsaWVudF9oYXNoKCkgewogICAgJGNsaWVudCA9ICcnOwogICAgaWYgKGdldGVudignSFRUUF9DTElFTlRfSVAnKSkKICAgICAgICAkY2xpZW50ID0gZ2V0ZW52KCdIVFRQX0NMSUVOVF9JUCcpOwogICAgZWxzZSBpZihnZXRlbnYoJ0hUVFBfWF9GT1JXQVJERURfRk9SJykpCiAgICAgICAgJGNsaWVudCA9IGdldGVudignSFRUUF9YX0ZPUldBUkRFRF9GT1InKTsKICAgIGVsc2UgaWYoZ2V0ZW52KCdIVFRQX1hfRk9SV0FSREVEJykpCiAgICAgICAgJGNsaWVudCA9IGdldGVudignSFRUUF9YX0ZPUldBUkRFRCcpOwogICAgZWxzZSBpZihnZXRlbnYoJ0hUVFBfRk9SV0FSREVEX0ZPUicpKQogICAgICAgICRjbGllbnQgPSBnZXRlbnYoJ0hUVFBfRk9SV0FSREVEX0ZPUicpOwogICAgZWxzZSBpZihnZXRlbnYoJ0hUVFBfRk9SV0FSREVEJykpCiAgICAgICAkY2xpZW50ID0gZ2V0ZW52KCdIVFRQX0ZPUldBUkRFRCcpOwogICAgZWxzZSBpZihnZXRlbnYoJ1JFTU9URV9BRERSJykpCiAgICAgICAgJGNsaWVudCA9IGdldGVudignUkVNT1RFX0FERFInKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gJyc7CiAgICByZXR1cm4gbWQ1KCAkY2xpZW50ICk7Cn0KCi8vIEFsbCBkYXRhIGFub255bWl6ZWQgYW5kIHJvdW5kZWQgZm9yIHByaXZhY3kuCiR1cmwgPSAnaHR0cDovL2Jic3RhdHMuZHVzdGluYm9sdG9uLmNvbS8/aD0nIC4gJGhhc2ggLiAnJnY9JyAuICRzaW1wbGVWZXJzaW9uIC4gJyZzPScgLiAkc291cmNlVHlwZSAuICcmZD0nIC4gJGRlc3RpbmF0aW9uVHlwZSAuICcmcj0nIC4gJGlzUmVzdG9yZSAuICcmZj0nIC4gJGRlcGxveU1vZGVPbiAuICcmej0nIC4gJHppcFNpemUgLiAnJnQ9JyAuICRiYWNrdXBUeXBlIC4gJyZhPScgLiAkYmFja3VwQWdlIC4gJyZjPScgLiBnZXRfY2xpZW50X2hhc2goKTsKJG9wdGlvbnMgPSBhcnJheSgKCUNVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gdHJ1ZSwKCUNVUkxPUFRfSEVBREVSICAgICAgICAgPT4gZmFsc2UsCglDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IHRydWUsCglDVVJMT1BUX0VOQ09ESU5HICAgICAgID0+ICIiLAoJQ1VSTE9QVF9VU0VSQUdFTlQgICAgICA9PiAiSW1wb3J0QnVkZHkiLAoJQ1VSTE9QVF9BVVRPUkVGRVJFUiAgICA9PiB0cnVlLAoJQ1VSTE9QVF9DT05ORUNUVElNRU9VVCA9PiAzLAoJQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiAzLAoJQ1VSTE9QVF9NQVhSRURJUlMgICAgICA9PiAzLAopOwoKJGNoID0gQGN1cmxfaW5pdCggJHVybCApOwpAY3VybF9zZXRvcHRfYXJyYXkoICRjaCwgJG9wdGlvbnMgKTsKQGN1cmxfZXhlYyggJGNoICk7CkBjdXJsX2Nsb3NlKCAkY2ggKTsK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/_stats.php,importbuddy/controllers/ajax/_stats.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/cpanel_createdb.php,importbuddy/controllers/ajax/cpanel_createdb.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgpBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoKLy9wcmludF9yKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoKSApOwoKJGNwYW5lbF91c2VyID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3VzZXInICk7CiRjcGFuZWxfcGFzc3dvcmQgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfcGFzcycgKTsKJGNwYW5lbF9ob3N0ID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3VybCcgKTsKJGNwYW5lbF9wb3J0ID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3BvcnQnICk7CiRjcGFuZWxfcHJvdG9jb2wgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfcHJvdG9jb2wnICk7CiRkYl9uYW1lID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX2RibmFtZScgKTsKJGRiX3VzZXIgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfZGJ1c2VyJyApOwokZGJfcGFzcyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2NwYW5lbF9kYnBhc3MnICk7CgovLyBOZWVkZWQgZm9yIEhUVFAgcmVxdWVzdHMuCiRyZXF1ZXN0Y29yZV9maWxlID0gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9yZXF1ZXN0Y29yZS9yZXF1ZXN0Y29yZS5jbGFzcy5waHAnOwpyZXF1aXJlX29uY2UoICRyZXF1ZXN0Y29yZV9maWxlICk7CgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvY3BhbmVsL2NwYW5lbC5waHAnICk7CiRjcmVhdGVfZGJfcmVzdWx0ID0gcGJfYmFja3VwYnVkZHlfY3BhbmVsOjpjcmVhdGVfZGIoICRjcGFuZWxfdXNlciwgJGNwYW5lbF9wYXNzd29yZCwgJGNwYW5lbF9ob3N0LCAkZGJfbmFtZSwgJGRiX3VzZXIsICRkYl9wYXNzLCAkY3BhbmVsX3BvcnQsICRjcGFuZWxfcHJvdG9jb2wgKTsKCmlmICggJGNyZWF0ZV9kYl9yZXN1bHQgPT09IHRydWUgKSB7CgllY2hvICdTdWNjZXNzISBDcmVhdGVkIGRhdGFiYXNlLCB1c2VyLCBhbmQgYXNzaWduZWQgdXNlciB0byBkYXRhYmFzZS4nOwp9IGVsc2UgewoJZWNobyAiVW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGRhdGFiYXNlIHdpdGggdGhlIHByb3ZpZGVkIHNldHRpbmdzLiBDaGVjayBzZXR0aW5ncyBvciBtYW51YWxseSBjcmVhdGUgdGhlIGRhdGFiYXNlIGZyb20geW91ciBob3N0J3MgY29udHJvbCBwYW5lbC4gU2VlIHR1dG9yaWFsIGF0OiAiOwoJZWNobyAiaHR0cDovL2l0aGVtZXMuY29tL3R1dG9yaWFsLWNyZWF0ZS1kYXRhYmFzZS1pbi1jcGFuZWwvXG5cbiI7CgllY2hvICJFcnJvciBkZXRhaWxzOlxuIiAuIGltcGxvZGUoICJcbiIsICRjcmVhdGVfZGJfcmVzdWx0KTsKfQoKZGllKCk7Cg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/cpanel_createdb.php,importbuddy/controllers/ajax/cpanel_createdb.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/create_admin.php,importbuddy/controllers/ajax/create_admin.php PD9waHAKZGllKCAnPGh0bWw+PC9odG1sPicgKTsgLy8gRElTQUJMRUQuCgpBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgppZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWxvYWQucGhwJyApICkgewoJb2Jfc3RhcnQoICdvYl9lcnJvcl9oYW5kbGVyJyApOyAvL1N1cHByZXNzIGVycm9ycwoJcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ3dwLWxvYWQucGhwJyApOwoJb2JfZW5kX2NsZWFuKCk7Cn0gZWxzZSB7CglkaWUoICdVbmFibGUgdG8gZmluZCBXb3JkUHJlc3MgZmlsZXMgdG8gbG9hZCAod3AtbG9hZC5waHApLiBWZXJpZnkgeW91ciBXb3JkUHJlc3Mgc2l0ZSBpcyBmdW5jdGlvbmFsIGFuZCBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLicgKTsKfQoKJHVzZXIgPSBnZXRfdXNlcl9ieSggJ2xvZ2luJywgJHNlYXJjaF9zdHJpbmcgKTsKaWYgKCAkdXNlciApIGRpZSgganNvbl9lbmNvZGUoICR1c2VyICkgKTsK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/create_admin.php,importbuddy/controllers/ajax/create_admin.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/file_hash.php,importbuddy/controllers/ajax/file_hash.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgokZmlsZSA9IEFCU1BBVEggLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlJyApOwoKaWYgKCAnJyA9PSAkZmlsZSApIHsKCWRpZSggJ05vIGZpbGUgcGFzc2VkLicgKTsKfQppZiAoICEgZmlsZV9leGlzdHMoICRmaWxlICkgKSB7CglkaWUoICdGaWxlIG5vdCBmb3VuZC4nICk7Cn0KCiRmaWxlSGFzaCA9IEBtZDVfZmlsZSggJGZpbGUgKTsKCmlmICggZmFsc2UgPT09ICRmaWxlSGFzaCApIHsKCWRpZSggJ1VuYWJsZSB0byBjYWxjdWxhdGUgaGFzaC4gVmVyaWZ5IGZpbGUgcGVybWlzc2lvbnMuJyApOwp9IGVsc2UgewoJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdoYXNoJyA9PiAkZmlsZUhhc2ggKSApICk7Cn0= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/file_hash.php,importbuddy/controllers/ajax/file_hash.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/getDeployLog.php,importbuddy/controllers/ajax/getDeployLog.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCWRpZSggJ0FjY2VzcyBkZW5pZWQuJyApOwp9CgovLyBPbmx5IGFsbG93IGFjY2VzcyB0byB0aGlzIGZpbGUgaWYgaXQgaGFzIGEgc2VyaWFsIGhpZGluZyBpdC4gVXNlZCBieSBkZXBsb3ltZW50LgpnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CiRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRpbXBvcnRidWRkeV9maWxlICk7CmlmICggJycgPT0gJGltcG9ydEZpbGVTZXJpYWwgKSB7CglkaWUoICdBY2Nlc3MgZGVuaWVkLicgKTsKfQoKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnKioqIEVuZCBJbXBvcnRCdWRkeSBMb2cgc2VjdGlvbicgKTsKCi8vIExvZyB0byBtYWtlIGEgY29weSBvZiByZXRyaWV2ZWQgZGVwbG95IGluZm8gaW50by4KJGxvZ19kaXJlY3RvcnkgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsKJGJhY2t1cF9sb2dfZmlsZSA9ICRsb2dfZGlyZWN0b3J5IC4gJ3N0YXR1cy1kZXBsb3ljb3B5LScgLiAkaW1wb3J0RmlsZVNlcmlhbCAuICcudHh0JzsKCiRzdGF0dXNfbGluZXMgPSBwYl9iYWNrdXBidWRkeTo6Z2V0X3N0YXR1cyggJycsIHRydWUsIGZhbHNlLCB0cnVlLCAkYmFja3VwX2xvZ19maWxlICk7IC8vIENsZWFyIGZpbGUsIGRvbnQgdW5saW5rIGZpbGUsIHN1cHJlc3Mgc3RhdHVzIHJldHJpZXZhbCBtc2csIGJhY2t1cCBpbnRvICRsb2dfZmlsZQplY2hvIGltcGxvZGUoICcnLCAkc3RhdHVzX2xpbmVzICk7Cg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/getDeployLog.php,importbuddy/controllers/ajax/getDeployLog.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/hash_forgotpass.php,importbuddy/controllers/ajax/hash_forgotpass.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgppZiAoICcnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ25ld3Bhc3N3b3JkJyApICkgewoJZGllKCAnRXJyb3IgIzg0OTM0ODk6IE1pc3NpbmcgcGFzc3dvcmQuJyApOwp9CgpkaWUoIG1kNSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbmV3cGFzc3dvcmQnICkgKSApOw== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/hash_forgotpass.php,importbuddy/controllers/ajax/hash_forgotpass.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/index.php,importbuddy/controllers/ajax/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/index.php,importbuddy/controllers/ajax/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/mysql_test.php,importbuddy/controllers/ajax/mysql_test.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgovLyBJbmNsdWRlIHRoZSBEQiBUZXN0cyBjbGFzcyBhbmQgaW5pdCBpdC4KcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvdGVzdC1kYi5waHAnICk7CiRpbXBvcnRidWRkeV90ZXN0X2RiID0gbmV3IGltcG9ydGJ1ZGR5X3Rlc3RfZGIoKTsK ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/mysql_test.php,importbuddy/controllers/ajax/mysql_test.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/create_admin.php,importbuddy/controllers/pages/create_admin.php PD9waHAKZGllKCk7CgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApIHx8ICggdHJ1ZSAhPT0gUEJfSU1QT1JUQlVERFkgKSApIHsKCWRpZSggJzxodG1sPjwvaHRtbD4nICk7Cn0KCkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgo/Pgo8ZGl2IGlkPSJwYl9jcmVhdGVhZG1pbl9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGhlaWdodDogOTAlOyI+CgkJPGRpdiBjbGFzcz0ibW9kYWwiPgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQkJPGgyPlNlcnZlciBJbmZvcm1hdGlvbjwvaDI+CgkJCTwvZGl2PgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQoJCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJCQkJCWpRdWVyeSggJyNjcmVhdGVhZG1pbl9mb3JtJyApLnN1Ym1pdChmdW5jdGlvbigpewoJCQkJCQkJCgkJCQkJCQlqUXVlcnkoICcuY3JlYXRlYWRtaW5fbG9hZGluZycgKS5zaG93KCk7CgkJCQkJCQlqUXVlcnkucG9zdCgnaW1wb3J0YnVkZHkucGhwP2FqYXg9Y3JlYXRlX2FkbWluJywKCQkJCQkJCQlqUXVlcnkoICcjY3JlYXRlYWRtaW5fZm9ybScgKS5zZXJpYWxpemUoKSwgZnVuY3Rpb24oZGF0YSkgewoJCQkJCQkJCQkKCQkJCQkJCQkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgkJCQkJCQkJCWpRdWVyeSggJy5jcmVhdGVhZG1pbl9sb2FkaW5nJyApLmhpZGUoKTsKCQkJCQkJCQkJCgkJCQkJCQkJCWlmICggZGF0YSA9PSAnMScgKSB7CgkJCQkJCQkJCQlhbGVydCggJ1N1Y2Nlc3MnICk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQlhbGVydCggJ0Vycm9yOiAnICsgZGF0YSApOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCX0KCQkJCQkJCSk7CgkJCQkJCQkKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQoJCQkJCQl9KTsKCQkJCQl9KTsKCQkJCTwvc2NyaXB0PgoJCQkJCgkJCQk8Zm9ybSBpZD0iY3JlYXRlYWRtaW5fZm9ybSI+CgkJCQkJVXNlcm5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VybmFtZSI+CgkJCQkJRW1haWw6IDxpbnB1dCB0eXBlPSJlbWFpbCIgbmFtZT0iZW1haWwiPgoJCQkJCVBhc3N3b3JkOiA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIj4KCQkJCQlDb25maXJtIFBhc3N3b3JkOiA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkX2NvbmZpcm0iPgoJCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkNyZWF0ZSBBZG1pbiBVc2VyIiBjbGFzcz0iYnV0dG9uIj4KCQkJCQk8c3BhbiBjbGFzcz0iY3JlYXRlYWRtaW5fbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7Ij48L3NwYW4+CgkJCQk8L2Zvcm0+CgkJCQkKCQkJCQoJCTwvZGl2PgoJPC9kaXY+CjwvZGl2Pgo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/create_admin.php,importbuddy/controllers/pages/create_admin.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/dbreplace.php,importbuddy/controllers/pages/dbreplace.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgoKJGRhdGEgPSBhcnJheSgpOwpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnZGJyZXBsYWNlJywgJGRhdGEgKTsKPz48c2NyaXB0PmpRdWVyeSggJyNwYWdlVGl0bGUnICkuaHRtbCggJ0RhdGFiYXNlIFRleHQgUmVwbGFjZScgKTs8L3NjcmlwdD4= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/dbreplace.php,importbuddy/controllers/pages/dbreplace.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/default.php,importbuddy/controllers/pages/default.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgoKCi8qKioqKiogQkVHSU4gQVVUSEVOVElDQVRJT04gKioqKiovCi8vcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvYXV0aC5waHAnICk7CkF1dGg6OmNoZWNrKCk7CmlmICggKCB0cnVlID09PSBBdXRoOjppc19hdXRoZW50aWNhdGVkKCkgKSAmJiAoICdsb2dpbicgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnYWN0aW9uJyApICkgKSB7IC8vIE9uIHN1Y2Nlc3NmdWwgbG9naW4gdG8gc3RlcCAwLCByZWRpcmVjdCB0byBzdGVwIDEuCgloZWFkZXIoICdMb2NhdGlvbjogJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpICk7Cn0KLyoqKioqKiBFTkQgQVVUSEVOVElDQVRJT04gKioqKiovCgoKCiRtb2RlID0gJ2h0bWwnOwoKCgovLyBSZWdpc3RlciBQSFAgc2h1dGRvd24gZnVuY3Rpb24gdG8gaGVscCBjYXRjaCBhbmQgbG9nIGZhdGFsIFBIUCBlcnJvcnMgZHVyaW5nIGJhY2t1cC4KcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oICdzaHV0ZG93bl9mdW5jdGlvbicgKTsKLy9lcnJvcl9yZXBvcnRpbmcoIEVfRVJST1IgfCBFX1dBUk5JTkcgfCBFX1BBUlNFIHwgRV9OT1RJQ0UgKTsgLy8gSElHSAoKLyoJc2h1dGRvd25fZnVuY3Rpb24oKQogKgkKICoJVXNlZCBmb3IgY2F0Y2hpbmcgZmF0YWwgUEhQIGVycm9ycyBkdXJpbmcgYmFja3VwIHRvIHdyaXRlIHRvIGxvZyBmb3IgZGVidWdnaW5nLgogKgkKICoJQHJldHVybgkJbnVsbAogKi8KZnVuY3Rpb24gc2h1dGRvd25fZnVuY3Rpb24oKSB7CgkKCQoJLy8gR2V0IGVycm9yIG1lc3NhZ2UuCgkvLyBFcnJvciB0eXBlczogaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Vycm9yZnVuYy5jb25zdGFudHMucGhwCgkkZSA9IGVycm9yX2dldF9sYXN0KCk7CglpZiAoICRlID09PSBOVUxMICkgeyAvLyBObyBlcnJvciBvZiBhbnkga2luZC4KCQlyZXR1cm47Cgl9IGVsc2UgeyAvLyBTb21lIHR5cGUgb2YgZXJyb3IuCgkJaWYgKCAhaXNfYXJyYXkoICRlICkgfHwgKCAkZVsndHlwZSddICE9IEVfRVJST1IgKSAmJiAoICRlWyd0eXBlJ10gIT0gRV9VU0VSX0VSUk9SICkgKSB7IC8vIFJldHVybiBpZiBub3QgYSBmYXRhbCBlcnJvci4KCQkJLy9lY2hvICc8IS0tICcgLiBwcmludF9yKCAkZSwgdHJ1ZSApIC4gJyAtLT4nIC4gIlxuIjsKCQkJcmV0dXJuOwoJCX0KCX0KCQoJCgkvLyBDYWxjdWxhdGUgbG9nIGRpcmVjdG9yeS4KCSRsb2dfZGlyZWN0b3J5ID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCk7IC8vIEFsc28gaGFuZGxlIHdoZW4gaW4gaW1wb3J0YnVkZHkuCgkkbWFpbl9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnbG9nLScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQoJCgkvLyBEZXRlcm1pbmUgaWYgd3JpdGluZyB0byBhIHNlcmlhbCBsb2cuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5OjokX3N0YXR1c19zZXJpYWwgIT0gJycgKSB7CgkJJHNlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjokX3N0YXR1c19zZXJpYWw7CgkJJHNlcmlhbF9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLScgLiAkc2VyaWFsIC4gJ18nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJJHdyaXRlX3NlcmlhbCA9IHRydWU7Cgl9IGVsc2UgewoJCSR3cml0ZV9zZXJpYWwgPSBmYWxzZTsKCX0KCQoJCgkvLyBGb3JtYXQgZXJyb3IgbWVzc2FnZS4KCSRlX3N0cmluZyA9ICctLS0tLSBGQVRBTCBFUlJPUiAtLS0tLSBBIGZhdGFsIFBIUCBlcnJvciB3YXMgZW5jb3VudGVyZWQ6ICc7Cglmb3JlYWNoKCAoYXJyYXkpJGUgYXMgJGVfbGluZV90aXRsZSA9PiAkZV9saW5lICkgewoJCSRlX3N0cmluZyAuPSAkZV9saW5lX3RpdGxlIC4gJyA9PiAnIC4gJGVfbGluZSAuICI7ICI7Cgl9CgkkZV9zdHJpbmcgPSBydHJpbSggJGVfc3RyaW5nLCAnOyAnICkgLiAnLic7CgkKCS8vIFdyaXRlIHRvIGxvZy4KCUBmaWxlX3B1dF9jb250ZW50cyggJG1haW5fZmlsZSwgJGVfc3RyaW5nLCBGSUxFX0FQUEVORCApOwoJCgkvLyBJTVBPUlRCVUREWQoJJHN0YXR1cyA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCB0aW1lKCkgKSAuICJcdCIgLgoJCQkJc3ByaW50ZiggIiUwMS4yZiIsIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSwgMiApICkgLiAiXHQiIC4KCQkJCXNwcmludGYoICIlMDEuMmYiLCByb3VuZCggbWVtb3J5X2dldF9wZWFrX3VzYWdlKCkgLyAxMDQ4NTc2LCAyICkgKSAuICJcdCIgLgoJCQkJJ2Vycm9yJyAuICJcdFx0IiAuCgkJCQlzdHJfcmVwbGFjZSggY2hyKDkpLCAnICAgJywgJGVfc3RyaW5nICkKCQkJOwoJJHN0YXR1cyA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsICRzdGF0dXMgKTsKCWVjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5wYl9zdGF0dXNfYXBwZW5kKCInIC4gc3RyX3JlcGxhY2UoICciJywgJyZxdW90OycsICRzdGF0dXMgKSAuICciKTs8L3NjcmlwdD4nOwoJCn0gLy8gRW5kIHNodXRkb3duX2Z1bmN0aW9uLgoKCgoKLy8gSGFuZGxlIEFKQVguCgokYWpheCA9ICcnOwppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2FqYXgnICkgIT0gJycgKSB7CgkkYWpheCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2FqYXgnICk7Cn0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdhamF4JyApICE9ICcnICkgewoJJGFqYXggPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2FqYXgnICk7Cn0KaWYgKCAkYWpheCAhPSAnJyApIHsgLy8gQUpBWAoJaWYgKCAkYWpheCAhPSAnaGFzaF9mb3Jnb3RwYXNzJyApIHsKCQlBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoJfQoJCgkkcGFnZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvYWpheC8nIC4gJGFqYXggLiAnLnBocCc7CglpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZSApICkgewoJCXJlcXVpcmVfb25jZSggJHBhZ2UgKTsKCX0gZWxzZSB7CgkJZWNobyAne0Vycm9yOiBJbnZhbGlkIEFKQVggYWN0aW9uIGAnIC4gaHRtbGVudGl0aWVzKCAkYWpheCApIC4gJ2AgRmlsZSBub3QgZm91bmQ6IGAnIC4gJHBhZ2UgLiAnYC59JzsKCX0KCXJldHVybjsKCQp9CgoKLy8gRGV0ZXJtaW5lIHBhZ2UgdG8gbG9hZC4KCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYWdlJyApICE9ICcnICkgeyAvLyBOYW1lZCBwYWdlLgoJCglBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoJCgkkcGFnZVNsdWcgPSBzdHJfcmVwbGFjZSggYXJyYXkoICdcXCcsICcvJyApLCAnJywgcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYWdlJyApICk7CglpZiAoICEgY3R5cGVfYWxudW0oIHN0cl9yZXBsYWNlKCBhcnJheSggJy0nLCAnXycgKSwgJycsICRwYWdlU2x1ZyApICkgKSB7IC8vIERpc2FsbG93IG5vbi1hbHBoYW51bWVyaWMgZXhjZXB0IGRhc2gsIHVuZGVyc2NvcmUuCgkJZGllKCAnRXJyb3IgIzg1NzQ3ODMzLiBQYWdlIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gT25seSBhbHBoYW51bWVyaWMsIGRhc2hlcywgYW5kIHVuZGVyc2NvcmVzIHBlcm1pdHRlZC4nICk7Cgl9IAoJCgkkcGFnZUZpbGUgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NvbnRyb2xsZXJzL3BhZ2VzLycgLiAkcGFnZVNsdWcgLiAnLnBocCc7CglpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZUZpbGUgKSApIHsKCQllY2hvICc8IS0tIFN0YXJ0aW5nIHBhZ2UgJyAuICRwYWdlU2x1ZyAuICcuIC0tPic7CgkJcmVxdWlyZV9vbmNlKCAkcGFnZUZpbGUgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBwYWdlICcgLiAkcGFnZVNsdWcgLiAnLicgKTsKCX0gZWxzZSB7CgkJZWNobyAne0Vycm9yOiBJbnZhbGlkIHBhZ2UgYCcgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc3RlcCcgKSApIC4gJy5waHAnIC4gJ2AufSc7Cgl9CglyZXR1cm47CgkKfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3N0ZXAnICkgIT0gJycgKSB7IC8vIE51bWVyaWNhbCBzdGVwLgoJCglpZiAoIHRydWUgIT09IEF1dGg6OmlzX2F1dGhlbnRpY2F0ZWQoKSApIHsgLy8gSWYgbm90IGxvZ2dlZCBpbiB0aGVuIHByb3ZpZGUgbG9naW4gcGFnZS4KCQkkc3RlcCA9ICdsb2dpbic7Cgl9IGVsc2UgewoJCSRzdGVwID0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdzdGVwJyApOwoJCUF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgl9CgkKfSBlbHNlIHsgLy8gVW5rbm93bi4gRGVmYXVsdCB0byBsb2dpbi4KCWlmICggdHJ1ZSAhPT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgeyAvLyBJZiBub3QgbG9nZ2VkIGluIHRoZW4gcHJvdmlkZSBsb2dpbiBwYWdlLgoJCSRzdGVwID0gJ2xvZ2luJzsKCX0gZWxzZSB7CgkJJHN0ZXAgPSAnaG9tZUJhY2t1cFNlbGVjdCc7Cgl9Cn0KCiRzdGVwRmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvcGFnZXMvJyAuICRzdGVwIC4gJy5waHAnOwokc3RlcCA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc3RlcCcgKTsKcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L3ZpZXdzL19oZWFkZXIucGhwJyApOwplY2hvICc8IS0tIFN0YXJ0aW5nIHN0ZXAgZmlsZSBgJyAuIGJhc2VuYW1lKCAkc3RlcEZpbGUgKSAuICdgLiAtLT4nOwoKLyppZiAoICRzdGVwID4gMCApIHsgLy8gTG9hZCBzdGVwcyBhZnRlciAwIGluIGlmcmFtZS4KCWVjaG8gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydpbXBvcnQnXS0+c3RhdHVzX2JveCggJ0ltcG9ydEJ1ZGR5IHYnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10gLiAnLi4uIFBvd2VyZWQgYnkgQmFja3VwQnVkZHkuJyApOwoJZWNobyAnPGlmcmFtZSBpZD0icGJfYmFja3VwYnVkZHlfbW9kYWxfaWZyYW1lIiBuYW1lPSJwYl9iYWNrdXBidWRkeV9tb2RhbF9pZnJhbWUiIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJ2ltcG9ydGJ1ZGR5LnBocD9hamF4PScgLiAkc3RlcCAuICciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjE4MDAiIGZyYW1lYm9yZGVyPSIwIiBwYWRkaW5nPSIwIiBtYXJnaW49IjAiPkVycm9yICM0NTg0NTk0NTc5LiBCcm93c2VyIG5vdCBjb21wYXRpYmxlIHdpdGggaWZyYW1lcy48L2lmcmFtZT4nOwp9IGVsc2UgewoJKi8KCWlmICggZmlsZV9leGlzdHMoICRzdGVwRmlsZSApICkgewoJCXJlcXVpcmVfb25jZSggJHN0ZXBGaWxlICk7Cgl9IGVsc2UgewoJCWVjaG8gJ3tFcnJvcjogSW52YWxpZCBzdGVwIGZpbGUgYCcgLiBodG1sZW50aXRpZXMoICRzdGVwICkgLiAnLnBocCcgLiAnYC59JzsKCX0KLy99CnBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIHN0ZXAuJyApOwpyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvdmlld3MvX2Zvb3Rlci5waHAnICk7CgpyZXR1cm47Cgo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/default.php,importbuddy/controllers/pages/default.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/homeBackupSelect.php,importbuddy/controllers/pages/homeBackupSelect.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgoKLy8gT24gaW5pdGlhbCBsb2dpbiB0byBTdGVwIDEgKGNoZWNrcyBmb3IgcGFzc3dvcmQgZmllbGQgZnJvbSBhdXRoIGZvcm0pIHJlc2V0IGFueSBkYW5nbGluZyBkZWZhdWx0cyBmcm9tIGEgcGFydGlhbCByZXN0b3JlLgppZiAoICggdHJ1ZSA9PT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYXNzd29yZCcgKSAhPSAnJyApICkgewoJcGJfYmFja3VwYnVkZHk6OnJlc2V0X2RlZmF1bHRzKCk7Cn0KCgovLyBIYW5kbGUgc21hbGwgc2l6ZSBQSFAgdXBsb2FkIGxpbWl0IGtub2NraW5nIG9mZiBhdXRoZW50aWNhdGlvbiB3aGVuIHVwbG9hZGluZyBhIGJhY2t1cC4KaWYgKCBpc3NldCggJF9TRVJWRVJbJ0NPTlRFTlRfTEVOR1RIJ10gKSAmJiAoIGludHZhbCggJF9TRVJWRVJbJ0NPTlRFTlRfTEVOR1RIJ10gKSA+IDAgKSAmJiAoIGNvdW50KCAkX1BPU1QgKSA9PT0gMCApICkgewoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzU0ODQ1NDg1OTUuIFVuYWJsZSB0byB1cGxvYWQuIFlvdXIgUEhQIHBvc3RfbWF4X3NpemUgc2V0dGluZyBpcyB0b28gc21hbGwgc28gaXQgZGlzY2FyZGVkIFBPU1QgZGF0YS4gWW91IG1heSBoYXZlIHRvIGxvZyBiYWNrIGluLicsIHRydWUgKTsKfQp1cGxvYWQoKTsgLy8gSGFuZGxlIGFueSB1cGxvYWRpbmcgb2YgYSBiYWNrdXAgZmlsZS4KCgokZGF0YSA9IGFycmF5KCk7CgovKioKICoJdXBsb2FkKCkKICoKICoJUHJvY2Vzc2VzIHVwbG9hZGVkIGJhY2t1cCBmaWxlLgogKgogKglAcmV0dXJuCQlhcnJheQkJVHJ1ZSBvbiB1cGxvYWQgc3VjY2VzczsgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gdXBsb2FkKCkgewoJCglBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7CgkKCWlmICggaXNzZXQoICRfUE9TVFsndXBsb2FkJ10gKSAmJiAoICRfUE9TVFsndXBsb2FkJ10gPT0gJ2xvY2FsJyApICkgewoJCSRwYXRoX3BhcnRzID0gcGF0aGluZm8oICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddICk7CgkJaWYgKCAoIHN0cnRvbG93ZXIoIHN1YnN0ciggJF9GSUxFU1snZmlsZSddWyduYW1lJ10sIDAsIDYgKSApID09ICdiYWNrdXAnICkgJiYgKCBzdHJ0b2xvd2VyKCAkcGF0aF9wYXJ0c1snZXh0ZW5zaW9uJ10gKSA9PSAnemlwJyApICkgewoJCQlpZiAoIG1vdmVfdXBsb2FkZWRfZmlsZSggJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCBiYXNlbmFtZSggJF9GSUxFU1snZmlsZSddWyduYW1lJ10gKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRmlsZSBVcGxvYWRlZC4gWW91ciBiYWNrdXAgd2FzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZC4nICk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1NvcnJ5LCB0aGVyZSB3YXMgYSBwcm9ibGVtIHVwbG9hZGluZyB5b3VyIGZpbGUuJywgdHJ1ZSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnT25seSBwcm9wZXJseSBuYW1lZCBCYWNrdXBCdWRkeSB6aXAgYXJjaGl2ZXMgd2l0aCBhIHppcCBleHRlbnNpb24gbWF5IGJlIHVwbG9hZGVkLicsIHRydWUgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCQoJLy8gRE9XTkxPQUQgRklMRSBGUk9NIFNUQVNIIFRPIExPQ0FMLgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd1cGxvYWQnICkgPT0gJ3N0YXNoJyApIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCB0cnVlICk7CgkJCgkJJHJlcXVlc3Rjb3JlX2ZpbGUgPSBkaXJuYW1lKCBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgKSAuICcvbGliL3JlcXVlc3Rjb3JlL3JlcXVlc3Rjb3JlLmNsYXNzLnBocCc7CgkJcmVxdWlyZV9vbmNlKCAkcmVxdWVzdGNvcmVfZmlsZSApOwoJCQoJCSRsaW5rID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbGluaycgKTsKCQkkZGVzdGluYXRpb25fZmlsZSA9IGRpcm5hbWUoIGRpcm5hbWUoIGRpcm5hbWUoIGRpcm5hbWUoIF9fRklMRV9fICkgKSApICkgLiAnLycgLiBiYXNlbmFtZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbGluaycgKSApOwoJCSRkZXN0aW5hdGlvbl9maWxlID0gc3Vic3RyKCAkZGVzdGluYXRpb25fZmlsZSwgMCwgc3RyaXBvcyggJGRlc3RpbmF0aW9uX2ZpbGUsICcuemlwJyApICsgNCApOwoJCQoJCSRfR0VUWydmaWxlJ10gPSBiYXNlbmFtZSggJGRlc3RpbmF0aW9uX2ZpbGUgKTsKCQkKCQkkcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q29yZSggJGxpbmsgKTsKCQkkcmVxdWVzdC0+c2V0X3dyaXRlX2ZpbGUoICRkZXN0aW5hdGlvbl9maWxlICk7CgkJCgkJZWNobyAnPGRpdiBpZD0icGJfaW1wb3J0YnVkZHlfd29ya2luZyIgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij5Eb3dubG9hZGluZyBiYWNrdXAgZnJvbSBTdGFzaCB0byBgJyAuICRkZXN0aW5hdGlvbl9maWxlIC4gJ2AuLi48YnI+PGJyPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmdfbGFyZ2UuZ2lmIiB0aXRsZT0iV29ya2luZy4uLiBQbGVhc2Ugd2FpdCBhcyB0aGlzIG1heSB0YWtlIGEgbW9tZW50Li4uIj48YnI+PGJyPjwvZGl2Pic7CgkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgkJCgkJJHJlc3BvbnNlID0gJHJlcXVlc3QtPnNlbmRfcmVxdWVzdCggZmFsc2UgKTsKCQlpZiAoICRyZXNwb25zZSAhPT0gdHJ1ZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzg1NDg0NTk1OTguIFVuYWJsZSB0byBkb3dubG9hZCBmaWxlIGZyb20gU3Rhc2guIFlvdSBtYXkgbWFudWFsbHkgZG93bmxvYWQgaXQgYW5kIHVwbG9hZCB0byB0aGUgc2VydmVyIHZpYSBGVFAuJyApOwoJCX0gZWxzZSB7IC8vIE5vIGVycm9yLgoJCQlpZiAoICEgZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9maWxlICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjMzQ4NDU3NDU4NzguIFN0YXNoIHJldHVybmVkIGEgc3VjY2VzcyBidXQgdGhlIGJhY2t1cCBmaWxlIHdhcyBub3QgZm91bmQgbG9jYWxseS4gQ2hlY2sgdGhpcyBzZXJ2ZXJcJ3MgZGlyZWN0b3J5IHdyaXRlIHBlcm1pc3Npb25zLiBZb3UgbWF5IG1hbnVhbGx5IGRvd25sb2FkIGl0IGFuZCB1cGxvYWQgdG8gdGhlIHNlcnZlciB2aWEgRlRQLicgKTsKCQkJfQoJCX0KCQkKCQllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+alF1ZXJ5KCIjcGJfaW1wb3J0YnVkZHlfd29ya2luZyIpLmhpZGUoKTs8L3NjcmlwdD4nOwoJCQoJfQp9CgoKLyoqCiAqCWdldF9hcmNoaXZlc19saXN0KCkKICoKICoJUmV0dXJucyBhbiBhcnJheSBvZiBiYWNrdXAgYXJjaGl2ZSB6aXAgZmlsZW5hbWVzIGZvdW5kLgogKgogKglAcmV0dXJuCQlhcnJheQkJQXJyYXkgb2YgLnppcCBmaWxlbmFtZXM7IHBhdGggTk9UIGluY2x1ZGVkLgogKi8KZnVuY3Rpb24gZ2V0X2FyY2hpdmVzX2xpc3QoKSB7CgkKCUF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsKCQoJaWYgKCAhaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSApICkgewoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgkJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBBQlNQQVRIICk7Cgl9CgkKCS8vIExpc3QgYmFja3VwIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LgoJJGJhY2t1cF9hcmNoaXZlcyA9IGFycmF5KCk7CgkkYmFja3VwX3ppcHMgPSBnbG9iKCBBQlNQQVRIIC4gJ2JhY2t1cCouemlwJyApOwoJaWYgKCAhIGlzX2FycmF5KCAkYmFja3VwX3ppcHMgKSApIHsKCQkkYmFja3VwX3ppcHMgPSBhcnJheSgpOwoJfQoJJHNuYXBzaG90X3ppcHMgPSBnbG9iKCBBQlNQQVRIIC4gJ3NuYXBzaG90Ki56aXAnICk7CglpZiAoICEgaXNfYXJyYXkoICRzbmFwc2hvdF96aXBzICkgKSB7CgkJJHNuYXBzaG90X3ppcHMgPSBhcnJheSgpOwoJfQoJJGJhY2t1cF9hcmNoaXZlc19nbG9iID0gYXJyYXlfbWVyZ2UoICRiYWNrdXBfemlwcywgJHNuYXBzaG90X3ppcHMgKTsKCXVuc2V0KCAkYmFja3VwX3ppcHMgKTsKCXVuc2V0KCAkc25hcHNob3RfemlwcyApOwoJZm9yZWFjaCggJGJhY2t1cF9hcmNoaXZlc19nbG9iIGFzICRiYWNrdXBfYXJjaGl2ZSApIHsKCQkkY29tbWVudCA9IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXS0+Z2V0X2NvbW1lbnQoICRiYWNrdXBfYXJjaGl2ZSApOwoJCSRjb21tZW50ID0gYmFja3VwYnVkZHlfY29yZTo6bm9ybWFsaXplX2NvbW1lbnRfZGF0YSggJGNvbW1lbnQgKTsKCQkKCQkkdGhpc19hcmNoaXZlID0gYXJyYXkoCgkJCSdmaWxlJwkJPT4JCWJhc2VuYW1lKCAkYmFja3VwX2FyY2hpdmUgKSwKCQkJJ2NvbW1lbnQnCT0+CQkkY29tbWVudCwKCQkpOwoJCSRiYWNrdXBfYXJjaGl2ZXNbXSA9ICR0aGlzX2FyY2hpdmU7Cgl9Cgl1bnNldCggJGJhY2t1cF9hcmNoaXZlc19nbG9iICk7CgkKCQoJcmV0dXJuICRiYWNrdXBfYXJjaGl2ZXM7Cn0KCgovKiBwcmVmbGlnaHRTY2FuKCkKICoKICogQ2hlY2tzIGZvciBwb3RlbnRpYWwgcHJvYmxlbXMgYmVmb3JlIGdldHRpbmcgc3RhcnRlZC4KICogQHJldHVybiBhcnJheSBvZiBwb3RlbnRpYWwgcHJvYmxlbXMuIEtleSBpcyBhIHVuaXF1ZSBzbHVnIHRvIHRoZSBpc3N1ZSwgdmFsdWUgaXMgYSBkZXNjcmlwdGl2ZSB0ZXh0LgogKi8KZnVuY3Rpb24gcHJlZmxpZ2h0U2NhbigpIHsKCSRpc3N1ZXMgPSBhcnJheSgpOwoJCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnICkgKSB7CgkJJGlzc3Vlc1snd29yZHByZXNzX2V4aXN0cyddID0gJ1dBUk5JTkc6IEV4aXN0aW5nIFdvcmRQcmVzcyBpbnN0YWxsYXRpb24gZm91bmQuIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgZXhpc3RpbmcgV29yZFByZXNzIGZpbGVzIGFuZCBkYXRhYmFzZSBiZSByZW1vdmVkIHByaW9yIHRvIG1pZ3JhdGluZyBvciByZXN0b3JpbmcgdG8gYXZvaWQgY29uZmxpY3RzLiBZb3Ugc2hvdWxkIG5vdCBpbnN0YWxsIFdvcmRQcmVzcyBwcmlvciB0byBtaWdyYXRpbmcuJzsKCX0KCQoJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdwaHAuaW5pJyApICkgewoJCSRpc3N1ZXNbJ3BocF9pbmlfZXhpc3RzJ10gPSAnV0FSTklORzogRXhpc3RpbmcgcGhwLmluaSBmaWxlIGZvdW5kIHdoaWNoIGNvbmZpZ3VyZXMgY3VzdG9tIFBIUCBzZXR0aW5ncy4gSWYgeW91ciBiYWNrdXAgYWxzbyBjb250YWlucyBhIHBocC5pbmkgZmlsZSBpdCBtYXkgb3ZlcndyaXRlIHRoZSBjdXJyZW50IG9uZSwgcG9zc2libHkgcmVzdWx0aW5nIGluIGNoYW5nZXMgaW4gY29uZmlndXJhdGlvbiBvciBwcm9ibGVtcy4gTWFrZSBhIGJhY2t1cCBvZiB5b3VyIGV4aXN0aW5nIGZpbGUgaWYgeW91ciBhcmUgdW5zdXJlLic7Cgl9CgkKCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLnVzZXIuaW5pJyApICkgewoJCSRpc3N1ZXNbJ3BocF9pbmlfZXhpc3RzJ10gPSAnV0FSTklORzogRXhpc3RpbmcgLnVzZXIuaW5pIGZpbGUgZm91bmQgd2hpY2ggY29uZmlndXJlcyBjdXN0b20gUEhQIHNldHRpbmdzLiBJZiB5b3VyIGJhY2t1cCBhbHNvIGNvbnRhaW5zIGEgLnVzZXIuaW5pIGZpbGUgaXQgbWF5IG92ZXJ3cml0ZSB0aGUgY3VycmVudCBvbmUsIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBjaGFuZ2VzIGluIGNvbmZpZ3VyYXRpb24gb3IgcHJvYmxlbXMuIE1ha2UgYSBiYWNrdXAgb2YgeW91ciBleGlzdGluZyBmaWxlIGlmIHlvdXIgYXJlIHVuc3VyZS4nOwoJfQoJCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKSApIHsKCQkkaXNzdWVzWydodGFjY2Vzc19leGlzdHMnXSA9ICdXQVJOSU5HOiBFeGlzdGluZyAuaHRhY2Nlc3MgZmlsZSBmb3VuZC4gSWYgeW91ciBiYWNrdXAgYWxzbyBjb250YWlucyBhIC5odGFjY2VzcyBmaWxlIGl0IG1heSBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgb25lLCBwb3NzaWJseSByZXN1bHRpbmcgaW4gY2hhbmdlcyBpbiBjb25maWd1cmF0aW9uIG9yIHByb2JsZW1zLiBNYWtlIGEgYmFja3VwIG9mIHlvdXIgZXhpc3RpbmcgZmlsZSBpZiB5b3UgYXJlIHVuc3VyZS4nOwoJfQoJCgkvKiBUT0RPOiBNb3ZlIHRvIHBvc3QgZmxpZ2h0IHNjYW4uCglpZiAoICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnaW5kZXguaHRtJyApID09PSB0cnVlICkgfHwgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdpbmRleC5odG1sJyApID09PSB0cnVlICkgKSB7CgkJJGlzc3Vlc1snaW5kZXhfZXhpc3RzJ10gPSAnQW4gaW5kZXguaHRtKGwpIGZpbGUgZXhpc3RzIGluIHRoaXMgc2l0ZSBwYXRoLiBEZXBlbmRpbmcgb24geW91ciBzZXJ2ZXIgc2V0dXAgaXQgbWF5IHRha2UgcHJlY2VkZW5jZSBpbiBsb2FkaW5nIGluc3RlYWQgb2YgV29yZFByZXNzLiBJZiBhZnRlciByZXN0b3JlIHlvdXIgc2l0ZSBsb2FkcyBhbiB1bmV4cGVjdGVkIG9yIGJsYW5rIHBhZ2UsIHRyeSByZW5hbWluZyBvciBkZWxldGluZyB0aGUgaW5kZXguaHRtKGwpIGZpbGUocykgaW4gdGhlIHNpdGUgcm9vdCwgYCcgLiBBQlNQQVRIIC4gJ2AuJzsKCX0KCSovCgkKCS8vIExvb2sgZm9yIGRpcmVjdG9yaWVzIG5hbWVkIGFmdGVyIGEgYmFja3VwIGZpbGUgdGhhdCBjb250YWluIFdvcmRQcmVzcy4gLS0gaW1wcm9wZXJseSB1bnppcHBlZCBpbiB0aGUgd3JvbmcgbG9jYXRpb24uCgkkYmFja3VwX2RpcnMgPSBnbG9iKCBBQlNQQVRIIC4gJ2JhY2t1cC0qL3dwLWxvZ2luLnBocCcgKTsKCWlmICggISBpc19hcnJheSggJGJhY2t1cF9kaXJzICkgKSB7CgkJJGJhY2t1cF9kaXJzID0gYXJyYXkoKTsKCX0KCWlmICggY291bnQoIChhcnJheSkkYmFja3VwX2RpcnMgKSA+IDAgKSB7CgkJJGlzc3Vlc1snbWFudWFsX3VuemlwX3dyb25nX2xvY2F0aW9uJ10gPSAnQSBtYW51YWxseSB1bnppcHBlZCBiYWNrdXAgbWF5IGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIGxvY2F0aW9uKHMpLiBJZiB5b3UgbWFudWFsbHkgdW56aXBwZWQgY29uZmlybSB0aGUgZmlsZXMgd2VyZSBub3QgdW56aXBwZWQgaW50byB0aGlzIHN1YmRpcmVjdG9yeSBlbHNlIHRoZXkgd2lsbCBuZWVkIHRvIGJlIG1vdmVkIHVwIG91dCBvZiB0aGUgc3ViZGlyZWN0b3J5IGludG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGltcG9ydGJ1ZGR5LnBocC4gUG9zc2libGUgbWFudWFsbHkgdW56aXBwZWQgYmFja3VwcyBpbiBhIHN1YmRpcmVjdG9yeTogJyAuIGltcGxvZGUoICcsICcsICRiYWNrdXBfZGlycyApOwoJfQoJCglyZXR1cm4gJGlzc3VlczsKfQoKCgoKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ2hvbWUnLCAkZGF0YSApOwoKLy8gTE9HIElNUE9SVEJVRERZIFZFUlNJT04gSU5GT1JNQVRJT04KcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUnVubmluZyBJbXBvcnRCdWRkeSB2JyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddIC4gJy4nICk7Cgo/Pgo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/homeBackupSelect.php,importbuddy/controllers/pages/homeBackupSelect.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/index.php,importbuddy/controllers/pages/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/index.php,importbuddy/controllers/pages/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/login.php,importbuddy/controllers/pages/login.php PHNjcmlwdD5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcgKTs8L3NjcmlwdD4KPD9waHAKCgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgewoJZ2xvYmFsICRwYl9sb2dpbl9hdHRlbXB0czsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgcGFzc3dvcmQuIFBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgeW91IHByb3ZpZGVkIHdpdGhpbiBCYWNrdXBCdWRkeSBTZXR0aW5ncy4gQXR0ZW1wdCAjJyAuICRwYl9sb2dpbl9hdHRlbXB0cyAuICcuJyApOwoJZWNobyAnPGJyPic7Cn0KCmlmICggISBpc19jYWxsYWJsZSggJ2pzb25fZGVjb2RlJyApICkgewoJJG1lc3NhZ2UgPSAnRXJyb3IgIzg0Mzk4NDM0OiBNaXNzaW5nIHJlcXVpcmVkIFBIUCBmdW5jdGlvbiBqc29uX2RlY29kZSgpLiBZb3VyIFBIUCB2ZXJzaW9uIGlzIHRvbyBvbGQgb3IgZGFtYWdlZC4gSXQgaXMgTk9UIGNvbXBhdGlibGUgd2l0aCBXb3JkUHJlc3MgYXMgaXQgaXMuIFBsZWFzZSBjb250YWN0IHlvdXIgaG9zdCB0byBmaXggdGhpcy4nOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UsIHRydWUgKTsKfQo/PgoKPHA+RW50ZXIgeW91ciBJbXBvcnRCdWRkeSBwYXNzd29yZCBiZWxvdyB0byBiZWdpbi48L3A+Cgo8YnI+Cgo8Zm9ybSBtZXRob2Q9InBvc3QiPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ibG9naW4iPgoJPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCIgc3R5bGU9IndpZHRoOiAyNTBweDsgdmVydGljYWwtYWxpZ246IC0ycHg7Ij4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkF1dGhlbnRpY2F0ZSIgY2xhc3M9Iml0LWJ1dHRvbiI+Cgk8YnV0dG9uIGhyZWY9IiNwYl9mb3Jnb3RwYXNzd29yZF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIj5Gb3Jnb3QgUGFzc3dvcmQ/PC9idXR0b24+CjwvZm9ybT4KCgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQlqUXVlcnkoJy5sZWFuTW9kYWwnKS5sZWFuTW9kYWwoCgkJCXsgdG9wIDogNDUsIG92ZXJsYXkgOiAwLjQsIGNsb3NlQnV0dG9uOiAiLm1vZGFsX2Nsb3NlIiB9CgkJKTsKCQkKCQlqUXVlcnkoICcjY3JlYXRlcGFzc19mb3JtJyApLnN1Ym1pdChmdW5jdGlvbigpewoJCQkKCQkJaWYgKCBqUXVlcnkoICcjbmV3X3Bhc3MnICkudmFsKCkgIT0galF1ZXJ5KHRoaXMpLmZpbmQoICcjbmV3X3Bhc3NfY29uZmlybScgKS52YWwoKSApIHsKCQkJCWFsZXJ0KCAnUGFzc3dvcmQgYW5kIGNvbmZpcm1hdGlvbiBkbyBub3QgbWF0Y2guJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlpZiAoICcnID09PSBqUXVlcnkoICcjbmV3X3Bhc3MnICkudmFsKCkgKSB7CgkJCQlhbGVydCggJ1lvdSBtdXN0IHByb3ZpZGUgYSBuZXcgcGFzc3dvcmQuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlqUXVlcnkoICcuY3JlYXRlcGFzc19sb2FkaW5nJyApLnNob3coKTsKCQkJalF1ZXJ5LnBvc3QoJ2ltcG9ydGJ1ZGR5LnBocD9hamF4PWhhc2hfZm9yZ290cGFzcycsCgkJCXsKCQkJCW5ld3Bhc3N3b3JkOiBqUXVlcnkoICcjbmV3X3Bhc3MnICkudmFsKCksCgkJCX0sIGZ1bmN0aW9uKGRhdGEpIHsKCQkJCQkKCQkJCQlkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKCQkJCQlqUXVlcnkoICcuY3JlYXRlcGFzc19sb2FkaW5nJyApLmhpZGUoKTsKCQkJCQkKCQkJCQlqUXVlcnkoICcuZm9yZ290cGFzc19mb3JtX3dyYXAnICkuaGlkZSgpOwoJCQkJCWpRdWVyeSggJy5mb3Jnb3RwYXNzX2ZpbmlzaF9oYXNoJykudmFsKCBkYXRhICk7CgkJCQkJalF1ZXJ5KCAnLmZvcmdvdHBhc3NfZmluaXNoX3dyYXAnICkuc2hvdygpOwoJCQkJfQoJCQkpOwoJCQkKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9KTsKCX0pOwo8L3NjcmlwdD4KCgoKPGRpdiBpZD0icGJfZm9yZ290cGFzc3dvcmRfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+UGFzc3dvcmQgUmVzZXQ8L2gyPgoJCQlBZnRlciBzdWJtaXR0aW5nIHlvdSB3aWxsIG5lZWQgdG8gZWRpdCB5b3VyIGltcG9ydGJ1ZGR5LnBocCBmaWxlIG9uIHRoaXMgc2VydmVyIGFuZCBlZGl0IGEgbGluZSBvZiBjb2RlIHdpdGggYSBoYXNoZWQgdmVyc2lvbiBvZiB0aGlzIHBhc3N3b3JkLgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9Im1vZGFsX2NvbnRlbnQiPgoJCQkKCQkJCgkJCTxkaXYgY2xhc3M9ImZvcmdvdHBhc3NfZm9ybV93cmFwIj4KCQkJCQoJCQkJCgkJCQk8Y2VudGVyPgoJCQkJCTxmb3JtIGlkPSJjcmVhdGVwYXNzX2Zvcm0iPgoJCQkJCQk8dGFibGU+CgkJCQkJCQk8dHI+CgkJCQkJCQkJPHRkPk5ldyBQYXNzd29yZDwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0ibmV3cGFzc3dvcmQiIGlkPSJuZXdfcGFzcyI+PC90ZD4KCQkJCQkJCTwvdHI+CgkJCQkJCQk8dHI+CgkJCQkJCQkJPHRkPkNvbmZpcm0gUGFzc3dvcmQ8L3RkPjx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9Im5ld3Bhc3N3b3JkX2NvbmZpcm0iIGlkPSJuZXdfcGFzc19jb25maXJtIj48L3RkPgoJCQkJCQkJPC90cj4KCQkJCQkJPC90YWJsZT4KCQkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0IiBjbGFzcz0iYnV0dG9uLXByaW1hcnkiPgoJCQkJCTwvZm9ybT4KCQkJCQk8c3BhbiBjbGFzcz0iY3JlYXRlcGFzc19sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpOyA/Pi9pbWFnZXMvbG9hZGluZy5naWYiIGFsdD0iJyAuIF9fKCdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiPjwvc3Bhbj4KCQkJCTwvY2VudGVyPgoJCQkJCgkJCTwvZGl2PgoJCQkKCQkJCgkJCTxkaXYgY2xhc3M9ImZvcmdvdHBhc3NfZmluaXNoX3dyYXAiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQlUbyBlbmFibGUgdGhpcyBuZXcgcGFzc3dvcmQgZm9yIGFjY2Vzc2luZyBpbXBvcnRidWRkeS5waHAgb3BlbiBpbXBvcnRidWRkeS5waHAgaW4gYSB0ZXh0IGVkaXRvciBhbmQgZmluZCBsaW5lIDEzIHRoYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLCByZXBsYWNpbmcgdGhlIFgncyBpbiB0aGlzIGxpbmUgd2l0aCB0aGUgcGFzc3dvcmQgaGFzaCBjb2RlIGJlbG93LiBNYWtlIHN1cmUgeW91IHJlLXNhdmUgdGhpcyBlZGl0ZWQgdmVyc2lvbiB0byB0aGUgc2VydmVyIHRoZW4gcmVmcmVzaCB0aGlzIHBhZ2UgdG8gbG9nIGluLjxicj48YnI+CgkJCQkKCQkJCTxpPmRlZmluZSggJ1BCX1BBU1NXT1JEJywgJ1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYJyApOzwvaT48YnI+PGJyPgoJCQkJCgkJCQk8Yj5OZXcgcGFzc3dvcmQgaGFzaCBjb2RlOjwvYj48YnI+CgkJCQk8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcmdvdHBhc3NfZmluaXNoX2hhc2giIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgc2l6ZT0iNDAiPgoJCQk8L2Rpdj4KCQkJCgkJCQoJCTwvZGl2PgoJPC9kaXY+CjwvZGl2Pgo= ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/login.php,importbuddy/controllers/pages/login.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php PD9waHAKaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgeyAvLyBOT1QgSU4gSU1QT1JUQlVERFk6Cgl3cF9lbnF1ZXVlX3NjcmlwdCggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc2NyaXB0cyggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc3R5bGVzKCAndGhpY2tib3gnICk7Cgk/PgoJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCSNiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCBhLnNob3ctc2V0dGluZ3MgewoJCWZsb2F0OiByaWdodDsKCQltYXJnaW46IDAgMCAwIDZweDsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYSB7CgkJYmFja2dyb3VuZDogbm9uZTsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYTphZnRlciB7CgkJY29udGVudDogJyc7CgkJbWFyZ2luLXJpZ2h0OiA1cHg7Cgl9Cgk8L3N0eWxlPgoKCTw/cGhwCgoJcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnYWRtaW4uanMnICk7CgkKCQoJCglwYl9iYWNrdXBidWRkeTo6JHVpLT50aXRsZSggX18oICdTZXJ2ZXIgVG9vbHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJYmFja3VwYnVkZHlfY29yZTo6dmVyc2lvbnNfY29uZmlybSgpOwoJCgkkZGVmYXVsdF90YWIgPSAwOwoJaWYgKCBpc19udW1lcmljKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3RhYicgKSApICkgewoJCSRkZWZhdWx0X3RhYiA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAndGFiJyApOwoJfQoJCgllY2hvICcnOwoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFicygKCQknZ2V0dGluZ19zdGFydGVkJywKCQlhcnJheSgKCQkJYXJyYXkoCgkJCQkndGl0bGUnCQk9PgkJX18oICdTZXJ2ZXInLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSdzbHVnJwkJPT4JCSdzZXJ2ZXInLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ0RhdGFiYXNlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZGF0YWJhc2UnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1NpdGUgU2l6ZSBNYXBzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZmlsZXMnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1dvcmRQcmVzcyBTY2hlZHVsZXMgKENyb24pJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknY3JvbicsCgkJCSksCgkJKSwKCQknd2lkdGg6IDEwMCU7JywKCQl0cnVlLAoJCSRkZWZhdWx0X3RhYgoJKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ3NlcnZlcicgKTsKCQkKCQlyZXF1aXJlX29uY2UoICdzZXJ2ZXJfaW5mby9zZXJ2ZXIucGhwJyApOwoJCQoJCQoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3Blcm1pc3Npb25zLnBocCcgKTsKCQkKCQkKCQkkd3BfdXBsb2FkX2RpciA9IHdwX3VwbG9hZF9kaXIoKTsKCQkkd3Bfc2V0dGluZ3MgPSBhcnJheSgpOwoJCQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydwYXRoJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBGaWxlIFBhdGgnLCAkd3BfdXBsb2FkX2RpclsncGF0aCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsndXJsJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBVUkwnLCAkd3BfdXBsb2FkX2RpclsndXJsJ10sICd3cF91cGxvYWRfZGlyKCknICk7CgkJfQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSApICkgewoJCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnVXBsb2FkIFN1YmRpcmVjdG9yeScsICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSwgJ3dwX3VwbG9hZF9kaXIoKScpOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBVUkwnLCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBEaXJlY3RvcnknLCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnU2l0ZSBVUkwnLCBzaXRlX3VybCgpLCAnc2l0ZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnSG9tZSBVUkwnLCBob21lX3VybCgpLCAnaG9tZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnV29yZFByZXNzIFJvb3QgUGF0aCcsIEFCU1BBVEgsICdBQlNQQVRIJyApOwoJCQoJCS8vIE11bHRpc2l0ZSBleHRyYXM6CgkJJHdwX3NldHRpbmdzX211bHRpc2l0ZSA9IGFycmF5KCk7CgkJaWYgKCBpc19tdWx0aXNpdGUoKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ05ldHdvcmsgU2l0ZSBVUkwnLCBuZXR3b3JrX3NpdGVfdXJsKCksICduZXR3b3JrX3NpdGVfdXJsKCknICk7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdOZXR3b3JrIEhvbWUgVVJMJywgbmV0d29ya19ob21lX3VybCgpLCAnbmV0d29ya19ob21lX3VybCgpJyApOwoJCX0KCQkKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnQmFja3VwQnVkZHkgbG9jYWwgc3RvcmFnZScsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpLCAnQmFja3VwQnVkZHkgU2V0dGluZ3MnICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IHRlbXBvcmFyeSBmaWxlcycsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSwgJ1VwbG9hZCBCYXNlICsgQmFja3VwQnVkZHknICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IGxvZ3MnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSwgJ1VwbG9hZCBCYXNlICsgQmFja3VwQnVkZHknICk7CgkJCgkJLy8gRGlzcGxheSBXUCBzZXR0aW5ncy4uCgkJcGJfYmFja3VwYnVkZHk6OiR1aS0+bGlzdF90YWJsZSgKCQkJJHdwX3NldHRpbmdzLAoJCQlhcnJheSgKCQkJCSdhY3Rpb24nCQkJCQk9PglwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSwKCQkJCSdjb2x1bW5zJwkJCQkJPT4JYXJyYXkoCgkJCQkJCQkJCQkJCQlfXyggJ1VSTHMgJiBQYXRocycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdPYnRhaW5lZCB2aWEnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkJCQkJCQkJKSwKCQkJCSdjc3MnCQkJCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJCQkpCgkJKTsKCQkKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCS8vIFRoaXMgcGFnZSBjYW4gdGFrZSBhIGJpdCB0byBydW4uCgkvLyBSdW5zIEFGVEVSIHNlcnZlciBpbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgc28gd2UgY2FuIHZpZXcgdGhlIGRlZmF1bHQgbGltaXRzIGZvciB0aGUgc2VydmVyLgoJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZGF0YWJhc2UnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vZGF0YWJhc2UucGhwJyApOwoJCWVjaG8gJzxicj48YnI+PGEgbmFtZT0iZGF0YWJhc2VfcmVwbGFjZSI+PC9hPic7CgkJZWNobyAnPGRpdiBjbGFzcz0icGJfaHRpdGxlIj4nIC4gJ0FkdmFuY2VkOiAnIC4gX18oICdEYXRhYmFzZSBNYXNzIFRleHQgUmVwbGFjZW1lbnQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2Rpdj48YnI+JzsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnX3NlcnZlcl90b29scy1kYXRhYmFzZV9yZXBsYWNlJyApOwoJCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYigpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZmlsZXMnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vc2l0ZV9zaXplLnBocCcgKTsKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2Nyb24nICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vY3Jvbi5waHAnICk7CgkJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFiKCk7CgkKCQoJZWNobyAnPGJyIHN0eWxlPSJjbGVhcjogYm90aDsiPjxicj48YnI+JzsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWJzKCk7CgkKCQoJCgkvLyBIYW5kbGVzIHRoaWNrYm94IGF1dG8tcmVzaXppbmcuIEtlZXAgYXQgYm90dG9tIG9mIHBhZ2UgdG8gYXZvaWQgaXNzdWVzLgoJaWYgKCAhd3Bfc2NyaXB0X2lzKCAnbWVkaWEtdXBsb2FkJyApICkgewoJCXdwX2VucXVldWVfc2NyaXB0KCAnbWVkaWEtdXBsb2FkJyApOwoJCXdwX3ByaW50X3NjcmlwdHMoICdtZWRpYS11cGxvYWQnICk7Cgl9CgkKfSBlbHNlIHsgLy8gSU5TSURFIElNUE9SVEJVRERZOgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3NraXBfc2VydmVyaW5mbycgKSA9PSAnJyApIHsgLy8gR2l2ZSBhIHdvcmthcm91bmQgdG8gc2tpcCB0aGlzLgoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3NlcnZlci5waHAnICk7Cgl9IGVsc2UgewoJCWVjaG8gJ3tTa2lwcGluZyBTZXJ2ZXIgSW5mby4gc2VjdGlvbiBiYXNlZCBvbiBxdWVyeXN0cmluZy59JzsKCX0KfQo/Pg== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/serverinfo.php,importbuddy/controllers/pages/serverinfo.php PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgpyZXF1aXJlX29uY2UoIEFCU1BBVEggLidpbXBvcnRidWRkeS92aWV3cy9faGVhZGVyLnBocCcgKTsKPz4KPHNjcmlwdD5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdTZXJ2ZXIgSW5mb3JtYXRpb24nICk7PC9zY3JpcHQ+Cgo8ZGl2IGNsYXNzPSJ3cmFwIj4KCTw/cGhwCglnbG9iYWwgJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZTsKCXJlcXVpcmVfb25jZSggJ3NlcnZlcl90b29scy5waHAnICk7Cgk/Pgo8L2Rpdj4KCjw/cGhwCnJlcXVpcmVfb25jZSggQUJTUEFUSCAuJ2ltcG9ydGJ1ZGR5L3ZpZXdzL19mb290ZXIucGhwJyApOw== ###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/serverinfo.php,importbuddy/controllers/pages/serverinfo.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/lib/pclzip/index.php,importbuddy/lib/pclzip/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/_importbuddy/importbuddy/lib/pclzip/index.php,importbuddy/lib/pclzip/index.php ###PACKDATA,FILE_START,/_importbuddy/importbuddy/lib/pclzip/pclzip.php,importbuddy/lib/pclzip/pclzip.php PD9waHAKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUGhwQ29uY2VwdCBMaWJyYXJ5IC0gWmlwIE1vZHVsZSAyLjguMgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMaWNlbnNlIEdOVS9MR1BMIC0gVmluY2VudCBCbGF2ZXQgLSBBdWd1c3QgMjAwOQovLyBodHRwOi8vd3d3LnBocGNvbmNlcHQubmV0Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIFByZXNlbnRhdGlvbiA6Ci8vICAgUGNsWmlwIGlzIGEgUEhQIGxpYnJhcnkgdGhhdCBtYW5hZ2UgWklQIGFyY2hpdmVzLgovLyAgIFNvIGZhciB0ZXN0cyBzaG93IHRoYXQgYXJjaGl2ZXMgZ2VuZXJhdGVkIGJ5IFBjbFppcCBhcmUgcmVhZGFibGUgYnkKLy8gICBXaW5aaXAgYXBwbGljYXRpb24gYW5kIG90aGVyIHRvb2xzLgovLwovLyBEZXNjcmlwdGlvbiA6Ci8vICAgU2VlIHJlYWRtZS50eHQgYW5kIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQKLy8KLy8gV2FybmluZyA6Ci8vICAgVGhpcyBsaWJyYXJ5IGFuZCB0aGUgYXNzb2NpYXRlZCBmaWxlcyBhcmUgbm9uIGNvbW1lcmNpYWwsIG5vbiBwcm9mZXNzaW9uYWwKLy8gICB3b3JrLgovLyAgIEl0IHNob3VsZCBub3QgaGF2ZSB1bmV4cGVjdGVkIHJlc3VsdHMuIEhvd2V2ZXIgaWYgYW55IGRhbWFnZSBpcyBjYXVzZWQgYnkKLy8gICB0aGlzIHNvZnR3YXJlIHRoZSBhdXRob3IgY2FuIG5vdCBiZSByZXNwb25zaWJsZS4KLy8gICBUaGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgYXQgdGhlIHJpc2sgb2YgdGhlIHVzZXIuCi8vCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICRJZDogcGNsemlwLmxpYi5waHAsdiAxLjYwIDIwMDkvMDkvMzAgMjE6MDE6MDQgdmJsYXZldCBFeHAgJAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLSBDb25zdGFudHMKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9SRUFEX0JMT0NLX1NJWkUnKSkgewogICAgZGVmaW5lKCAnUENMWklQX1JFQURfQkxPQ0tfU0laRScsIDIwNDggKTsKICB9CgogIC8vIC0tLS0tIEZpbGUgbGlzdCBzZXBhcmF0b3IKICAvLyBJbiB2ZXJzaW9uIDEueCBvZiBQY2xaaXAsIHRoZSBzZXBhcmF0b3IgZm9yIGZpbGUgbGlzdCBpcyBhIHNwYWNlCiAgLy8gKHdoaWNoIGlzIG5vdCBhIHZlcnkgc21hcnQgY2hvaWNlLCBzcGVjaWZpY2FsbHkgZm9yIHdpbmRvd3MgcGF0aHMgISkuCiAgLy8gQSBiZXR0ZXIgc2VwYXJhdG9yIHNob3VsZCBiZSBhIGNvbW1hICgsKS4gVGhpcyBjb25zdGFudCBnaXZlcyB5b3UgdGhlCiAgLy8gYWJpbHR5IHRvIGNoYW5nZSB0aGF0LgogIC8vIEhvd2V2ZXIgbm90aWNlIHRoYXQgY2hhbmdpbmcgdGhpcyB2YWx1ZSwgbWF5IGhhdmUgaW1wYWN0IG9uIGV4aXN0aW5nCiAgLy8gc2NyaXB0cywgdXNpbmcgc3BhY2Ugc2VwYXJhdGVkIGZpbGVuYW1lcy4KICAvLyBSZWNvbW1hbmRlZCB2YWx1ZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyA6CiAgLy9kZWZpbmUoICdQQ0xaSVBfU0VQQVJBVE9SJywgJyAnICk7CiAgLy8gUmVjb21tYW5kZWQgdmFsdWVzIGZvciBzbWFydCBzZXBhcmF0aW9uIG9mIGZpbGVuYW1lcy4KICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9TRVBBUkFUT1InKSkgewogICAgZGVmaW5lKCAnUENMWklQX1NFUEFSQVRPUicsICcsJyApOwogIH0KCiAgLy8gLS0tLS0gRXJyb3IgY29uZmlndXJhdGlvbgogIC8vIDAgOiBQY2xaaXAgQ2xhc3MgaW50ZWdyYXRlZCBlcnJvciBoYW5kbGluZwogIC8vIDEgOiBQY2xFcnJvciBleHRlcm5hbCBsaWJyYXJ5IGVycm9yIGhhbmRsaW5nLiBCeSBlbmFibGluZyB0aGlzCiAgLy8gICAgIHlvdSBtdXN0IGVuc3VyZSB0aGF0IHlvdSBoYXZlIGluY2x1ZGVkIFBjbEVycm9yIGxpYnJhcnkuCiAgLy8gWzIsLi4uXSA6IHJlc2VydmVkIGZvciBmdXR1ciB1c2UKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9FUlJPUl9FWFRFUk5BTCcpKSB7CiAgICBkZWZpbmUoICdQQ0xaSVBfRVJST1JfRVhURVJOQUwnLCAwICk7CiAgfQoKICAvLyAtLS0tLSBPcHRpb25hbCBzdGF0aWMgdGVtcG9yYXJ5IGRpcmVjdG9yeQogIC8vICAgICAgIEJ5IGRlZmF1bHQgdGVtcG9yYXJ5IGZpbGVzIGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHNjcmlwdCBjdXJyZW50CiAgLy8gICAgICAgcGF0aC4KICAvLyAgICAgICBJZiBkZWZpbmVkIDoKICAvLyAgICAgICAtIE1VU1QgQkUgdGVybWluYXRlZCBieSBhICcvJy4KICAvLyAgICAgICAtIE1VU1QgYmUgYSB2YWxpZCwgYWxyZWFkeSBjcmVhdGVkIGRpcmVjdG9yeQogIC8vICAgICAgIFNhbXBsZXMgOgogIC8vIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJy90ZW1wLycgKTsKICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0RJUicsICdDOi9UZW1wLycgKTsKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9URU1QT1JBUllfRElSJykpIHsKICAgIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJycgKTsKICB9CgogIC8vIC0tLS0tIE9wdGlvbmFsIHRocmVzaG9sZCByYXRpbyBmb3IgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcwogIC8vICAgICAgIFBjbHppcCBzZW5zZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB0byBhZGQvZXh0cmFjdCBhbmQgZGVjaWRlIHRvCiAgLy8gICAgICAgdXNlIG9yIG5vdCB0ZW1wb3JhcnkgZmlsZS4gVGhlIGFsZ29yeXRobSBpcyBsb29raW5nIGZvcgogIC8vICAgICAgIG1lbW9yeV9saW1pdCBvZiBQSFAgYW5kIGFwcGx5IGEgcmF0aW8uCiAgLy8gICAgICAgdGhyZXNob2xkID0gbWVtb3J5X2xpbWl0ICogcmF0aW8uCiAgLy8gICAgICAgUmVjb21tZW5kZWQgdmFsdWVzIGFyZSB1bmRlciAwLjUuIERlZmF1bHQgMC40Ny4KICAvLyAgICAgICBTYW1wbGVzIDoKICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nLCAwLjUgKTsKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9URU1QT1JBUllfRklMRV9SQVRJTycpKSB7CiAgICBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nLCAwLjQ3ICk7CiAgfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gKioqKiogVU5ERVIgVEhJUyBMSU5FIE5PVEhJTkcgTkVFRFMgVE8gQkUgTU9ESUZJRUQgKioqKioKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0gR2xvYmFsIHZhcmlhYmxlcwogICRnX3BjbHppcF92ZXJzaW9uID0gIjIuOC4yIjsKCiAgLy8gLS0tLS0gRXJyb3IgY29kZXMKICAvLyAgIC0xIDogVW5hYmxlIHRvIG9wZW4gZmlsZSBpbiBiaW5hcnkgd3JpdGUgbW9kZQogIC8vICAgLTIgOiBVbmFibGUgdG8gb3BlbiBmaWxlIGluIGJpbmFyeSByZWFkIG1vZGUKICAvLyAgIC0zIDogSW52YWxpZCBwYXJhbWV0ZXJzCiAgLy8gICAtNCA6IEZpbGUgZG9lcyBub3QgZXhpc3QKICAvLyAgIC01IDogRmlsZW5hbWUgaXMgdG9vIGxvbmcgKG1heC4gMjU1KQogIC8vICAgLTYgOiBOb3QgYSB2YWxpZCB6aXAgZmlsZQogIC8vICAgLTcgOiBJbnZhbGlkIGV4dHJhY3RlZCBmaWxlIHNpemUKICAvLyAgIC04IDogVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkKICAvLyAgIC05IDogSW52YWxpZCBhcmNoaXZlIGV4dGVuc2lvbgogIC8vICAtMTAgOiBJbnZhbGlkIGFyY2hpdmUgZm9ybWF0CiAgLy8gIC0xMSA6IFVuYWJsZSB0byBkZWxldGUgZmlsZSAodW5saW5rKQogIC8vICAtMTIgOiBVbmFibGUgdG8gcmVuYW1lIGZpbGUgKHJlbmFtZSkKICAvLyAgLTEzIDogSW52YWxpZCBoZWFkZXIgY2hlY2tzdW0KICAvLyAgLTE0IDogSW52YWxpZCBhcmNoaXZlIHNpemUKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRCcsIDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX05PX0VSUk9SJywgMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMJywgLTEgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMJywgLTIgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSJywgLTMgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX01JU1NJTkdfRklMRScsIC00ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORycsIC01ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX1pJUCcsIC02ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9CQURfRVhUUkFDVEVEX0ZJTEUnLCAtNyApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfRElSX0NSRUFURV9GQUlMJywgLTggKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0JBRF9FWFRFTlNJT04nLCAtOSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfQkFEX0ZPUk1BVCcsIC0xMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfREVMRVRFX0ZJTEVfRkFJTCcsIC0xMSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfUkVOQU1FX0ZJTEVfRkFJTCcsIC0xMiApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfQkFEX0NIRUNLU1VNJywgLTEzICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQJywgLTE0ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRScsIC0xNSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUnLCAtMTYgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0FMUkVBRFlfQV9ESVJFQ1RPUlknLCAtMTcgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OJywgLTE4ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OJywgLTE5ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRScsIC0yMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfRElSRUNUT1JZX1JFU1RSSUNUSU9OJywgLTIxICk7CgogIC8vIC0tLS0tIE9wdGlvbnMgdmFsdWVzCiAgZGVmaW5lKCAnUENMWklQX09QVF9QQVRIJywgNzcwMDEgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0FERF9QQVRIJywgNzcwMDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIJywgNzcwMDMgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCcsIDc3MDA0ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9TRVRfQ0hNT0QnLCA3NzAwNSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcnLCA3NzAwNiApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT04nLCA3NzAwNyApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQllfTkFNRScsIDc3MDA4ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9JTkRFWCcsIDc3MDA5ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9FUkVHJywgNzcwMTAgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0JZX1BSRUcnLCA3NzAxMSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQ09NTUVOVCcsIDc3MDEyICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9BRERfQ09NTUVOVCcsIDc3MDEzICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlQnLCA3NzAxNCApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQnLCA3NzAxNSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUicsIDc3MDE2ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9TVE9QX09OX0VSUk9SJywgNzcwMTcgKTsKICAvLyBIYXZpbmcgYmlnIHRyb3VibGUgd2l0aCBjcnlwdC4gTmVlZCB0byBtdWx0aXBseSAyIGxvbmcgaW50CiAgLy8gd2hpY2ggaXMgbm90IGNvcnJlY3RseSBzdXBwb3J0ZWQgYnkgUEhQIC4uLgogIC8vZGVmaW5lKCAnUENMWklQX09QVF9DUllQVCcsIDc3MDE4ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTicsIDc3MDE5ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEJywgNzcwMjAgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0FERF9URU1QX0ZJTEVfVEhSRVNIT0xEJywgNzcwMjAgKTsgLy8gYWxpYXMKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTicsIDc3MDIxICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9BRERfVEVNUF9GSUxFX09OJywgNzcwMjEgKTsgLy8gYWxpYXMKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYnLCA3NzAyMiApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX1RFTVBfRklMRV9PRkYnLCA3NzAyMiApOyAvLyBhbGlhcwoKICAvLyAtLS0tLSBGaWxlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfTkFNRScsIDc5MDAxICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FJywgNzkwMDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfTkVXX0ZVTExfTkFNRScsIDc5MDAzICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX01USU1FJywgNzkwMDQgKTsKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCcsIDc5MDA1ICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX0NPTU1FTlQnLCA3OTAwNiApOwoKICAvLyAtLS0tLSBDYWxsIGJhY2tzIHZhbHVlcwogIGRlZmluZSggJ1BDTFpJUF9DQl9QUkVfRVhUUkFDVCcsIDc4MDAxICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BPU1RfRVhUUkFDVCcsIDc4MDAyICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BSRV9BREQnLCA3ODAwMyApOwogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0FERCcsIDc4MDA0ICk7CiAgLyogRm9yIGZ1dHVyIHVzZQogIGRlZmluZSggJ1BDTFpJUF9DQl9QUkVfTElTVCcsIDc4MDA1ICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BPU1RfTElTVCcsIDc4MDA2ICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BSRV9ERUxFVEUnLCA3ODAwNyApOwogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0RFTEVURScsIDc4MDA4ICk7CiAgKi8KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDbGFzcyA6IFBjbFppcAogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFBjbFppcCBpcyB0aGUgY2xhc3MgdGhhdCByZXByZXNlbnQgYSBaaXAgYXJjaGl2ZS4KICAvLyAgIFRoZSBwdWJsaWMgbWV0aG9kcyBhbGxvdyB0aGUgbWFuaXB1bGF0aW9uIG9mIHRoZSBhcmNoaXZlLgogIC8vIEF0dHJpYnV0ZXMgOgogIC8vICAgQXR0cmlidXRlcyBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KICAvLyBNZXRob2RzIDoKICAvLyAgIFBjbFppcCgpIDogT2JqZWN0IGNyZWF0b3IKICAvLyAgIGNyZWF0ZSgpIDogQ3JlYXRlcyB0aGUgWmlwIGFyY2hpdmUKICAvLyAgIGxpc3RDb250ZW50KCkgOiBMaXN0IHRoZSBjb250ZW50IG9mIHRoZSBaaXAgYXJjaGl2ZQogIC8vICAgZXh0cmFjdCgpIDogRXh0cmFjdCB0aGUgY29udGVudCBvZiB0aGUgYXJjaGl2ZQogIC8vICAgcHJvcGVydGllcygpIDogTGlzdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJjaGl2ZQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgY2xhc3MgUGNsWmlwCiAgewogICAgLy8gLS0tLS0gRmlsZW5hbWUgb2YgdGhlIHppcCBmaWxlCiAgICB2YXIgJHppcG5hbWUgPSAnJzsKCiAgICAvLyAtLS0tLSBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHppcCBmaWxlCiAgICB2YXIgJHppcF9mZCA9IDA7CgogICAgLy8gLS0tLS0gSW50ZXJuYWwgZXJyb3IgaGFuZGxpbmcKICAgIHZhciAkZXJyb3JfY29kZSA9IDE7CiAgICB2YXIgJGVycm9yX3N0cmluZyA9ICcnOwoKICAgIC8vIC0tLS0tIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtYWdpY19xdW90ZXNfcnVudGltZQogICAgLy8gVGhpcyB2YWx1ZSBzdG9yZSB0aGUgcGhwIGNvbmZpZ3VyYXRpb24gZm9yIG1hZ2ljX3F1b3RlcwogICAgLy8gVGhlIGNsYXNzIGNhbiB0aGVuIGRpc2FibGUgdGhlIG1hZ2ljX3F1b3RlcyBhbmQgcmVzZXQgaXQgYWZ0ZXIKICAgIHZhciAkbWFnaWNfcXVvdGVzX3N0YXR1czsKICAgIAogIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwX3ppcG5hbWUpIHsKICAgIHJldHVybiAkdGhpcy0+UGNsWmlwKCRwX3ppcG5hbWUpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgQ3JlYXRlcyBhIFBjbFppcCBvYmplY3QgYW5kIHNldCB0aGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBaaXAgYXJjaGl2ZQogIC8vICAgZmlsZW5hbWUuCiAgLy8gICBOb3RlIHRoYXQgbm8gcmVhbCBhY3Rpb24gaXMgdGFrZW4sIGlmIHRoZSBhcmNoaXZlIGRvZXMgbm90IGV4aXN0IGl0IGlzIG5vdAogIC8vICAgY3JlYXRlZC4gVXNlIGNyZWF0ZSgpIGZvciB0aGF0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwKCRwX3ppcG5hbWUpCiAgewoKICAgIC8vIC0tLS0tIFRlc3RzIHRoZSB6bGliCiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3pvcGVuJykpCiAgICB7CiAgICAgIGRpZSgnQWJvcnQgJy5iYXNlbmFtZShfX0ZJTEVfXykuJyA6IE1pc3NpbmcgemxpYiBleHRlbnNpb25zJyk7CiAgICB9CgogICAgLy8gLS0tLS0gU2V0IHRoZSBhdHRyaWJ1dGVzCiAgICAkdGhpcy0+emlwbmFtZSA9ICRwX3ppcG5hbWU7CiAgICAkdGhpcy0+emlwX2ZkID0gMDsKICAgICR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzID0gLTE7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm47CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOgogIC8vICAgY3JlYXRlKCRwX2ZpbGVsaXN0LCAkcF9hZGRfZGlyPSIiLCAkcF9yZW1vdmVfZGlyPSIiKQogIC8vICAgY3JlYXRlKCRwX2ZpbGVsaXN0LCAkcF9vcHRpb24sICRwX29wdGlvbl92YWx1ZSwgLi4uKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBkaWZmZXJlbnQgc3lub3BzaXMuIFRoZSBmaXJzdCBvbmUgaXMgaGlzdG9yaWNhbC4KICAvLyAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBaaXAgQXJjaGl2ZS4gVGhlIFppcCBmaWxlIGlzIGNyZWF0ZWQgaW4gdGhlCiAgLy8gICBmaWxlc3lzdGVtLiBUaGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluZGljYXRlZCBpbiAkcF9maWxlbGlzdAogIC8vICAgYXJlIGFkZGVkIGluIHRoZSBhcmNoaXZlLiBTZWUgdGhlIHBhcmFtZXRlcnMgZGVzY3JpcHRpb24gZm9yIHRoZQogIC8vICAgc3VwcG9ydGVkIGZvcm1hdCBvZiAkcF9maWxlbGlzdC4KICAvLyAgIFdoZW4gYSBkaXJlY3RvcnkgaXMgaW4gdGhlIGxpc3QsIHRoZSBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50IGlzIGFkZGVkCiAgLy8gICBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgIEluIHRoaXMgc3lub3BzaXMsIHRoZSBmdW5jdGlvbiB0YWtlcyBhbiBvcHRpb25hbCB2YXJpYWJsZSBsaXN0IG9mCiAgLy8gICBvcHRpb25zLiBTZWUgYmVsbG93IHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2ZpbGVsaXN0IDogQW4gYXJyYXkgY29udGFpbmluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcywgb3IKICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgZmlsZW5hbWUgb3Igb25lIGRpcmVjdG9yeSBuYW1lLCBvcgogIC8vICAgICAgICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIGEgbGlzdCBvZiBmaWxlbmFtZXMgYW5kL29yIGRpcmVjdG9yeQogIC8vICAgICAgICAgICAgICAgICBuYW1lcyBzZXBhcmF0ZWQgYnkgc3BhY2VzLgogIC8vICAgJHBfYWRkX2RpciA6IEEgcGF0aCB0byBhZGQgYmVmb3JlIHRoZSByZWFsIHBhdGggb2YgdGhlIGFyY2hpdmVkIGZpbGUsCiAgLy8gICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gaGF2ZSBpdCBtZW1vcml6ZWQgaW4gdGhlIGFyY2hpdmUuCiAgLy8gICAkcF9yZW1vdmVfZGlyIDogQSBwYXRoIHRvIHJlbW92ZSBmcm9tIHRoZSByZWFsIHBhdGggb2YgdGhlIGZpbGUgdG8gYXJjaGl2ZSwKICAvLyAgICAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBoYXZlIGEgc2hvcnRlciBwYXRoIG1lbW9yaXplZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgICAgICAgICAgICAgICAgICBXaGVuICRwX2FkZF9kaXIgYW5kICRwX3JlbW92ZV9kaXIgYXJlIHNldCwgJHBfcmVtb3ZlX2RpcgogIC8vICAgICAgICAgICAgICAgICAgIGlzIHJlbW92ZWQgZmlyc3QsIGJlZm9yZSAkcF9hZGRfZGlyIGlzIGFkZGVkLgogIC8vIE9wdGlvbnMgOgogIC8vICAgUENMWklQX09QVF9BRERfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfQ09NTUVOVCA6CiAgLy8gICBQQ0xaSVBfQ0JfUFJFX0FERCA6CiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9BREQgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBmYWlsdXJlLAogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGFkZGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhZGQgYWN0aW9uLgogIC8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gY3JlYXRlKCRwX2ZpbGVsaXN0KQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKICAgICR2X29wdGlvbnMgPSBhcnJheSgpOwogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSA9IEZBTFNFOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzCiAgICAkdl9zaXplID0gZnVuY19udW1fYXJncygpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAxKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGZyb20gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgYXJyYXlfc2hpZnQoJHZfYXJnX2xpc3QpOwogICAgICAkdl9zaXplLS07CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBmaXJzdCBhcmcKICAgICAgaWYgKChpc19pbnRlZ2VyKCR2X2FyZ19saXN0WzBdKSkgJiYgKCR2X2FyZ19saXN0WzBdID4gNzcwMDApKSB7CgogICAgICAgIC8vIC0tLS0tIFBhcnNlIHRoZSBvcHRpb25zCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUFJFX0FERCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9BREQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLCBQQ0xaSVBfT1BUX0NSWVBUID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncwogICAgICAvLyBIZXJlIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGUgZmlyc3QgaGlzdG9yaWMgc3lub3BzaXMgb2YgdGhlCiAgICAgIC8vIG1ldGhvZC4KICAgICAgZWxzZSB7CgogICAgICAgIC8vIC0tLS0tIEdldCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdID0gJHZfYXJnX2xpc3RbMF07CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQKICAgICAgICBpZiAoJHZfc2l6ZSA9PSAyKSB7CiAgICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdID0gJHZfYXJnX2xpc3RbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR2X3NpemUgPiAyKSB7CiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLAoJCSAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIC8gdHlwZSBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgb3B0aW9uIHZhbHVlcwogICAgJHRoaXMtPnByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCR2X29wdGlvbnMpOwoKICAgIC8vIC0tLS0tIEluaXQKICAgICR2X3N0cmluZ19saXN0ID0gYXJyYXkoKTsKICAgICR2X2F0dF9saXN0ID0gYXJyYXkoKTsKICAgICR2X2ZpbGVkZXNjcl9saXN0ID0gYXJyYXkoKTsKICAgICRwX3Jlc3VsdF9saXN0ID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyByZWFsbHkgYW4gYXJyYXkKICAgIGlmIChpc19hcnJheSgkcF9maWxlbGlzdCkpIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYWxzbyBhbiBhcnJheQogICAgICAvLyAgICAgICBUaGlzIHdpbGwgbWVhbiB0aGF0IHRoaXMgaXMgYSBmaWxlIGRlc2NyaXB0aW9uIGVudHJ5CiAgICAgIGlmIChpc3NldCgkcF9maWxlbGlzdFswXSkgJiYgaXNfYXJyYXkoJHBfZmlsZWxpc3RbMF0pKSB7CiAgICAgICAgJHZfYXR0X2xpc3QgPSAkcF9maWxlbGlzdDsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gVGhlIGxpc3QgaXMgYSBsaXN0IG9mIHN0cmluZyBuYW1lcwogICAgICBlbHNlIHsKICAgICAgICAkdl9zdHJpbmdfbGlzdCA9ICRwX2ZpbGVsaXN0OwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcKICAgIGVsc2UgaWYgKGlzX3N0cmluZygkcF9maWxlbGlzdCkpIHsKICAgICAgLy8gLS0tLS0gQ3JlYXRlIGEgbGlzdCBmcm9tIHRoZSBzdHJpbmcKICAgICAgJHZfc3RyaW5nX2xpc3QgPSBleHBsb2RlKFBDTFpJUF9TRVBBUkFUT1IsICRwX2ZpbGVsaXN0KTsKICAgIH0KCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlIHR5cGUgZm9yICRwX2ZpbGVsaXN0CiAgICBlbHNlIHsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgdmFyaWFibGUgdHlwZSBwX2ZpbGVsaXN0Iik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIFJlZm9ybWF0IHRoZSBzdHJpbmcgbGlzdAogICAgaWYgKHNpemVvZigkdl9zdHJpbmdfbGlzdCkgIT0gMCkgewogICAgICBmb3JlYWNoICgkdl9zdHJpbmdfbGlzdCBhcyAkdl9zdHJpbmcpIHsKICAgICAgICBpZiAoJHZfc3RyaW5nICE9ICcnKSB7CiAgICAgICAgICAkdl9hdHRfbGlzdFtdW1BDTFpJUF9BVFRfRklMRV9OQU1FXSA9ICR2X3N0cmluZzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gRm9yIGVhY2ggZmlsZSBpbiB0aGUgbGlzdCBjaGVjayB0aGUgYXR0cmlidXRlcwogICAgJHZfc3VwcG9ydGVkX2F0dHJpYnV0ZXMKICAgID0gYXJyYXkgKCBQQ0xaSVBfQVRUX0ZJTEVfTkFNRSA9PiAnbWFuZGF0b3J5JwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9ORVdfU0hPUlRfTkFNRSA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX05FV19GVUxMX05BTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9NVElNRSA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX0NPTlRFTlQgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9DT01NRU5UID0+ICdvcHRpb25hbCcKCQkJCQkJKTsKICAgIGZvcmVhY2ggKCR2X2F0dF9saXN0IGFzICR2X2VudHJ5KSB7CiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RmlsZURlc2NyUGFyc2VBdHQoJHZfZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfZmlsZWRlc2NyX2xpc3RbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzKTsKICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBFeHBhbmQgdGhlIGZpbGVsaXN0IChleHBhbmQgZGlyZWN0b3JpZXMpCiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjckV4cGFuZCgkdl9maWxlZGVzY3JfbGlzdCwgJHZfb3B0aW9ucyk7CiAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gLS0tLS0gQ2FsbCB0aGUgY3JlYXRlIGZjdAogICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDcmVhdGUoJHZfZmlsZWRlc2NyX2xpc3QsICRwX3Jlc3VsdF9saXN0LCAkdl9vcHRpb25zKTsKICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9yZXN1bHRfbGlzdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6CiAgLy8gICBhZGQoJHBfZmlsZWxpc3QsICRwX2FkZF9kaXI9IiIsICRwX3JlbW92ZV9kaXI9IiIpCiAgLy8gICBhZGQoJHBfZmlsZWxpc3QsICRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi4pCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdHdvIHN5bm9wc2lzLiBUaGUgZmlyc3Qgb25lIGlzIGhpc3RvcmljYWwuCiAgLy8gICBUaGlzIG1ldGhvZHMgYWRkIHRoZSBsaXN0IG9mIGZpbGVzIGluIGFuIGV4aXN0aW5nIGFyY2hpdmUuCiAgLy8gICBJZiBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQogIC8vICAgYXJjaGl2ZSwgdGhlIGZpcnN0IG9uZSBpcyBzdGlsbCBwcmVzZW50LgogIC8vICAgSWYgdGhlIGFyY2hpdmUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9maWxlbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMsIG9yCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIG9uZSBkaXJlY3RvcnkgbmFtZSwgb3IKICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkKICAvLyAgICAgICAgICAgICAgICAgbmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KICAvLyAgICRwX2FkZF9kaXIgOiBBIHBhdGggdG8gYWRkIGJlZm9yZSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBhcmNoaXZlZCBmaWxlLAogIC8vICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGhhdmUgaXQgbWVtb3JpemVkIGluIHRoZSBhcmNoaXZlLgogIC8vICAgJHBfcmVtb3ZlX2RpciA6IEEgcGF0aCB0byByZW1vdmUgZnJvbSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBmaWxlIHRvIGFyY2hpdmUsCiAgLy8gICAgICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gaGF2ZSBhIHNob3J0ZXIgcGF0aCBtZW1vcml6ZWQgaW4gdGhlIGFyY2hpdmUuCiAgLy8gICAgICAgICAgICAgICAgICAgV2hlbiAkcF9hZGRfZGlyIGFuZCAkcF9yZW1vdmVfZGlyIGFyZSBzZXQsICRwX3JlbW92ZV9kaXIKICAvLyAgICAgICAgICAgICAgICAgICBpcyByZW1vdmVkIGZpcnN0LCBiZWZvcmUgJHBfYWRkX2RpciBpcyBhZGRlZC4KICAvLyBPcHRpb25zIDoKICAvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX0NPTU1FTlQgOgogIC8vICAgUENMWklQX09QVF9BRERfQ09NTUVOVCA6CiAgLy8gICBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA6CiAgLy8gICBQQ0xaSVBfQ0JfUFJFX0FERCA6CiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9BREQgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBmYWlsdXJlLAogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGFkZGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhZGQgYWN0aW9uLgogIC8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYWRkKCRwX2ZpbGVsaXN0KQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKICAgICR2X29wdGlvbnMgPSBhcnJheSgpOwogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSA9IEZBTFNFOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzCiAgICAkdl9zaXplID0gZnVuY19udW1fYXJncygpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAxKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGZvcm0gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgYXJyYXlfc2hpZnQoJHZfYXJnX2xpc3QpOwogICAgICAkdl9zaXplLS07CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBmaXJzdCBhcmcKICAgICAgaWYgKChpc19pbnRlZ2VyKCR2X2FyZ19saXN0WzBdKSkgJiYgKCR2X2FyZ19saXN0WzBdID4gNzcwMDApKSB7CgogICAgICAgIC8vIC0tLS0tIFBhcnNlIHRoZSBvcHRpb25zCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUFJFX0FERCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9BREQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfQ09NTUVOVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8sIFBDTFpJUF9PUFRfQ1JZUFQgPT4gJ29wdGlvbmFsJwoJCQkJCQkJCQkJCQkgICApKTsKICAgICAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgMiBhcmdzCiAgICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzdXBwb3J0IHRoZSBmaXJzdCBoaXN0b3JpYyBzeW5vcHNpcyBvZiB0aGUKICAgICAgLy8gbWV0aG9kLgogICAgICBlbHNlIHsKCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0gPSAkdl9hZGRfcGF0aCA9ICR2X2FyZ19saXN0WzBdOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgaWYgKCR2X3NpemUgPT0gMikgewogICAgICAgICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSA9ICR2X2FyZ19saXN0WzFdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdl9zaXplID4gMikgewogICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBudW1iZXIgLyB0eXBlIG9mIGFyZ3VtZW50cyIpOwoKICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCBvcHRpb24gdmFsdWVzCiAgICAkdGhpcy0+cHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoJHZfb3B0aW9ucyk7CgogICAgLy8gLS0tLS0gSW5pdAogICAgJHZfc3RyaW5nX2xpc3QgPSBhcnJheSgpOwogICAgJHZfYXR0X2xpc3QgPSBhcnJheSgpOwogICAgJHZfZmlsZWRlc2NyX2xpc3QgPSBhcnJheSgpOwogICAgJHBfcmVzdWx0X2xpc3QgPSBhcnJheSgpOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIHJlYWxseSBhbiBhcnJheQogICAgaWYgKGlzX2FycmF5KCRwX2ZpbGVsaXN0KSkgewoKICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbHNvIGFuIGFycmF5CiAgICAgIC8vICAgICAgIFRoaXMgd2lsbCBtZWFuIHRoYXQgdGhpcyBpcyBhIGZpbGUgZGVzY3JpcHRpb24gZW50cnkKICAgICAgaWYgKGlzc2V0KCRwX2ZpbGVsaXN0WzBdKSAmJiBpc19hcnJheSgkcF9maWxlbGlzdFswXSkpIHsKICAgICAgICAkdl9hdHRfbGlzdCA9ICRwX2ZpbGVsaXN0OwogICAgICB9CgogICAgICAvLyAtLS0tLSBUaGUgbGlzdCBpcyBhIGxpc3Qgb2Ygc3RyaW5nIG5hbWVzCiAgICAgIGVsc2UgewogICAgICAgICR2X3N0cmluZ19saXN0ID0gJHBfZmlsZWxpc3Q7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyBhIHN0cmluZwogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2ZpbGVsaXN0KSkgewogICAgICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IGZyb20gdGhlIHN0cmluZwogICAgICAkdl9zdHJpbmdfbGlzdCA9IGV4cGxvZGUoUENMWklQX1NFUEFSQVRPUiwgJHBfZmlsZWxpc3QpOwogICAgfQoKICAgIC8vIC0tLS0tIEludmFsaWQgdmFyaWFibGUgdHlwZSBmb3IgJHBfZmlsZWxpc3QKICAgIGVsc2UgewogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlICciLmdldHR5cGUoJHBfZmlsZWxpc3QpLiInIGZvciBwX2ZpbGVsaXN0Iik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIFJlZm9ybWF0IHRoZSBzdHJpbmcgbGlzdAogICAgaWYgKHNpemVvZigkdl9zdHJpbmdfbGlzdCkgIT0gMCkgewogICAgICBmb3JlYWNoICgkdl9zdHJpbmdfbGlzdCBhcyAkdl9zdHJpbmcpIHsKICAgICAgICAkdl9hdHRfbGlzdFtdW1BDTFpJUF9BVFRfRklMRV9OQU1FXSA9ICR2X3N0cmluZzsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEZvciBlYWNoIGZpbGUgaW4gdGhlIGxpc3QgY2hlY2sgdGhlIGF0dHJpYnV0ZXMKICAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzCiAgICA9IGFycmF5ICggUENMWklQX0FUVF9GSUxFX05BTUUgPT4gJ21hbmRhdG9yeScKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTkVXX1NIT1JUX05BTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9ORVdfRlVMTF9OQU1FID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9DT05URU5UID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfQ09NTUVOVCA9PiAnb3B0aW9uYWwnCgkJCQkJCSk7CiAgICBmb3JlYWNoICgkdl9hdHRfbGlzdCBhcyAkdl9lbnRyeSkgewogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjclBhcnNlQXR0KCR2X2VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X2ZpbGVkZXNjcl9saXN0W10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9zdXBwb3J0ZWRfYXR0cmlidXRlcyk7CiAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gRXhwYW5kIHRoZSBmaWxlbGlzdCAoZXhwYW5kIGRpcmVjdG9yaWVzKQogICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZGaWxlRGVzY3JFeHBhbmQoJHZfZmlsZWRlc2NyX2xpc3QsICR2X29wdGlvbnMpOwogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGNyZWF0ZSBmY3QKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkKCR2X2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHZfb3B0aW9ucyk7CiAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHBfcmVzdWx0X2xpc3Q7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBsaXN0Q29udGVudCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBwdWJsaWMgbWV0aG9kLCBnaXZlcyB0aGUgbGlzdCBvZiB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCB3aXRoIHRoZWlyCiAgLy8gICBwcm9wZXJ0aWVzLgogIC8vICAgVGhlIHByb3BlcnRpZXMgb2YgZWFjaCBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSAodXNlZCBhbHNvIGluIG90aGVyIGZ1bmN0aW9ucykgOgogIC8vICAgICBmaWxlbmFtZSA6IE5hbWUgb2YgdGhlIGZpbGUuIEZvciBhIGNyZWF0ZSBvciBhZGQgYWN0aW9uIGl0IGlzIHRoZSBmaWxlbmFtZQogIC8vICAgICAgICAgICAgICAgIGdpdmVuIGJ5IHRoZSB1c2VyLiBGb3IgYW4gZXh0cmFjdCBmdW5jdGlvbiBpdCBpcyB0aGUgZmlsZW5hbWUKICAvLyAgICAgICAgICAgICAgICBvZiB0aGUgZXh0cmFjdGVkIGZpbGUuCiAgLy8gICAgIHN0b3JlZF9maWxlbmFtZSA6IE5hbWUgb2YgdGhlIGZpbGUgLyBkaXJlY3Rvcnkgc3RvcmVkIGluIHRoZSBhcmNoaXZlLgogIC8vICAgICBzaXplIDogU2l6ZSBvZiB0aGUgc3RvcmVkIGZpbGUuCiAgLy8gICAgIGNvbXByZXNzZWRfc2l6ZSA6IFNpemUgb2YgdGhlIGZpbGUncyBkYXRhIGNvbXByZXNzZWQgaW4gdGhlIGFyY2hpdmUKICAvLyAgICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXQgdGhlIGhlYWRlcnMgb3ZlcmhlYWQpCiAgLy8gICAgIG10aW1lIDogTGFzdCBrbm93biBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZmlsZSAoVU5JWCB0aW1lc3RhbXApCiAgLy8gICAgIGNvbW1lbnQgOiBDb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQogIC8vICAgICBmb2xkZXIgOiB0cnVlIHwgZmFsc2UKICAvLyAgICAgaW5kZXggOiBpbmRleCBvZiB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZQogIC8vICAgICBzdGF0dXMgOiBzdGF0dXMgb2YgdGhlIGFjdGlvbiAoZGVwZW5kaW5nIG9mIHRoZSBhY3Rpb24pIDoKICAvLyAgICAgICAgICAgICAgVmFsdWVzIGFyZSA6CiAgLy8gICAgICAgICAgICAgICAgb2sgOiBPSyAhCiAgLy8gICAgICAgICAgICAgICAgZmlsdGVyZWQgOiB0aGUgZmlsZSAvIGRpciBpcyBub3QgZXh0cmFjdGVkIChmaWx0ZXJlZCBieSB1c2VyKQogIC8vICAgICAgICAgICAgICAgIGFscmVhZHlfYV9kaXJlY3RvcnkgOiB0aGUgZmlsZSBjYW4gbm90IGJlIGV4dHJhY3RlZCBiZWNhdXNlIGEKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cwogIC8vICAgICAgICAgICAgICAgIHdyaXRlX3Byb3RlY3RlZCA6IHRoZSBmaWxlIGNhbiBub3QgYmUgZXh0cmFjdGVkIGJlY2F1c2UgYSBmaWxlCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGFuZCBpcwogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHByb3RlY3RlZAogIC8vICAgICAgICAgICAgICAgIG5ld2VyX2V4aXN0IDogdGhlIGZpbGUgd2FzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSBhIG5ld2VyIGZpbGUgZXhpc3RzCiAgLy8gICAgICAgICAgICAgICAgcGF0aF9jcmVhdGlvbl9mYWlsIDogdGhlIGZpbGUgaXMgbm90IGV4dHJhY3RlZCBiZWNhdXNlIHRoZSBmb2xkZXIKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdCBhbmQgY2FuIG5vdCBiZSBjcmVhdGVkCiAgLy8gICAgICAgICAgICAgICAgd3JpdGVfZXJyb3IgOiB0aGUgZmlsZSB3YXMgbm90IGV4dHJhY3RlZCBiZWNhdXNlIHRoZXJlIHdhcyBhCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciB3aGlsZSB3cml0aW5nIHRoZSBmaWxlCiAgLy8gICAgICAgICAgICAgICAgcmVhZF9lcnJvciA6IHRoZSBmaWxlIHdhcyBub3QgZXh0cmFjdGVkIGJlY2F1c2UgdGhlcmUgd2FzIGEgZXJyb3IKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcmVhZGluZyB0aGUgZmlsZQogIC8vICAgICAgICAgICAgICAgIGludmFsaWRfaGVhZGVyIDogdGhlIGZpbGUgd2FzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSBvZiBhbiBhcmNoaXZlCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgZXJyb3IgKGJhZCBmaWxlIGhlYWRlcikKICAvLyAgIE5vdGUgdGhhdCBlYWNoIHRpbWUgYSBtZXRob2QgY2FuIGNvbnRpbnVlIG9wZXJhdGluZyB3aGVuIHRoZXJlCiAgLy8gICBpcyBhbiBhY3Rpb24gZXJyb3Igb24gYSBmaWxlLCB0aGUgZXJyb3IgaXMgb25seSBsb2dnZWQgaW4gdGhlIGZpbGUgc3RhdHVzLgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBhbiB1bnJlY292ZXJhYmxlIGZhaWx1cmUsCiAgLy8gICBUaGUgbGlzdCBvZiB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBsaXN0Q29udGVudCgpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIENoZWNrIGFyY2hpdmUKICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBleHRyYWN0aW5nIGZjdAogICAgJHBfbGlzdCA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2TGlzdCgkcF9saXN0KSkgIT0gMSkKICAgIHsKICAgICAgdW5zZXQoJHBfbGlzdCk7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDoKICAvLyAgIGV4dHJhY3QoJHBfcGF0aD0iLi8iLCAkcF9yZW1vdmVfcGF0aD0iIikKICAvLyAgIGV4dHJhY3QoWyRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi5dKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBzeW5vcHNpcy4gVGhlIGZpcnN0IG9uZSBpcyBoaXN0b3JpY2FsLgogIC8vICAgVGhpcyBtZXRob2QgZXh0cmFjdCBhbGwgdGhlIGZpbGVzIC8gZGlyZWN0b3JpZXMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUKICAvLyAgIGZvbGRlciBpbmRpY2F0ZWQgaW4gJHBfcGF0aC4KICAvLyAgIElmIHlvdSB3YW50IHRvIGlnbm9yZSB0aGUgJ3Jvb3QnIHBhcnQgb2YgcGF0aCBvZiB0aGUgbWVtb3JpemVkIGZpbGVzCiAgLy8gICB5b3UgY2FuIGluZGljYXRlIHRoaXMgaW4gdGhlIG9wdGlvbmFsICRwX3JlbW92ZV9wYXRoIHBhcmFtZXRlci4KICAvLyAgIEJ5IGRlZmF1bHQsIGlmIGEgbmV3ZXIgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZQogIC8vICAgZmlsZSBpcyBub3QgZXh0cmFjdGVkLgogIC8vCiAgLy8gICBJZiBib3RoIFBDTFpJUF9PUFRfUEFUSCBhbmQgUENMWklQX09QVF9BRERfUEFUSCBhb3B0aW9ucwogIC8vICAgYXJlIHVzZWQsIHRoZSBwYXRoIGluZGljYXRlZCBpbiBQQ0xaSVBfT1BUX0FERF9QQVRIIGlzIGFwcGVuZAogIC8vICAgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCB2YWx1ZSBvZiBQQ0xaSVBfT1BUX1BBVEguCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9wYXRoIDogUGF0aCB3aGVyZSB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSB0byBiZSBleHRyYWN0ZWQKICAvLyAgICRwX3JlbW92ZV9wYXRoIDogRmlyc3QgcGFydCAoJ3Jvb3QnIHBhcnQpIG9mIHRoZSBtZW1vcml6ZWQgcGF0aAogIC8vICAgICAgICAgICAgICAgICAgICAoaWYgYW55IHNpbWlsYXIpIHRvIHJlbW92ZSB3aGlsZSBleHRyYWN0aW5nLgogIC8vIE9wdGlvbnMgOgogIC8vICAgUENMWklQX09QVF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6CiAgLy8gICBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgOgogIC8vICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAwIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZSwKICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBleHRyYWN0ZWQgZmlsZXMsIHdpdGggYSBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGV4dHJhY3QoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlCiAgICBpZiAoISR0aGlzLT5wcml2Q2hlY2tGb3JtYXQoKSkgewogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkdl9vcHRpb25zID0gYXJyYXkoKTsKLy8gICAgJHZfcGF0aCA9ICIuLyI7CiAgICAkdl9wYXRoID0gJyc7CiAgICAkdl9yZW1vdmVfcGF0aCA9ICIiOwogICAgJHZfcmVtb3ZlX2FsbF9wYXRoID0gZmFsc2U7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgdmFyaWFibGUgb3B0aW9ucyBhcmd1bWVudHMKICAgICR2X3NpemUgPSBmdW5jX251bV9hcmdzKCk7CgogICAgLy8gLS0tLS0gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbgogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSA9IEZBTFNFOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAwKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnCiAgICAgIGlmICgoaXNfaW50ZWdlcigkdl9hcmdfbGlzdFswXSkpICYmICgkdl9hcmdfbGlzdFswXSA+IDc3MDAwKSkgewoKICAgICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucwogICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UGFyc2VPcHRpb25zKCR2X2FyZ19saXN0LCAkdl9zaXplLCAkdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0FERF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfU0VUX0NITU9EID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfTkFNRSA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0VSRUcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9QUkVHID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfSU5ERVggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklORyA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGID0+ICdvcHRpb25hbCcKCQkJCQkJCQkJCQkJICAgICkpOwogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGFyZ3VtZW50cwogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUEFUSF0pKSB7CiAgICAgICAgICAkdl9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1BBVEhdOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSkpIHsKICAgICAgICAgICR2X3JlbW92ZV9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKSkgewogICAgICAgICAgJHZfcmVtb3ZlX2FsbF9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdKSkgewogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yICcvJyBpbiBsYXN0IHBhdGggY2hhcgogICAgICAgICAgaWYgKChzdHJsZW4oJHZfcGF0aCkgPiAwKSAmJiAoc3Vic3RyKCR2X3BhdGgsIC0xKSAhPSAnLycpKSB7CiAgICAgICAgICAgICR2X3BhdGggLj0gJy8nOwogICAgICAgICAgfQogICAgICAgICAgJHZfcGF0aCAuPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgMiBhcmdzCiAgICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzdXBwb3J0IHRoZSBmaXJzdCBoaXN0b3JpYyBzeW5vcHNpcyBvZiB0aGUKICAgICAgLy8gbWV0aG9kLgogICAgICBlbHNlIHsKCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICR2X3BhdGggPSAkdl9hcmdfbGlzdFswXTsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAogICAgICAgIGlmICgkdl9zaXplID09IDIpIHsKICAgICAgICAgICR2X3JlbW92ZV9wYXRoID0gJHZfYXJnX2xpc3RbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR2X3NpemUgPiAyKSB7CiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIG51bWJlciAvIHR5cGUgb2YgYXJndW1lbnRzIik7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBkZWZhdWx0IG9wdGlvbiB2YWx1ZXMKICAgICR0aGlzLT5wcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgkdl9vcHRpb25zKTsKCiAgICAvLyAtLS0tLSBUcmFjZQoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0CiAgICAkcF9saXN0ID0gYXJyYXkoKTsKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RXh0cmFjdEJ5UnVsZSgkcF9saXN0LCAkdl9wYXRoLCAkdl9yZW1vdmVfcGF0aCwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9yZW1vdmVfYWxsX3BhdGgsICR2X29wdGlvbnMpOwogICAgaWYgKCR2X3Jlc3VsdCA8IDEpIHsKICAgICAgdW5zZXQoJHBfbGlzdCk7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6CiAgLy8gICBleHRyYWN0QnlJbmRleCgkcF9pbmRleCwgJHBfcGF0aD0iLi8iLCAkcF9yZW1vdmVfcGF0aD0iIikKICAvLyAgIGV4dHJhY3RCeUluZGV4KCRwX2luZGV4LCBbJHBfb3B0aW9uLCAkcF9vcHRpb25fdmFsdWUsIC4uLl0pCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdHdvIHN5bm9wc2lzLiBUaGUgZmlyc3Qgb25lIGlzIGhpc3RvcmljYWwuCiAgLy8gICBUaGlzIG1ldGhvZCBpcyBkb2luZyBhIHBhcnRpYWwgZXh0cmFjdCBvZiB0aGUgYXJjaGl2ZS4KICAvLyAgIFRoZSBleHRyYWN0ZWQgZmlsZXMgb3IgZm9sZGVycyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBpbmRleCBpbiB0aGUKICAvLyAgIGFyY2hpdmUgKGZyb20gMCB0byBuKS4KICAvLyAgIE5vdGUgdGhhdCBpZiB0aGUgaW5kZXggaWRlbnRpZnkgYSBmb2xkZXIsIG9ubHkgdGhlIGZvbGRlciBlbnRyeSBpcwogIC8vICAgZXh0cmFjdGVkLCBub3QgYWxsIHRoZSBmaWxlcyBpbmNsdWRlZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2luZGV4IDogQSBzaW5nbGUgaW5kZXggKGludGVnZXIpIG9yIGEgc3RyaW5nIG9mIGluZGV4ZXMgb2YgZmlsZXMgdG8KICAvLyAgICAgICAgICAgICAgZXh0cmFjdC4gVGhlIGZvcm0gb2YgdGhlIHN0cmluZyBpcyAiMCw0LTYsOC0xMiIgd2l0aCBvbmx5IG51bWJlcnMKICAvLyAgICAgICAgICAgICAgYW5kICctJyBmb3IgcmFuZ2Ugb3IgJywnIHRvIHNlcGFyYXRlIHJhbmdlcy4gTm8gc3BhY2VzIG9yICc7JwogIC8vICAgICAgICAgICAgICBhcmUgYWxsb3dlZC4KICAvLyAgICRwX3BhdGggOiBQYXRoIHdoZXJlIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXJlIHRvIGJlIGV4dHJhY3RlZAogIC8vICAgJHBfcmVtb3ZlX3BhdGggOiBGaXJzdCBwYXJ0ICgncm9vdCcgcGFydCkgb2YgdGhlIG1lbW9yaXplZCBwYXRoCiAgLy8gICAgICAgICAgICAgICAgICAgIChpZiBhbnkgc2ltaWxhcikgdG8gcmVtb3ZlIHdoaWxlIGV4dHJhY3RpbmcuCiAgLy8gT3B0aW9ucyA6CiAgLy8gICBQQ0xaSVBfT1BUX1BBVEggOgogIC8vICAgUENMWklQX09QVF9BRERfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgOiBUaGUgZmlsZXMgYXJlIGV4dHJhY3RlZCBhcyBzdHJpbmdzIGFuZAogIC8vICAgICBub3QgYXMgZmlsZXMuCiAgLy8gICAgIFRoZSByZXN1bHRpbmcgY29udGVudCBpcyBpbiBhIG5ldyBmaWVsZCAnY29udGVudCcgaW4gdGhlIGZpbGUKICAvLyAgICAgc3RydWN0dXJlLgogIC8vICAgICBUaGlzIG9wdGlvbiBtdXN0IGJlIHVzZWQgYWxvbmUgKGFueSBvdGhlciBvcHRpb25zIGFyZSBpZ25vcmVkKS4KICAvLyAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA6CiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gZmFpbHVyZSwKICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBleHRyYWN0ZWQgZmlsZXMsIHdpdGggYSBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vZnVuY3Rpb24gZXh0cmFjdEJ5SW5kZXgoJHBfaW5kZXgsIG9wdGlvbnMuLi4pCiAgZnVuY3Rpb24gZXh0cmFjdEJ5SW5kZXgoJHBfaW5kZXgpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIENoZWNrIGFyY2hpdmUKICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKICAgICR2X29wdGlvbnMgPSBhcnJheSgpOwovLyAgICAkdl9wYXRoID0gIi4vIjsKICAgICR2X3BhdGggPSAnJzsKICAgICR2X3JlbW92ZV9wYXRoID0gIiI7CiAgICAkdl9yZW1vdmVfYWxsX3BhdGggPSBmYWxzZTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciB2YXJpYWJsZSBvcHRpb25zIGFyZ3VtZW50cwogICAgJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsKCiAgICAvLyAtLS0tLSBEZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uCiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkddID0gRkFMU0U7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgYXJndW1lbnRzCiAgICBpZiAoJHZfc2l6ZSA+IDEpIHsKICAgICAgLy8gLS0tLS0gR2V0IHRoZSBhcmd1bWVudHMKICAgICAgJHZfYXJnX2xpc3QgPSBmdW5jX2dldF9hcmdzKCk7CgogICAgICAvLyAtLS0tLSBSZW1vdmUgZm9ybSB0aGUgb3B0aW9ucyBsaXN0IHRoZSBmaXJzdCBhcmd1bWVudAogICAgICBhcnJheV9zaGlmdCgkdl9hcmdfbGlzdCk7CiAgICAgICR2X3NpemUtLTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpcnN0IGFyZwogICAgICBpZiAoKGlzX2ludGVnZXIoJHZfYXJnX2xpc3RbMF0pKSAmJiAoJHZfYXJnX2xpc3RbMF0gPiA3NzAwMCkpIHsKCiAgICAgICAgLy8gLS0tLS0gUGFyc2UgdGhlIG9wdGlvbnMKICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSAoUENMWklQX09QVF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklORyA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0FERF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfU0VUX0NITU9EID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGID0+ICdvcHRpb25hbCcKCQkJCQkJCQkJCQkJICAgKSk7CiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFNldCB0aGUgYXJndW1lbnRzCiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9QQVRIXSkpIHsKICAgICAgICAgICR2X3BhdGggPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdKSkgewogICAgICAgICAgJHZfcmVtb3ZlX3BhdGggPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKSB7CiAgICAgICAgICAkdl9yZW1vdmVfYWxsX3BhdGggPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0pKSB7CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgJy8nIGluIGxhc3QgcGF0aCBjaGFyCiAgICAgICAgICBpZiAoKHN0cmxlbigkdl9wYXRoKSA+IDApICYmIChzdWJzdHIoJHZfcGF0aCwgLTEpICE9ICcvJykpIHsKICAgICAgICAgICAgJHZfcGF0aCAuPSAnLyc7CiAgICAgICAgICB9CiAgICAgICAgICAkdl9wYXRoIC49ICR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmICghaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSkpIHsKICAgICAgICAgICR2X29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklOR10gPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciAyIGFyZ3MKICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGhpc3RvcmljIHN5bm9wc2lzIG9mIHRoZQogICAgICAvLyBtZXRob2QuCiAgICAgIGVsc2UgewoKICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgJHZfcGF0aCA9ICR2X2FyZ19saXN0WzBdOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgaWYgKCR2X3NpemUgPT0gMikgewogICAgICAgICAgJHZfcmVtb3ZlX3BhdGggPSAkdl9hcmdfbGlzdFsxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHZfc2l6ZSA+IDIpIHsKICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgbnVtYmVyIC8gdHlwZSBvZiBhcmd1bWVudHMiKTsKCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFRyYWNlCgogICAgLy8gLS0tLS0gVHJpY2sKICAgIC8vIEhlcmUgSSB3YW50IHRvIHJldXNlIGV4dHJhY3RCeVJ1bGUoKSwgc28gSSBuZWVkIHRvIHBhcnNlIHRoZSAkcF9pbmRleAogICAgLy8gd2l0aCBwcml2UGFyc2VPcHRpb25zKCkKICAgICR2X2FyZ190cmljayA9IGFycmF5IChQQ0xaSVBfT1BUX0JZX0lOREVYLCAkcF9pbmRleCk7CiAgICAkdl9vcHRpb25zX3RyaWNrID0gYXJyYXkoKTsKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UGFyc2VPcHRpb25zKCR2X2FyZ190cmljaywgc2l6ZW9mKCR2X2FyZ190cmljayksICR2X29wdGlvbnNfdHJpY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSAoUENMWklQX09QVF9CWV9JTkRFWCA9PiAnb3B0aW9uYWwnICkpOwogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdID0gJHZfb3B0aW9uc190cmlja1tQQ0xaSVBfT1BUX0JZX0lOREVYXTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBkZWZhdWx0IG9wdGlvbiB2YWx1ZXMKICAgICR0aGlzLT5wcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgkdl9vcHRpb25zKTsKCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBleHRyYWN0aW5nIGZjdAogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkV4dHJhY3RCeVJ1bGUoJHBfbGlzdCwgJHZfcGF0aCwgJHZfcmVtb3ZlX3BhdGgsICR2X3JlbW92ZV9hbGxfcGF0aCwgJHZfb3B0aW9ucykpIDwgMSkgewogICAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDoKICAvLyAgIGRlbGV0ZShbJHBfb3B0aW9uLCAkcF9vcHRpb25fdmFsdWUsIC4uLl0pCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgcmVtb3ZlcyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlLgogIC8vICAgSWYgbm8gcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHRoZW4gYWxsIHRoZSBhcmNoaXZlIGlzIGVtcHRpZWQuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICBOb25lIG9yIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAvLyBPcHRpb25zIDoKICAvLyAgIFBDTFpJUF9PUFRfQllfSU5ERVggOgogIC8vICAgUENMWklQX09QVF9CWV9OQU1FIDoKICAvLyAgIFBDTFpJUF9PUFRfQllfRVJFRyA6CiAgLy8gICBQQ0xaSVBfT1BUX0JZX1BSRUcgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBmYWlsdXJlLAogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSBzdGlsbCBwcmVzZW50IGluIHRoZSBhcmNoaXZlLgogIC8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gZGVsZXRlKCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gQ2hlY2sgYXJjaGl2ZQogICAgaWYgKCEkdGhpcy0+cHJpdkNoZWNrRm9ybWF0KCkpIHsKICAgICAgcmV0dXJuKDApOwogICAgfQoKICAgIC8vIC0tLS0tIFNldCBkZWZhdWx0IHZhbHVlcwogICAgJHZfb3B0aW9ucyA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgdmFyaWFibGUgb3B0aW9ucyBhcmd1bWVudHMKICAgICR2X3NpemUgPSBmdW5jX251bV9hcmdzKCk7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgYXJndW1lbnRzCiAgICBpZiAoJHZfc2l6ZSA+IDApIHsKICAgICAgLy8gLS0tLS0gR2V0IHRoZSBhcmd1bWVudHMKICAgICAgJHZfYXJnX2xpc3QgPSBmdW5jX2dldF9hcmdzKCk7CgogICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucwogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX0JZX05BTUUgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0VSRUcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX1BSRUcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0lOREVYID0+ICdvcHRpb25hbCcgKSk7CiAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gQ2FsbCB0aGUgZGVsZXRlIGZjdAogICAgJHZfbGlzdCA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RGVsZXRlQnlSdWxlKCR2X2xpc3QsICR2X29wdGlvbnMpKSAhPSAxKSB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICB1bnNldCgkdl9saXN0KTsKICAgICAgcmV0dXJuKDApOwogICAgfQoKICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfbGlzdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IGRlbGV0ZUJ5SW5kZXgoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgICoqKioqIERlcHJlY2F0ZWQgKioqKioKICAvLyAgIGRlbGV0ZShQQ0xaSVBfT1BUX0JZX0lOREVYLCAkcF9pbmRleCkgc2hvdWxkIGJlIHByZWZlcmVkLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gZGVsZXRlQnlJbmRleCgkcF9pbmRleCkKICB7CgogICAgJHBfbGlzdCA9ICR0aGlzLT5kZWxldGUoUENMWklQX09QVF9CWV9JTkRFWCwgJHBfaW5kZXgpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICRwX2xpc3Q7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcm9wZXJ0aWVzKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJjaGl2ZS4KICAvLyAgIFRoZSBwcm9wZXJ0aWVzIGFyZSA6CiAgLy8gICAgIG5iIDogTnVtYmVyIG9mIGZpbGVzIGluIHRoZSBhcmNoaXZlCiAgLy8gICAgIGNvbW1lbnQgOiBDb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJjaGl2ZSBmaWxlCiAgLy8gICAgIHN0YXR1cyA6IG5vdF9leGlzdCwgb2sKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgIE5vbmUKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gZmFpbHVyZSwKICAvLyAgIEFuIGFycmF5IHdpdGggdGhlIGFyY2hpdmUgcHJvcGVydGllcy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByb3BlcnRpZXMoKQogIHsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIENoZWNrIGFyY2hpdmUKICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gRGVmYXVsdCBwcm9wZXJ0aWVzCiAgICAkdl9wcm9wID0gYXJyYXkoKTsKICAgICR2X3Byb3BbJ2NvbW1lbnQnXSA9ICcnOwogICAgJHZfcHJvcFsnbmInXSA9IDA7CiAgICAkdl9wcm9wWydzdGF0dXMnXSA9ICdub3RfZXhpc3QnOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgZmlsZSBleGlzdHMKICAgIGlmIChAaXNfZmlsZSgkdGhpcy0+emlwbmFtZSkpCiAgICB7CiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICAgIGlmICgoJHRoaXMtPnppcF9mZCA9IEBmb3BlbigkdGhpcy0+emlwbmFtZSwgJ3JiJykpID09IDApCiAgICAgIHsKICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CgogICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMKICAgICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgICB7CiAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgIC8vIC0tLS0tIFNldCB0aGUgdXNlciBhdHRyaWJ1dGVzCiAgICAgICR2X3Byb3BbJ2NvbW1lbnQnXSA9ICR2X2NlbnRyYWxfZGlyWydjb21tZW50J107CiAgICAgICR2X3Byb3BbJ25iJ10gPSAkdl9jZW50cmFsX2RpclsnZW50cmllcyddOwogICAgICAkdl9wcm9wWydzdGF0dXMnXSA9ICdvayc7CiAgICB9CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9wcm9wOwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogZHVwbGljYXRlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIG1ldGhvZCBjcmVhdGVzIGFuIGFyY2hpdmUgYnkgY29weWluZyB0aGUgY29udGVudCBvZiBhbiBvdGhlciBvbmUuIElmCiAgLy8gICB0aGUgYXJjaGl2ZSBhbHJlYWR5IGV4aXN0LCBpdCBpcyByZXBsYWNlZCBieSB0aGUgbmV3IG9uZSB3aXRob3V0IGFueSB3YXJuaW5nLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfYXJjaGl2ZSA6IFRoZSBmaWxlbmFtZSBvZiBhIHZhbGlkIGFyY2hpdmUsIG9yCiAgLy8gICAgICAgICAgICAgICAgYSB2YWxpZCBQY2xaaXAgb2JqZWN0LgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLgogIC8vICAgMCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yIChlcnJvciBjb2RlKS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGR1cGxpY2F0ZSgkcF9hcmNoaXZlKQogIHsKICAgICR2X3Jlc3VsdCA9IDE7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmUgaXMgYSBQY2xaaXAgb2JqZWN0CiAgICBpZiAoKGlzX29iamVjdCgkcF9hcmNoaXZlKSkgJiYgKGdldF9jbGFzcygkcF9hcmNoaXZlKSA9PSAncGNsemlwJykpCiAgICB7CgogICAgICAvLyAtLS0tLSBEdXBsaWNhdGUgdGhlIGFyY2hpdmUKICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEdXBsaWNhdGUoJHBfYXJjaGl2ZS0+emlwbmFtZSk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZSBpcyBhIHN0cmluZyAoc28gYSBmaWxlbmFtZSkKICAgIGVsc2UgaWYgKGlzX3N0cmluZygkcF9hcmNoaXZlKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgJHBfYXJjaGl2ZSBpcyBhIHZhbGlkIHppcCBmaWxlCiAgICAgIC8vIFRCQyA6IFNob3VsZCBhbHNvIGNoZWNrIHRoZSBhcmNoaXZlIGZvcm1hdAogICAgICBpZiAoIWlzX2ZpbGUoJHBfYXJjaGl2ZSkpIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIk5vIGZpbGUgd2l0aCBmaWxlbmFtZSAnIi4kcF9hcmNoaXZlLiInIik7CiAgICAgICAgJHZfcmVzdWx0ID0gUENMWklQX0VSUl9NSVNTSU5HX0ZJTEU7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLy8gLS0tLS0gRHVwbGljYXRlIHRoZSBhcmNoaXZlCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEdXBsaWNhdGUoJHBfYXJjaGl2ZSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlCiAgICBlbHNlCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlIHBfYXJjaGl2ZV90b19hZGQiKTsKICAgICAgJHZfcmVzdWx0ID0gUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBtZXJnZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgbWVyZ2UgdGhlICRwX2FyY2hpdmVfdG9fYWRkIGFyY2hpdmUgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudAogIC8vICAgb25lICgkdGhpcykuCiAgLy8gICBJZiB0aGUgYXJjaGl2ZSAoJHRoaXMpIGRvZXMgbm90IGV4aXN0LCB0aGUgbWVyZ2UgYmVjb21lcyBhIGR1cGxpY2F0ZS4KICAvLyAgIElmIHRoZSAkcF9hcmNoaXZlX3RvX2FkZCBhcmNoaXZlIGRvZXMgbm90IGV4aXN0LCB0aGUgbWVyZ2UgaXMgYSBzdWNjZXNzLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfYXJjaGl2ZV90b19hZGQgOiBJdCBjYW4gYmUgZGlyZWN0bHkgdGhlIGZpbGVuYW1lIG9mIGEgdmFsaWQgemlwIGFyY2hpdmUsCiAgLy8gICAgICAgICAgICAgICAgICAgICAgIG9yIGEgUGNsWmlwIG9iamVjdCBhcmNoaXZlLgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLAogIC8vICAgMCBvciBuZWdhdGl2ZSB2YWx1ZXMgb24gZXJyb3IgKHNlZSBiZWxvdykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBtZXJnZSgkcF9hcmNoaXZlX3RvX2FkZCkKICB7CiAgICAkdl9yZXN1bHQgPSAxOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlCiAgICBpZiAoISR0aGlzLT5wcml2Q2hlY2tGb3JtYXQoKSkgewogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZV90b19hZGQgaXMgYSBQY2xaaXAgb2JqZWN0CiAgICBpZiAoKGlzX29iamVjdCgkcF9hcmNoaXZlX3RvX2FkZCkpICYmIChnZXRfY2xhc3MoJHBfYXJjaGl2ZV90b19hZGQpID09ICdwY2x6aXAnKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIE1lcmdlIHRoZSBhcmNoaXZlCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2TWVyZ2UoJHBfYXJjaGl2ZV90b19hZGQpOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmVfdG9fYWRkIGlzIGEgc3RyaW5nIChzbyBhIGZpbGVuYW1lKQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2FyY2hpdmVfdG9fYWRkKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIENyZWF0ZSBhIHRlbXBvcmFyeSBhcmNoaXZlCiAgICAgICR2X29iamVjdF9hcmNoaXZlID0gbmV3IFBjbFppcCgkcF9hcmNoaXZlX3RvX2FkZCk7CgogICAgICAvLyAtLS0tLSBNZXJnZSB0aGUgYXJjaGl2ZQogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdk1lcmdlKCR2X29iamVjdF9hcmNoaXZlKTsKICAgIH0KCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlCiAgICBlbHNlCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlIHBfYXJjaGl2ZV90b19hZGQiKTsKICAgICAgJHZfcmVzdWx0ID0gUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IGVycm9yQ29kZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gZXJyb3JDb2RlKCkKICB7CiAgICBpZiAoUENMWklQX0VSUk9SX0VYVEVSTkFMID09IDEpIHsKICAgICAgcmV0dXJuKFBjbEVycm9yQ29kZSgpKTsKICAgIH0KICAgIGVsc2UgewogICAgICByZXR1cm4oJHRoaXMtPmVycm9yX2NvZGUpOwogICAgfQogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogZXJyb3JOYW1lKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBlcnJvck5hbWUoJHBfd2l0aF9jb2RlPWZhbHNlKQogIHsKICAgICR2X25hbWUgPSBhcnJheSAoIFBDTFpJUF9FUlJfTk9fRVJST1IgPT4gJ1BDTFpJUF9FUlJfTk9fRVJST1InLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwgPT4gJ1BDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwgPT4gJ1BDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiA9PiAnUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUicsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSA9PiAnUENMWklQX0VSUl9NSVNTSU5HX0ZJTEUnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORyA9PiAnUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORycsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0lOVkFMSURfWklQID0+ICdQQ0xaSVBfRVJSX0lOVkFMSURfWklQJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfQkFEX0VYVFJBQ1RFRF9GSUxFID0+ICdQQ0xaSVBfRVJSX0JBRF9FWFRSQUNURURfRklMRScsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0RJUl9DUkVBVEVfRkFJTCA9PiAnUENMWklQX0VSUl9ESVJfQ1JFQVRFX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9CQURfRVhURU5TSU9OID0+ICdQQ0xaSVBfRVJSX0JBRF9FWFRFTlNJT04nLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9CQURfRk9STUFUID0+ICdQQ0xaSVBfRVJSX0JBRF9GT1JNQVQnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9ERUxFVEVfRklMRV9GQUlMID0+ICdQQ0xaSVBfRVJSX0RFTEVURV9GSUxFX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9SRU5BTUVfRklMRV9GQUlMID0+ICdQQ0xaSVBfRVJSX1JFTkFNRV9GSUxFX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9CQURfQ0hFQ0tTVU0gPT4gJ1BDTFpJUF9FUlJfQkFEX0NIRUNLU1VNJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfSU5WQUxJRF9BUkNISVZFX1pJUCA9PiAnUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUgPT4gJ1BDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSA9PiAnUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRScsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OID0+ICdQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTiA9PiAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OJwogICAgICAgICAgICAgICAgICAgICAgLFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUgPT4gJ1BDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUnCiAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX0VSUl9ESVJFQ1RPUllfUkVTVFJJQ1RJT04gPT4gJ1BDTFpJUF9FUlJfRElSRUNUT1JZX1JFU1RSSUNUSU9OJwogICAgICAgICAgICAgICAgICAgICk7CgogICAgaWYgKGlzc2V0KCR2X25hbWVbJHRoaXMtPmVycm9yX2NvZGVdKSkgewogICAgICAkdl92YWx1ZSA9ICR2X25hbWVbJHRoaXMtPmVycm9yX2NvZGVdOwogICAgfQogICAgZWxzZSB7CiAgICAgICR2X3ZhbHVlID0gJ05vTmFtZSc7CiAgICB9CgogICAgaWYgKCRwX3dpdGhfY29kZSkgewogICAgICByZXR1cm4oJHZfdmFsdWUuJyAoJy4kdGhpcy0+ZXJyb3JfY29kZS4nKScpOwogICAgfQogICAgZWxzZSB7CiAgICAgIHJldHVybigkdl92YWx1ZSk7CiAgICB9CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBlcnJvckluZm8oKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGVycm9ySW5mbygkcF9mdWxsPWZhbHNlKQogIHsKICAgIGlmIChQQ0xaSVBfRVJST1JfRVhURVJOQUwgPT0gMSkgewogICAgICByZXR1cm4oUGNsRXJyb3JTdHJpbmcoKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKCRwX2Z1bGwpIHsKICAgICAgICByZXR1cm4oJHRoaXMtPmVycm9yTmFtZSh0cnVlKS4iIDogIi4kdGhpcy0+ZXJyb3Jfc3RyaW5nKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICByZXR1cm4oJHRoaXMtPmVycm9yX3N0cmluZy4iIFtjb2RlICIuJHRoaXMtPmVycm9yX2NvZGUuIl0iKTsKICAgICAgfQogICAgfQogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICoqKioqIFVOREVSIFRISVMgTElORSBBUkUgREVGSU5FRCBQUklWQVRFIElOVEVSTkFMIEZVTkNUSU9OUyAqKioqKgovLyAqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioKLy8gKioqKiogICAgICAgVEhFU0VTIEZVTkNUSU9OUyBNVVNUIE5PVCBCRSBVU0VEIERJUkVDVExZICAgICAgICoqKioqCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZDaGVja0Zvcm1hdCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgY2hlY2sgdGhhdCB0aGUgYXJjaGl2ZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgemlwIGFyY2hpdmUuCiAgLy8gICBTZXZlcmFsIGxldmVsIG9mIGNoZWNrIGV4aXN0cy4gKGZ1dHVyKQogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfbGV2ZWwgOiBMZXZlbCBvZiBjaGVjay4gRGVmYXVsdCAwLgogIC8vICAgICAgICAgICAgICAwIDogQ2hlY2sgdGhlIGZpcnN0IGJ5dGVzIChtYWdpYyBjb2RlcykgKGRlZmF1bHQgdmFsdWUpKQogIC8vICAgICAgICAgICAgICAxIDogMCArIENoZWNrIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAoZnV0dXIpCiAgLy8gICAgICAgICAgICAgIDIgOiAxICsgQ2hlY2sgZWFjaCBmaWxlIGhlYWRlciAoZnV0dXIpCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICB0cnVlIG9uIHN1Y2Nlc3MsCiAgLy8gICBmYWxzZSBvbiBlcnJvciwgdGhlIGVycm9yIGNvZGUgaXMgc2V0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkNoZWNrRm9ybWF0KCRwX2xldmVsPTApCiAgewogICAgJHZfcmVzdWx0ID0gdHJ1ZTsKCgkvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBzeXN0ZW0gY2FjaGUKICAgIGNsZWFyc3RhdGNhY2hlKCk7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpbGUgZXhpdHMKICAgIGlmICghaXNfZmlsZSgkdGhpcy0+emlwbmFtZSkpIHsKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFLCAiTWlzc2luZyBhcmNoaXZlIGZpbGUgJyIuJHRoaXMtPnppcG5hbWUuIiciKTsKICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGlzIHJlYWRlYWJsZQogICAgaWYgKCFpc19yZWFkYWJsZSgkdGhpcy0+emlwbmFtZSkpIHsKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICJVbmFibGUgdG8gcmVhZCBhcmNoaXZlICciLiR0aGlzLT56aXBuYW1lLiInIik7CiAgICAgIHJldHVybihmYWxzZSk7CiAgICB9CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG1hZ2ljIGNvZGUKICAgIC8vIFRCQwoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBjZW50cmFsIGhlYWRlcgogICAgLy8gVEJDCgogICAgLy8gLS0tLS0gQ2hlY2sgZWFjaCBmaWxlIGhlYWRlcgogICAgLy8gVEJDCgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdlBhcnNlT3B0aW9ucygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBpbnRlcm5hbCBtZXRob2RzIHJlYWRzIHRoZSB2YXJpYWJsZSBsaXN0IG9mIGFyZ3VtZW50cyAoJHBfb3B0aW9uc19saXN0LAogIC8vICAgJHBfc2l6ZSkgYW5kIGdlbmVyYXRlIGFuIGFycmF5IHdpdGggdGhlIG9wdGlvbnMgYW5kIHZhbHVlcyAoJHZfcmVzdWx0X2xpc3QpLgogIC8vICAgJHZfcmVxdWVzdGVkX29wdGlvbnMgY29udGFpbnMgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgcHJlc2VudCBhbmQgdGhvc2UgdGhhdAogIC8vICAgbXVzdCBiZSBwcmVzZW50LgogIC8vICAgJHZfcmVxdWVzdGVkX29wdGlvbnMgaXMgYW4gYXJyYXksIHdpdGggdGhlIG9wdGlvbiB2YWx1ZSBhcyBrZXksIGFuZCAnb3B0aW9uYWwnLAogIC8vICAgb3IgJ21hbmRhdG9yeScgYXMgdmFsdWUuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICBTZWUgYWJvdmUuCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAxIG9uIHN1Y2Nlc3MuCiAgLy8gICAwIG9uIGZhaWx1cmUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2UGFyc2VPcHRpb25zKCYkcF9vcHRpb25zX2xpc3QsICRwX3NpemUsICYkdl9yZXN1bHRfbGlzdCwgJHZfcmVxdWVzdGVkX29wdGlvbnM9ZmFsc2UpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgb3B0aW9ucwogICAgJGk9MDsKICAgIHdoaWxlICgkaTwkcF9zaXplKSB7CgogICAgICAvLyAtLS0tLSBDaGVjayBpZiB0aGUgb3B0aW9uIGlzIHN1cHBvcnRlZAogICAgICBpZiAoIWlzc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zWyRwX29wdGlvbnNfbGlzdFskaV1dKSkgewogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIG9wdGlvbmFsIHBhcmFtZXRlciAnIi4kcF9vcHRpb25zX2xpc3RbJGldLiInIGZvciB0aGlzIG1ldGhvZCIpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbmV4dCBvcHRpb24KICAgICAgc3dpdGNoICgkcF9vcHRpb25zX2xpc3RbJGldKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHJlcXVlc3QgYSBwYXRoIHZhbHVlCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1BBVEggOgogICAgICAgIGNhc2UgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0FERF9QQVRIIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfb3B0aW9uc19saXN0WyRpKzFdLCBGQUxTRSk7CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgaW5jb21wYXRpYmxlIG9wdGlvbnMKICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgdmFsdWUKICAgICAgICAgICR2X3ZhbHVlID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgaWYgKCghaXNfaW50ZWdlcigkdl92YWx1ZSkpIHx8ICgkdl92YWx1ZTwwKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiSW50ZWdlciBleHBlY3RlZCBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUgKGFuZCBjb252ZXJ0IGl0IGluIGJ5dGVzKQogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkdl92YWx1ZSoxMDQ4NTc2OwogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTiA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgaW5jb21wYXRpYmxlIG9wdGlvbnMKICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IHRydWU7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciBpbmNvbXBhdGlibGUgb3B0aW9ucwogICAgICAgICAgaWYgKGlzc2V0KCR2X3Jlc3VsdF9saXN0W1BDTFpJUF9PUFRfVEVNUF9GSUxFX09OXSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyBjYW4gbm90IGJlIHVzZWQgd2l0aCBvcHRpb24gJ1BDTFpJUF9PUFRfVEVNUF9GSUxFX09OJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciBpbmNvbXBhdGlibGUgb3B0aW9ucwogICAgICAgICAgaWYgKGlzc2V0KCR2X3Jlc3VsdF9saXN0W1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJPcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIicgY2FuIG5vdCBiZSB1c2VkIHdpdGggb3B0aW9uICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQnIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gdHJ1ZTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgIGlmICggICBpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKQogICAgICAgICAgICAgICYmICgkcF9vcHRpb25zX2xpc3RbJGkrMV0gIT0gJycpKSB7CiAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfb3B0aW9uc19saXN0WyRpKzFdLCBGQUxTRSk7CiAgICAgICAgICAgICRpKys7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHJlcXVlc3QgYW4gYXJyYXkgb2Ygc3RyaW5nIGZvciB2YWx1ZQogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9OQU1FIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewogICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dWzBdID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNfYXJyYXkoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewogICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiV3JvbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KICAgICAgICAgICRpKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGFuIEVSRUcgb3IgUFJFRyBleHByZXNzaW9uCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0JZX0VSRUcgOgogICAgICAgICAgLy8gZXJlZygpIGlzIGRlcHJlY2F0ZWQgc3RhcnRpbmcgd2l0aCBQSFAgNS4zLiBNb3ZlIFBDTFpJUF9PUFRfQllfRVJFRwogICAgICAgICAgLy8gdG8gUENMWklQX09QVF9CWV9QUkVHCiAgICAgICAgICAkcF9vcHRpb25zX2xpc3RbJGldID0gUENMWklQX09QVF9CWV9QUkVHOwogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9QUkVHIDoKICAgICAgICAvL2Nhc2UgUENMWklQX09QVF9DUllQVCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRwX29wdGlvbnNfbGlzdFskaSsxXSkpIHsKICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSwgIldyb25nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgdGFrZXMgYSBzdHJpbmcKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfQ09NTUVOVCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0FERF9DT01NRU5UIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLAoJCQkgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIgoJCQkJCQkJCSAuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkKCQkJCQkJCQkgLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSB2YWx1ZQogICAgICAgICAgaWYgKGlzX3N0cmluZygkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CiAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkcF9vcHRpb25zX2xpc3RbJGkrMV07CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsCgkJCSAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIgoJCQkJCQkJCSAuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkKCQkJCQkJCQkgLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhbiBhcnJheSBvZiBpbmRleAogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9JTkRFWCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICAkdl93b3JrX2xpc3QgPSBhcnJheSgpOwogICAgICAgICAgaWYgKGlzX3N0cmluZygkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CgogICAgICAgICAgICAgIC8vIC0tLS0tIFJlbW92ZSBzcGFjZXMKICAgICAgICAgICAgICAkcF9vcHRpb25zX2xpc3RbJGkrMV0gPSBzdHJ0cigkcF9vcHRpb25zX2xpc3RbJGkrMV0sICcgJywgJycpOwoKICAgICAgICAgICAgICAvLyAtLS0tLSBQYXJzZSBpdGVtcwogICAgICAgICAgICAgICR2X3dvcmtfbGlzdCA9IGV4cGxvZGUoIiwiLCAkcF9vcHRpb25zX2xpc3RbJGkrMV0pOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNfaW50ZWdlcigkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CiAgICAgICAgICAgICAgJHZfd29ya19saXN0WzBdID0gJHBfb3B0aW9uc19saXN0WyRpKzFdLictJy4kcF9vcHRpb25zX2xpc3RbJGkrMV07CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmIChpc19hcnJheSgkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CiAgICAgICAgICAgICAgJHZfd29ya19saXN0ID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiVmFsdWUgbXVzdCBiZSBpbnRlZ2VyLCBzdHJpbmcgb3IgYXJyYXkgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIFJlZHVjZSB0aGUgaW5kZXggbGlzdAogICAgICAgICAgLy8gZWFjaCBpbmRleCBpdGVtIGluIHRoZSBsaXN0IG11c3QgYmUgYSBjb3VwbGUgd2l0aCBhIHN0YXJ0IGFuZAogICAgICAgICAgLy8gYW4gZW5kIHZhbHVlIDogWzAsM10sIFs1LTVdLCBbOC0xMF0sIC4uLgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGZvcm1hdCBvZiBlYWNoIGl0ZW0KICAgICAgICAgICR2X3NvcnRfZmxhZz1mYWxzZTsKICAgICAgICAgICR2X3NvcnRfdmFsdWU9MDsKICAgICAgICAgIGZvciAoJGo9MDsgJGo8c2l6ZW9mKCR2X3dvcmtfbGlzdCk7ICRqKyspIHsKICAgICAgICAgICAgICAvLyAtLS0tLSBFeHBsb2RlIHRoZSBpdGVtCiAgICAgICAgICAgICAgJHZfaXRlbV9saXN0ID0gZXhwbG9kZSgiLSIsICR2X3dvcmtfbGlzdFskal0pOwogICAgICAgICAgICAgICR2X3NpemVfaXRlbV9saXN0ID0gc2l6ZW9mKCR2X2l0ZW1fbGlzdCk7CgogICAgICAgICAgICAgIC8vIC0tLS0tIFRCQyA6IEhlcmUgd2UgbWlnaHQgY2hlY2sgdGhhdCBlYWNoIGl0ZW0gaXMgYQogICAgICAgICAgICAgIC8vIHJlYWwgaW50ZWdlciAuLi4KCiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igc2luZ2xlIHZhbHVlCiAgICAgICAgICAgICAgaWYgKCR2X3NpemVfaXRlbV9saXN0ID09IDEpIHsKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBvcHRpb24gdmFsdWUKICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydzdGFydCddID0gJHZfaXRlbV9saXN0WzBdOwogICAgICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ2VuZCddID0gJHZfaXRlbV9saXN0WzBdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlaWYgKCR2X3NpemVfaXRlbV9saXN0ID09IDIpIHsKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBvcHRpb24gdmFsdWUKICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydzdGFydCddID0gJHZfaXRlbV9saXN0WzBdOwogICAgICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ2VuZCddID0gJHZfaXRlbV9saXN0WzFdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJUb28gbWFueSB2YWx1ZXMgaW4gaW5kZXggcmFuZ2UgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGxpc3Qgc29ydAogICAgICAgICAgICAgIGlmICgkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ3N0YXJ0J10gPCAkdl9zb3J0X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICR2X3NvcnRfZmxhZz10cnVlOwoKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gVEJDIDogQW4gYXV0b21hdGljIHNvcnQgc2hvdWxkIGJlIHdyaXRlbiAuLi4KICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJJbnZhbGlkIG9yZGVyIG9mIGluZGV4IHJhbmdlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJHZfc29ydF92YWx1ZSA9ICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dWyRqXVsnc3RhcnQnXTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBTb3J0IHRoZSBpdGVtcwogICAgICAgICAgaWYgKCR2X3NvcnRfZmxhZykgewogICAgICAgICAgICAgIC8vIFRCQyA6IFRvIEJlIENvbXBsZXRlZAogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIE5leHQgb3B0aW9uCiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBubyB2YWx1ZQogICAgICAgIGNhc2UgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOgogICAgICAgIGNhc2UgUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklORyA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQgOgogICAgICAgIGNhc2UgUENMWklQX09QVF9SRVBMQUNFX05FV0VSIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUiA6CiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IHRydWU7CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGFuIG9jdGFsIHZhbHVlCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1NFVF9DSE1PRCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgICRpKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGEgY2FsbC1iYWNrCiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgOgogICAgICAgIGNhc2UgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0FERCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUE9TVF9BREQgOgogICAgICAgIC8qIGZvciBmdXR1ciB1c2UKICAgICAgICBjYXNlIFBDTFpJUF9DQl9QUkVfREVMRVRFIDoKICAgICAgICBjYXNlIFBDTFpJUF9DQl9QT1NUX0RFTEVURSA6CiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0xJU1QgOgogICAgICAgIGNhc2UgUENMWklQX0NCX1BPU1RfTElTVCA6CiAgICAgICAgKi8KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgICR2X2Z1bmN0aW9uX25hbWUgPSAkcF9vcHRpb25zX2xpc3RbJGkrMV07CgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgYSB2YWxpZCBleGlzdGluZyBmdW5jdGlvbgogICAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJHZfZnVuY3Rpb25fbmFtZSkpIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJGdW5jdGlvbiAnIi4kdl9mdW5jdGlvbl9uYW1lLiIoKScgaXMgbm90IGFuIGV4aXN0aW5nIGZ1bmN0aW9uIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGF0dHJpYnV0ZQogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkdl9mdW5jdGlvbl9uYW1lOwogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsCgkJICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwYXJhbWV0ZXIgJyIKCQkJCQkJCSAgIC4kcF9vcHRpb25zX2xpc3RbJGldLiInIik7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTmV4dCBvcHRpb25zCiAgICAgICRpKys7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbnMKICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyAhPT0gZmFsc2UpIHsKICAgICAgZm9yICgka2V5PXJlc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zKTsgJGtleT1rZXkoJHZfcmVxdWVzdGVkX29wdGlvbnMpOyAka2V5PW5leHQoJHZfcmVxdWVzdGVkX29wdGlvbnMpKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbgogICAgICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9uc1ska2V5XSA9PSAnbWFuZGF0b3J5JykgewogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiBwcmVzZW50CiAgICAgICAgICBpZiAoIWlzc2V0KCR2X3Jlc3VsdF9saXN0WyRrZXldKSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlciAiLlBjbFppcFV0aWxPcHRpb25UZXh0KCRrZXkpLiIoIi4ka2V5LiIpIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCB2YWx1ZXMKICAgIGlmICghaXNzZXQoJHZfcmVzdWx0X2xpc3RbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSkpIHsKCiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pCiAgICAgICAgfHwgaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgewogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIEdldCAnbWVtb3J5X2xpbWl0JyBjb25maWd1cmF0aW9uIHZhbHVlCiAgICAkdl9tZW1vcnlfbGltaXQgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKICAgICR2X21lbW9yeV9saW1pdCA9IHRyaW0oJHZfbWVtb3J5X2xpbWl0KTsKICAgICRsYXN0ID0gc3RydG9sb3dlcihzdWJzdHIoJHZfbWVtb3J5X2xpbWl0LCAtMSkpOwoKICAgIGlmKCRsYXN0ID09ICdnJykKICAgICAgICAvLyR2X21lbW9yeV9saW1pdCA9ICR2X21lbW9yeV9saW1pdCoxMDI0KjEwMjQqMTAyNDsKICAgICAgICAkdl9tZW1vcnlfbGltaXQgPSAkdl9tZW1vcnlfbGltaXQqMTA3Mzc0MTgyNDsKICAgIGlmKCRsYXN0ID09ICdtJykKICAgICAgICAvLyR2X21lbW9yeV9saW1pdCA9ICR2X21lbW9yeV9saW1pdCoxMDI0KjEwMjQ7CiAgICAgICAgJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwNDg1NzY7CiAgICBpZigkbGFzdCA9PSAnaycpCiAgICAgICAgJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwMjQ7CgogICAgJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdID0gZmxvb3IoJHZfbWVtb3J5X2xpbWl0KlBDTFpJUF9URU1QT1JBUllfRklMRV9SQVRJTyk7CgoKICAgIC8vIC0tLS0tIFNhbml0eSBjaGVjayA6IE5vIHRocmVzaG9sZCBpZiB2YWx1ZSBsb3dlciB0aGFuIDFNCiAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdIDwgMTA0ODU3NikgewogICAgICB1bnNldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pOwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZGaWxlRGVzY3JQYXJzZUF0dCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLgogIC8vICAgMCBvbiBmYWlsdXJlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkZpbGVEZXNjclBhcnNlQXR0KCYkcF9maWxlX2xpc3QsICYkcF9maWxlZGVzY3IsICR2X29wdGlvbnMsICR2X3JlcXVlc3RlZF9vcHRpb25zPWZhbHNlKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIEZvciBlYWNoIGZpbGUgaW4gdGhlIGxpc3QgY2hlY2sgdGhlIGF0dHJpYnV0ZXMKICAgIGZvcmVhY2ggKCRwX2ZpbGVfbGlzdCBhcyAkdl9rZXkgPT4gJHZfdmFsdWUpIHsKCiAgICAgIC8vIC0tLS0tIENoZWNrIGlmIHRoZSBvcHRpb24gaXMgc3VwcG9ydGVkCiAgICAgIGlmICghaXNzZXQoJHZfcmVxdWVzdGVkX29wdGlvbnNbJHZfa2V5XSkpIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBmaWxlIGF0dHJpYnV0ZSAnIi4kdl9rZXkuIicgZm9yIHRoaXMgZmlsZSIpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYXR0cmlidXRlCiAgICAgIHN3aXRjaCAoJHZfa2V5KSB7CiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTkFNRSA6CiAgICAgICAgICBpZiAoIWlzX3N0cmluZygkdl92YWx1ZSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgdHlwZSAiLmdldHR5cGUoJHZfdmFsdWUpLiIuIFN0cmluZyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgJHBfZmlsZWRlc2NyWydmaWxlbmFtZSddID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHZfdmFsdWUpOwoKICAgICAgICAgIGlmICgkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ10gPT0gJycpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgZW1wdHkgZmlsZW5hbWUgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTkVXX1NIT1JUX05BTUUgOgogICAgICAgICAgaWYgKCFpc19zdHJpbmcoJHZfdmFsdWUpKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBTdHJpbmcgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgICRwX2ZpbGVkZXNjclsnbmV3X3Nob3J0X25hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X3ZhbHVlKTsKCiAgICAgICAgICBpZiAoJHBfZmlsZWRlc2NyWyduZXdfc2hvcnRfbmFtZSddID09ICcnKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIGVtcHR5IHNob3J0IGZpbGVuYW1lIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTkVXX0ZVTExfTkFNRSA6CiAgICAgICAgICBpZiAoIWlzX3N0cmluZygkdl92YWx1ZSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgdHlwZSAiLmdldHR5cGUoJHZfdmFsdWUpLiIuIFN0cmluZyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgJHBfZmlsZWRlc2NyWyduZXdfZnVsbF9uYW1lJ10gPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl92YWx1ZSk7CgogICAgICAgICAgaWYgKCRwX2ZpbGVkZXNjclsnbmV3X2Z1bGxfbmFtZSddID09ICcnKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIGVtcHR5IGZ1bGwgZmlsZW5hbWUgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgdGFrZXMgYSBzdHJpbmcKICAgICAgICBjYXNlIFBDTFpJUF9BVFRfRklMRV9DT01NRU5UIDoKICAgICAgICAgIGlmICghaXNfc3RyaW5nKCR2X3ZhbHVlKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFLCAiSW52YWxpZCB0eXBlICIuZ2V0dHlwZSgkdl92YWx1ZSkuIi4gU3RyaW5nIGV4cGVjdGVkIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ2NvbW1lbnQnXSA9ICR2X3ZhbHVlOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDTFpJUF9BVFRfRklMRV9NVElNRSA6CiAgICAgICAgICBpZiAoIWlzX2ludGVnZXIoJHZfdmFsdWUpKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBJbnRlZ2VyIGV4cGVjdGVkIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ210aW1lJ10gPSAkdl92YWx1ZTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCA6CiAgICAgICAgICAkcF9maWxlZGVzY3JbJ2NvbnRlbnQnXSA9ICR2X3ZhbHVlOwogICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0IDoKICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwYXJhbWV0ZXIgJyIuJHZfa2V5LiInIik7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbnMKICAgICAgaWYgKCR2X3JlcXVlc3RlZF9vcHRpb25zICE9PSBmYWxzZSkgewogICAgICAgIGZvciAoJGtleT1yZXNldCgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyk7ICRrZXk9a2V5KCR2X3JlcXVlc3RlZF9vcHRpb25zKTsgJGtleT1uZXh0KCR2X3JlcXVlc3RlZF9vcHRpb25zKSkgewogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbgogICAgICAgICAgaWYgKCR2X3JlcXVlc3RlZF9vcHRpb25zWyRrZXldID09ICdtYW5kYXRvcnknKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgcHJlc2VudAogICAgICAgICAgICBpZiAoIWlzc2V0KCRwX2ZpbGVfbGlzdFska2V5XSkpIHsKICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICIuUGNsWmlwVXRpbE9wdGlvblRleHQoJGtleSkuIigiLiRrZXkuIikiKTsKICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgIC8vIGVuZCBmb3JlYWNoCiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkZpbGVEZXNjckV4cGFuZCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgbG9vayBmb3IgZWFjaCBpdGVtIG9mIHRoZSBsaXN0IHRvIHNlZSBpZiBpdHMgYSBmaWxlLCBhIGZvbGRlcgogIC8vICAgb3IgYSBzdHJpbmcgdG8gYmUgYWRkZWQgYXMgZmlsZS4gRm9yIGFueSBvdGhlciB0eXBlIG9mIGZpbGVzIChsaW5rLCBvdGhlcikKICAvLyAgIGp1c3QgaWdub3JlIHRoZSBpdGVtLgogIC8vICAgVGhlbiBwcmVwYXJlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgc3RvcmVkIGZvciB0aGF0IGZpbGUuCiAgLy8gICBXaGVuIGl0cyBhIGZvbGRlciwgZXhwYW5kIHRoZSBmb2xkZXIgd2l0aCBhbGwgdGhlIGZpbGVzIHRoYXQgYXJlIGluIHRoYXQKICAvLyAgIGZvbGRlciAocmVjdXJzaXZlbHkpLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLgogIC8vICAgMCBvbiBmYWlsdXJlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkZpbGVEZXNjckV4cGFuZCgmJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIENyZWF0ZSBhIHJlc3VsdCBsaXN0CiAgICAkdl9yZXN1bHRfbGlzdCA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTG9vayBlYWNoIGVudHJ5CiAgICBmb3IgKCRpPTA7ICRpPHNpemVvZigkcF9maWxlZGVzY3JfbGlzdCk7ICRpKyspIHsKCiAgICAgIC8vIC0tLS0tIEdldCBmaWxlZGVzY3IKICAgICAgJHZfZGVzY3IgPSAkcF9maWxlZGVzY3JfbGlzdFskaV07CgogICAgICAvLyAtLS0tLSBSZWR1Y2UgdGhlIGZpbGVuYW1lCiAgICAgICR2X2Rlc2NyWydmaWxlbmFtZSddID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10sIGZhbHNlKTsKICAgICAgJHZfZGVzY3JbJ2ZpbGVuYW1lJ10gPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl9kZXNjclsnZmlsZW5hbWUnXSk7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciByZWFsIGZpbGUgb3IgZm9sZGVyCiAgICAgIGlmIChmaWxlX2V4aXN0cygkdl9kZXNjclsnZmlsZW5hbWUnXSkpIHsKICAgICAgICBpZiAoQGlzX2ZpbGUoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAkdl9kZXNjclsndHlwZSddID0gJ2ZpbGUnOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChAaXNfZGlyKCR2X2Rlc2NyWydmaWxlbmFtZSddKSkgewogICAgICAgICAgJHZfZGVzY3JbJ3R5cGUnXSA9ICdmb2xkZXInOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChAaXNfbGluaygkdl9kZXNjclsnZmlsZW5hbWUnXSkpIHsKICAgICAgICAgIC8vIHNraXAKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIHNraXAKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3Igc3RyaW5nIGFkZGVkIGFzIGZpbGUKICAgICAgZWxzZSBpZiAoaXNzZXQoJHZfZGVzY3JbJ2NvbnRlbnQnXSkpIHsKICAgICAgICAkdl9kZXNjclsndHlwZSddID0gJ3ZpcnR1YWxfZmlsZSc7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIE1pc3NpbmcgZmlsZQogICAgICBlbHNlIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIkZpbGUgJyIuJHZfZGVzY3JbJ2ZpbGVuYW1lJ10uIicgZG9lcyBub3QgZXhpc3QiKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lCiAgICAgICR0aGlzLT5wcml2Q2FsY3VsYXRlU3RvcmVkRmlsZW5hbWUoJHZfZGVzY3IsICRwX29wdGlvbnMpOwoKICAgICAgLy8gLS0tLS0gQWRkIHRoZSBkZXNjcmlwdG9yIGluIHJlc3VsdCBsaXN0CiAgICAgICR2X3Jlc3VsdF9saXN0W3NpemVvZigkdl9yZXN1bHRfbGlzdCldID0gJHZfZGVzY3I7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBmb2xkZXIKICAgICAgaWYgKCR2X2Rlc2NyWyd0eXBlJ10gPT0gJ2ZvbGRlcicpIHsKICAgICAgICAvLyAtLS0tLSBMaXN0IG9mIGl0ZW1zIGluIGZvbGRlcgogICAgICAgICR2X2Rpcmxpc3RfZGVzY3IgPSBhcnJheSgpOwogICAgICAgICR2X2Rpcmxpc3RfbmIgPSAwOwogICAgICAgIGlmICgkdl9mb2xkZXJfaGFuZGxlciA9IEBvcGVuZGlyKCR2X2Rlc2NyWydmaWxlbmFtZSddKSkgewogICAgICAgICAgd2hpbGUgKCgkdl9pdGVtX2hhbmRsZXIgPSBAcmVhZGRpcigkdl9mb2xkZXJfaGFuZGxlcikpICE9PSBmYWxzZSkgewoKICAgICAgICAgICAgLy8gLS0tLS0gU2tpcCAnLicgYW5kICcuLicKICAgICAgICAgICAgaWYgKCgkdl9pdGVtX2hhbmRsZXIgPT0gJy4nKSB8fCAoJHZfaXRlbV9oYW5kbGVyID09ICcuLicpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gLS0tLS0gQ29tcG9zZSB0aGUgZnVsbCBmaWxlbmFtZQogICAgICAgICAgICAkdl9kaXJsaXN0X2Rlc2NyWyR2X2Rpcmxpc3RfbmJdWydmaWxlbmFtZSddID0gJHZfZGVzY3JbJ2ZpbGVuYW1lJ10uJy8nLiR2X2l0ZW1faGFuZGxlcjsKCiAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGRpZmZlcmVudCBzdG9yZWQgZmlsZW5hbWUKICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHdhcyBjaGFuZ2VkLCB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgLy8gZmlsZXMvc3ViLWZvbGRlcnMgYWxzbyBjaGFuZ2UKICAgICAgICAgICAgaWYgKCgkdl9kZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ10gIT0gJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pCiAgICAgICAgICAgICAgICAgJiYgKCFpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXSkpKSB7CiAgICAgICAgICAgICAgaWYgKCR2X2Rlc2NyWydzdG9yZWRfZmlsZW5hbWUnXSAhPSAnJykgewogICAgICAgICAgICAgICAgJHZfZGlybGlzdF9kZXNjclskdl9kaXJsaXN0X25iXVsnbmV3X2Z1bGxfbmFtZSddID0gJHZfZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddLicvJy4kdl9pdGVtX2hhbmRsZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHZfZGlybGlzdF9kZXNjclskdl9kaXJsaXN0X25iXVsnbmV3X2Z1bGxfbmFtZSddID0gJHZfaXRlbV9oYW5kbGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZfZGlybGlzdF9uYisrOwogICAgICAgICAgfQoKICAgICAgICAgIEBjbG9zZWRpcigkdl9mb2xkZXJfaGFuZGxlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gVEJDIDogdW5hYmxlIHRvIG9wZW4gZm9sZGVyIGluIHJlYWQgbW9kZQogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gRXhwYW5kIGVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdAogICAgICAgIGlmICgkdl9kaXJsaXN0X25iICE9IDApIHsKICAgICAgICAgIC8vIC0tLS0tIEV4cGFuZAogICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjckV4cGFuZCgkdl9kaXJsaXN0X2Rlc2NyLCAkcF9vcHRpb25zKSkgIT0gMSkgewogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIENvbmNhdCB0aGUgcmVzdWx0aW5nIGxpc3QKICAgICAgICAgICR2X3Jlc3VsdF9saXN0ID0gYXJyYXlfbWVyZ2UoJHZfcmVzdWx0X2xpc3QsICR2X2Rpcmxpc3RfZGVzY3IpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIEZyZWUgbG9jYWwgYXJyYXkKICAgICAgICB1bnNldCgkdl9kaXJsaXN0X2Rlc2NyKTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEdldCB0aGUgcmVzdWx0IGxpc3QKICAgICRwX2ZpbGVkZXNjcl9saXN0ID0gJHZfcmVzdWx0X2xpc3Q7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkNyZWF0ZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkNyZWF0ZSgkcF9maWxlZGVzY3JfbGlzdCwgJiRwX3Jlc3VsdF9saXN0LCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKICAgICR2X2xpc3RfZGV0YWlsID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgZmlsZSBpbiB3cml0ZSBtb2RlCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2T3BlbkZkKCd3YicpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBBZGQgdGhlIGxpc3Qgb2YgZmlsZXMKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHBfcmVzdWx0X2xpc3QsICRwX29wdGlvbnMpOwoKICAgIC8vIC0tLS0tIENsb3NlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZBZGQoJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CiAgICAkdl9saXN0X2RldGFpbCA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZSBleGlzdHMgb3IgaXMgZW1wdHkKICAgIGlmICgoIWlzX2ZpbGUoJHRoaXMtPnppcG5hbWUpKSB8fCAoZmlsZXNpemUoJHRoaXMtPnppcG5hbWUpID09IDApKQogICAgewoKICAgICAgLy8gLS0tLS0gRG8gYSBjcmVhdGUKICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDcmVhdGUoJHBfZmlsZWRlc2NyX2xpc3QsICRwX3Jlc3VsdF9saXN0LCAkcF9vcHRpb25zKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR2X3Jlc3VsdD0kdGhpcy0+cHJpdk9wZW5GZCgncmInKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmF5IGZpbGUKICAgICR2X3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLnRtcCc7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gd3JpdGUgbW9kZQogICAgaWYgKCgkdl96aXBfdGVtcF9mZCA9IEBmb3Blbigkdl96aXBfdGVtcF9uYW1lLCAnd2InKSkgPT0gMCkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl96aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgd3JpdGUgbW9kZScpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAvLyBUQkMgOiBIZXJlIEkgc2hvdWxkIGJldHRlciBhcHBlbmQgdGhlIGZpbGUgYW5kIGdvIGJhY2sgdG8gZXJhc2UgdGhlIGNlbnRyYWwgZGlyCiAgICAkdl9zaXplID0gJHZfY2VudHJhbF9kaXJbJ29mZnNldCddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIFN3YXAgdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgLy8gSGVyZSBpcyBhIHRyaWNrIDogSSBzd2FwIHRoZSB0ZW1wb3JhcnkgZmQgd2l0aCB0aGUgemlwIGZkLCBpbiBvcmRlciB0byB1c2UKICAgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiB0aGUgdGVtcG9yYXJ5IGZpbCBhbmQgbm90IHRoZSByZWFsIGFyY2hpdmUKICAgICR2X3N3YXAgPSAkdGhpcy0+emlwX2ZkOwogICAgJHRoaXMtPnppcF9mZCA9ICR2X3ppcF90ZW1wX2ZkOwogICAgJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOwoKICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZXMKICAgICR2X2hlYWRlcl9saXN0ID0gYXJyYXkoKTsKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZBZGRGaWxlTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHZfaGVhZGVyX2xpc3QsICRwX29wdGlvbnMpKSAhPSAxKQogICAgewogICAgICBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcgogICAgJHZfb2Zmc2V0ID0gQGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBvbGQgYXJjaGl2ZQogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyWydzaXplJ107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQogICAgewogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdl96aXBfdGVtcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyCiAgICBmb3IgKCRpPTAsICR2X2NvdW50PTA7ICRpPHNpemVvZigkdl9oZWFkZXJfbGlzdCk7ICRpKyspCiAgICB7CiAgICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgZmlsZSBoZWFkZXIKICAgICAgaWYgKCR2X2hlYWRlcl9saXN0WyRpXVsnc3RhdHVzJ10gPT0gJ29rJykgewogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyRpXSkpICE9IDEpIHsKICAgICAgICAgIGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7CiAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CiAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQogICAgICAgICR2X2NvdW50Kys7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFRyYW5zZm9ybSB0aGUgaGVhZGVyIHRvIGEgJ3VzYWJsZScgaW5mbwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyX2xpc3RbJGldLCAkcF9yZXN1bHRfbGlzdFskaV0pOwogICAgfQoKICAgIC8vIC0tLS0tIFppcCBmaWxlIGNvbW1lbnQKICAgICR2X2NvbW1lbnQgPSAkdl9jZW50cmFsX2RpclsnY29tbWVudCddOwogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXSkpIHsKICAgICAgJHZfY29tbWVudCA9ICRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXTsKICAgIH0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQUREX0NPTU1FTlRdKSkgewogICAgICAkdl9jb21tZW50ID0gJHZfY29tbWVudC4kcF9vcHRpb25zW1BDTFpJUF9PUFRfQUREX0NPTU1FTlRdOwogICAgfQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlRdKSkgewogICAgICAkdl9jb21tZW50ID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVF0uJHZfY29tbWVudDsKICAgIH0KCiAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGNlbnRyYWwgaGVhZGVyCiAgICAkdl9zaXplID0gQGZ0ZWxsKCR0aGlzLT56aXBfZmQpLSR2X29mZnNldDsKCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3RlcgogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlQ2VudHJhbEhlYWRlcigkdl9jb3VudCskdl9jZW50cmFsX2RpclsnZW50cmllcyddLCAkdl9zaXplLCAkdl9vZmZzZXQsICR2X2NvbW1lbnQpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBsaXN0CiAgICAgIHVuc2V0KCR2X2hlYWRlcl9saXN0KTsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBTd2FwIGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgJHZfc3dhcCA9ICR0aGlzLT56aXBfZmQ7CiAgICAkdGhpcy0+emlwX2ZkID0gJHZfemlwX3RlbXBfZmQ7CiAgICAkdl96aXBfdGVtcF9mZCA9ICR2X3N3YXA7CgogICAgLy8gLS0tLS0gQ2xvc2UKICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlCiAgICAvLyBUQkMgOiBJIHNob3VsZCB0ZXN0IHRoZSByZXN1bHQgLi4uCiAgICBAdW5saW5rKCR0aGlzLT56aXBuYW1lKTsKCiAgICAvLyAtLS0tLSBSZW5hbWUgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAvLyBUQkMgOiBJIHNob3VsZCB0ZXN0IHRoZSByZXN1bHQgLi4uCiAgICAvL0ByZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOwogICAgUGNsWmlwVXRpbFJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdk9wZW5GZCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdk9wZW5GZCgkcF9tb2RlKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgYWxyZWFkeSBvcGVuCiAgICBpZiAoJHRoaXMtPnppcF9mZCAhPSAwKQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1ppcCBmaWxlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcgYWxyZWFkeSBvcGVuJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUKICAgIGlmICgoJHRoaXMtPnppcF9mZCA9IEBmb3BlbigkdGhpcy0+emlwbmFtZSwgJHBfbW9kZSkpID09IDApCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnIGluICcuJHBfbW9kZS4nIG1vZGUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2xvc2VGZCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkNsb3NlRmQoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIGlmICgkdGhpcy0+emlwX2ZkICE9IDApCiAgICAgIEBmY2xvc2UoJHRoaXMtPnppcF9mZCk7CiAgICAkdGhpcy0+emlwX2ZkID0gMDsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2QWRkTGlzdCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgJHBfYWRkX2RpciBhbmQgJHBfcmVtb3ZlX2RpciB3aWxsIGdpdmUgdGhlIGFiaWxpdHkgdG8gbWVtb3JpemUgYSBwYXRoIHdoaWNoIGlzCiAgLy8gICBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBmaWxlLiBUaGlzIGlzIHVzZWZ1bGwgaWYgeW91IHdhbnQgdG8gaGF2ZSBQY2xUYXIKICAvLyAgIHJ1bm5pbmcgaW4gYW55IGRpcmVjdG9yeSwgYW5kIG1lbW9yaXplIHJlbGF0aXZlIHBhdGggZnJvbSBhbiBvdGhlciBkaXJlY3RvcnkuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9saXN0IDogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMgdG8gYWRkIGluIHRoZSB0YXIKICAvLyAgICRwX3Jlc3VsdF9saXN0IDogbGlzdCBvZiBhZGRlZCBmaWxlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKHNwZWNpYWxseSB0aGUgc3RhdHVzIGZpZWxkKQogIC8vICAgJHBfYWRkX2RpciA6IFBhdGggdG8gYWRkIGluIHRoZSBmaWxlbmFtZSBwYXRoIGFyY2hpdmVkCiAgLy8gICAkcF9yZW1vdmVfZGlyIDogUGF0aCB0byByZW1vdmUgaW4gdGhlIGZpbGVuYW1lIHBhdGggYXJjaGl2ZWQKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgZnVuY3Rpb24gcHJpdkFkZExpc3QoJHBfbGlzdCwgJiRwX3Jlc3VsdF9saXN0LCAkcF9hZGRfZGlyLCAkcF9yZW1vdmVfZGlyLCAkcF9yZW1vdmVfYWxsX2RpciwgJiRwX29wdGlvbnMpCiAgZnVuY3Rpb24gcHJpdkFkZExpc3QoJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gQWRkIHRoZSBmaWxlcwogICAgJHZfaGVhZGVyX2xpc3QgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkFkZEZpbGVMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAkdl9oZWFkZXJfbGlzdCwgJHBfb3B0aW9ucykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGNlbnRyYWwgZGlyCiAgICAkdl9vZmZzZXQgPSBAZnRlbGwoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBDZW50cmFsIERpciBmaWxlcyBoZWFkZXIKICAgIGZvciAoJGk9MCwkdl9jb3VudD0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKQogICAgewogICAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGZpbGUgaGVhZGVyCiAgICAgIGlmICgkdl9oZWFkZXJfbGlzdFskaV1bJ3N0YXR1cyddID09ICdvaycpIHsKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXJfbGlzdFskaV0pKSAhPSAxKSB7CiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQogICAgICAgICR2X2NvdW50Kys7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFRyYW5zZm9ybSB0aGUgaGVhZGVyIHRvIGEgJ3VzYWJsZScgaW5mbwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyX2xpc3RbJGldLCAkcF9yZXN1bHRfbGlzdFskaV0pOwogICAgfQoKICAgIC8vIC0tLS0tIFppcCBmaWxlIGNvbW1lbnQKICAgICR2X2NvbW1lbnQgPSAnJzsKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF0pKSB7CiAgICAgICR2X2NvbW1lbnQgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF07CiAgICB9CgogICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlcgogICAgJHZfc2l6ZSA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKS0kdl9vZmZzZXQ7CgogICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBjZW50cmFsIGRpciBmb290ZXIKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoJHZfY291bnQsICR2X3NpemUsICR2X29mZnNldCwgJHZfY29tbWVudCkpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBmaWxlIGxpc3QKICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkFkZEZpbGVMaXN0KCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9maWxlZGVzY3JfbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbGUgZGVzY3JpcHRpb24KICAvLyAgICAgICAgICAgICAgICAgICAgICBvciBkaXJlY3RvcnkgbmFtZXMgdG8gYWRkIGluIHRoZSB6aXAKICAvLyAgICRwX3Jlc3VsdF9saXN0IDogbGlzdCBvZiBhZGRlZCBmaWxlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKHNwZWNpYWxseSB0aGUgc3RhdHVzIGZpZWxkKQogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkFkZEZpbGVMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfcmVzdWx0X2xpc3QsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwogICAgJHZfaGVhZGVyID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBSZWN1cGVyYXRlIHRoZSBjdXJyZW50IG51bWJlciBvZiBlbHQgaW4gbGlzdAogICAgJHZfbmIgPSBzaXplb2YoJHBfcmVzdWx0X2xpc3QpOwoKICAgIC8vIC0tLS0tIExvb3Agb24gdGhlIGZpbGVzCiAgICBmb3IgKCRqPTA7ICgkajxzaXplb2YoJHBfZmlsZWRlc2NyX2xpc3QpKSAmJiAoJHZfcmVzdWx0PT0xKTsgJGorKykgewogICAgICAvLyAtLS0tLSBGb3JtYXQgdGhlIGZpbGVuYW1lCiAgICAgICRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXQogICAgICA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXSwgZmFsc2UpOwoKCiAgICAgIC8vIC0tLS0tIFNraXAgZW1wdHkgZmlsZSBuYW1lcwogICAgICAvLyBUQkMgOiBDYW4gdGhpcyBiZSBwb3NzaWJsZSA/IG5vdCBjaGVja2VkIGluIERlc2NyUGFyc2VBdHQgPwogICAgICBpZiAoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddID09ICIiKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBmaWxlbmFtZQogICAgICBpZiAoICAgKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsndHlwZSddICE9ICd2aXJ0dWFsX2ZpbGUnKQogICAgICAgICAgJiYgKCFmaWxlX2V4aXN0cygkcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10pKSkgewogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFLCAiRmlsZSAnIi4kcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10uIicgZG9lcyBub3QgZXhpc3QiKTsKICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBpZiBpdCBpcyBhIGZpbGUgb3IgYSBkaXIgd2l0aCBubyBhbGwgcGF0aCByZW1vdmUgb3B0aW9uCiAgICAgIC8vIG9yIGEgZGlyIHdpdGggYWxsIGl0cyBwYXRoIHJlbW92ZWQKLy8gICAgICBpZiAoICAgKGlzX2ZpbGUoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddKSkKLy8gICAgICAgICAgfHwgKCAgIGlzX2RpcigkcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10pCiAgICAgIGlmICggICAoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWyd0eXBlJ10gPT0gJ2ZpbGUnKQogICAgICAgICAgfHwgKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsndHlwZSddID09ICd2aXJ0dWFsX2ZpbGUnKQogICAgICAgICAgfHwgKCAgICgkcF9maWxlZGVzY3JfbGlzdFskal1bJ3R5cGUnXSA9PSAnZm9sZGVyJykKICAgICAgICAgICAgICAmJiAoICAgIWlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKQogICAgICAgICAgICAgICAgICB8fCAhJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKQogICAgICAgICAgKSB7CgogICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZQogICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkRmlsZSgkcF9maWxlZGVzY3JfbGlzdFskal0sICR2X2hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfb3B0aW9ucyk7CiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gU3RvcmUgdGhlIGZpbGUgaW5mb3MKICAgICAgICAkcF9yZXN1bHRfbGlzdFskdl9uYisrXSA9ICR2X2hlYWRlcjsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGRGaWxlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2QWRkRmlsZSgkcF9maWxlZGVzY3IsICYkcF9oZWFkZXIsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFdvcmtpbmcgdmFyaWFibGUKICAgICRwX2ZpbGVuYW1lID0gJHBfZmlsZWRlc2NyWydmaWxlbmFtZSddOwoKICAgIC8vIFRCQyA6IEFscmVhZHkgZG9uZSBpbiB0aGUgZmlsZUF0dCBjaGVjayAuLi4gPwogICAgaWYgKCRwX2ZpbGVuYW1lID09ICIiKSB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBmaWxlIGxpc3QgcGFyYW1ldGVyIChpbnZhbGlkIG9yIGVtcHR5IGxpc3QpIik7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgYSBzdG9yZWQgZGlmZmVyZW50IGZpbGVuYW1lCiAgICAvKiBUQkMgOiBSZW1vdmVkCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsKICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXTsKICAgIH0KICAgIGVsc2UgewogICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSAkcF9maWxlZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddOwogICAgfQogICAgKi8KCiAgICAvLyAtLS0tLSBTZXQgdGhlIGZpbGUgcHJvcGVydGllcwogICAgY2xlYXJzdGF0Y2FjaGUoKTsKICAgICRwX2hlYWRlclsndmVyc2lvbiddID0gMjA7CiAgICAkcF9oZWFkZXJbJ3ZlcnNpb25fZXh0cmFjdGVkJ10gPSAxMDsKICAgICRwX2hlYWRlclsnZmxhZyddID0gMDsKICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDA7CiAgICAkcF9oZWFkZXJbJ2NyYyddID0gMDsKICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAwOwogICAgJHBfaGVhZGVyWydmaWxlbmFtZV9sZW4nXSA9IHN0cmxlbigkcF9maWxlbmFtZSk7CiAgICAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddID0gMDsKICAgICRwX2hlYWRlclsnZGlzayddID0gMDsKICAgICRwX2hlYWRlclsnaW50ZXJuYWwnXSA9IDA7CiAgICAkcF9oZWFkZXJbJ29mZnNldCddID0gMDsKICAgICRwX2hlYWRlclsnZmlsZW5hbWUnXSA9ICRwX2ZpbGVuYW1lOwovLyBUQkMgOiBSZW1vdmVkICAgICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10gPSAkdl9zdG9yZWRfZmlsZW5hbWU7CiAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXTsKICAgICRwX2hlYWRlclsnZXh0cmEnXSA9ICcnOwogICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICdvayc7CiAgICAkcF9oZWFkZXJbJ2luZGV4J10gPSAtMTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciByZWd1bGFyIGZpbGUKICAgIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXT09J2ZpbGUnKSB7CiAgICAgICRwX2hlYWRlclsnZXh0ZXJuYWwnXSA9IDB4MDAwMDAwMDA7CiAgICAgICRwX2hlYWRlclsnc2l6ZSddID0gZmlsZXNpemUoJHBfZmlsZW5hbWUpOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHJlZ3VsYXIgZm9sZGVyCiAgICBlbHNlIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXT09J2ZvbGRlcicpIHsKICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAxMDsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gZmlsZW10aW1lKCRwX2ZpbGVuYW1lKTsKICAgICAgJHBfaGVhZGVyWydzaXplJ10gPSBmaWxlc2l6ZSgkcF9maWxlbmFtZSk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgdmlydHVhbCBmaWxlCiAgICBlbHNlIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXSA9PSAndmlydHVhbF9maWxlJykgewogICAgICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDAwMDAwMDAwOwogICAgICAkcF9oZWFkZXJbJ3NpemUnXSA9IHN0cmxlbigkcF9maWxlZGVzY3JbJ2NvbnRlbnQnXSk7CiAgICB9CgoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpbGV0aW1lCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydtdGltZSddKSkgewogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSAkcF9maWxlZGVzY3JbJ210aW1lJ107CiAgICB9CiAgICBlbHNlIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXSA9PSAndmlydHVhbF9maWxlJykgewogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSB0aW1lKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gZmlsZW10aW1lKCRwX2ZpbGVuYW1lKTsKICAgIH0KCiAgICAvLyAtLS0tLS0gTG9vayBmb3IgZmlsZSBjb21tZW50CiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydjb21tZW50J10pKSB7CiAgICAgICRwX2hlYWRlclsnY29tbWVudF9sZW4nXSA9IHN0cmxlbigkcF9maWxlZGVzY3JbJ2NvbW1lbnQnXSk7CiAgICAgICRwX2hlYWRlclsnY29tbWVudCddID0gJHBfZmlsZWRlc2NyWydjb21tZW50J107CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHBfaGVhZGVyWydjb21tZW50X2xlbiddID0gMDsKICAgICAgJHBfaGVhZGVyWydjb21tZW50J10gPSAnJzsKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwcmUtYWRkIGNhbGxiYWNrCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0FERF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9oZWFkZXIsICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0FERF0oUENMWklQX0NCX1BSRV9BREQsICR2X2xvY2FsX2hlYWRlcik7CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMCkgewogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gInNraXBwZWQiOwogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zCiAgICAgIC8vIE9ubHkgc29tZSBmaWVsZHMgY2FuIGJlIG1vZGlmaWVkCiAgICAgIGlmICgkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddICE9ICR2X2xvY2FsX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pIHsKICAgICAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHZfbG9jYWxfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBlbXB0eSBzdG9yZWQgZmlsZW5hbWUKICAgIGlmICgkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID09ICIiKSB7CiAgICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAiZmlsdGVyZWQiOwogICAgfQoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXRoIGxlbmd0aAogICAgaWYgKHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSA+IDB4RkYpIHsKICAgICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICdmaWxlbmFtZV90b29fbG9uZyc7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiBubyBlcnJvciwgb3IgZmlsZSBub3Qgc2tpcHBlZAogICAgaWYgKCRwX2hlYWRlclsnc3RhdHVzJ10gPT0gJ29rJykgewoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBmaWxlCiAgICAgIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXSA9PSAnZmlsZScpIHsKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2luZyB0ZW1wb3JhcnkgZmlsZSB0byB6aXAKICAgICAgICBpZiAoICghaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkKICAgICAgICAgICAgJiYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT05dKQogICAgICAgICAgICAgICAgfHwgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSkKICAgICAgICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdIDw9ICRwX2hlYWRlclsnc2l6ZSddKSkgKSApIHsKICAgICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkRmlsZVVzaW5nVGVtcEZpbGUoJHBfZmlsZWRlc2NyLCAkcF9oZWFkZXIsICRwX29wdGlvbnMpOwogICAgICAgICAgaWYgKCR2X3Jlc3VsdCA8IFBDTFpJUF9FUlJfTk9fRVJST1IpIHsKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFVzZSAiaW4gbWVtb3J5IiB6aXAgYWxnbwogICAgICAgIGVsc2UgewoKICAgICAgICAvLyAtLS0tLSBPcGVuIHRoZSBzb3VyY2UgZmlsZQogICAgICAgIGlmICgoJHZfZmlsZSA9IEBmb3BlbigkcF9maWxlbmFtZSwgInJiIikpID09IDApIHsKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF9maWxlbmFtZScgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOwogICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGNvbnRlbnQKICAgICAgICAkdl9jb250ZW50ID0gQGZyZWFkKCR2X2ZpbGUsICRwX2hlYWRlclsnc2l6ZSddKTsKCiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUKICAgICAgICBAZmNsb3NlKCR2X2ZpbGUpOwoKICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIENSQwogICAgICAgICRwX2hlYWRlclsnY3JjJ10gPSBAY3JjMzIoJHZfY29udGVudCk7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vIGNvbXByZXNzaW9uCiAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9OT19DT01QUkVTU0lPTl0pIHsKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2hlYWRlclsnc2l6ZSddOwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gMDsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vcm1hbCBjb21wcmVzc2lvbgogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gLS0tLS0gQ29tcHJlc3MgdGhlIGNvbnRlbnQKICAgICAgICAgICR2X2NvbnRlbnQgPSBAZ3pkZWZsYXRlKCR2X2NvbnRlbnQpOwoKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9IHN0cmxlbigkdl9jb250ZW50KTsKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDg7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHBfaGVhZGVyKSkgIT0gMSkgewogICAgICAgICAgQGZjbG9zZSgkdl9maWxlKTsKICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBXcml0ZSB0aGUgY29tcHJlc3NlZCAob3Igbm90KSBjb250ZW50CiAgICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9jb250ZW50LCAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddKTsKCiAgICAgICAgfQoKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSB2aXJ0dWFsIGZpbGUgKGEgZmlsZSBmcm9tIHN0cmluZykKICAgICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ3ZpcnR1YWxfZmlsZScpIHsKCiAgICAgICAgJHZfY29udGVudCA9ICRwX2ZpbGVkZXNjclsnY29udGVudCddOwoKICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIENSQwogICAgICAgICRwX2hlYWRlclsnY3JjJ10gPSBAY3JjMzIoJHZfY29udGVudCk7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vIGNvbXByZXNzaW9uCiAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9OT19DT01QUkVTU0lPTl0pIHsKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2hlYWRlclsnc2l6ZSddOwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gMDsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vcm1hbCBjb21wcmVzc2lvbgogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gLS0tLS0gQ29tcHJlc3MgdGhlIGNvbnRlbnQKICAgICAgICAgICR2X2NvbnRlbnQgPSBAZ3pkZWZsYXRlKCR2X2NvbnRlbnQpOwoKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9IHN0cmxlbigkdl9jb250ZW50KTsKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDg7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHBfaGVhZGVyKSkgIT0gMSkgewogICAgICAgICAgQGZjbG9zZSgkdl9maWxlKTsKICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBXcml0ZSB0aGUgY29tcHJlc3NlZCAob3Igbm90KSBjb250ZW50CiAgICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9jb250ZW50LCAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBkaXJlY3RvcnkKICAgICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ2ZvbGRlcicpIHsKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBkaXJlY3RvcnkgbGFzdCAnLycKICAgICAgICBpZiAoQHN1YnN0cigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddIC49ICcvJzsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFNldCB0aGUgZmlsZSBwcm9wZXJ0aWVzCiAgICAgICAgJHBfaGVhZGVyWydzaXplJ10gPSAwOwogICAgICAgIC8vJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHg0MUZGMDAxMDsgICAvLyBWYWx1ZSBmb3IgYSBmb2xkZXIgOiB0byBiZSBjaGVja2VkCiAgICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAxMDsgICAvLyBWYWx1ZSBmb3IgYSBmb2xkZXIgOiB0byBiZSBjaGVja2VkCgogICAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGhlYWRlciBnZW5lcmF0aW9uCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlRmlsZUhlYWRlcigkcF9oZWFkZXIpKSAhPSAxKQogICAgICAgIHsKICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcG9zdC1hZGQgY2FsbGJhY2sKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0FERF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9oZWFkZXIsICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9BRERdKFBDTFpJUF9DQl9QT1NUX0FERCwgJHZfbG9jYWxfaGVhZGVyKTsKICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAwKSB7CiAgICAgICAgLy8gLS0tLS0gSWdub3JlZAogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zCiAgICAgIC8vIE5vdGhpbmcgY2FuIGJlIG1vZGlmaWVkCiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkFkZEZpbGVVc2luZ1RlbXBGaWxlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2QWRkRmlsZVVzaW5nVGVtcEZpbGUoJHBfZmlsZWRlc2NyLCAmJHBfaGVhZGVyLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9UENMWklQX0VSUl9OT19FUlJPUjsKCiAgICAvLyAtLS0tLSBXb3JraW5nIHZhcmlhYmxlCiAgICAkcF9maWxlbmFtZSA9ICRwX2ZpbGVkZXNjclsnZmlsZW5hbWUnXTsKCgogICAgLy8gLS0tLS0gT3BlbiB0aGUgc291cmNlIGZpbGUKICAgIGlmICgoJHZfZmlsZSA9IEBmb3BlbigkcF9maWxlbmFtZSwgInJiIikpID09IDApIHsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyRwX2ZpbGVuYW1lJyBpbiBiaW5hcnkgcmVhZCBtb2RlIik7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIENyZWF0ZXMgYSBjb21wcmVzc2VkIHRlbXBvcmFyeSBmaWxlCiAgICAkdl9nemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicuZ3onOwogICAgaWYgKCgkdl9maWxlX2NvbXByZXNzZWQgPSBAZ3pvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAid2IiKSkgPT0gMCkgewogICAgICBmY2xvc2UoJHZfZmlsZSk7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgd3JpdGUgbW9kZScpOwogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2NrcwogICAgJHZfc2l6ZSA9IGZpbGVzaXplKCRwX2ZpbGVuYW1lKTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHZfZmlsZSwgJHZfcmVhZF9zaXplKTsKICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgQGd6cHV0cygkdl9maWxlX2NvbXByZXNzZWQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUKICAgIEBmY2xvc2UoJHZfZmlsZSk7CiAgICBAZ3pjbG9zZSgkdl9maWxlX2NvbXByZXNzZWQpOwoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBtaW5pbXVtIGZpbGUgc2l6ZQogICAgaWYgKGZpbGVzaXplKCR2X2d6aXBfdGVtcF9uYW1lKSA8IDE4KSB7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ2d6aXAgdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBoYXMgaW52YWxpZCBmaWxlc2l6ZSAtIHNob3VsZCBiZSBtaW5pbXVtIDE4IGJ5dGVzJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIGNvbXByZXNzZWQgYXR0cmlidXRlcwogICAgaWYgKCgkdl9maWxlX2NvbXByZXNzZWQgPSBAZm9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICJyYiIpKSA9PSAwKSB7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfZ3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSByZWFkIG1vZGUnKTsKICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZ3ppcCBmaWxlIGhlYWRlcgogICAgJHZfYmluYXJ5X2RhdGEgPSBAZnJlYWQoJHZfZmlsZV9jb21wcmVzc2VkLCAxMCk7CiAgICAkdl9kYXRhX2hlYWRlciA9IHVucGFjaygnYTFpZDEvYTFpZDIvYTFjbS9hMWZsYWcvVm10aW1lL2ExeGZsL2Exb3MnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgc29tZSBwYXJhbWV0ZXJzCiAgICAkdl9kYXRhX2hlYWRlclsnb3MnXSA9IGJpbjJoZXgoJHZfZGF0YV9oZWFkZXJbJ29zJ10pOwoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGd6aXAgZmlsZSBmb290ZXIKICAgIEBmc2Vlaygkdl9maWxlX2NvbXByZXNzZWQsIGZpbGVzaXplKCR2X2d6aXBfdGVtcF9uYW1lKS04KTsKICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR2X2ZpbGVfY29tcHJlc3NlZCwgOCk7CiAgICAkdl9kYXRhX2Zvb3RlciA9IHVucGFjaygnVmNyYy9WY29tcHJlc3NlZF9zaXplJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgIC8vIC0tLS0tIFNldCB0aGUgYXR0cmlidXRlcwogICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gb3JkKCR2X2RhdGFfaGVhZGVyWydjbSddKTsKICAgIC8vJHBfaGVhZGVyWydtdGltZSddID0gJHZfZGF0YV9oZWFkZXJbJ210aW1lJ107CiAgICAkcF9oZWFkZXJbJ2NyYyddID0gJHZfZGF0YV9mb290ZXJbJ2NyYyddOwogICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9IGZpbGVzaXplKCR2X2d6aXBfdGVtcF9uYW1lKS0xODsKCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgZmlsZQogICAgQGZjbG9zZSgkdl9maWxlX2NvbXByZXNzZWQpOwoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGhlYWRlciBnZW5lcmF0aW9uCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVGaWxlSGVhZGVyKCRwX2hlYWRlcikpICE9IDEpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBBZGQgdGhlIGNvbXByZXNzZWQgZGF0YQogICAgaWYgKCgkdl9maWxlX2NvbXByZXNzZWQgPSBAZm9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICJyYiIpKSA9PSAwKQogICAgewogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzCiAgICBmc2Vlaygkdl9maWxlX2NvbXByZXNzZWQsIDEwKTsKICAgICR2X3NpemUgPSAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHZfZmlsZV9jb21wcmVzc2VkLCAkdl9yZWFkX3NpemUpOwogICAgICAvLyR2X2JpbmFyeV9kYXRhID0gcGFjaygnYScuJHZfcmVhZF9zaXplLCAkdl9idWZmZXIpOwogICAgICBAZndyaXRlKCR0aGlzLT56aXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUKICAgIEBmY2xvc2UoJHZfZmlsZV9jb21wcmVzc2VkKTsKCiAgICAvLyAtLS0tLSBVbmxpbmsgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICBAdW5saW5rKCR2X2d6aXBfdGVtcF9uYW1lKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2FsY3VsYXRlU3RvcmVkRmlsZW5hbWUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIEJhc2VkIG9uIGZpbGUgZGVzY3JpcHRvciBwcm9wZXJ0aWVzIGFuZCBnbG9iYWwgb3B0aW9ucywgdGhpcyBtZXRob2QKICAvLyAgIGNhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDYWxjdWxhdGVTdG9yZWRGaWxlbmFtZSgmJHBfZmlsZWRlc2NyLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBXb3JraW5nIHZhcmlhYmxlcwogICAgJHBfZmlsZW5hbWUgPSAkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ107CiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXSkpIHsKICAgICAgJHBfYWRkX2RpciA9ICRwX29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHBfYWRkX2RpciA9ICcnOwogICAgfQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfUEFUSF0pKSB7CiAgICAgICRwX3JlbW92ZV9kaXIgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdOwogICAgfQogICAgZWxzZSB7CiAgICAgICRwX3JlbW92ZV9kaXIgPSAnJzsKICAgIH0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXSkpIHsKICAgICAgJHBfcmVtb3ZlX2FsbF9kaXIgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXTsKICAgIH0KICAgIGVsc2UgewogICAgICAkcF9yZW1vdmVfYWxsX2RpciA9IDA7CiAgICB9CgoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGZ1bGwgbmFtZSBjaGFuZ2UKICAgIGlmIChpc3NldCgkcF9maWxlZGVzY3JbJ25ld19mdWxsX25hbWUnXSkpIHsKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGRyaXZlIGxldHRlciBpZiBhbnkKICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfZmlsZWRlc2NyWyduZXdfZnVsbF9uYW1lJ10pOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggYW5kL29yIHNob3J0IG5hbWUgY2hhbmdlCiAgICBlbHNlIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHNob3J0IG5hbWUgY2hhbmdlCiAgICAgIC8vIEl0cyB3aGVuIHdlIGNhaG5nZSBqdXN0IHRoZSBmaWxlbmFtZSBidXQgbm90IHRoZSBwYXRoCiAgICAgIGlmIChpc3NldCgkcF9maWxlZGVzY3JbJ25ld19zaG9ydF9uYW1lJ10pKSB7CiAgICAgICAgJHZfcGF0aF9pbmZvID0gcGF0aGluZm8oJHBfZmlsZW5hbWUpOwogICAgICAgICR2X2RpciA9ICcnOwogICAgICAgIGlmICgkdl9wYXRoX2luZm9bJ2Rpcm5hbWUnXSAhPSAnJykgewogICAgICAgICAgJHZfZGlyID0gJHZfcGF0aF9pbmZvWydkaXJuYW1lJ10uJy8nOwogICAgICAgIH0KICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSAkdl9kaXIuJHBfZmlsZWRlc2NyWyduZXdfc2hvcnRfbmFtZSddOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lCiAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZW5hbWU7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFsbCBwYXRoIHRvIHJlbW92ZQogICAgICBpZiAoJHBfcmVtb3ZlX2FsbF9kaXIpIHsKICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSBiYXNlbmFtZSgkcF9maWxlbmFtZSk7CiAgICAgIH0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcGFydGlhbCBwYXRoIHJlbW92ZQogICAgICBlbHNlIGlmICgkcF9yZW1vdmVfZGlyICE9ICIiKSB7CiAgICAgICAgaWYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAtMSkgIT0gJy8nKQogICAgICAgICAgJHBfcmVtb3ZlX2RpciAuPSAiLyI7CgogICAgICAgIGlmICggICAoc3Vic3RyKCRwX2ZpbGVuYW1lLCAwLCAyKSA9PSAiLi8iKQogICAgICAgICAgICB8fCAoc3Vic3RyKCRwX3JlbW92ZV9kaXIsIDAsIDIpID09ICIuLyIpKSB7CgogICAgICAgICAgaWYgKCAgIChzdWJzdHIoJHBfZmlsZW5hbWUsIDAsIDIpID09ICIuLyIpCiAgICAgICAgICAgICAgJiYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAwLCAyKSAhPSAiLi8iKSkgewogICAgICAgICAgICAkcF9yZW1vdmVfZGlyID0gIi4vIi4kcF9yZW1vdmVfZGlyOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCAgIChzdWJzdHIoJHBfZmlsZW5hbWUsIDAsIDIpICE9ICIuLyIpCiAgICAgICAgICAgICAgJiYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAwLCAyKSA9PSAiLi8iKSkgewogICAgICAgICAgICAkcF9yZW1vdmVfZGlyID0gc3Vic3RyKCRwX3JlbW92ZV9kaXIsIDIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHZfY29tcGFyZSA9IFBjbFppcFV0aWxQYXRoSW5jbHVzaW9uKCRwX3JlbW92ZV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSk7CiAgICAgICAgaWYgKCR2X2NvbXBhcmUgPiAwKSB7CiAgICAgICAgICBpZiAoJHZfY29tcGFyZSA9PSAyKSB7CiAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICIiOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IHN1YnN0cigkdl9zdG9yZWRfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oJHBfcmVtb3ZlX2RpcikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGRyaXZlIGxldHRlciBpZiBhbnkKICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHZfc3RvcmVkX2ZpbGVuYW1lKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggdG8gYWRkCiAgICAgIGlmICgkcF9hZGRfZGlyICE9ICIiKSB7CiAgICAgICAgaWYgKHN1YnN0cigkcF9hZGRfZGlyLCAtMSkgPT0gIi8iKQogICAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfYWRkX2Rpci4kdl9zdG9yZWRfZmlsZW5hbWU7CiAgICAgICAgZWxzZQogICAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfYWRkX2Rpci4iLyIuJHZfc3RvcmVkX2ZpbGVuYW1lOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gRmlsZW5hbWUgKHJlZHVjZSB0aGUgcGF0aCBvZiBzdG9yZWQgbmFtZSkKICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X3N0b3JlZF9maWxlbmFtZSk7CiAgICAkcF9maWxlZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddID0gJHZfc3RvcmVkX2ZpbGVuYW1lOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZXcml0ZUZpbGVIZWFkZXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZXcml0ZUZpbGVIZWFkZXIoJiRwX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IHBvc2l0aW9uIG9mIHRoZSBmaWxlCiAgICAkcF9oZWFkZXJbJ29mZnNldCddID0gZnRlbGwoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gVHJhbnNmb3JtIFVOSVggbXRpbWUgdG8gRE9TIGZvcm1hdCBtZGF0ZS9tdGltZQogICAgJHZfZGF0ZSA9IGdldGRhdGUoJHBfaGVhZGVyWydtdGltZSddKTsKICAgICR2X210aW1lID0gKCR2X2RhdGVbJ2hvdXJzJ108PDExKSArICgkdl9kYXRlWydtaW51dGVzJ108PDUpICsgJHZfZGF0ZVsnc2Vjb25kcyddLzI7CiAgICAkdl9tZGF0ZSA9ICgoJHZfZGF0ZVsneWVhciddLTE5ODApPDw5KSArICgkdl9kYXRlWydtb24nXTw8NSkgKyAkdl9kYXRlWydtZGF5J107CgogICAgLy8gLS0tLS0gUGFja2VkIGRhdGEKICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygiVnZ2dnZ2VlZWdnYiLCAweDA0MDM0YjUwLAoJICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSwgJHBfaGVhZGVyWydmbGFnJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddLCAkdl9tdGltZSwgJHZfbWRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWydjcmMnXSwgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSwKCQkJCQkJICAkcF9oZWFkZXJbJ3NpemUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSksCgkJCQkJCSAgJHBfaGVhZGVyWydleHRyYV9sZW4nXSk7CgogICAgLy8gLS0tLS0gV3JpdGUgdGhlIGZpcnN0IDE0OCBieXRlcyBvZiB0aGUgaGVhZGVyIGluIHRoZSBhcmNoaXZlCiAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkdl9iaW5hcnlfZGF0YSwgMzApOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB2YXJpYWJsZSBmaWVsZHMKICAgIGlmIChzdHJsZW4oJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSkgIT0gMCkKICAgIHsKICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSwgc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pKTsKICAgIH0KICAgIGlmICgkcF9oZWFkZXJbJ2V4dHJhX2xlbiddICE9IDApCiAgICB7CiAgICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnZXh0cmEnXSwgJHBfaGVhZGVyWydleHRyYV9sZW4nXSk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdldyaXRlQ2VudHJhbEZpbGVIZWFkZXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCYkcF9oZWFkZXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gVEJDCiAgICAvL2ZvcihyZXNldCgkcF9oZWFkZXIpOyAka2V5ID0ga2V5KCRwX2hlYWRlcik7IG5leHQoJHBfaGVhZGVyKSkgewogICAgLy99CgogICAgLy8gLS0tLS0gVHJhbnNmb3JtIFVOSVggbXRpbWUgdG8gRE9TIGZvcm1hdCBtZGF0ZS9tdGltZQogICAgJHZfZGF0ZSA9IGdldGRhdGUoJHBfaGVhZGVyWydtdGltZSddKTsKICAgICR2X210aW1lID0gKCR2X2RhdGVbJ2hvdXJzJ108PDExKSArICgkdl9kYXRlWydtaW51dGVzJ108PDUpICsgJHZfZGF0ZVsnc2Vjb25kcyddLzI7CiAgICAkdl9tZGF0ZSA9ICgoJHZfZGF0ZVsneWVhciddLTE5ODApPDw5KSArICgkdl9kYXRlWydtb24nXTw8NSkgKyAkdl9kYXRlWydtZGF5J107CgoKICAgIC8vIC0tLS0tIFBhY2tlZCBkYXRhCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soIlZ2dnZ2dnZWVlZ2dnZ2dlZWIiwgMHgwMjAxNGI1MCwKCSAgICAgICAgICAgICAgICAgICAgICAkcF9oZWFkZXJbJ3ZlcnNpb24nXSwgJHBfaGVhZGVyWyd2ZXJzaW9uX2V4dHJhY3RlZCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnZmxhZyddLCAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10sCgkJCQkJCSAgJHZfbXRpbWUsICR2X21kYXRlLCAkcF9oZWFkZXJbJ2NyYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10sICRwX2hlYWRlclsnc2l6ZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSwKCQkJCQkJICAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddLCAkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWydkaXNrJ10sICRwX2hlYWRlclsnaW50ZXJuYWwnXSwKCQkJCQkJICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10sICRwX2hlYWRlclsnb2Zmc2V0J10pOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSA0MiBieXRlcyBvZiB0aGUgaGVhZGVyIGluIHRoZSB6aXAgZmlsZQogICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHZfYmluYXJ5X2RhdGEsIDQ2KTsKCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgdmFyaWFibGUgZmllbGRzCiAgICBpZiAoc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pICE9IDApCiAgICB7CiAgICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10sIHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSk7CiAgICB9CiAgICBpZiAoJHBfaGVhZGVyWydleHRyYV9sZW4nXSAhPSAwKQogICAgewogICAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2V4dHJhJ10sICRwX2hlYWRlclsnZXh0cmFfbGVuJ10pOwogICAgfQogICAgaWYgKCRwX2hlYWRlclsnY29tbWVudF9sZW4nXSAhPSAwKQogICAgewogICAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2NvbW1lbnQnXSwgJHBfaGVhZGVyWydjb21tZW50X2xlbiddKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2V3JpdGVDZW50cmFsSGVhZGVyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2V3JpdGVDZW50cmFsSGVhZGVyKCRwX25iX2VudHJpZXMsICRwX3NpemUsICRwX29mZnNldCwgJHBfY29tbWVudCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBQYWNrZWQgZGF0YQogICAgJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCJWdnZ2dlZWdiIsIDB4MDYwNTRiNTAsIDAsIDAsICRwX25iX2VudHJpZXMsCgkgICAgICAgICAgICAgICAgICAgICAgJHBfbmJfZW50cmllcywgJHBfc2l6ZSwKCQkJCQkJICAkcF9vZmZzZXQsIHN0cmxlbigkcF9jb21tZW50KSk7CgogICAgLy8gLS0tLS0gV3JpdGUgdGhlIDIyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIHppcCBmaWxlCiAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkdl9iaW5hcnlfZGF0YSwgMjIpOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB2YXJpYWJsZSBmaWVsZHMKICAgIGlmIChzdHJsZW4oJHBfY29tbWVudCkgIT0gMCkKICAgIHsKICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfY29tbWVudCwgc3RybGVuKCRwX2NvbW1lbnQpKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2TGlzdCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkxpc3QoJiRwX2xpc3QpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR0aGlzLT56aXBfZmQgPSBAZm9wZW4oJHRoaXMtPnppcG5hbWUsICdyYicpKSA9PSAwKQogICAgewogICAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgQ2VudHJhbCBEaXIKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICBpZiAoQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X2NlbnRyYWxfZGlyWydvZmZzZXQnXSkpCiAgICB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BUkNISVZFX1pJUCwgJ0ludmFsaWQgYXJjaGl2ZSBzaXplJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCBlYWNoIGVudHJ5CiAgICBmb3IgKCRpPTA7ICRpPCR2X2NlbnRyYWxfZGlyWydlbnRyaWVzJ107ICRpKyspCiAgICB7CiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyKSkgIT0gMSkKICAgICAgewogICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgIH0KICAgICAgJHZfaGVhZGVyWydpbmRleCddID0gJGk7CgogICAgICAvLyAtLS0tLSBHZXQgdGhlIG9ubHkgaW50ZXJlc3RpbmcgYXR0cmlidXRlcwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyLCAkcF9saXN0WyRpXSk7CiAgICAgIHVuc2V0KCR2X2hlYWRlcik7CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBmaWxlIGluZm9ybWF0aW9ucyBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeQogIC8vICAgZW50cmllcyBhbmQgZXh0cmFjdCB0aGUgaW50ZXJlc3RpbmcgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgZ2l2ZW4gYmFjay4KICAvLyAgIFRoZSByZXN1bHRpbmcgZmlsZSBpbmZvcyBhcmUgc2V0IGluIHRoZSBhcnJheSAkcF9pbmZvCiAgLy8gICAgICRwX2luZm9bJ2ZpbGVuYW1lJ10gOiBGaWxlbmFtZSB3aXRoIGZ1bGwgcGF0aC4gR2l2ZW4gYnkgdXNlciAoYWRkKSwKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZCBpbiB0aGUgZmlsZXN5c3RlbSAoZXh0cmFjdCkuCiAgLy8gICAgICRwX2luZm9bJ3N0b3JlZF9maWxlbmFtZSddIDogU3RvcmVkIGZpbGVuYW1lIGluIHRoZSBhcmNoaXZlLgogIC8vICAgICAkcF9pbmZvWydzaXplJ10gPSBTaXplIG9mIHRoZSBmaWxlLgogIC8vICAgICAkcF9pbmZvWydjb21wcmVzc2VkX3NpemUnXSA9IENvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZmlsZS4KICAvLyAgICAgJHBfaW5mb1snbXRpbWUnXSA9IExhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGZpbGUuCiAgLy8gICAgICRwX2luZm9bJ2NvbW1lbnQnXSA9IENvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLgogIC8vICAgICAkcF9pbmZvWydmb2xkZXInXSA9IHRydWUvZmFsc2UgOiBpbmRpY2F0ZXMgaWYgdGhlIGVudHJ5IGlzIGEgZm9sZGVyIG9yIG5vdC4KICAvLyAgICAgJHBfaW5mb1snc3RhdHVzJ10gPSBzdGF0dXMgb2YgdGhlIGFjdGlvbiBvbiB0aGUgZmlsZS4KICAvLyAgICAgJHBfaW5mb1snY3JjJ10gPSBDUkMgb2YgdGhlIGZpbGUgY29udGVudC4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2hlYWRlciwgJiRwX2luZm8pCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gR2V0IHRoZSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzCiAgICAkdl90ZW1wX3BhdGggPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10pOwogICAgJHBfaW5mb1snZmlsZW5hbWUnXSA9ICR2X3RlbXBfcGF0aDsKICAgICR2X3RlbXBfcGF0aCA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pOwogICAgJHBfaW5mb1snc3RvcmVkX2ZpbGVuYW1lJ10gPSAkdl90ZW1wX3BhdGg7CiAgICAkcF9pbmZvWydzaXplJ10gPSAkcF9oZWFkZXJbJ3NpemUnXTsKICAgICRwX2luZm9bJ2NvbXByZXNzZWRfc2l6ZSddID0gJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXTsKICAgICRwX2luZm9bJ210aW1lJ10gPSAkcF9oZWFkZXJbJ210aW1lJ107CiAgICAkcF9pbmZvWydjb21tZW50J10gPSAkcF9oZWFkZXJbJ2NvbW1lbnQnXTsKICAgICRwX2luZm9bJ2ZvbGRlciddID0gKCgkcF9oZWFkZXJbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApOwogICAgJHBfaW5mb1snaW5kZXgnXSA9ICRwX2hlYWRlclsnaW5kZXgnXTsKICAgICRwX2luZm9bJ3N0YXR1cyddID0gJHBfaGVhZGVyWydzdGF0dXMnXTsKICAgICRwX2luZm9bJ2NyYyddID0gJHBfaGVhZGVyWydjcmMnXTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RXh0cmFjdEJ5UnVsZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgRXh0cmFjdCBhIGZpbGUgb3IgZGlyZWN0b3J5IGRlcGVuZGluZyBvZiBydWxlcyAoYnkgaW5kZXgsIGJ5IG5hbWUsIC4uLikKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2ZpbGVfbGlzdCA6IEFuIGFycmF5IHdoZXJlIHdpbGwgYmUgcGxhY2VkIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2gKICAvLyAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZCBmaWxlCiAgLy8gICAkcF9wYXRoIDogUGF0aCB0byBhZGQgd2hpbGUgd3JpdGluZyB0aGUgZXh0cmFjdGVkIGZpbGVzCiAgLy8gICAkcF9yZW1vdmVfcGF0aCA6IFBhdGggdG8gcmVtb3ZlIChmcm9tIHRoZSBmaWxlIG1lbW9yaXplZCBwYXRoKSB3aGlsZSB3cml0aW5nIHRoZQogIC8vICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZmlsZXMuIElmIHRoZSBwYXRoIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlIHBhdGgsCiAgLy8gICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGlzIGV4dHJhY3RlZCB3aXRoIGl0cyBtZW1vcml6ZWQgcGF0aC4KICAvLyAgICAgICAgICAgICAgICAgICAgJHBfcmVtb3ZlX3BhdGggZG9lcyBub3QgYXBwbHkgdG8gJ2xpc3QnIG1vZGUuCiAgLy8gICAgICAgICAgICAgICAgICAgICRwX3BhdGggYW5kICRwX3JlbW92ZV9wYXRoIGFyZSBjb21tdWxhdGl2ZS4KICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2VzcywwIG9yIGxlc3Mgb24gZXJyb3IgKHNlZSBlcnJvciBjb2RlIGxpc3QpCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEJ5UnVsZSgmJHBfZmlsZV9saXN0LCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHBfcmVtb3ZlX2FsbF9wYXRoLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIHBhdGgKICAgIGlmICggICAoJHBfcGF0aCA9PSAiIikKCSAgICB8fCAoICAgKHN1YnN0cigkcF9wYXRoLCAwLCAxKSAhPSAiLyIpCgkJICAgICYmIChzdWJzdHIoJHBfcGF0aCwgMCwgMykgIT0gIi4uLyIpCgkJCSYmIChzdWJzdHIoJHBfcGF0aCwxLDIpIT0iOi8iKSkpCiAgICAgICRwX3BhdGggPSAiLi8iLiRwX3BhdGg7CgogICAgLy8gLS0tLS0gUmVkdWNlIHRoZSBwYXRoIGxhc3QgKGFuZCBkdXBsaWNhdGVkKSAnLycKICAgIGlmICgoJHBfcGF0aCAhPSAiLi8iKSAmJiAoJHBfcGF0aCAhPSAiLyIpKQogICAgewogICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgcGF0aCBlbmQgJy8nCiAgICAgIHdoaWxlIChzdWJzdHIoJHBfcGF0aCwgLTEpID09ICIvIikKICAgICAgewogICAgICAgICRwX3BhdGggPSBzdWJzdHIoJHBfcGF0aCwgMCwgc3RybGVuKCRwX3BhdGgpLTEpOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCB0byByZW1vdmUgZm9ybWF0IChzaG91bGQgZW5kIGJ5IC8pCiAgICBpZiAoKCRwX3JlbW92ZV9wYXRoICE9ICIiKSAmJiAoc3Vic3RyKCRwX3JlbW92ZV9wYXRoLCAtMSkgIT0gJy8nKSkKICAgIHsKICAgICAgJHBfcmVtb3ZlX3BhdGggLj0gJy8nOwogICAgfQogICAgJHBfcmVtb3ZlX3BhdGhfc2l6ZSA9IHN0cmxlbigkcF9yZW1vdmVfcGF0aCk7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZPcGVuRmQoJ3JiJykpICE9IDEpCiAgICB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucwogICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gU3RhcnQgYXQgYmVnaW5uaW5nIG9mIENlbnRyYWwgRGlyCiAgICAkdl9wb3NfZW50cnkgPSAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J107CgogICAgLy8gLS0tLS0gUmVhZCBlYWNoIGVudHJ5CiAgICAkal9zdGFydCA9IDA7CiAgICBmb3IgKCRpPTAsICR2X25iX2V4dHJhY3RlZD0wOyAkaTwkdl9jZW50cmFsX2RpclsnZW50cmllcyddOyAkaSsrKQogICAgewoKICAgICAgLy8gLS0tLS0gUmVhZCBuZXh0IENlbnRyYWwgZGlyIGVudHJ5CiAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICAgIGlmIChAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfcG9zX2VudHJ5KSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBoZWFkZXIKICAgICAgJHZfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXIpKSAhPSAxKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBpbmRleAogICAgICAkdl9oZWFkZXJbJ2luZGV4J10gPSAkaTsKCiAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBmaWxlIHBvc2l0aW9uCiAgICAgICR2X3Bvc19lbnRyeSA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHNwZWNpZmljIGV4dHJhY3QgcnVsZXMKICAgICAgJHZfZXh0cmFjdCA9IGZhbHNlOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBieSBuYW1lIHJ1bGUKICAgICAgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV0pKQogICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSAhPSAwKSkgewoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpbGVuYW1lIGlzIGluIHRoZSBsaXN0CiAgICAgICAgICBmb3IgKCRqPTA7ICgkajxzaXplb2YoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdKSkgJiYgKCEkdl9leHRyYWN0KTsgJGorKykgewoKICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGRpcmVjdG9yeQogICAgICAgICAgICAgIGlmIChzdWJzdHIoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSwgLTEpID09ICIvIikgewoKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZGlyZWN0b3J5IGlzIGluIHRoZSBmaWxlbmFtZSBwYXRoCiAgICAgICAgICAgICAgICAgIGlmICggICAoc3RybGVuKCR2X2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pID4gc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKQogICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YnN0cigkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddLCAwLCBzdHJsZW4oJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSkpID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGZpbGVuYW1lCiAgICAgICAgICAgICAgZWxzZWlmICgkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pIHsKICAgICAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGVyZWcgcnVsZQogICAgICAvLyBlcmVnKCkgaXMgZGVwcmVjYXRlZCB3aXRoIFBIUCA1LjMKICAgICAgLyoKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSkpCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfRVJFR10gIT0gIiIpKSB7CgogICAgICAgICAgaWYgKGVyZWcoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddLCAkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSkgewogICAgICAgICAgICAgICR2X2V4dHJhY3QgPSB0cnVlOwogICAgICAgICAgfQogICAgICB9CiAgICAgICovCgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IHByZWcgcnVsZQogICAgICBlbHNlIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX1BSRUddKSkKICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSAhPSAiIikpIHsKCiAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10sICR2X2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgaW5kZXggcnVsZQogICAgICBlbHNlIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSkpCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdICE9IDApKSB7CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgaW5kZXggaXMgaW4gdGhlIGxpc3QKICAgICAgICAgIGZvciAoJGo9JGpfc3RhcnQ7ICgkajxzaXplb2YoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSkpICYmICghJHZfZXh0cmFjdCk7ICRqKyspIHsKCiAgICAgICAgICAgICAgaWYgKCgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ3N0YXJ0J10pICYmICgkaTw9JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSkgewogICAgICAgICAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCRpPj0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnZW5kJ10pIHsKICAgICAgICAgICAgICAgICAgJGpfc3RhcnQgPSAkaisxOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF1bJGpdWydzdGFydCddPiRpKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm8gcnVsZSwgd2hpY2ggbWVhbnMgZXh0cmFjdCBhbGwgdGhlIGFyY2hpdmUKICAgICAgZWxzZSB7CiAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsKICAgICAgfQoKCSAgLy8gLS0tLS0gQ2hlY2sgY29tcHJlc3Npb24gbWV0aG9kCgkgIGlmICggICAoJHZfZXh0cmFjdCkKCSAgICAgICYmICggICAoJHZfaGVhZGVyWydjb21wcmVzc2lvbiddICE9IDgpCgkJICAgICAgJiYgKCR2X2hlYWRlclsnY29tcHJlc3Npb24nXSAhPSAwKSkpIHsKICAgICAgICAgICR2X2hlYWRlclsnc3RhdHVzJ10gPSAndW5zdXBwb3J0ZWRfY29tcHJlc3Npb24nOwoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUgogICAgICAgICAgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl0pKQoJCSAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl09PT10cnVlKSkgewoKICAgICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTiwKCQkJICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW5hbWUgJyIuJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXS4iJyBpcyAiCgkJCQkgIAkgICAgCSAgCSAgIC4iY29tcHJlc3NlZCBieSBhbiB1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiAiCgkJCQkgIAkgICAgCSAgCSAgIC4ibWV0aG9kICgiLiR2X2hlYWRlclsnY29tcHJlc3Npb24nXS4iKSAiKTsKCiAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkJICB9CgkgIH0KCgkgIC8vIC0tLS0tIENoZWNrIGVuY3J5cHRlZCBmaWxlcwoJICBpZiAoKCR2X2V4dHJhY3QpICYmICgoJHZfaGVhZGVyWydmbGFnJ10gJiAxKSA9PSAxKSkgewogICAgICAgICAgJHZfaGVhZGVyWydzdGF0dXMnXSA9ICd1bnN1cHBvcnRlZF9lbmNyeXB0aW9uJzsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IKICAgICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdPT09dHJ1ZSkpIHsKCiAgICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTiwKCQkJICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBmb3IgIgoJCQkJICAJICAgIAkgIAkgICAuIiBmaWxlbmFtZSAnIi4kdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddCgkJCQkJCQkJICAgLiInIik7CgogICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJCSAgfQogICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcmVhbCBleHRyYWN0aW9uCiAgICAgIGlmICgoJHZfZXh0cmFjdCkgJiYgKCR2X2hlYWRlclsnc3RhdHVzJ10gIT0gJ29rJykpIHsKICAgICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXIsCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWQrK10pOwogICAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KCiAgICAgICAgICAkdl9leHRyYWN0ID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHJlYWwgZXh0cmFjdGlvbgogICAgICBpZiAoJHZfZXh0cmFjdCkKICAgICAgewoKICAgICAgICAvLyAtLS0tLSBHbyB0byB0aGUgZmlsZSBwb3NpdGlvbgogICAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICAgICAgaWYgKEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9oZWFkZXJbJ29mZnNldCddKSkKICAgICAgICB7CiAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQLCAnSW52YWxpZCBhcmNoaXZlIHNpemUnKTsKCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdGlvbiBhcyBzdHJpbmcKICAgICAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSkgewoKICAgICAgICAgICR2X3N0cmluZyA9ICcnOwoKICAgICAgICAgIC8vIC0tLS0tIEV4dHJhY3RpbmcgdGhlIGZpbGUKICAgICAgICAgICR2X3Jlc3VsdDEgPSAkdGhpcy0+cHJpdkV4dHJhY3RGaWxlQXNTdHJpbmcoJHZfaGVhZGVyLCAkdl9zdHJpbmcsICRwX29wdGlvbnMpOwogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPCAxKSB7CiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDE7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBvbmx5IGludGVyZXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlciwgJHBfZmlsZV9saXN0WyR2X25iX2V4dHJhY3RlZF0pKSAhPSAxKQogICAgICAgICAgewogICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGZpbGUgY29udGVudAogICAgICAgICAgJHBfZmlsZV9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ2NvbnRlbnQnXSA9ICR2X3N0cmluZzsKCiAgICAgICAgICAvLyAtLS0tLSBOZXh0IGV4dHJhY3RlZCBmaWxlCiAgICAgICAgICAkdl9uYl9leHRyYWN0ZWQrKzsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2VyIGNhbGxiYWNrIGFib3J0CiAgICAgICAgICBpZiAoJHZfcmVzdWx0MSA9PSAyKSB7CiAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3Rpb24gaW4gc3RhbmRhcmQgb3V0cHV0CiAgICAgICAgZWxzZWlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUXSkpCgkJICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUXSkpIHsKICAgICAgICAgIC8vIC0tLS0tIEV4dHJhY3RpbmcgdGhlIGZpbGUgaW4gc3RhbmRhcmQgb3V0cHV0CiAgICAgICAgICAkdl9yZXN1bHQxID0gJHRoaXMtPnByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCR2X2hlYWRlciwgJHBfb3B0aW9ucyk7CiAgICAgICAgICBpZiAoJHZfcmVzdWx0MSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0MTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIG9ubHkgaW50ZXJlc3RpbmcgYXR0cmlidXRlcwogICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyLCAkcF9maWxlX2xpc3RbJHZfbmJfZXh0cmFjdGVkKytdKSkgIT0gMSkgewogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdXNlciBjYWxsYmFjayBhYm9ydAogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPT0gMikgewogICAgICAgICAgCWJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3JtYWwgZXh0cmFjdGlvbgogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gLS0tLS0gRXh0cmFjdGluZyB0aGUgZmlsZQogICAgICAgICAgJHZfcmVzdWx0MSA9ICR0aGlzLT5wcml2RXh0cmFjdEZpbGUoJHZfaGVhZGVyLAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsCgkJCQkJCQkJCQkJICAkcF9yZW1vdmVfYWxsX3BhdGgsCgkJCQkJCQkJCQkJICAkcF9vcHRpb25zKTsKICAgICAgICAgIGlmICgkdl9yZXN1bHQxIDwgMSkgewogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQxOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgb25seSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzCiAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXIsICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWQrK10pKSAhPSAxKQogICAgICAgICAgewogICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2VyIGNhbGxiYWNrIGFib3J0CiAgICAgICAgICBpZiAoJHZfcmVzdWx0MSA9PSAyKSB7CiAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFeHRyYWN0RmlsZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vCiAgLy8gMSA6IC4uLiA/CiAgLy8gUENMWklQX0VSUl9VU0VSX0FCT1JURUQoMikgOiBVc2VyIGFzayBmb3IgZXh0cmFjdGlvbiBzdG9wIGluIGNhbGxiYWNrCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEZpbGUoJiRwX2VudHJ5LCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHBfcmVtb3ZlX2FsbF9wYXRoLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcgogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRGaWxlSGVhZGVyKCR2X2hlYWRlcikpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGhlYWRlciBpcyBjb2hlcmVudCB3aXRoICRwX2VudHJ5IGluZm8KICAgIGlmICgkdGhpcy0+cHJpdkNoZWNrRmlsZUhlYWRlcnMoJHZfaGVhZGVyLCAkcF9lbnRyeSkgIT0gMSkgewogICAgICAgIC8vIFRCQwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFsbCBwYXRoIHRvIHJlbW92ZQogICAgaWYgKCRwX3JlbW92ZV9hbGxfcGF0aCA9PSB0cnVlKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZm9sZGVyIGVudHJ5IHRoYXQgbm90IG5lZWQgdG8gYmUgZXh0cmFjdGVkCiAgICAgICAgaWYgKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkgewoKICAgICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImZpbHRlcmVkIjsKCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIGJhc2VuYW1lIG9mIHRoZSBwYXRoCiAgICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSBiYXNlbmFtZSgkcF9lbnRyeVsnZmlsZW5hbWUnXSk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCB0byByZW1vdmUKICAgIGVsc2UgaWYgKCRwX3JlbW92ZV9wYXRoICE9ICIiKQogICAgewogICAgICBpZiAoUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfcmVtb3ZlX3BhdGgsICRwX2VudHJ5WydmaWxlbmFtZSddKSA9PSAyKQogICAgICB7CgogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiZmlsdGVyZWQiOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICB9CgogICAgICAkcF9yZW1vdmVfcGF0aF9zaXplID0gc3RybGVuKCRwX3JlbW92ZV9wYXRoKTsKICAgICAgaWYgKHN1YnN0cigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgMCwgJHBfcmVtb3ZlX3BhdGhfc2l6ZSkgPT0gJHBfcmVtb3ZlX3BhdGgpCiAgICAgIHsKCiAgICAgICAgLy8gLS0tLS0gUmVtb3ZlIHRoZSBwYXRoCiAgICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSBzdWJzdHIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICRwX3JlbW92ZV9wYXRoX3NpemUpOwoKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEFkZCB0aGUgcGF0aAogICAgaWYgKCRwX3BhdGggIT0gJycpIHsKICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSAkcF9wYXRoLiIvIi4kcF9lbnRyeVsnZmlsZW5hbWUnXTsKICAgIH0KCiAgICAvLyAtLS0tLSBDaGVjayBhIGJhc2VfZGlyX3Jlc3RyaWN0aW9uCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OXSkpIHsKICAgICAgJHZfaW5jbHVzaW9uCiAgICAgID0gUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSk7CiAgICAgIGlmICgkdl9pbmNsdXNpb24gPT0gMCkgewoKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0RJUkVDVE9SWV9SRVNUUklDVElPTiwKCQkJICAgICAgICAgICAgICAgICAgICAgIkZpbGVuYW1lICciLiRwX2VudHJ5WydmaWxlbmFtZSddLiInIGlzICIKCQkJCQkJCQkgLiJvdXRzaWRlIFBDTFpJUF9PUFRfRVhUUkFDVF9ESVJfUkVTVFJJQ1RJT04iKTsKCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwcmUtZXh0cmFjdCBjYWxsYmFjawogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9FWFRSQUNUXSkpIHsKCiAgICAgIC8vIC0tLS0tIEdlbmVyYXRlIGEgbG9jYWwgaW5mb3JtYXRpb24KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9FWFRSQUNUXShQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QsICR2X2xvY2FsX2hlYWRlcik7CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMCkgewogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAic2tpcHBlZCI7CiAgICAgICAgJHZfcmVzdWx0ID0gMTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMikgewogICAgICAgIC8vIC0tLS0tIFRoaXMgc3RhdHVzIGlzIGludGVybmFsIGFuZCB3aWxsIGJlIGNoYW5nZWQgaW4gJ3NraXBwZWQnCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImFib3J0ZWQiOwogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zCiAgICAgIC8vIE9ubHkgc29tZSBmaWVsZHMgY2FuIGJlIG1vZGlmaWVkCiAgICAgICRwX2VudHJ5WydmaWxlbmFtZSddID0gJHZfbG9jYWxfaGVhZGVyWydmaWxlbmFtZSddOwogICAgfQoKCiAgICAvLyAtLS0tLSBMb29rIGlmIGV4dHJhY3Rpb24gc2hvdWxkIGJlIGRvbmUKICAgIGlmICgkcF9lbnRyeVsnc3RhdHVzJ10gPT0gJ29rJykgewoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHNwZWNpZmljIGFjdGlvbnMgd2hpbGUgdGhlIGZpbGUgZXhpc3QKICAgIGlmIChmaWxlX2V4aXN0cygkcF9lbnRyeVsnZmlsZW5hbWUnXSkpCiAgICB7CgogICAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgaXMgYSBkaXJlY3RvcnkKICAgICAgaWYgKGlzX2RpcigkcF9lbnRyeVsnZmlsZW5hbWUnXSkpCiAgICAgIHsKCiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhbHJlYWR5X2FfZGlyZWN0b3J5IjsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgUENMWklQX09QVF9TVE9QX09OX0VSUk9SCiAgICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29uIGZpcnN0IFBjbFppcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdG9wCiAgICAgICAgLy8gd2hlbiB0aGlzIGtpbmQgb2YgZXJyb3Igb2NjdXJzLgogICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7CgogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0FMUkVBRFlfQV9ESVJFQ1RPUlksCgkJCSAgICAgICAgICAgICAgICAgICAgICJGaWxlbmFtZSAnIi4kcF9lbnRyeVsnZmlsZW5hbWUnXS4iJyBpcyAiCgkJCQkJCQkJIC4iYWxyZWFkeSB1c2VkIGJ5IGFuIGV4aXN0aW5nIGRpcmVjdG9yeSIpOwoKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkJICAgIH0KICAgICAgfQogICAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgaXMgd3JpdGUgcHJvdGVjdGVkCiAgICAgIGVsc2UgaWYgKCFpc193cml0ZWFibGUoJHBfZW50cnlbJ2ZpbGVuYW1lJ10pKQogICAgICB7CgogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAid3JpdGVfcHJvdGVjdGVkIjsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgUENMWklQX09QVF9TVE9QX09OX0VSUk9SCiAgICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29uIGZpcnN0IFBjbFppcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdG9wCiAgICAgICAgLy8gd2hlbiB0aGlzIGtpbmQgb2YgZXJyb3Igb2NjdXJzLgogICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7CgogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1dSSVRFX09QRU5fRkFJTCwKCQkJICAgICAgICAgICAgICAgICAgICAgIkZpbGVuYW1lICciLiRwX2VudHJ5WydmaWxlbmFtZSddLiInIGV4aXN0cyAiCgkJCQkJCQkJIC4iYW5kIGlzIHdyaXRlIHByb3RlY3RlZCIpOwoKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkJICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZXh0cmFjdGVkIGZpbGUgaXMgb2xkZXIKICAgICAgZWxzZSBpZiAoZmlsZW10aW1lKCRwX2VudHJ5WydmaWxlbmFtZSddKSA+ICRwX2VudHJ5WydtdGltZSddKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFUExBQ0VfTkVXRVJdKSkKCQkgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9SRVBMQUNFX05FV0VSXT09PXRydWUpKSB7CgkgIAkgIH0KCQkgICAgZWxzZSB7CiAgICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJuZXdlcl9leGlzdCI7CgogICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IKICAgICAgICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29uIGZpcnN0IFBjbFppcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdG9wCiAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBraW5kIG9mIGVycm9yIG9jY3Vycy4KICAgICAgICAgICAgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl0pKQoJCSAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7CgogICAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwsCgkJCSAgICAgICAgICAgICAiTmV3ZXIgdmVyc2lvbiBvZiAnIi4kcF9lbnRyeVsnZmlsZW5hbWUnXS4iJyBleGlzdHMgIgoJCQkJCSAgICAuImFuZCBvcHRpb24gUENMWklQX09QVF9SRVBMQUNFX05FV0VSIGlzIG5vdCBzZWxlY3RlZCIpOwoKICAgICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJCSAgICAgIH0KCQkgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGRpcmVjdG9yeSBhdmFpbGFiaWxpdHkgYW5kIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkKICAgIGVsc2UgewogICAgICBpZiAoKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkgfHwgKHN1YnN0cigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgLTEpID09ICcvJykpCiAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gJHBfZW50cnlbJ2ZpbGVuYW1lJ107CiAgICAgIGVsc2UgaWYgKCFzdHJzdHIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICIvIikpCiAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gIiI7CiAgICAgIGVsc2UKICAgICAgICAkdl9kaXJfdG9fY2hlY2sgPSBkaXJuYW1lKCRwX2VudHJ5WydmaWxlbmFtZSddKTsKCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkRpckNoZWNrKCR2X2Rpcl90b19jaGVjaywgKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkpKSAhPSAxKSB7CgogICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInBhdGhfY3JlYXRpb25fZmFpbCI7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAvL3JldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAkdl9yZXN1bHQgPSAxOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgZXh0cmFjdGlvbiBzaG91bGQgYmUgZG9uZQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7CgogICAgICAvLyAtLS0tLSBEbyB0aGUgZXh0cmFjdGlvbiAoaWYgbm90IGEgZm9sZGVyKQogICAgICBpZiAoISgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm90IGNvbXByZXNzZWQgZmlsZQogICAgICAgIGlmICgkcF9lbnRyeVsnY29tcHJlc3Npb24nXSA9PSAwKSB7CgogICAgCQkgIC8vIC0tLS0tIE9wZW5pbmcgZGVzdGluYXRpb24gZmlsZQogICAgICAgICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICd3YicpKSA9PSAwKQogICAgICAgICAgewoKICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAid3JpdGVfZXJyb3IiOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CgoKICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzCiAgICAgICAgICAkdl9zaXplID0gJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgICAgICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgICAgICAgIHsKICAgICAgICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgICAgICAgLyogVHJ5IHRvIHNwZWVkIHVwIHRoZSBjb2RlCiAgICAgICAgICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygnYScuJHZfcmVhZF9zaXplLCAkdl9idWZmZXIpOwogICAgICAgICAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfYmluYXJ5X2RhdGEsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgICAgICovCiAgICAgICAgICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIENsb3NpbmcgdGhlIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgIGZjbG9zZSgkdl9kZXN0X2ZpbGUpOwoKICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBtdGltZQogICAgICAgICAgdG91Y2goJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICRwX2VudHJ5WydtdGltZSddKTsKCgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIC0tLS0tIFRCQwogICAgICAgICAgLy8gTmVlZCB0byBiZSBmaW5pc2hlZAogICAgICAgICAgaWYgKCgkcF9lbnRyeVsnZmxhZyddICYgMSkgPT0gMSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT04sICdGaWxlIFwnJy4kcF9lbnRyeVsnZmlsZW5hbWUnXS4nXCcgaXMgZW5jcnlwdGVkLiBFbmNyeXB0ZWQgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuJyk7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2luZyB0ZW1wb3JhcnkgZmlsZSB0byB1bnppcAogICAgICAgICAgaWYgKCAoIWlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGXSkpCiAgICAgICAgICAgICAgJiYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT05dKQogICAgICAgICAgICAgICAgICB8fCAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKQogICAgICAgICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSA8PSAkcF9lbnRyeVsnc2l6ZSddKSkgKSApIHsKICAgICAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZFeHRyYWN0RmlsZVVzaW5nVGVtcEZpbGUoJHBfZW50cnksICRwX29wdGlvbnMpOwogICAgICAgICAgICBpZiAoJHZfcmVzdWx0IDwgUENMWklQX0VSUl9OT19FUlJPUikgewogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGluIG1lbW9yeQogICAgICAgICAgZWxzZSB7CgoKICAgICAgICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgY29tcHJlc3NlZCBmaWxlIGluIGEgYnVmZmVyIChvbmUgc2hvdCkKICAgICAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSk7CgogICAgICAgICAgICAvLyAtLS0tLSBEZWNvbXByZXNzIHRoZSBmaWxlCiAgICAgICAgICAgICR2X2ZpbGVfY29udGVudCA9IEBnemluZmxhdGUoJHZfYnVmZmVyKTsKICAgICAgICAgICAgdW5zZXQoJHZfYnVmZmVyKTsKICAgICAgICAgICAgaWYgKCR2X2ZpbGVfY29udGVudCA9PT0gRkFMU0UpIHsKCiAgICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgICAgIC8vIFRCQwogICAgICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJlcnJvciI7CgogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIE9wZW5pbmcgZGVzdGluYXRpb24gZmlsZQogICAgICAgICAgICBpZiAoKCR2X2Rlc3RfZmlsZSA9IEBmb3BlbigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJ3diJykpID09IDApIHsKCiAgICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJ3cml0ZV9lcnJvciI7CgogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB1bmNvbXByZXNzZWQgZGF0YQogICAgICAgICAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfZmlsZV9jb250ZW50LCAkcF9lbnRyeVsnc2l6ZSddKTsKICAgICAgICAgICAgdW5zZXQoJHZfZmlsZV9jb250ZW50KTsKCiAgICAgICAgICAgIC8vIC0tLS0tIENsb3NpbmcgdGhlIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgICAgQGZjbG9zZSgkdl9kZXN0X2ZpbGUpOwoKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgbXRpbWUKICAgICAgICAgIEB0b3VjaCgkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJHBfZW50cnlbJ210aW1lJ10pOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgY2htb2Qgb3B0aW9uCiAgICAgICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TRVRfQ0hNT0RdKSkgewoKICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgbW9kZSBvZiB0aGUgZmlsZQogICAgICAgICAgQGNobW9kKCRwX2VudHJ5WydmaWxlbmFtZSddLCAkcF9vcHRpb25zW1BDTFpJUF9PUFRfU0VUX0NITU9EXSk7CiAgICAgICAgfQoKICAgICAgfQogICAgfQoKICAJLy8gLS0tLS0gQ2hhbmdlIGFib3J0IHN0YXR1cwogIAlpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICJhYm9ydGVkIikgewogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJza2lwcGVkIjsKICAJfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtZXh0cmFjdCBjYWxsYmFjawogICAgZWxzZWlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfZW50cnksICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXShQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMikgewogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RXh0cmFjdEZpbGVVc2luZ1RlbXBGaWxlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEZpbGVVc2luZ1RlbXBGaWxlKCYkcF9lbnRyeSwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlCiAgICAkdl9nemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicuZ3onOwogICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICJ3YiIpKSA9PSAwKSB7CiAgICAgIGZjbG9zZSgkdl9maWxlKTsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfZ3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKCiAgICAvLyAtLS0tLSBXcml0ZSBneiBmaWxlIGZvcm1hdCBoZWFkZXIKICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygndmExYTFWYTFhMScsIDB4OGIxZiwgQ2hyKCRwX2VudHJ5Wydjb21wcmVzc2lvbiddKSwgQ2hyKDB4MDApLCB0aW1lKCksIENocigweDAwKSwgQ2hyKDMpKTsKICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9iaW5hcnlfZGF0YSwgMTApOwoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzCiAgICAkdl9zaXplID0gJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gV3JpdGUgZ3ogZmlsZSBmb3JtYXQgZm9vdGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soJ1ZWJywgJHBfZW50cnlbJ2NyYyddLCAkcF9lbnRyeVsnc2l6ZSddKTsKICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9iaW5hcnlfZGF0YSwgOCk7CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICBAZmNsb3NlKCR2X2Rlc3RfZmlsZSk7CgogICAgLy8gLS0tLS0gT3BlbmluZyBkZXN0aW5hdGlvbiBmaWxlCiAgICBpZiAoKCR2X2Rlc3RfZmlsZSA9IEBmb3BlbigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJ3diJykpID09IDApIHsKICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gIndyaXRlX2Vycm9yIjsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZ3ogZmlsZQogICAgaWYgKCgkdl9zcmNfZmlsZSA9IEBnem9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICdyYicpKSA9PSAwKSB7CiAgICAgIEBmY2xvc2UoJHZfZGVzdF9maWxlKTsKICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInJlYWRfZXJyb3IiOwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2NrcwogICAgJHZfc2l6ZSA9ICRwX2VudHJ5WydzaXplJ107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKSB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gQGd6cmVhZCgkdl9zcmNfZmlsZSwgJHZfcmVhZF9zaXplKTsKICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CiAgICBAZmNsb3NlKCR2X2Rlc3RfZmlsZSk7CiAgICBAZ3pjbG9zZSgkdl9zcmNfZmlsZSk7CgogICAgLy8gLS0tLS0gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQHVubGluaygkdl9nemlwX3RlbXBfbmFtZSk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkV4dHJhY3RGaWxlSW5PdXRwdXQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCYkcF9lbnRyeSwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBoZWFkZXIKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRmlsZUhlYWRlcigkdl9oZWFkZXIpKSAhPSAxKSB7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgoKICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgdGhlIGZpbGUgaGVhZGVyIGlzIGNvaGVyZW50IHdpdGggJHBfZW50cnkgaW5mbwogICAgaWYgKCR0aGlzLT5wcml2Q2hlY2tGaWxlSGVhZGVycygkdl9oZWFkZXIsICRwX2VudHJ5KSAhPSAxKSB7CiAgICAgICAgLy8gVEJDCiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcHJlLWV4dHJhY3QgY2FsbGJhY2sKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gaGVhZGVyLgogICAgICAkdl9yZXN1bHQgPSAkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0oUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgICAvLyAtLS0tLSBUaGlzIHN0YXR1cyBpcyBpbnRlcm5hbCBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluICdza2lwcGVkJwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhYm9ydGVkIjsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CgogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucwogICAgICAvLyBPbmx5IHNvbWUgZmllbGRzIGNhbiBiZSBtb2RpZmllZAogICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSA9ICR2X2xvY2FsX2hlYWRlclsnZmlsZW5hbWUnXTsKICAgIH0KCiAgICAvLyAtLS0tLSBUcmFjZQoKICAgIC8vIC0tLS0tIExvb2sgaWYgZXh0cmFjdGlvbiBzaG91bGQgYmUgZG9uZQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7CgogICAgICAvLyAtLS0tLSBEbyB0aGUgZXh0cmFjdGlvbiAoaWYgbm90IGEgZm9sZGVyKQogICAgICBpZiAoISgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm90IGNvbXByZXNzZWQgZmlsZQogICAgICAgIGlmICgkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10gPT0gJHBfZW50cnlbJ3NpemUnXSkgewoKICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaW4gYSBidWZmZXIgKG9uZSBzaG90KQogICAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSk7CgogICAgICAgICAgLy8gLS0tLS0gU2VuZCB0aGUgZmlsZSB0byB0aGUgb3V0cHV0CiAgICAgICAgICBlY2hvICR2X2J1ZmZlcjsKICAgICAgICAgIHVuc2V0KCR2X2J1ZmZlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNvbXByZXNzZWQgZmlsZSBpbiBhIGJ1ZmZlciAob25lIHNob3QpCiAgICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddKTsKCiAgICAgICAgICAvLyAtLS0tLSBEZWNvbXByZXNzIHRoZSBmaWxlCiAgICAgICAgICAkdl9maWxlX2NvbnRlbnQgPSBnemluZmxhdGUoJHZfYnVmZmVyKTsKICAgICAgICAgIHVuc2V0KCR2X2J1ZmZlcik7CgogICAgICAgICAgLy8gLS0tLS0gU2VuZCB0aGUgZmlsZSB0byB0aGUgb3V0cHV0CiAgICAgICAgICBlY2hvICR2X2ZpbGVfY29udGVudDsKICAgICAgICAgIHVuc2V0KCR2X2ZpbGVfY29udGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgoJLy8gLS0tLS0gQ2hhbmdlIGFib3J0IHN0YXR1cwoJaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAiYWJvcnRlZCIpIHsKICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwoJfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtZXh0cmFjdCBjYWxsYmFjawogICAgZWxzZWlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfZW50cnksICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXShQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMikgewogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkV4dHJhY3RGaWxlQXNTdHJpbmcoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0RmlsZUFzU3RyaW5nKCYkcF9lbnRyeSwgJiRwX3N0cmluZywgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBoZWFkZXIKICAgICR2X2hlYWRlciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEZpbGVIZWFkZXIoJHZfaGVhZGVyKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgoKICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgdGhlIGZpbGUgaGVhZGVyIGlzIGNvaGVyZW50IHdpdGggJHBfZW50cnkgaW5mbwogICAgaWYgKCR0aGlzLT5wcml2Q2hlY2tGaWxlSGVhZGVycygkdl9oZWFkZXIsICRwX2VudHJ5KSAhPSAxKSB7CiAgICAgICAgLy8gVEJDCiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcHJlLWV4dHJhY3QgY2FsbGJhY2sKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gaGVhZGVyLgogICAgICAkdl9yZXN1bHQgPSAkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0oUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgICAvLyAtLS0tLSBUaGlzIHN0YXR1cyBpcyBpbnRlcm5hbCBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluICdza2lwcGVkJwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhYm9ydGVkIjsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CgogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucwogICAgICAvLyBPbmx5IHNvbWUgZmllbGRzIGNhbiBiZSBtb2RpZmllZAogICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSA9ICR2X2xvY2FsX2hlYWRlclsnZmlsZW5hbWUnXTsKICAgIH0KCgogICAgLy8gLS0tLS0gTG9vayBpZiBleHRyYWN0aW9uIHNob3VsZCBiZSBkb25lCiAgICBpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICdvaycpIHsKCiAgICAgIC8vIC0tLS0tIERvIHRoZSBleHRyYWN0aW9uIChpZiBub3QgYSBmb2xkZXIpCiAgICAgIGlmICghKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkpIHsKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3QgY29tcHJlc3NlZCBmaWxlCiAgLy8gICAgICBpZiAoJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddID09ICRwX2VudHJ5WydzaXplJ10pCiAgICAgICAgaWYgKCRwX2VudHJ5Wydjb21wcmVzc2lvbiddID09IDApIHsKCiAgICAgICAgICAvLyAtLS0tLSBSZWFkaW5nIHRoZSBmaWxlCiAgICAgICAgICAkcF9zdHJpbmcgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgLy8gLS0tLS0gUmVhZGluZyB0aGUgZmlsZQogICAgICAgICAgJHZfZGF0YSA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10pOwoKICAgICAgICAgIC8vIC0tLS0tIERlY29tcHJlc3MgdGhlIGZpbGUKICAgICAgICAgIGlmICgoJHBfc3RyaW5nID0gQGd6aW5mbGF0ZSgkdl9kYXRhKSkgPT09IEZBTFNFKSB7CiAgICAgICAgICAgICAgLy8gVEJDCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBUcmFjZQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgICAgLy8gVEJDIDogZXJyb3IgOiBjYW4gbm90IGV4dHJhY3QgYSBmb2xkZXIgaW4gYSBzdHJpbmcKICAgICAgfQoKICAgIH0KCiAgCS8vIC0tLS0tIENoYW5nZSBhYm9ydCBzdGF0dXMKICAJaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAiYWJvcnRlZCIpIHsKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAic2tpcHBlZCI7CiAgCX0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwb3N0LWV4dHJhY3QgY2FsbGJhY2sKICAgIGVsc2VpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXSkpIHsKCiAgICAgIC8vIC0tLS0tIEdlbmVyYXRlIGEgbG9jYWwgaW5mb3JtYXRpb24KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gU3dhcCB0aGUgY29udGVudCB0byBoZWFkZXIKICAgICAgJHZfbG9jYWxfaGVhZGVyWydjb250ZW50J10gPSAkcF9zdHJpbmc7CiAgICAgICRwX3N0cmluZyA9ICcnOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0oUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIFN3YXAgYmFjayB0aGUgY29udGVudCB0byBoZWFkZXIKICAgICAgJHBfc3RyaW5nID0gJHZfbG9jYWxfaGVhZGVyWydjb250ZW50J107CiAgICAgIHVuc2V0KCR2X2xvY2FsX2hlYWRlclsnY29udGVudCddKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdlJlYWRGaWxlSGVhZGVyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2UmVhZEZpbGVIZWFkZXIoJiRwX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSA0IGJ5dGVzIHNpZ25hdHVyZQogICAgJHZfYmluYXJ5X2RhdGEgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgNCk7CiAgICAkdl9kYXRhID0gdW5wYWNrKCdWaWQnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgc2lnbmF0dXJlCiAgICBpZiAoJHZfZGF0YVsnaWQnXSAhPSAweDA0MDM0YjUwKQogICAgewoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ0ludmFsaWQgYXJjaGl2ZSBzdHJ1Y3R1cmUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCA0MiBieXRlcyBvZiB0aGUgaGVhZGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsIDI2KTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBpbnZhbGlkIGJsb2NrIHNpemUKICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpICE9IDI2KQogICAgewogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAiIjsKICAgICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICJpbnZhbGlkX2hlYWRlciI7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAiSW52YWxpZCBibG9jayBzaXplIDogIi5zdHJsZW4oJHZfYmluYXJ5X2RhdGEpKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSB2YWx1ZXMKICAgICR2X2RhdGEgPSB1bnBhY2soJ3Z2ZXJzaW9uL3ZmbGFnL3Zjb21wcmVzc2lvbi92bXRpbWUvdm1kYXRlL1ZjcmMvVmNvbXByZXNzZWRfc2l6ZS9Wc2l6ZS92ZmlsZW5hbWVfbGVuL3ZleHRyYV9sZW4nLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gR2V0IGZpbGVuYW1lCiAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9kYXRhWydmaWxlbmFtZV9sZW4nXSk7CgogICAgLy8gLS0tLS0gR2V0IGV4dHJhX2ZpZWxkcwogICAgaWYgKCR2X2RhdGFbJ2V4dHJhX2xlbiddICE9IDApIHsKICAgICAgJHBfaGVhZGVyWydleHRyYSddID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfZGF0YVsnZXh0cmFfbGVuJ10pOwogICAgfQogICAgZWxzZSB7CiAgICAgICRwX2hlYWRlclsnZXh0cmEnXSA9ICcnOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgcHJvcGVydGllcwogICAgJHBfaGVhZGVyWyd2ZXJzaW9uX2V4dHJhY3RlZCddID0gJHZfZGF0YVsndmVyc2lvbiddOwogICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gJHZfZGF0YVsnY29tcHJlc3Npb24nXTsKICAgICRwX2hlYWRlclsnc2l6ZSddID0gJHZfZGF0YVsnc2l6ZSddOwogICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICR2X2RhdGFbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgJHBfaGVhZGVyWydjcmMnXSA9ICR2X2RhdGFbJ2NyYyddOwogICAgJHBfaGVhZGVyWydmbGFnJ10gPSAkdl9kYXRhWydmbGFnJ107CiAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddID0gJHZfZGF0YVsnZmlsZW5hbWVfbGVuJ107CgogICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSBkYXRlIGluIFVOSVggZm9ybWF0CiAgICAkcF9oZWFkZXJbJ21kYXRlJ10gPSAkdl9kYXRhWydtZGF0ZSddOwogICAgJHBfaGVhZGVyWydtdGltZSddID0gJHZfZGF0YVsnbXRpbWUnXTsKICAgIGlmICgkcF9oZWFkZXJbJ21kYXRlJ10gJiYgJHBfaGVhZGVyWydtdGltZSddKQogICAgewogICAgICAvLyAtLS0tLSBFeHRyYWN0IHRpbWUKICAgICAgJHZfaG91ciA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweEY4MDApID4+IDExOwogICAgICAkdl9taW51dGUgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHgwN0UwKSA+PiA1OwogICAgICAkdl9zZWNvbmRlID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4MDAxRikqMjsKCiAgICAgIC8vIC0tLS0tIEV4dHJhY3QgZGF0ZQogICAgICAkdl95ZWFyID0gKCgkcF9oZWFkZXJbJ21kYXRlJ10gJiAweEZFMDApID4+IDkpICsgMTk4MDsKICAgICAgJHZfbW9udGggPSAoJHBfaGVhZGVyWydtZGF0ZSddICYgMHgwMUUwKSA+PiA1OwogICAgICAkdl9kYXkgPSAkcF9oZWFkZXJbJ21kYXRlJ10gJiAweDAwMUY7CgogICAgICAvLyAtLS0tLSBHZXQgVU5JWCBkYXRlIGZvcm1hdAogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSBAbWt0aW1lKCR2X2hvdXIsICR2X21pbnV0ZSwgJHZfc2Vjb25kZSwgJHZfbW9udGgsICR2X2RheSwgJHZfeWVhcik7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSB0aW1lKCk7CiAgICB9CgogICAgLy8gVEJDCiAgICAvL2ZvcihyZXNldCgkdl9kYXRhKTsgJGtleSA9IGtleSgkdl9kYXRhKTsgbmV4dCgkdl9kYXRhKSkgewogICAgLy99CgogICAgLy8gLS0tLS0gU2V0IHRoZSBzdG9yZWQgZmlsZW5hbWUKICAgICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10gPSAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ107CgogICAgLy8gLS0tLS0gU2V0IHRoZSBzdGF0dXMgZmllbGQKICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAib2siOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoJiRwX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSA0IGJ5dGVzIHNpZ25hdHVyZQogICAgJHZfYmluYXJ5X2RhdGEgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgNCk7CiAgICAkdl9kYXRhID0gdW5wYWNrKCdWaWQnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgc2lnbmF0dXJlCiAgICBpZiAoJHZfZGF0YVsnaWQnXSAhPSAweDAyMDE0YjUwKQogICAgewoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ0ludmFsaWQgYXJjaGl2ZSBzdHJ1Y3R1cmUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCA0MiBieXRlcyBvZiB0aGUgaGVhZGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsIDQyKTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBpbnZhbGlkIGJsb2NrIHNpemUKICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpICE9IDQyKQogICAgewogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAiIjsKICAgICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICJpbnZhbGlkX2hlYWRlciI7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAiSW52YWxpZCBibG9jayBzaXplIDogIi5zdHJsZW4oJHZfYmluYXJ5X2RhdGEpKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSB2YWx1ZXMKICAgICRwX2hlYWRlciA9IHVucGFjaygndnZlcnNpb24vdnZlcnNpb25fZXh0cmFjdGVkL3ZmbGFnL3Zjb21wcmVzc2lvbi92bXRpbWUvdm1kYXRlL1ZjcmMvVmNvbXByZXNzZWRfc2l6ZS9Wc2l6ZS92ZmlsZW5hbWVfbGVuL3ZleHRyYV9sZW4vdmNvbW1lbnRfbGVuL3ZkaXNrL3ZpbnRlcm5hbC9WZXh0ZXJuYWwvVm9mZnNldCcsICR2X2JpbmFyeV9kYXRhKTsKCiAgICAvLyAtLS0tLSBHZXQgZmlsZW5hbWUKICAgIGlmICgkcF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddICE9IDApCiAgICAgICRwX2hlYWRlclsnZmlsZW5hbWUnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10pOwogICAgZWxzZQogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAnJzsKCiAgICAvLyAtLS0tLSBHZXQgZXh0cmEKICAgIGlmICgkcF9oZWFkZXJbJ2V4dHJhX2xlbiddICE9IDApCiAgICAgICRwX2hlYWRlclsnZXh0cmEnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnZXh0cmFfbGVuJ10pOwogICAgZWxzZQogICAgICAkcF9oZWFkZXJbJ2V4dHJhJ10gPSAnJzsKCiAgICAvLyAtLS0tLSBHZXQgY29tbWVudAogICAgaWYgKCRwX2hlYWRlclsnY29tbWVudF9sZW4nXSAhPSAwKQogICAgICAkcF9oZWFkZXJbJ2NvbW1lbnQnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnY29tbWVudF9sZW4nXSk7CiAgICBlbHNlCiAgICAgICRwX2hlYWRlclsnY29tbWVudCddID0gJyc7CgogICAgLy8gLS0tLS0gRXh0cmFjdCBwcm9wZXJ0aWVzCgogICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSBkYXRlIGluIFVOSVggZm9ybWF0CiAgICAvL2lmICgkcF9oZWFkZXJbJ21kYXRlJ10gJiYgJHBfaGVhZGVyWydtdGltZSddKQogICAgLy8gVEJDIDogYnVnIDogdGhpcyB3YXMgaWdub3JpbmcgdGltZSB3aXRoIDAvMC8wCiAgICBpZiAoMSkKICAgIHsKICAgICAgLy8gLS0tLS0gRXh0cmFjdCB0aW1lCiAgICAgICR2X2hvdXIgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHhGODAwKSA+PiAxMTsKICAgICAgJHZfbWludXRlID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4MDdFMCkgPj4gNTsKICAgICAgJHZfc2Vjb25kZSA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweDAwMUYpKjI7CgogICAgICAvLyAtLS0tLSBFeHRyYWN0IGRhdGUKICAgICAgJHZfeWVhciA9ICgoJHBfaGVhZGVyWydtZGF0ZSddICYgMHhGRTAwKSA+PiA5KSArIDE5ODA7CiAgICAgICR2X21vbnRoID0gKCRwX2hlYWRlclsnbWRhdGUnXSAmIDB4MDFFMCkgPj4gNTsKICAgICAgJHZfZGF5ID0gJHBfaGVhZGVyWydtZGF0ZSddICYgMHgwMDFGOwoKICAgICAgLy8gLS0tLS0gR2V0IFVOSVggZGF0ZSBmb3JtYXQKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gQG1rdGltZSgkdl9ob3VyLCAkdl9taW51dGUsICR2X3NlY29uZGUsICR2X21vbnRoLCAkdl9kYXksICR2X3llYXIpOwoKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gdGltZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFNldCB0aGUgc3RvcmVkIGZpbGVuYW1lCiAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gJHBfaGVhZGVyWydmaWxlbmFtZSddOwoKICAgIC8vIC0tLS0tIFNldCBkZWZhdWx0IHN0YXR1cyB0byBvawogICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICdvayc7CgogICAgLy8gLS0tLS0gTG9vayBpZiBpdCBpcyBhIGRpcmVjdG9yeQogICAgaWYgKHN1YnN0cigkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10sIC0xKSA9PSAnLycpIHsKICAgICAgLy8kcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDQxRkYwMDEwOwogICAgICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDAwMDAwMDEwOwogICAgfQoKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2hlY2tGaWxlSGVhZGVycygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLAogIC8vICAgMCBvbiBlcnJvcjsKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDaGVja0ZpbGVIZWFkZXJzKCYkcF9sb2NhbF9oZWFkZXIsICYkcF9jZW50cmFsX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgCS8vIC0tLS0tIENoZWNrIHRoZSBzdGF0aWMgdmFsdWVzCiAgCS8vIFRCQwogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydmaWxlbmFtZSddICE9ICRwX2NlbnRyYWxfaGVhZGVyWydmaWxlbmFtZSddKSB7CiAgCX0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSAhPSAkcF9jZW50cmFsX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSkgewogIAl9CiAgCWlmICgkcF9sb2NhbF9oZWFkZXJbJ2ZsYWcnXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnZmxhZyddKSB7CiAgCX0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsnY29tcHJlc3Npb24nXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnY29tcHJlc3Npb24nXSkgewogIAl9CiAgCWlmICgkcF9sb2NhbF9oZWFkZXJbJ210aW1lJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ210aW1lJ10pIHsKICAJfQogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydmaWxlbmFtZV9sZW4nXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10pIHsKICAJfQoKICAJLy8gLS0tLS0gTG9vayBmb3IgZmxhZyBiaXQgMwogIAlpZiAoKCRwX2xvY2FsX2hlYWRlclsnZmxhZyddICYgOCkgPT0gOCkgewogICAgICAgICAgJHBfbG9jYWxfaGVhZGVyWydzaXplJ10gPSAkcF9jZW50cmFsX2hlYWRlclsnc2l6ZSddOwogICAgICAgICAgJHBfbG9jYWxfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2NlbnRyYWxfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXTsKICAgICAgICAgICRwX2xvY2FsX2hlYWRlclsnY3JjJ10gPSAkcF9jZW50cmFsX2hlYWRlclsnY3JjJ107CiAgCX0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2UmVhZEVuZENlbnRyYWxEaXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZSZWFkRW5kQ2VudHJhbERpcigmJHBfY2VudHJhbF9kaXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gR28gdG8gdGhlIGVuZCBvZiB0aGUgemlwIGZpbGUKICAgICR2X3NpemUgPSBmaWxlc2l6ZSgkdGhpcy0+emlwbmFtZSk7CiAgICBAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfc2l6ZSk7CiAgICBpZiAoQGZ0ZWxsKCR0aGlzLT56aXBfZmQpICE9ICR2X3NpemUpCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICdVbmFibGUgdG8gZ28gdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gRmlyc3QgdHJ5IDogbG9vayBpZiB0aGlzIGlzIGFuIGFyY2hpdmUgd2l0aCBubyBjb21tZW50YXJpZXMgKG1vc3Qgb2YgdGhlIHRpbWUpCiAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIGVuZCBvZiBjZW50cmFsIGRpciBpcyBhdCAyMiBieXRlcyBvZiB0aGUgZmlsZSBlbmQKICAgICR2X2ZvdW5kID0gMDsKICAgIGlmICgkdl9zaXplID4gMjYpIHsKICAgICAgQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3NpemUtMjIpOwogICAgICBpZiAoKCR2X3BvcyA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKSkgIT0gKCR2X3NpemUtMjIpKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAnVW5hYmxlIHRvIHNlZWsgYmFjayB0byB0aGUgbWlkZGxlIG9mIHRoZSBhcmNoaXZlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcnKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFJlYWQgZm9yIGJ5dGVzCiAgICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDQpOwogICAgICAkdl9kYXRhID0gQHVucGFjaygnVmlkJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgICAgLy8gLS0tLS0gQ2hlY2sgc2lnbmF0dXJlCiAgICAgIGlmICgkdl9kYXRhWydpZCddID09IDB4MDYwNTRiNTApIHsKICAgICAgICAkdl9mb3VuZCA9IDE7CiAgICAgIH0KCiAgICAgICR2X3BvcyA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwogICAgfQoKICAgIC8vIC0tLS0tIEdvIGJhY2sgdG8gdGhlIG1heGltdW0gcG9zc2libGUgc2l6ZSBvZiB0aGUgQ2VudHJhbCBEaXIgRW5kIFJlY29yZAogICAgaWYgKCEkdl9mb3VuZCkgewogICAgICAkdl9tYXhpbXVtX3NpemUgPSA2NTU1NzsgLy8gMHhGRkZGICsgMjI7CiAgICAgIGlmICgkdl9tYXhpbXVtX3NpemUgPiAkdl9zaXplKQogICAgICAgICR2X21heGltdW1fc2l6ZSA9ICR2X3NpemU7CiAgICAgIEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9zaXplLSR2X21heGltdW1fc2l6ZSk7CiAgICAgIGlmIChAZnRlbGwoJHRoaXMtPnppcF9mZCkgIT0gKCR2X3NpemUtJHZfbWF4aW11bV9zaXplKSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ1VuYWJsZSB0byBzZWVrIGJhY2sgdG8gdGhlIG1pZGRsZSBvZiB0aGUgYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnJyk7CgogICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICB9CgogICAgICAvLyAtLS0tLSBSZWFkIGJ5dGUgcGVyIGJ5dGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgc2lnbmF0dXJlCiAgICAgICR2X3BvcyA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwogICAgICAkdl9ieXRlcyA9IDB4MDAwMDAwMDA7CiAgICAgIHdoaWxlICgkdl9wb3MgPCAkdl9zaXplKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gUmVhZCBhIGJ5dGUKICAgICAgICAkdl9ieXRlID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDEpOwoKICAgICAgICAvLyAtLS0tLSAgQWRkIHRoZSBieXRlCiAgICAgICAgLy8kdl9ieXRlcyA9ICgkdl9ieXRlcyA8PCA4KSB8IE9yZCgkdl9ieXRlKTsKICAgICAgICAvLyBOb3RlIHdlIG1hc2sgdGhlIG9sZCB2YWx1ZSBkb3duIHN1Y2ggdGhhdCBvbmNlIHNoaWZ0ZWQgd2UgY2FuIG5ldmVyIGVuZCB1cCB3aXRoIG1vcmUgdGhhbiBhIDMyYml0IG51bWJlcgogICAgICAgIC8vIE90aGVyd2lzZSBvbiBzeXN0ZW1zIHdoZXJlIHdlIGhhdmUgNjRiaXQgaW50ZWdlcnMgdGhlIGNoZWNrIGJlbG93IGZvciB0aGUgbWFnaWMgbnVtYmVyIHdpbGwgZmFpbC4KICAgICAgICAkdl9ieXRlcyA9ICggKCR2X2J5dGVzICYgMHhGRkZGRkYpIDw8IDgpIHwgT3JkKCR2X2J5dGUpOwoKICAgICAgICAvLyAtLS0tLSBDb21wYXJlIHRoZSBieXRlcwogICAgICAgIGlmICgkdl9ieXRlcyA9PSAweDUwNGIwNTA2KQogICAgICAgIHsKICAgICAgICAgICR2X3BvcysrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAkdl9wb3MrKzsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBpZiBub3QgZm91bmQgZW5kIG9mIGNlbnRyYWwgZGlyCiAgICAgIGlmICgkdl9wb3MgPT0gJHZfc2l6ZSkKICAgICAgewoKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICJVbmFibGUgdG8gZmluZCBFbmQgb2YgQ2VudHJhbCBEaXIgUmVjb3JkIHNpZ25hdHVyZSIpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpcnN0IDE4IGJ5dGVzIG9mIHRoZSBoZWFkZXIKICAgICR2X2JpbmFyeV9kYXRhID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgMTgpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGludmFsaWQgYmxvY2sgc2l6ZQogICAgaWYgKHN0cmxlbigkdl9iaW5hcnlfZGF0YSkgIT0gMTgpCiAgICB7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAiSW52YWxpZCBFbmQgb2YgQ2VudHJhbCBEaXIgUmVjb3JkIHNpemUgOiAiLnN0cmxlbigkdl9iaW5hcnlfZGF0YSkpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHZhbHVlcwogICAgJHZfZGF0YSA9IHVucGFjaygndmRpc2svdmRpc2tfc3RhcnQvdmRpc2tfZW50cmllcy92ZW50cmllcy9Wc2l6ZS9Wb2Zmc2V0L3Zjb21tZW50X3NpemUnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGdsb2JhbCBzaXplCiAgICBpZiAoKCR2X3BvcyArICR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddICsgMTgpICE9ICR2X3NpemUpIHsKCgkgIC8vIC0tLS0tIFJlbW92ZWQgaW4gcmVsZWFzZSAyLjIgc2VlIHJlYWRtZSBmaWxlCgkgIC8vIFRoZSBjaGVjayBvZiB0aGUgZmlsZSBzaXplIGlzIGEgbGl0dGxlIHRvbyBzdHJpY3QuCgkgIC8vIFNvbWUgYnVncyB3aGVyZSBmb3VuZCB3aGVuIGEgemlwIGlzIGVuY3J5cHRlZC9kZWNyeXB0ZWQgd2l0aCAnY3J5cHQnLgoJICAvLyBXaGlsZSBkZWNyeXB0ZWQsIHppcCBoYXMgdHJhaW5pbmcgMCBieXRlcwoJICBpZiAoMCkgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULAoJICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGNlbnRyYWwgZGlyIGlzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLicKCQkJCQkJICAgLicgU29tZSB0cmFpbGluZyBieXRlcyBleGlzdHMgYWZ0ZXIgdGhlIGFyY2hpdmUuJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBHZXQgY29tbWVudAogICAgaWYgKCR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddICE9IDApIHsKICAgICAgJHBfY2VudHJhbF9kaXJbJ2NvbW1lbnQnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddKTsKICAgIH0KICAgIGVsc2UKICAgICAgJHBfY2VudHJhbF9kaXJbJ2NvbW1lbnQnXSA9ICcnOwoKICAgICRwX2NlbnRyYWxfZGlyWydlbnRyaWVzJ10gPSAkdl9kYXRhWydlbnRyaWVzJ107CiAgICAkcF9jZW50cmFsX2RpclsnZGlza19lbnRyaWVzJ10gPSAkdl9kYXRhWydkaXNrX2VudHJpZXMnXTsKICAgICRwX2NlbnRyYWxfZGlyWydvZmZzZXQnXSA9ICR2X2RhdGFbJ29mZnNldCddOwogICAgJHBfY2VudHJhbF9kaXJbJ3NpemUnXSA9ICR2X2RhdGFbJ3NpemUnXTsKICAgICRwX2NlbnRyYWxfZGlyWydkaXNrJ10gPSAkdl9kYXRhWydkaXNrJ107CiAgICAkcF9jZW50cmFsX2RpclsnZGlza19zdGFydCddID0gJHZfZGF0YVsnZGlza19zdGFydCddOwoKICAgIC8vIFRCQwogICAgLy9mb3IocmVzZXQoJHBfY2VudHJhbF9kaXIpOyAka2V5ID0ga2V5KCRwX2NlbnRyYWxfZGlyKTsgbmV4dCgkcF9jZW50cmFsX2RpcikpIHsKICAgIC8vfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZEZWxldGVCeVJ1bGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZEZWxldGVCeVJ1bGUoJiRwX3Jlc3VsdF9saXN0LCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKICAgICR2X2xpc3RfZGV0YWlsID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgaWYgKCgkdl9yZXN1bHQ9JHRoaXMtPnByaXZPcGVuRmQoJ3JiJykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucwogICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gU2NhbiBhbGwgdGhlIGZpbGVzCiAgICAvLyAtLS0tLSBTdGFydCBhdCBiZWdpbm5pbmcgb2YgQ2VudHJhbCBEaXIKICAgICR2X3Bvc19lbnRyeSA9ICR2X2NlbnRyYWxfZGlyWydvZmZzZXQnXTsKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICBpZiAoQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3Bvc19lbnRyeSkpCiAgICB7CiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgZWFjaCBlbnRyeQogICAgJHZfaGVhZGVyX2xpc3QgPSBhcnJheSgpOwogICAgJGpfc3RhcnQgPSAwOwogICAgZm9yICgkaT0wLCAkdl9uYl9leHRyYWN0ZWQ9MDsgJGk8JHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXTsgJGkrKykKICAgIHsKCiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAgICR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF0gPSBhcnJheSgpOwogICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZENlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF0pKSAhPSAxKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgIH0KCgogICAgICAvLyAtLS0tLSBTdG9yZSB0aGUgaW5kZXgKICAgICAgJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnaW5kZXgnXSA9ICRpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHNwZWNpZmljIGV4dHJhY3QgcnVsZXMKICAgICAgJHZfZm91bmQgPSBmYWxzZTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgbmFtZSBydWxlCiAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdKSkKICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV0gIT0gMCkpIHsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBmaWxlbmFtZSBpcyBpbiB0aGUgbGlzdAogICAgICAgICAgZm9yICgkaj0wOyAoJGo8c2l6ZW9mKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSkpICYmICghJHZfZm91bmQpOyAkaisrKSB7CgogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZGlyZWN0b3J5CiAgICAgICAgICAgICAgaWYgKHN1YnN0cigkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdLCAtMSkgPT0gIi8iKSB7CgogICAgICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBkaXJlY3RvcnkgaXMgaW4gdGhlIGZpbGVuYW1lIHBhdGgKICAgICAgICAgICAgICAgICAgaWYgKCAgIChzdHJsZW4oJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10pID4gc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKQogICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YnN0cigkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydzdG9yZWRfZmlsZW5hbWUnXSwgMCwgc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgewogICAgICAgICAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2VpZiAoICAgKCgkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydleHRlcm5hbCddJjB4MDAwMDAwMTApPT0weDAwMDAwMDEwKSAvKiBJbmRpY2F0ZXMgYSBmb2xkZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10uJy8nID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBmaWxlbmFtZQogICAgICAgICAgICAgIGVsc2VpZiAoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10gPT0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSkgewogICAgICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGVyZWcgcnVsZQogICAgICAvLyBlcmVnKCkgaXMgZGVwcmVjYXRlZCB3aXRoIFBIUCA1LjMKICAgICAgLyoKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSkpCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfRVJFR10gIT0gIiIpKSB7CgogICAgICAgICAgaWYgKGVyZWcoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddLCAkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsKICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgKi8KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgcHJlZyBydWxlCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10pKQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX1BSRUddICE9ICIiKSkgewoKICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSwgJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGluZGV4IHJ1bGUKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0pKQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSAhPSAwKSkgewoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZSBsaXN0CiAgICAgICAgICBmb3IgKCRqPSRqX3N0YXJ0OyAoJGo8c2l6ZW9mKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0pKSAmJiAoISR2X2ZvdW5kKTsgJGorKykgewoKICAgICAgICAgICAgICBpZiAoKCRpPj0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnc3RhcnQnXSkgJiYgKCRpPD0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnZW5kJ10pKSB7CiAgICAgICAgICAgICAgICAgICR2X2ZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCRpPj0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnZW5kJ10pIHsKICAgICAgICAgICAgICAgICAgJGpfc3RhcnQgPSAkaisxOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF1bJGpdWydzdGFydCddPiRpKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgCSR2X2ZvdW5kID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZGVsZXRpb24KICAgICAgaWYgKCR2X2ZvdW5kKQogICAgICB7CiAgICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgJHZfbmJfZXh0cmFjdGVkKys7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHNvbWV0aGluZyBuZWVkIHRvIGJlIGRlbGV0ZWQKICAgIGlmICgkdl9uYl9leHRyYWN0ZWQgPiAwKSB7CgogICAgICAgIC8vIC0tLS0tIENyZWF0ZXMgYSB0ZW1wb3JheSBmaWxlCiAgICAgICAgJHZfemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicudG1wJzsKCiAgICAgICAgLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmFyeSB6aXAgYXJjaGl2ZQogICAgICAgICR2X3RlbXBfemlwID0gbmV3IFBjbFppcCgkdl96aXBfdGVtcF9uYW1lKTsKCiAgICAgICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IHppcCBmaWxlIGluIHdyaXRlIG1vZGUKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR2X3RlbXBfemlwLT5wcml2T3BlbkZkKCd3YicpKSAhPSAxKSB7CiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBMb29rIHdoaWNoIGZpbGUgbmVlZCB0byBiZSBrZXB0CiAgICAgICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKSB7CgogICAgICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoZWFkZXIKICAgICAgICAgICAgQHJld2luZCgkdGhpcy0+emlwX2ZkKTsKICAgICAgICAgICAgaWYgKEBmc2VlaygkdGhpcy0+emlwX2ZkLCAgJHZfaGVhZGVyX2xpc3RbJGldWydvZmZzZXQnXSkpIHsKICAgICAgICAgICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICAkdl90ZW1wX3ppcC0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAgICAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRmlsZUhlYWRlcigkdl9sb2NhbF9oZWFkZXIpKSAhPSAxKSB7CiAgICAgICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCBsb2NhbCBmaWxlIGhlYWRlciBpcyBzYW1lIGFzIGNlbnRyYWwgZmlsZSBoZWFkZXIKICAgICAgICAgICAgaWYgKCR0aGlzLT5wcml2Q2hlY2tGaWxlSGVhZGVycygkdl9sb2NhbF9oZWFkZXIsCgkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfaGVhZGVyX2xpc3RbJGldKSAhPSAxKSB7CiAgICAgICAgICAgICAgICAvLyBUQkMKICAgICAgICAgICAgfQogICAgICAgICAgICB1bnNldCgkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyCiAgICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHZfdGVtcF96aXAtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHZfaGVhZGVyX2xpc3RbJGldKSkgIT0gMSkgewogICAgICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsKCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQvd3JpdGUgdGhlIGRhdGEgYmxvY2sKICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xaaXBVdGlsQ29weUJsb2NrKCR0aGlzLT56aXBfZmQsICR2X3RlbXBfemlwLT56aXBfZmQsICR2X2hlYWRlcl9saXN0WyRpXVsnY29tcHJlc3NlZF9zaXplJ10pKSAhPSAxKSB7CiAgICAgICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gU3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgY2VudHJhbCBkaXIKICAgICAgICAkdl9vZmZzZXQgPSBAZnRlbGwoJHZfdGVtcF96aXAtPnppcF9mZCk7CgogICAgICAgIC8vIC0tLS0tIFJlLUNyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyCiAgICAgICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgZmlsZSBoZWFkZXIKICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdl90ZW1wX3ppcC0+cHJpdldyaXRlQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyX2xpc3RbJGldKSkgIT0gMSkgewogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAtLS0tLSBUcmFuc2Zvcm0gdGhlIGhlYWRlciB0byBhICd1c2FibGUnIGluZm8KICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlcl9saXN0WyRpXSwgJHBfcmVzdWx0X2xpc3RbJGldKTsKICAgICAgICB9CgoKICAgICAgICAvLyAtLS0tLSBaaXAgZmlsZSBjb21tZW50CiAgICAgICAgJHZfY29tbWVudCA9ICcnOwogICAgICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF0pKSB7CiAgICAgICAgICAkdl9jb21tZW50ID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlcgogICAgICAgICR2X3NpemUgPSBAZnRlbGwoJHZfdGVtcF96aXAtPnppcF9mZCktJHZfb2Zmc2V0OwoKICAgICAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3RlcgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHZfdGVtcF96aXAtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoc2l6ZW9mKCR2X2hlYWRlcl9saXN0KSwgJHZfc2l6ZSwgJHZfb2Zmc2V0LCAkdl9jb21tZW50KSkgIT0gMSkgewogICAgICAgICAgICAvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBsaXN0CiAgICAgICAgICAgIHVuc2V0KCR2X2hlYWRlcl9saXN0KTsKICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBDbG9zZQogICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgICAvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlCiAgICAgICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgICAgIEB1bmxpbmsoJHRoaXMtPnppcG5hbWUpOwoKICAgICAgICAvLyAtLS0tLSBSZW5hbWUgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAgICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgICAgIC8vQHJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CiAgICAgICAgUGNsWmlwVXRpbFJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CgogICAgICAgIC8vIC0tLS0tIERlc3Ryb3kgdGhlIHRlbXBvcmFyeSBhcmNoaXZlCiAgICAgICAgdW5zZXQoJHZfdGVtcF96aXApOwogICAgfQoKICAgIC8vIC0tLS0tIFJlbW92ZSBldmVyeSBmaWxlcyA6IHJlc2V0IHRoZSBmaWxlCiAgICBlbHNlIGlmICgkdl9jZW50cmFsX2RpclsnZW50cmllcyddICE9IDApIHsKICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdk9wZW5GZCgnd2InKSkgIT0gMSkgewogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICB9CgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoMCwgMCwgMCwgJycpKSAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkRpckNoZWNrKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBDaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHMsIGlmIG5vdCBpdCBjcmVhdGVzIGl0IGFuZCBhbGwgdGhlIHBhcmVudHMgZGlyZWN0b3J5CiAgLy8gICB3aGljaCBtYXkgYmUgdXNlZnVsLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfZGlyIDogRGlyZWN0b3J5IHBhdGggdG8gY2hlY2suCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAgMSA6IE9LCiAgLy8gICAtMSA6IFVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RGlyQ2hlY2soJHBfZGlyLCAkcF9pc19kaXI9ZmFsc2UpCiAgewogICAgJHZfcmVzdWx0ID0gMTsKCgogICAgLy8gLS0tLS0gUmVtb3ZlIHRoZSBmaW5hbCAnLycKICAgIGlmICgoJHBfaXNfZGlyKSAmJiAoc3Vic3RyKCRwX2RpciwgLTEpPT0nLycpKQogICAgewogICAgICAkcF9kaXIgPSBzdWJzdHIoJHBfZGlyLCAwLCBzdHJsZW4oJHBfZGlyKS0xKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgZGlyZWN0b3J5IGF2YWlsYWJpbGl0eQogICAgaWYgKChpc19kaXIoJHBfZGlyKSkgfHwgKCRwX2RpciA9PSAiIikpCiAgICB7CiAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgcGFyZW50IGRpcmVjdG9yeQogICAgJHBfcGFyZW50X2RpciA9IGRpcm5hbWUoJHBfZGlyKTsKCiAgICAvLyAtLS0tLSBKdXN0IGEgY2hlY2sKICAgIGlmICgkcF9wYXJlbnRfZGlyICE9ICRwX2RpcikKICAgIHsKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcGFyZW50IGRpcmVjdG9yeQogICAgICBpZiAoJHBfcGFyZW50X2RpciAhPSAiIikKICAgICAgewogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEaXJDaGVjaygkcF9wYXJlbnRfZGlyKSkgIT0gMSkKICAgICAgICB7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgZGlyZWN0b3J5CiAgICBpZiAoIUBta2RpcigkcF9kaXIsIDA3NzcpKQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9ESVJfQ1JFQVRFX0ZBSUwsICJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSAnJHBfZGlyJyIpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZNZXJnZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgSWYgJHBfYXJjaGl2ZV90b19hZGQgZG9lcyBub3QgZXhpc3QsIHRoZSBmdW5jdGlvbiBleGl0IHdpdGggYSBzdWNjZXNzIHJlc3VsdC4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZNZXJnZSgmJHBfYXJjaGl2ZV90b19hZGQpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZV90b19hZGQgZXhpc3RzCiAgICBpZiAoIWlzX2ZpbGUoJHBfYXJjaGl2ZV90b19hZGQtPnppcG5hbWUpKQogICAgewoKICAgICAgLy8gLS0tLS0gTm90aGluZyB0byBtZXJnZSwgc28gbWVyZ2UgaXMgYSBzdWNjZXNzCiAgICAgICR2X3Jlc3VsdCA9IDE7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBhcmNoaXZlIGV4aXN0cwogICAgaWYgKCFpc19maWxlKCR0aGlzLT56aXBuYW1lKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIERvIGEgZHVwbGljYXRlCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RHVwbGljYXRlKCRwX2FyY2hpdmVfdG9fYWRkLT56aXBuYW1lKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR2X3Jlc3VsdD0kdGhpcy0+cHJpdk9wZW5GZCgncmInKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgRmlsZQogICAgQHJld2luZCgkdGhpcy0+emlwX2ZkKTsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSBhcmNoaXZlX3RvX2FkZCBmaWxlCiAgICBpZiAoKCR2X3Jlc3VsdD0kcF9hcmNoaXZlX3RvX2FkZC0+cHJpdk9wZW5GZCgncmInKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMKICAgICR2X2NlbnRyYWxfZGlyX3RvX2FkZCA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXJfdG9fYWRkKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgRmlsZQogICAgQHJld2luZCgkcF9hcmNoaXZlX3RvX2FkZC0+emlwX2ZkKTsKCiAgICAvLyAtLS0tLSBDcmVhdGVzIGEgdGVtcG9yYXkgZmlsZQogICAgJHZfemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicudG1wJzsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB3cml0ZSBtb2RlCiAgICBpZiAoKCR2X3ppcF90ZW1wX2ZkID0gQGZvcGVuKCR2X3ppcF90ZW1wX25hbWUsICd3YicpKSA9PSAwKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgJHBfYXJjaGl2ZV90b19hZGQtPnByaXZDbG9zZUZkKCk7CgogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gQ29weSB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIC8vIFRCQyA6IEhlcmUgSSBzaG91bGQgYmV0dGVyIGFwcGVuZCB0aGUgZmlsZSBhbmQgZ28gYmFjayB0byBlcmFzZSB0aGUgY2VudHJhbCBkaXIKICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQogICAgewogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICR2X2J1ZmZlciA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7CiAgICAgIEBmd3JpdGUoJHZfemlwX3RlbXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gQ29weSB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZV90b19hZGQgaW50byB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpcl90b19hZGRbJ29mZnNldCddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkcF9hcmNoaXZlX3RvX2FkZC0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGNlbnRyYWwgZGlyCiAgICAkdl9vZmZzZXQgPSBAZnRlbGwoJHZfemlwX3RlbXBfZmQpOwoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBvbGQgYXJjaGl2ZQogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyWydzaXplJ107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQogICAgewogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBhcmNoaXZlX3RvX2FkZAogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHBfYXJjaGl2ZV90b19hZGQtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgIH0KCiAgICAvLyAtLS0tLSBNZXJnZSB0aGUgZmlsZSBjb21tZW50cwogICAgJHZfY29tbWVudCA9ICR2X2NlbnRyYWxfZGlyWydjb21tZW50J10uJyAnLiR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnY29tbWVudCddOwoKICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgKG5ldykgY2VudHJhbCBoZWFkZXIKICAgICR2X3NpemUgPSBAZnRlbGwoJHZfemlwX3RlbXBfZmQpLSR2X29mZnNldDsKCiAgICAvLyAtLS0tLSBTd2FwIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgIC8vIEhlcmUgaXMgYSB0cmljayA6IEkgc3dhcCB0aGUgdGVtcG9yYXJ5IGZkIHdpdGggdGhlIHppcCBmZCwgaW4gb3JkZXIgdG8gdXNlCiAgICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gdGhlIHRlbXBvcmFyeSBmaWwgYW5kIG5vdCB0aGUgcmVhbCBhcmNoaXZlIGZkCiAgICAkdl9zd2FwID0gJHRoaXMtPnppcF9mZDsKICAgICR0aGlzLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsKICAgICR2X3ppcF90ZW1wX2ZkID0gJHZfc3dhcDsKCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3RlcgogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlQ2VudHJhbEhlYWRlcigkdl9jZW50cmFsX2RpclsnZW50cmllcyddKyR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnZW50cmllcyddLCAkdl9zaXplLCAkdl9vZmZzZXQsICR2X2NvbW1lbnQpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgJHBfYXJjaGl2ZV90b19hZGQtPnByaXZDbG9zZUZkKCk7CiAgICAgIEBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwogICAgICAkdGhpcy0+emlwX2ZkID0gbnVsbDsKCiAgICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBmaWxlIGxpc3QKICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gU3dhcCBiYWNrIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICR2X3N3YXAgPSAkdGhpcy0+emlwX2ZkOwogICAgJHRoaXMtPnppcF9mZCA9ICR2X3ppcF90ZW1wX2ZkOwogICAgJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOwoKICAgIC8vIC0tLS0tIENsb3NlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOwoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7CgogICAgLy8gLS0tLS0gRGVsZXRlIHRoZSB6aXAgZmlsZQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgQHVubGluaygkdGhpcy0+emlwbmFtZSk7CgogICAgLy8gLS0tLS0gUmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgLy9AcmVuYW1lKCR2X3ppcF90ZW1wX25hbWUsICR0aGlzLT56aXBuYW1lKTsKICAgIFBjbFppcFV0aWxSZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZEdXBsaWNhdGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZEdXBsaWNhdGUoJHBfYXJjaGl2ZV9maWxlbmFtZSkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9hcmNoaXZlX2ZpbGVuYW1lIGV4aXN0cwogICAgaWYgKCFpc19maWxlKCRwX2FyY2hpdmVfZmlsZW5hbWUpKQogICAgewoKICAgICAgLy8gLS0tLS0gTm90aGluZyB0byBkdXBsaWNhdGUsIHNvIGR1cGxpY2F0ZSBpcyBhIHN1Y2Nlc3MuCiAgICAgICR2X3Jlc3VsdCA9IDE7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgaWYgKCgkdl9yZXN1bHQ9JHRoaXMtPnByaXZPcGVuRmQoJ3diJykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRlbXBvcmFyeSBmaWxlIGluIHdyaXRlIG1vZGUKICAgIGlmICgoJHZfemlwX3RlbXBfZmQgPSBAZm9wZW4oJHBfYXJjaGl2ZV9maWxlbmFtZSwgJ3JiJykpID09IDApCiAgICB7CiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgZmlsZSBcJycuJHBfYXJjaGl2ZV9maWxlbmFtZS4nXCcgaW4gYmluYXJ5IHdyaXRlIG1vZGUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDb3B5IHRoZSBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgLy8gVEJDIDogSGVyZSBJIHNob3VsZCBiZXR0ZXIgYXBwZW5kIHRoZSBmaWxlIGFuZCBnbyBiYWNrIHRvIGVyYXNlIHRoZSBjZW50cmFsIGRpcgogICAgJHZfc2l6ZSA9IGZpbGVzaXplKCRwX2FyY2hpdmVfZmlsZW5hbWUpOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkdl96aXBfdGVtcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENsb3NlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIEBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFcnJvckxvZygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkVycm9yTG9nKCRwX2Vycm9yX2NvZGU9MCwgJHBfZXJyb3Jfc3RyaW5nPScnKQogIHsKICAgIGlmIChQQ0xaSVBfRVJST1JfRVhURVJOQUwgPT0gMSkgewogICAgICBQY2xFcnJvcigkcF9lcnJvcl9jb2RlLCAkcF9lcnJvcl9zdHJpbmcpOwogICAgfQogICAgZWxzZSB7CiAgICAgICR0aGlzLT5lcnJvcl9jb2RlID0gJHBfZXJyb3JfY29kZTsKICAgICAgJHRoaXMtPmVycm9yX3N0cmluZyA9ICRwX2Vycm9yX3N0cmluZzsKICAgIH0KICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFcnJvclJlc2V0KCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXJyb3JSZXNldCgpCiAgewogICAgaWYgKFBDTFpJUF9FUlJPUl9FWFRFUk5BTCA9PSAxKSB7CiAgICAgIFBjbEVycm9yUmVzZXQoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAkdGhpcy0+ZXJyb3JfY29kZSA9IDA7CiAgICAgICR0aGlzLT5lcnJvcl9zdHJpbmcgPSAnJzsKICAgIH0KICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgZnVuY3Rpb24gZXhpc3RzCiAgICBpZiAoICAgKCFmdW5jdGlvbl9leGlzdHMoImdldF9tYWdpY19xdW90ZXNfcnVudGltZSIpKQoJICAgIHx8ICghZnVuY3Rpb25fZXhpc3RzKCJzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiKSkpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKCX0KCiAgICAvLyAtLS0tLSBMb29rIGlmIGFscmVhZHkgZG9uZQogICAgaWYgKCR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzICE9IC0xKSB7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7Cgl9CgoJLy8gLS0tLS0gR2V0IGFuZCBtZW1vcml6ZSB0aGUgbWFnaWNfcXVvdGUgdmFsdWUKCSR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzID0gQGdldF9tYWdpY19xdW90ZXNfcnVudGltZSgpOwoKCS8vIC0tLS0tIERpc2FibGUgbWFnaWNfcXVvdGVzCglpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgPT0gMSkgewoJICBAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwoJfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTG9vayBpZiBmdW5jdGlvbiBleGlzdHMKICAgIGlmICggICAoIWZ1bmN0aW9uX2V4aXN0cygiZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIikpCgkgICAgfHwgKCFmdW5jdGlvbl9leGlzdHMoInNldF9tYWdpY19xdW90ZXNfcnVudGltZSIpKSkgewogICAgICByZXR1cm4gJHZfcmVzdWx0OwoJfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgc29tZXRoaW5nIHRvIGRvCiAgICBpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgIT0gLTEpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKCX0KCgkvLyAtLS0tLSBTd2FwIGJhY2sgbWFnaWNfcXVvdGVzCglpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgPT0gMSkgewogIAkgIEBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMpOwoJfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgfQogIC8vIEVuZCBvZiBjbGFzcwogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHBfZGlyKQogIHsKICAgICR2X3Jlc3VsdCA9ICIiOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vdCBlbXB0eSBwYXRoCiAgICBpZiAoJHBfZGlyICE9ICIiKSB7CiAgICAgIC8vIC0tLS0tIEV4cGxvZGUgcGF0aCBieSBkaXJlY3RvcnkgbmFtZXMKICAgICAgJHZfbGlzdCA9IGV4cGxvZGUoIi8iLCAkcF9kaXIpOwoKICAgICAgLy8gLS0tLS0gU3R1ZHkgZGlyZWN0b3JpZXMgZnJvbSBsYXN0IHRvIGZpcnN0CiAgICAgICR2X3NraXAgPSAwOwogICAgICBmb3IgKCRpPXNpemVvZigkdl9saXN0KS0xOyAkaT49MDsgJGktLSkgewogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGN1cnJlbnQgcGF0aAogICAgICAgIGlmICgkdl9saXN0WyRpXSA9PSAiLiIpIHsKICAgICAgICAgIC8vIC0tLS0tIElnbm9yZSB0aGlzIGRpcmVjdG9yeQogICAgICAgICAgLy8gU2hvdWxkIGJlIHRoZSBmaXJzdCAkaT0wLCBidXQgbm8gY2hlY2sgaXMgZG9uZQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdl9saXN0WyRpXSA9PSAiLi4iKSB7CgkJICAkdl9za2lwKys7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR2X2xpc3RbJGldID09ICIiKSB7CgkJICAvLyAtLS0tLSBGaXJzdCAnLycgaS5lLiByb290IHNsYXNoCgkJICBpZiAoJGkgPT0gMCkgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAiLyIuJHZfcmVzdWx0OwoJCSAgICBpZiAoJHZfc2tpcCA+IDApIHsKCQkgICAgICAgIC8vIC0tLS0tIEl0IGlzIGFuIGludmFsaWQgcGF0aCwgc28gdGhlIHBhdGggaXMgbm90IG1vZGlmaWVkCgkJICAgICAgICAvLyBUQkMKCQkgICAgICAgICR2X3Jlc3VsdCA9ICRwX2RpcjsKICAgICAgICAgICAgICAgICR2X3NraXAgPSAwOwoJCSAgICB9CgkJICB9CgkJICAvLyAtLS0tLSBMYXN0ICcvJyBpLmUuIGluZGljYXRlcyBhIGRpcmVjdG9yeQoJCSAgZWxzZSBpZiAoJGkgPT0gKHNpemVvZigkdl9saXN0KS0xKSkgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAkdl9saXN0WyRpXTsKCQkgIH0KCQkgIC8vIC0tLS0tIERvdWJsZSAnLycgaW5zaWRlIHRoZSBwYXRoCgkJICBlbHNlIHsKICAgICAgICAgICAgLy8gLS0tLS0gSWdub3JlIG9ubHkgdGhlIGRvdWJsZSAnLy8nIGluIHBhdGgsCiAgICAgICAgICAgIC8vIGJ1dCBub3QgdGhlIGZpcnN0IGFuZCBsYXN0ICcvJwoJCSAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCQkgIC8vIC0tLS0tIExvb2sgZm9yIGl0ZW0gdG8gc2tpcAoJCSAgaWYgKCR2X3NraXAgPiAwKSB7CgkJICAgICR2X3NraXAtLTsKCQkgIH0KCQkgIGVsc2UgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAkdl9saXN0WyRpXS4oJGkhPShzaXplb2YoJHZfbGlzdCktMSk/Ii8iLiR2X3Jlc3VsdDoiIik7CgkJICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBza2lwCiAgICAgIGlmICgkdl9za2lwID4gMCkgewogICAgICAgIHdoaWxlICgkdl9za2lwID4gMCkgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAnLi4vJy4kdl9yZXN1bHQ7CiAgICAgICAgICAgICR2X3NraXAtLTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsUGF0aEluY2x1c2lvbigpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgaWYgdGhlIHBhdGggJHBfcGF0aCBpcyB1bmRlciB0aGUgJHBfZGlyIHRyZWUuIE9yLAogIC8vICAgc2FpZCBpbiBhbiBvdGhlciB3YXksIGlmIHRoZSBmaWxlIG9yIHN1Yi1kaXIgJHBfcGF0aCBpcyBpbnNpZGUgdGhlIGRpcgogIC8vICAgJHBfZGlyLgogIC8vICAgVGhlIGZ1bmN0aW9uIGluZGljYXRlcyBhbHNvIGlmIHRoZSBwYXRoIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGRpci4KICAvLyAgIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgcGF0aCB3aXRoIGR1cGxpY2F0ZWQgJy8nIGxpa2UgJy8vJywgYnV0IGRvZXMgbm90CiAgLy8gICBzdXBwb3J0ICcuJyBvciAnLi4nIHN0YXRlbWVudHMuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAwIGlmICRwX3BhdGggaXMgbm90IGluc2lkZSBkaXJlY3RvcnkgJHBfZGlyCiAgLy8gICAxIGlmICRwX3BhdGggaXMgaW5zaWRlIGRpcmVjdG9yeSAkcF9kaXIKICAvLyAgIDIgaWYgJHBfcGF0aCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzICRwX2RpcgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfZGlyLCAkcF9wYXRoKQogIHsKICAgICR2X3Jlc3VsdCA9IDE7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCBiZWdpbm5pbmcgYnkgLi8KICAgIGlmICggICAoJHBfZGlyID09ICcuJykKICAgICAgICB8fCAoKHN0cmxlbigkcF9kaXIpID49MikgJiYgKHN1YnN0cigkcF9kaXIsIDAsIDIpID09ICcuLycpKSkgewogICAgICAkcF9kaXIgPSBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aChnZXRjd2QoKSwgRkFMU0UpLicvJy5zdWJzdHIoJHBfZGlyLCAxKTsKICAgIH0KICAgIGlmICggICAoJHBfcGF0aCA9PSAnLicpCiAgICAgICAgfHwgKChzdHJsZW4oJHBfcGF0aCkgPj0yKSAmJiAoc3Vic3RyKCRwX3BhdGgsIDAsIDIpID09ICcuLycpKSkgewogICAgICAkcF9wYXRoID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoZ2V0Y3dkKCksIEZBTFNFKS4nLycuc3Vic3RyKCRwX3BhdGgsIDEpOwogICAgfQoKICAgIC8vIC0tLS0tIEV4cGxvZGUgZGlyIGFuZCBwYXRoIGJ5IGRpcmVjdG9yeSBzZXBhcmF0b3IKICAgICR2X2xpc3RfZGlyID0gZXhwbG9kZSgiLyIsICRwX2Rpcik7CiAgICAkdl9saXN0X2Rpcl9zaXplID0gc2l6ZW9mKCR2X2xpc3RfZGlyKTsKICAgICR2X2xpc3RfcGF0aCA9IGV4cGxvZGUoIi8iLCAkcF9wYXRoKTsKICAgICR2X2xpc3RfcGF0aF9zaXplID0gc2l6ZW9mKCR2X2xpc3RfcGF0aCk7CgogICAgLy8gLS0tLS0gU3R1ZHkgZGlyZWN0b3JpZXMgcGF0aHMKICAgICRpID0gMDsKICAgICRqID0gMDsKICAgIHdoaWxlICgoJGkgPCAkdl9saXN0X2Rpcl9zaXplKSAmJiAoJGogPCAkdl9saXN0X3BhdGhfc2l6ZSkgJiYgKCR2X3Jlc3VsdCkpIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGVtcHR5IGRpciAocGF0aCByZWR1Y3Rpb24pCiAgICAgIGlmICgkdl9saXN0X2RpclskaV0gPT0gJycpIHsKICAgICAgICAkaSsrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICgkdl9saXN0X3BhdGhbJGpdID09ICcnKSB7CiAgICAgICAgJGorKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gQ29tcGFyZSB0aGUgaXRlbXMKICAgICAgaWYgKCgkdl9saXN0X2RpclskaV0gIT0gJHZfbGlzdF9wYXRoWyRqXSkgJiYgKCR2X2xpc3RfZGlyWyRpXSAhPSAnJykgJiYgKCAkdl9saXN0X3BhdGhbJGpdICE9ICcnKSkgIHsKICAgICAgICAkdl9yZXN1bHQgPSAwOwogICAgICB9CgogICAgICAvLyAtLS0tLSBOZXh0IGl0ZW1zCiAgICAgICRpKys7CiAgICAgICRqKys7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiBldmVyeXRoaW5nIHNlZW1zIHRvIGJlIHRoZSBzYW1lCiAgICBpZiAoJHZfcmVzdWx0KSB7CiAgICAgIC8vIC0tLS0tIFNraXAgYWxsIHRoZSBlbXB0eSBpdGVtcwogICAgICB3aGlsZSAoKCRqIDwgJHZfbGlzdF9wYXRoX3NpemUpICYmICgkdl9saXN0X3BhdGhbJGpdID09ICcnKSkgJGorKzsKICAgICAgd2hpbGUgKCgkaSA8ICR2X2xpc3RfZGlyX3NpemUpICYmICgkdl9saXN0X2RpclskaV0gPT0gJycpKSAkaSsrOwoKICAgICAgaWYgKCgkaSA+PSAkdl9saXN0X2Rpcl9zaXplKSAmJiAoJGogPj0gJHZfbGlzdF9wYXRoX3NpemUpKSB7CiAgICAgICAgLy8gLS0tLS0gVGhlcmUgYXJlIGV4YWN0bHkgdGhlIHNhbWUKICAgICAgICAkdl9yZXN1bHQgPSAyOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCRpIDwgJHZfbGlzdF9kaXJfc2l6ZSkgewogICAgICAgIC8vIC0tLS0tIFRoZSBwYXRoIGlzIHNob3J0ZXIgdGhhbiB0aGUgZGlyCiAgICAgICAgJHZfcmVzdWx0ID0gMDsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxDb3B5QmxvY2soKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX21vZGUgOiByZWFkL3dyaXRlIGNvbXByZXNzaW9uIG1vZGUKICAvLyAgICAgICAgICAgICAwIDogc3JjICYgZGVzdCBub3JtYWwKICAvLyAgICAgICAgICAgICAxIDogc3JjIGd6aXAsIGRlc3Qgbm9ybWFsCiAgLy8gICAgICAgICAgICAgMiA6IHNyYyBub3JtYWwsIGRlc3QgZ3ppcAogIC8vICAgICAgICAgICAgIDMgOiBzcmMgJiBkZXN0IGd6aXAKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIFBjbFppcFV0aWxDb3B5QmxvY2soJHBfc3JjLCAkcF9kZXN0LCAkcF9zaXplLCAkcF9tb2RlPTApCiAgewogICAgJHZfcmVzdWx0ID0gMTsKCiAgICBpZiAoJHBfbW9kZT09MCkKICAgIHsKICAgICAgd2hpbGUgKCRwX3NpemUgIT0gMCkKICAgICAgewogICAgICAgICR2X3JlYWRfc2l6ZSA9ICgkcF9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICRwX3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOwogICAgICAgIEBmd3JpdGUoJHBfZGVzdCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgkcF9tb2RlPT0xKQogICAgewogICAgICB3aGlsZSAoJHBfc2l6ZSAhPSAwKQogICAgICB7CiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICR2X2J1ZmZlciA9IEBnenJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOwogICAgICAgIEBmd3JpdGUoJHBfZGVzdCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgkcF9tb2RlPT0yKQogICAgewogICAgICB3aGlsZSAoJHBfc2l6ZSAhPSAwKQogICAgICB7CiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkcF9zcmMsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgQGd6d3JpdGUoJHBfZGVzdCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgkcF9tb2RlPT0zKQogICAgewogICAgICB3aGlsZSAoJHBfc2l6ZSAhPSAwKQogICAgICB7CiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICR2X2J1ZmZlciA9IEBnenJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOwogICAgICAgIEBnendyaXRlKCRwX2Rlc3QsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgICAkcF9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxSZW5hbWUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZG8gYSBzaW1wbGUgcmVuYW1lKCkgZnVuY3Rpb24uIElmIGl0IGZhaWxzLCBpdAogIC8vICAgdHJpZXMgdG8gY29weSB0aGUgJHBfc3JjIGZpbGUgaW4gYSBuZXcgJHBfZGVzdCBmaWxlIGFuZCB0aGVuIHVubGluayB0aGUKICAvLyAgIGZpcnN0IG9uZS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX3NyYyA6IE9sZCBmaWxlbmFtZQogIC8vICAgJHBfZGVzdCA6IE5ldyBmaWxlbmFtZQogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBQY2xaaXBVdGlsUmVuYW1lKCRwX3NyYywgJHBfZGVzdCkKICB7CiAgICAkdl9yZXN1bHQgPSAxOwoKICAgIC8vIC0tLS0tIFRyeSB0byByZW5hbWUgdGhlIGZpbGVzCiAgICBpZiAoIUByZW5hbWUoJHBfc3JjLCAkcF9kZXN0KSkgewoKICAgICAgLy8gLS0tLS0gVHJ5IHRvIGNvcHkgJiB1bmxpbmsgdGhlIHNyYwogICAgICBpZiAoIUBjb3B5KCRwX3NyYywgJHBfZGVzdCkpIHsKICAgICAgICAkdl9yZXN1bHQgPSAwOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCFAdW5saW5rKCRwX3NyYykpIHsKICAgICAgICAkdl9yZXN1bHQgPSAwOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbE9wdGlvblRleHQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRyYW5zbGF0ZSBvcHRpb24gdmFsdWUgaW4gdGV4dC4gTWFpbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfb3B0aW9uIDogdGhlIG9wdGlvbiB2YWx1ZS4KICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIFRoZSBvcHRpb24gdGV4dCB2YWx1ZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIFBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbikKICB7CgogICAgJHZfbGlzdCA9IGdldF9kZWZpbmVkX2NvbnN0YW50cygpOwogICAgZm9yIChyZXNldCgkdl9saXN0KTsgJHZfa2V5ID0ga2V5KCR2X2xpc3QpOyBuZXh0KCR2X2xpc3QpKSB7CgkgICAgJHZfcHJlZml4ID0gc3Vic3RyKCR2X2tleSwgMCwgMTApOwoJICAgIGlmICgoICAgKCR2X3ByZWZpeCA9PSAnUENMWklQX09QVCcpCiAgICAgICAgICAgfHwgKCR2X3ByZWZpeCA9PSAnUENMWklQX0NCXycpCiAgICAgICAgICAgfHwgKCR2X3ByZWZpeCA9PSAnUENMWklQX0FUVCcpKQoJICAgICAgICAmJiAoJHZfbGlzdFskdl9rZXldID09ICRwX29wdGlvbikpIHsKICAgICAgICByZXR1cm4gJHZfa2V5OwoJICAgIH0KICAgIH0KCiAgICAkdl9yZXN1bHQgPSAnVW5rbm93bic7CgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUcmFuc2xhdGUgd2luZG93cyBwYXRoIGJ5IHJlcGxhY2luZyAnXCcgYnkgJy8nIGFuZCBvcHRpb25hbGx5IHJlbW92aW5nCiAgLy8gICBkcml2ZSBsZXR0ZXIuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9wYXRoIDogcGF0aCB0byB0cmFuc2xhdGUuCiAgLy8gICAkcF9yZW1vdmVfZGlza19sZXR0ZXIgOiB0cnVlIHwgZmFsc2UKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIFRoZSBwYXRoIHRyYW5zbGF0ZWQuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aCgkcF9wYXRoLCAkcF9yZW1vdmVfZGlza19sZXR0ZXI9dHJ1ZSkKICB7CiAgICBpZiAoc3RyaXN0cihwaHBfdW5hbWUoKSwgJ3dpbmRvd3MnKSkgewogICAgICAvLyAtLS0tLSBMb29rIGZvciBwb3RlbnRpYWwgZGlzayBsZXR0ZXIKICAgICAgaWYgKCgkcF9yZW1vdmVfZGlza19sZXR0ZXIpICYmICgoJHZfcG9zaXRpb24gPSBzdHJwb3MoJHBfcGF0aCwgJzonKSkgIT0gZmFsc2UpKSB7CiAgICAgICAgICAkcF9wYXRoID0gc3Vic3RyKCRwX3BhdGgsICR2X3Bvc2l0aW9uKzEpOwogICAgICB9CiAgICAgIC8vIC0tLS0tIENoYW5nZSBwb3RlbnRpYWwgd2luZG93cyBkaXJlY3Rvcnkgc2VwYXJhdG9yCiAgICAgIGlmICgoc3RycG9zKCRwX3BhdGgsICdcXCcpID4gMCkgfHwgKHN1YnN0cigkcF9wYXRoLCAwLDEpID09ICdcXCcpKSB7CiAgICAgICAgICAkcF9wYXRoID0gc3RydHIoJHBfcGF0aCwgJ1xcJywgJy8nKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICRwX3BhdGg7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKPz4K ###PACKDATA,FILE_END,/_importbuddy/importbuddy/lib/pclzip/pclzip.php,importbuddy/lib/pclzip/pclzip.php ###PACKDATA,FILE_START,/classes/_migrate_database.php,importbuddy/classes/_migrate_database.php PD9waHAKLyoqCiAqCV9taWdyYXRlX2RhdGFiYXNlLnBocAogKgogKglIYW5kbGVzIGFsbCBTUUwgZGF0YSBtaWdyYXRpb24gZm9yIGJvdGggaW1wb3J0YnVkZHkgYW5kIG11bHRpc2l0ZSBpbXBvcnRpbmcuCiAqCUhhbmRsZXMgdXBkYXRpbmcgcGF0aHMsIFVSTHMsIGV0Yy4KICoJCiAqCUBzaW5jZSAxLjAuMQogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICoKICoJUkVRVUlSRU1FTlRTOgogKgogKgkxKSBTZXQgdXAgdGhlIHZhcmlhYmxlICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgdG8gdGhlIGRlc3RpbmF0aW9uIHR5cGUgaWYgbm9uLXN0YW5kYWxvbmUgKGRlZmF1bHQpIG9yIE11bHRpc2l0ZSBOZXR3b3JrIChhdXRvLWRldGVjdGVkKS4gVmFsaWQgdmFsdWVzOiBzdGFuZGFsb25lLCBtdWx0aXNpdGVfaW1wb3J0LCBtdWx0aXNpdGVfbmV0d29yawogKgkyKSBNeXNxbCBzaG91bGQgYWxyZWFkeSBiZSBjb25uZWN0ZWQuCiAqCTMpICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J10gc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIERBVCBmaWxlIGFycmF5LgogKgk0KSBJZiBtaWdyYXRpbmcgYSBuZXR3b3JrIC0+IG5ldHdvcmsgdGhlbiBzZXQgdXAgdGhlIHZhcmlhYmxlICR0aGlzLT5uZXR3b3JrUHJlZml4IHRvIGJlIHRoZSBkYXRhYmFzZSBwcmVmaXggb2YgdGhlIG5ldHdvcmsuIE5lZWRlZCB0byBhY2Nlc3MgdXNlcnMgdGFibGVzLgogKgk1KSBJZiBtdWx0aXNpdGVfaW1wb3J0IGlzIERFU1RJTkFUSU9OIHRoZW4gJHdwX3VwbG9hZF9kaXIgKHVwbG9hZF9wYXRoIG9wdGlvbiksICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddIChmaWxldXBsb2FkX3VybCBvcHRpb24pIG11c3QgYmUgc2V0LgogKgogKglVU0VEIEJZOgogKgogKgkxKSBJbXBvcnRCdWRkeQogKgkyKSBNdWx0aXNpdGUgSW1wb3J0IC8gUmVzdG9yZQogKgogKglOT1RFUzoKICoKICoJLSBFeGFtcGxlIGluc3RhbnRpYXRpb246ICRtaWdyYXRlID0gbmV3IGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiggJ3N0YW5kYWxvbmUnLCAkdGhpcy0+X3N0YXRlICk7CiAqCS0gZGJyZXBsYWNlIGNsYXNzIGludGVsbGlnZW50bHkgaWdub3JlcyByZXBsYWNpbmcgdmFsdWVzIHdpdGggaWRlbnRpY2FsIHZhbHVlcyBmb3IgcGVyZm9ybWFuY2UuCiAqCiAqLwoKCgpnbG9iYWwgJHdwZGI7CgppZiAoIGlzc2V0KCAkZGVzdGluYXRpb25fdHlwZSApICYmICggJGRlc3RpbmF0aW9uX3R5cGUgPT0gJ211bHRpc2l0ZV9pbXBvcnQnICkgKSB7IC8vIE1VTFRJU0lURSBJTVBPUlQKCQoJJHN0YXRlID0gYXJyYXkoCgkJJ2RhdCcgPT4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkYXRfZmlsZSddLAoJCSdtYXhFeGVjdXRpb25UaW1lJyA9PiAzMCwKCQknc2l0ZXVybCcgPT4gJGRlc3RpbmF0aW9uX3NpdGV1cmwsCgkJJ2hvbWV1cmwnID0+ICRkZXN0aW5hdGlvbl9ob21lLAoJCSd1cGxvYWRfdXJsJyA9PiAkdGhpcy0+cmVzdG9yZURhdGFbJ3VwbG9hZF91cmwnXSwgLy8gTVMgcmVsYXRlZCBzdHVmZi4KCQknZGF0YWJhc2VTZXR0aW5ncycgPT4gYXJyYXkoCgkJCQkJCQkJCSdwcmVmaXgnID0+ICRtdWx0aXNpdGVfbmV0d29ya19kYl9wcmVmaXgsCgkJCQkJCQkJCSdtaWdyYXRlRGF0YWJhc2VCcnV0ZUZvcmNlJyA9PiB0cnVlLAoJCQkJCQkJCSkKCSk7CgkKCSRtaWdyYXRlID0gbmV3IGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiggJGRlc3RpbmF0aW9uX3R5cGUsICRzdGF0ZSwgJG11bHRpc2l0ZV9uZXR3b3JrX2RiX3ByZWZpeCApOwp9CgoKCmNsYXNzIGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiB7CgoJY29uc3QgVElNRV9XSUdHTEVfUk9PTSA9IDE7IC8vIE51bWJlciBvZiBzZWNvbmRzIHRvIGZ1ZGdlIHVwIHRoZSB0aW1lIGVsYXBzZWQgdG8gZ2l2ZSBhIGxpdHRsZSB3aWdnbGUgcm9vbSBzbyB3ZSBkb24ndCBhY2NpZGVudGx5IGhpdCB0aGUgZWRnZSBhbmQgdGltZSBvdXQuCgkKCXZhciAkc3RhcnRUaW1lOyAvLyBNaWNyb3RpbWUgbWlncmF0aW9uIHN0YXJ0ZWQuCgkKCXZhciAkcmVzdG9yZURhdGE7Cgl2YXIgJHNvdXJjZVR5cGU7Cgl2YXIgJGRlc3RpbmF0aW9uVHlwZTsKCXZhciAkbmV0d29ya1ByZWZpeDsKCXZhciAkb3ZlcnJpZGVQcmVmaXg7IC8vIFByZWZpeCB0byB1c2UuIERlZmF1bHRzIHRvICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXS4gQWxsb3dzIG92ZXJyaWRpbmcuCgl2YXIgJGZpbmFsUHJlZml4OyAvLyBGaW5hbCBwcmVmaXggdG8gdXNlLiBJZiBub3Qgb3ZlcnJpZGluZyB0aGVuIHRocyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSAkb3ZlcnJpZGVQcmVmaXguCgoJdmFyICRvbGRVUkxzOwoJdmFyICRuZXdVUkxzOwoJCgl2YXIgJG9sZEZ1bGxSZXBsYWNlOwoJdmFyICRuZXdGdWxsUmVwbGFjZTsKCQoJdmFyICRuZXR3b3JrVXBsb2FkVVJMUmVhbDsKCXZhciAkYnJ1dGVmb3JjZUV4Y2x1ZGVkVGFibGVzOwoKCQoJLy8gREVTVElOQVRJT04gVFlQRS4gVmFsaWQgdmFsdWVzOiBzdGFuZGFsb25lLCBtdWx0aXNpdGVfaW1wb3J0LCBtdWx0aXNpdGVfbmV0d29yawoJLy8gUkVUVVJOUzogdHJ1ZSBvbiBzdWNjZXNzIGZ1bGx5IGNvbXBsZXRpbmcsIGFycmF5KCByZXN1bWVGdW5jdGlvbiwgcmVzdW1lUG9pbnQgKSBvbiBuZWVkaW5nIGNodW5raW5nLiBmYWxzZSBvbiBmYWlsdXJlLgoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRkZXN0aW5hdGlvblR5cGUsICRyZXN0b3JlRGF0YSwgJG5ldHdvcmtQcmVmaXggPSAnJywgJG92ZXJyaWRlUHJlZml4ID0gJycgKSB7CgoJCSR0aGlzLT5zdGFydFRpbWUgPSBtaWNyb3RpbWUoIHRydWUgKTsgLy8gU3RhcnQgdHJhY2tpbmcgZm9yIGVsYXBzZWQgdGltZS4KCQkKCQkkdGhpcy0+ZGVzdGluYXRpb25UeXBlID0gJGRlc3RpbmF0aW9uVHlwZTsKCQkkdGhpcy0+cmVzdG9yZURhdGEgPSAmJHJlc3RvcmVEYXRhOwoJCQoJCWlmICggJycgPT0gJG92ZXJyaWRlUHJlZml4ICkgeyAvLyBOb3Qgb3ZlcnJpZGluZyBwcmVmaXguCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsKCQkJJHRoaXMtPmZpbmFsUHJlZml4ID0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdVc2luZyBub3JtYWwgbW9kZSBkYXRhYmFzZSBwcmVmaXggYmFzZWQgb24gc2V0dGluZ3M6IGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2AuJyApOwoJCX0gZWxzZSB7IC8vIE92ZXJyaWRpbmcgcHJlZml4LgoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggPSAkb3ZlcnJpZGVQcmVmaXg7CgkJCSR0aGlzLT5maW5hbFByZWZpeCA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgb3ZlcnJpZGUgZGF0YWJhc2UgcHJlZml4OiBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdgLiBGaW5hbCBwcmVmaXg6IGAnIC4gJHRoaXMtPmZpbmFsUHJlZml4IC4gJ2AuJyApOwoJCX0KCQkKCQkkdGhpcy0+bmV0d29ya1ByZWZpeCA9ICRuZXR3b3JrUHJlZml4OyAKCQlpZiAoICcnID09ICRuZXR3b3JrUHJlZml4ICkgewoJCQkkdGhpcy0+bmV0d29ya1ByZWZpeCA9ICR0aGlzLT5vdmVycmlkZVByZWZpeDsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ01pZ3JhdGluZyBkYXRhYmFzZSBjb250ZW50Li4uJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Rlc3RpbmF0aW9uIHNpdGUgdGFibGUgcHJlZml4OiAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4ICk7CgoJCWlmICggJycgPT0gJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gKSB7IC8vIElmIG5vIGhvbWUgdGhlbiB3ZSBzZXQgaXQgZXF1YWwgdG8gc2l0ZSBVUkwuCgkJCSRzZXR0aW5nc1snaG9tZXVybCddID0gJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ107CgkJfQoJCQoJCS8vIFNvdXJjZSB0eXBlLiBWYWxpZCB2YWx1ZXM6IG5ldHdvcmssIG11bHRpc2l0ZV9leHBvcnQgKHNpbmdsZSBzaXRlIGV4cG9ydGVkIGZyb20gbXVsdGlzaXRlIG5ldHdvcmspLCBzdGFuZGFsb25lCgkJaWYgKCBpc3NldCggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsgJ2lzX211bHRpc2l0ZScgXSApICYmICggKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAnaXNfbXVsdGlzaXRlJyBdID09PSB0cnVlICkgfHwgKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAnaXNfbXVsdGlzaXRlJyBdID09PSAndHJ1ZScgKSApICkgewoJCQkkdGhpcy0+c291cmNlVHlwZSA9ICdtdWx0aXNpdGVfbmV0d29yayc7CgkJCSR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPSAnbXVsdGlzaXRlX25ldHdvcmsnOwoJCX0gZWxzZWlmICggaXNzZXQoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICdpc19tdWx0aXNpdGVfZXhwb3J0JyBdICkgJiYgKCAoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICdpc19tdWx0aXNpdGVfZXhwb3J0JyBdID09PSB0cnVlICkgfHwgKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAnaXNfbXVsdGlzaXRlX2V4cG9ydCcgXSA9PT0gJ3RydWUnICkgKSApIHsKCQkJJHRoaXMtPnNvdXJjZVR5cGUgPSAnbXVsdGlzaXRlX2V4cG9ydCc7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnNvdXJjZVR5cGUgPSAnc3RhbmRhbG9uZSc7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01pZ3JhdGlvbiB0eXBlOiBgJyAuICR0aGlzLT5zb3VyY2VUeXBlIC4gJ2AgdG8gYCcgLiAkdGhpcy0+ZGVzdGluYXRpb25UeXBlIC4gJ2AuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Rlc3RpbmF0aW9uIFNpdGUgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXN0aW5hdGlvbiBIb21lIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddICk7CgkJCgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoJCgkKCQoJZnVuY3Rpb24gbWlncmF0ZSgpIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRlKCkgb2YgZGF0YWJhc2UuJyApOwoJCSR0aGlzLT5taWdyYXRlQ29tbW9uKCk7IC8vIE11c3QgcnVuIGJlZm9yZSBhbnkgb3RoZXIgc3RlcHMsIGVhY2ggY2h1bmssIHRvIGNhbGN1bGF0ZSBVUkxzIGV0Yy4KCQkKCQlpZiAoIGlzX2FycmF5KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVN0ZXBzJ10gKSApIHsgLy8gUmVzdW1pbmcgc28gdXNlIGV4aXN0aW5nIHN0ZXBzIGxpc3QuCgkJCSRzdGVwcyA9ICYkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVN0ZXBzJ107CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Jlc3VtaW5nIG1pZ3JhdGUoKSBzbyB1c2luZyBzdG9yZWQgcmVzdW1lIHN0ZXBzLicgKTsKCQl9IGVsc2UgeyAvLyBOb3QgcmVzdW1pbmcgc28gYnVpbGQgc3RlcHMgbGlzdC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm90IHJlc3VtaW5nIHNvIGJ1aWxkaW5nIG1pZ3JhdGUgc3RlcCBsaXN0LicgKTsKCQkJLy8gTWlncmF0ZSBhbnl0aGluZyBjb21tb24gdG8gYWxsIHR5cGVzLgoJCQkvLyRzdGVwcyA9IGFycmF5KCAnbWlncmF0ZUNvbW1vbicgKTsKCQkJLy8gTWlncmF0ZSBOZXR3b3JrIC0+IE5ldHdvcmsuCgkJCWlmICggKCAkdGhpcy0+c291cmNlVHlwZSA9PSAnbXVsdGlzaXRlX25ldHdvcmsnICkgJiYgKCAkdGhpcy0+ZGVzdGluYXRpb25UeXBlID09ICdtdWx0aXNpdGVfbmV0d29yaycgKSApIHsKCQkJCSRzdGVwc1tdID0gJ21pZ3JhdGVOZXR3b3JrVG9OZXR3b3JrJzsKCQkJfQoJCQkvLyBTdGFuZGFsb25lIC0+IE11bHRpc2l0ZSBJbXBvcnQuCgkJCWlmICggKCAkdGhpcy0+c291cmNlVHlwZSA9PSAnc3RhbmRhbG9uZScgKSAmJiAoICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPT0gJ211bHRpc2l0ZV9pbXBvcnQnICkgKSB7CgkJCQkkc3RlcHNbXSA9ICdtaWdyYXRlU3RhbmRhbG9uZVRvTXVsdGlzaXRlSW1wb3J0JzsKCQkJfQoJCQkvLyBNdWx0aXNpdGUgRXhwb3J0IC0+IE11bHRpc2l0ZSBJbXBvcnQuCgkJCWlmICggKCAkdGhpcy0+c291cmNlVHlwZSA9PSAnbXVsdGlzaXRlX2V4cG9ydCcgKSAmJiAoICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPT0gJ211bHRpc2l0ZV9pbXBvcnQnICkgKSB7CgkJCQkkc3RlcHNbXSA9ICdtaWdyYXRlTXVsdGlzaXRlSW1wb3J0VG9NdWx0aXNpdGVFeHBvcnQnOwoJCQl9CgkJCS8vIE11bHRpc2l0ZSBFeHBvcnQgLT4gU3RhbmRhbG9uZS4KCQkJaWYgKCAoICR0aGlzLT5zb3VyY2VUeXBlID09ICdtdWx0aXNpdGVfZXhwb3J0JyApICYmICggJHRoaXMtPmRlc3RpbmF0aW9uVHlwZSA9PSAnc3RhbmRhbG9uZScgKSApIHsKCQkJCSRzdGVwc1tdID0gJ21pZ3JhdGVNdWx0aXNpdGVFeHBvcnRUb1N0YW5kYWxvbmUnOwoJCQl9CgkJCSRzdGVwc1tdID0gJ19jYWxjdWxhdGVOZXdPbGRVUkxzJzsKCQkJJHN0ZXBzW10gPSAnYnJ1dGVGb3JjZVRhYmxlcyc7CgkJCSRzdGVwc1tdID0gJ2ZpbmFsaXplJzsKCQkJJHN0ZXBzW10gPSAndmVyaWZ5RGF0YWJhc2UnOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGVwcyB0byBydW46IGAnIC4gaW1wbG9kZSggJywnLCAkc3RlcHMgKSAuICdgLicgKTsKCQkKCQkKCQlmb3JlYWNoKCAoYXJyYXkpJHN0ZXBzIGFzICRzdGVwICkgewoJCQkkcmVzdW1lUG9pbnQgPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVBvaW50J107CgkJCSR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSA9ICcnOyAvLyBDbGVhciBvdXQgbmVlZGluZyB0byByZXN1bWUgZm9yIG5vdy4KCQkJCgkJCS8vIFJ1biB0aGUgZnVuY3Rpb24uCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIHN0ZXAgYCcgLiAkc3RlcCAuICdgLicgKTsKCQkJJHJlc3VsdHMgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICR0aGlzLCAkc3RlcCApLCAkcmVzdW1lUG9pbnQgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3RlcCBgJyAuICRzdGVwIC4gJ2AuJyApOwoJCQkKCQkJaWYgKCBUUlVFID09PSAkcmVzdWx0cyApIHsgLy8gU3VjY2VzcyBzbyBtb3ZlIHRvIG5leHQgbG9vcC4KCQkJCWFycmF5X3NoaWZ0KCAkc3RlcHMgKTsgLy8gU2hpZnRzIHN0ZXAgb2ZmIHRoZSBmcm9udCBvZiB0aGUgYXJyYXkuCgkJCQlpZiAoICEgaXNfYXJyYXkoICRzdGVwcyApICkgewoJCQkJCSRzdGVwcyA9IGFycmF5KCk7CgkJCQl9CgkJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIG1pZ3JhdGlvbiBzdGVwIGAnIC4gJHN0ZXAgLiAnYCBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuJyApOwoKCQkJCWlmICggJHRoaXMtPm5lYXJUaW1lTGltaXQoKSApIHsKCQkJCQlyZXR1cm4gYXJyYXkoICRzdGVwcywgJycgKTsgLy8gYXJyYXkgb2YgcmVtYWluaW5nIHN0ZXBzLCBubyByZXN1bWUgcG9pbnQgc2luY2Ugbm90IHdpdGhpbiBhIGZ1bmN0aW9uLgoJCQkJfQoKCQkJCS8vIERvIG5vdGhpbmcuLi4gd2lsbCBqdXN0IGNvbnRpbnVlIHRvIG5leHQgc3RlcC4KCQkJfSBlbHNlaWYoIGlzX2FycmF5KCAkcmVzdWx0cyApICkgeyAvLyBORUVEUyBDSFVOS0lORy4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01pZ3JhdGluZyB0aGUgZGF0YWJhc2UgZGlkIG5vdCBjb21wbGV0ZSBpbiB0aGUgZmlyc3QgcGFzc3MuIENodW5raW5nIGludG8gbXVsdGlwbGUgcGFydHMuIFJlc3VtaW5nIHN0ZXAgYCcgLiAkc3RlcCAuICdgIHNob3J0bHkgYXQgcG9pbnQgYCcgLiBwcmludF9yKCBhcnJheSggJHN0ZXBzLCAkcmVzdWx0c1swXSApLCB0cnVlICkgLiAnYC4nICk7CgkJCQlyZXR1cm4gYXJyYXkoICRzdGVwcywgJHJlc3VsdHNbMF0gKTsgLy8gQXJyYXkgb2Ygc3RlcHMgdG8gcnVuLCByZXN1bWUgcG9pbnQuCgkJCX0gZWxzZSB7IC8vIEZBTFNFIG9yIHNvbWV0aGluZyB3ZWlyZC4uLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0RhdGFiYXNlIG1pZ3JhdGlvbiBzdGVwIGAnIC4gJHN0ZXAgLiAnYCBmYWlsZWQuIFNlZSBsb2cgZm9yIGRldGFpbHMuIFJlc3VsdDogYCcgLiAkcmVzdWx0cyAuICdgLicgKTsKCQkJCXJldHVybiBGQUxTRTsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgkJCgkJCgkJJHRoaXMtPmRpc2Nvbm5lY3RMaXZlKCk7CgkJCgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnVG9vayAnIC4gcm91bmQoIG1pY3JvdGltZSggdHJ1ZSApIC0gcGJfYmFja3VwYnVkZHk6OiRzdGFydF90aW1lLCAzICkgLiAnIHNlY29uZHMuIERvbmUuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0RhdGFiYXNlIGNvbnRlbnQgbWlncmF0ZWQuJyApOwoJCQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKS4KCQoJCgkKCS8qIGRpc2Nvbm5lY3RMaXZlKCkKCSAqCgkgKiBEaXNjb25uZWN0cyBhbnkgU3Rhc2ggTGl2ZSBkZXN0aW5hdGlvbi4KCSAqCgkgKi8KCWZ1bmN0aW9uIGRpc2Nvbm5lY3RMaXZlKCkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoZWNraW5nIGZvciBhbnkgU3Rhc2ggTGl2ZSBkZXN0aW5hdGlvbnMgbmVlZGluZyBkaXNjb25uZWN0ZWQuJyApOwoJCWdsb2JhbCAkd3BkYjsKCQkKCQkvLyBHZXQgQmFja3VwQnVkZHkgb3B0aW9ucy4KCQkkZmluYWxQcmVmaXggPSBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHRoaXMtPmZpbmFsUHJlZml4ICk7CgkJJHJlc3VsdCA9ICR3cGRiLT5nZXRfdmFyKCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JGZpbmFsUHJlZml4fW9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSdwYl9iYWNrdXBidWRkeScgTElNSVQgMSIgKTsKCQlpZiAoICRyZXN1bHQgPT09IGZhbHNlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJldHJpZXZlIHBiX2JhY2t1cGJ1ZGR5IG9wdGlvbnMgZnJvbSBkYXRhYmFzZS4gU2tpcHBpbmcgZGlzY29ubmVjdExpdmUoKS4nICk7CgkJCXJldHVybjsKCQl9CgkJCgkJLy8gVW5zZXJpYWxpemUuCgkJaWYgKCBmYWxzZSA9PT0gKCAkcmVzdWx0ID0gQHVuc2VyaWFsaXplKCAkcmVzdWx0ICkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ291bGQgbm90IHVuc2VyaWFsaXplIHJldHJpZXZlZCBvcHRpb25zIGRhdGEuIFNraXBwaW5nIGRpc2Nvbm5lY3RMaXZlKCkuJyApOwoJCQlyZXR1cm47IC8vIENvdWxkIG5vdCB1bnNlcmlhbGl6ZS4KCQl9CgkJCgkJLy8gQ2hlY2sgdGhhdCByZW1vdGUgb3B0aW9ucyBleGlzdHMgYW5kIGlzIHZhbGlkLgoJCWlmICggKCAhIGlzc2V0KCAkcmVzdWx0WydyZW1vdGVfZGVzdGluYXRpb25zJ10gKSApIHx8ICggISBpc19hcnJheSggJHJlc3VsdFsncmVtb3RlX2Rlc3RpbmF0aW9ucyddICkgKSApIHsgCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlbW90ZSBkZXN0aW5hdGlvbnMgbm90IGZvdW5kIG9yIG5vdCBhcnJheS4gU2tpcHBpbmcgZGlzY29ubmVjdExpdmUoKS4nICk7CgkJCXJldHVybjsKCQl9CgkJCgkJLy8gTG9vayBmb3IgYSBMaXZlIGRlc3RpbmF0aW9uICYgZGVsZXRlIGl0LgoJCWZvcmVhY2goICRyZXN1bHRbJ3JlbW90ZV9kZXN0aW5hdGlvbnMnXSBhcyAkaSA9PiAkcmVtb3RlX2Rlc3RpbmF0aW9uICkgewoJCQlpZiAoICdsaXZlJyA9PSAkcmVtb3RlX2Rlc3RpbmF0aW9uWyd0eXBlJ10gKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCBTdGFzaCBMaXZlIGRlc3RpbmF0aW9uLiBSZW1vdmluZy4nICk7CgkJCQl1bnNldCggJHJlc3VsdFsncmVtb3RlX2Rlc3RpbmF0aW9ucyddWyAkaSBdICk7CgkJCX0KCQl9CgkJCgkJLy8gUmUtc2VyaWFsaXplLgoJCSRyZXN1bHQgPSBzZXJpYWxpemUoICRyZXN1bHQgKTsKCQkKCQkvLyBTYXZlIG9wdGlvbnMgYmFjay4KCQkkd3BkYi0+cXVlcnkoICJVUERBVEUgYHskZmluYWxQcmVmaXh9b3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcmVzdWx0ICkgLiAiJyBXSEVSRSBvcHRpb25fbmFtZT0ncGJfYmFja3VwYnVkZHknIExJTUlUIDEiICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgcGJfYmFja3VwYnVkZHkgaW4gb3B0aW9ucyB0YWJsZS4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRG9uZSBjaGVja2luZyBmb3IgYW55IFN0YXNoIExpdmUgZGVzdGluYXRpb25zIG5lZWRpbmcgZGlzY29ubmVjdGVkLicgKTsKCX0gLy8gRW5kIGRpc2Nvbm5lY3RMaXZlKCkuCgkKCQoJCglmdW5jdGlvbiBuZWFyVGltZUxpbWl0KCkgewoJCS8vIElmIHdlIGFyZSB3aXRoaW4gMSBzZWNvbmQgb2YgcmVhY2hpbmcgbWF4aW11bSBQSFAgcnVudGltZSB0aGVuIHN0b3AgaGVyZSBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgaW4gYW5vdGhlciBQSFAgcHJvY2Vzcy4uLgoJCWlmICggKCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnN0YXJ0VGltZSApICsgc2VsZjo6VElNRV9XSUdHTEVfUk9PTSApID49ICR0aGlzLT5yZXN0b3JlRGF0YVsnbWF4RXhlY3V0aW9uVGltZSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdBcHByb2FjaGluZyBsaW1pdCBvZiBhdmFpbGFibGUgUEhQIGNodW5raW5nIHRpbWUgb2YgYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ21heEV4ZWN1dGlvblRpbWUnXSAuICdgIHNlYy4gUmFuIGZvciAnIC4gcm91bmQoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnN0YXJ0VGltZSwgMyApIC4gJyBzZWMuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoJCgkKCQoJZnVuY3Rpb24gX2NhbGN1bGF0ZU5ld09sZFVSTHMoKSB7CgkJLy8gKioqKioqKioqKiBCRUdJTiBNQUtJTkcgT0xEIFVSTFMgVU5JUVVFIEFORCBUUklNTUlORyBDT1JSRVNQT05ESU5HIE5FVyBVUkxTICoqKioqKioqKioKCgkJLy8gVGhpcyBlbnRpcmUgc2VjdGlvbiBpcyBpbiBwbGFjZSB0byBwcmV2ZW50IGR1cGxpY2F0ZSByZXBsYWNlbWVudHMuCgkJJHVuaXF1ZV91cmxzID0gJHRoaXMtPl9hcnJheV9wYWlyc191bmlxdWVfZmlyc3QoICR0aGlzLT5vbGRVUkxzLCAkdGhpcy0+bmV3VVJMcyApOwoJCSR0aGlzLT5vbGRVUkxzID0gJHVuaXF1ZV91cmxzWzBdOwoJCSR0aGlzLT5uZXdVUkxzID0gJHVuaXF1ZV91cmxzWzFdOwoKCQkkdW5pcXVlX3VybHMgPSAkdGhpcy0+X2FycmF5X3BhaXJzX3VuaXF1ZV9maXJzdCggJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLCAkdGhpcy0+bmV3RnVsbFJlcGxhY2UgKTsKCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2UgPSAkdW5pcXVlX3VybHNbMF07CgkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlID0gJHVuaXF1ZV91cmxzWzFdOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgVVJMczogJyAuIGltcGxvZGUoICcsICcsICR0aGlzLT5vbGRVUkxzICkgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOZXcgVVJMczogJyAuIGltcGxvZGUoICcsICcsICR0aGlzLT5uZXdVUkxzICkgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgZnVsbCByZXBsYWNlOiAnIC4gaW1wbG9kZSggJywgJywgJHRoaXMtPm9sZEZ1bGxSZXBsYWNlICkgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOZXcgZnVsbCByZXBsYWNlOiAnIC4gaW1wbG9kZSggJywgJywgJHRoaXMtPm5ld0Z1bGxSZXBsYWNlICkgKTsKCgkJcmV0dXJuIHRydWU7CgoJCS8vICoqKioqKioqKiogRU5EIE1BS0lORyBPTEQgVVJMUyBVTklRVUUgQU5EIFRSSU1NSU5HIENPUlJFU1BPTkRJTkcgTkVXIFVSTFMgKioqKioqKioqKgoJfQoJCgkKCQoJZnVuY3Rpb24gbWlncmF0ZUNvbW1vbigpIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRpb24gc3RlcHMgZm9yIGBhbGxgIHNpdGVzLicgKTsKCgkJLy8gQUJTUEFUSAoJCSRvbGRfYWJzcGF0aCA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2Fic3BhdGgnXTsKCQkvLyRvbGRfYWJzcGF0aCA9IHByZWdfcmVwbGFjZSggJ3wvKyR8JywgJycsICRvbGRfYWJzcGF0aCApOyAvLyBSZW1vdmUgZXNjYXBpbmcgb2Ygd2luZG93cyBwYXRocy4gVGhpcyBpcyB3cm9uZy4gc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMuIFdoeT8gSXQgc2hvdWxkbnQhIFJlbW92ZWQgTm92IDQKCQkkbmV3X2Fic3BhdGggPSBBQlNQQVRIOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0FCU1BBVEggY2hhbmdlIGZvciBkYXRhYmFzZS4gT2xkIFBhdGg6ICcgLiAkb2xkX2Fic3BhdGggLiAnLCBOZXcgUGF0aDogJyAuICRuZXdfYWJzcGF0aCAuICcuJyApOwoKCgoJCSRvbGRfdXJsID0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddOyAgLy8gdGhlIHZhbHVlIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IJCgoJCS8vIFNJVEVVUkwKCQlpZiAoIHN0cmlzdHIoICRvbGRfdXJsLCAnaHR0cDovL3d3dy4nICkgfHwgc3RyaXN0ciggJG9sZF91cmwsICdodHRwczovL3d3dy4nICkgKSB7IC8vIElmIGh0dHA6Ly93d3cuYmxhaC4uLi4gdGhlbiBhbHNvIHdlIHdpbGwgcmVwbGFjZSBodHRwOi8vYmxhaC4uLiBhbmQgdmljZSB2ZXJzYS4KCQkJJG9sZF91cmxfYWx0ID0gc3RyX2lyZXBsYWNlKCAnaHR0cDovL3d3dy4nLCAnaHR0cDovLycsICRvbGRfdXJsICk7CgkJCSRvbGRfdXJsX2FsdCA9IHN0cl9pcmVwbGFjZSggJ2h0dHBzOi8vd3d3LicsICdodHRwczovLycsICRvbGRfdXJsX2FsdCApOwoJCX0gZWxzZSB7CgkJCSRvbGRfdXJsX2FsdCA9IHN0cl9pcmVwbGFjZSggJ2h0dHA6Ly8nLCAnaHR0cDovL3d3dy4nLCAkb2xkX3VybCApOwoJCQkkb2xkX3VybF9hbHQgPSBzdHJfaXJlcGxhY2UoICdodHRwczovLycsICdodHRwczovL3d3dy4nLCAkb2xkX3VybF9hbHQgKTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2FsY3VsYXRlZCBzaXRlIFVSTCB1cGRhdGUuIFByZXZpb3VzIFVSTDogYCcgLiAkb2xkX3VybCAuICdgLCBOZXcgVVJMOiBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJ2AuJyApOwoJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSA9IGFycmF5KCAkb2xkX3VybCwgJG9sZF91cmxfYWx0ICk7CgkJaWYgKCAnLycgIT0gJG9sZF9hYnNwYXRoICkgeyAvLyBPbmx5IGRvIHJlcGxhY2Ugb24gYWJzcGF0aCBpZiBpdCB3YXMgbm90IHByZXZpb3VzbHkgYXQgdGhlIHJvb3QgYXMgdGhpcyBlYXNpbHkgYnJlYWtzIHRoaW5ncy4KCQkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlW10gPSAkb2xkX2Fic3BhdGg7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV0FSTklORzogU2tpcHBpbmcgQUJTUEFUSCBkYXRhYmFzZSBtaWdyYXRpb25zIGFzIHRoZSBwcmV2aW91cyBBQlNQQVRIIHdhcyBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuIENhbm5vdCBzYWZlbHkgdXBkYXRlIHBhdGhzIGF0IHRoaXMgbG9jYXRpb24gZG8gaXQgb25seSBiZWluZyBhIHNpbmdsZSBzbGFzaC4nICk7CgkJfQoJCSR0aGlzLT5uZXdGdWxsUmVwbGFjZSA9IGFycmF5KCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSwgJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gKTsKCQlpZiAoICcvJyAhPSAkb2xkX2Fic3BhdGggKSB7IC8vIE9ubHkgZG8gcmVwbGFjZSBvbiBhYnNwYXRoIGlmIGl0IHdhcyBub3QgcHJldmlvdXNseSBhdCB0aGUgcm9vdCBhcyB0aGlzIGVhc2lseSBicmVha3MgdGhpbmdzLgoJCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2VbXSA9ICRuZXdfYWJzcGF0aDsKCQl9CgoJCS8vIEhPTUVVUkwuCgkJaWYgKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2hvbWV1cmwnXSAhPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydzaXRldXJsJ10gKSB7IC8vIE9sZCBhbmQgbmV3IGhvbWV1cmwgZGlmZmVyIHNvIG5lZWRzIHVwZGF0aW5nLgoKCQkJaWYgKCBlbXB0eSggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaG9tZXVybCddICkgKSB7IC8vIG9sZCBCYWNrdXBCdWRkeSB2ZXJzaW9ucyBkaWQgbm90IHN0b3JlIHRoZSBwcmV2aW91cyBob21ldXJsLiBIYW5nIG9udG8gdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGEgd2hpbGUuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnWW91ciBjdXJyZW50IGJhY2t1cCBkb2VzIG5vdCBpbmNsdWRlIGEgaG9tZSBVUkwuIEhvbWUgVVJMcyB3aWxsIE5PVCBiZSB1cGRhdGVkOyBzaXRlIFVSTCB3aWxsIGJlIHVwZGF0ZWQgdGhvdWdoLiAgTWFrZSBhIG5ldyBiYWNrdXAgd2l0aCB0aGUgbGF0ZXN0IEJhY2t1cEJ1ZGR5IGJlZm9yZSBtaWdyYXRpbmcgaWYgeW91IHdpc2ggdG8gZnVsbHkgdXBkYXRlIGhvbWUgVVJMIGNvbmZpZ3VyYXRpb24uJyApOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPm9sZFVSTHMgPSBhcnJheSggJG9sZF91cmwsICRvbGRfdXJsX2FsdCwgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaG9tZXVybCddICk7CgkJCQkkdGhpcy0+bmV3VVJMcyA9IGFycmF5KCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSwgJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10sICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddICk7CgoJCQkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlW10gPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydob21ldXJsJ107CgkJCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2VbXSA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2hvbWV1cmwnXTsKCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDYWxjdWxhdGVkIGhvbWUgVVJMIHVwZGF0ZS4gUHJldmlvdXMgVVJMOiBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2hvbWV1cmwnXSAuICdgLCBOZXcgVVJMOiBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddIC4gJ2AnICk7CgkJCX0KCQl9IGVsc2UgeyAvLyBTaXRlIFVSTCB1cGRhdGVzIG9ubHkuCgkJCSR0aGlzLT5vbGRVUkxzID0gYXJyYXkoICRvbGRfdXJsLCAkb2xkX3VybF9hbHQgKTsKCQkJJHRoaXMtPm5ld1VSTHMgPSBhcnJheSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10sICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddICk7CgkJfQoKCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpciApICkgewoJCQkkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgPSAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvJyAuIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJHdwX3VwbG9hZF9kaXIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsID0gYCcgLiAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgLiAnYC4nICk7CgkJfQoJCQoJCQoJCSR0aGlzLT5icnV0ZWZvcmNlRXhjbHVkZWRUYWJsZXMgPSBhcnJheSgKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Bvc3RzJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3VzZXJzJywgLy8gSW1wb3J0ZWQgdXNlcnMgdGFibGUgd2lsbCB0ZW1wb3JhcmlseSBiZSBoZXJlIHNvIHRoaXMgaXMgZmluZSBmb3IgTVMgaW1wb3J0cy4KCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3VzZXJtZXRhJywgLy8gSW1wb3J0ZWQgdXNlcnMgdGFibGUgd2lsbCB0ZW1wb3JhcmlseSBiZSBoZXJlIHNvIHRoaXMgaXMgZmluZSBmb3IgTVMgaW1wb3J0cy4KCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Rlcm1zJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Rlcm1fdGF4b25vbXknLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAndGVybV9yZWxhdGlvbnNoaXBzJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Bvc3RtZXRhJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ29wdGlvbnMnLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnY29tbWVudHMnLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnY29tbWVudG1ldGEnLAoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnbGlua3MnLAoJCSk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYGFsbGAgc2l0ZXMuJyApOwoJCQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgbWlncmF0ZUNvbW1vbigpLgoJCgkKCQoJZnVuY3Rpb24gbWlncmF0ZU5ldHdvcmtUb05ldHdvcmsoKSB7CgkJZ2xvYmFsICR3cGRiOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRpb24gc3RlcHMgZm9yIGBOZXR3b3JrIC0+IE5ldHdvcmtgIHNpdGVzLicgKTsKCgkJLy8gTXVsdGlzaXRlIE5ldHdvcmsgZG9tYWluICYgcGF0aCBmcm9tIHNpdGUgdXJsOgoJCSR1cmxfcGFydHMgPSBwYXJzZV91cmwoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddICk7CgkJJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4gPSAgJHVybF9wYXJ0c1snaG9zdCddOwoJCWlmICggaXNzZXQoICR1cmxfcGFydHNbJ3BhdGgnXSApICkgewoJCQkkZGVzdGluYXRpb25fcGF0aCA9IHJ0cmltKCAkdXJsX3BhcnRzWydwYXRoJ10sICcvXFwnICkgLiAnLyc7CgkJfSBlbHNlIHsKCQkJJGRlc3RpbmF0aW9uX3BhdGggPSAnLyc7CgkJfQoJCQoJCS8vcGJfdXBkYXRlX2RvbWFpbl9wYXRoKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydkb21haW4nXSwgJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4sICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3BhdGgnXSwgJGRlc3RpbmF0aW9uX3BhdGggKTsgLy8gJG9sZF9kb21haW4sICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluLCAkb2xkX3BhdGgsICRkZXN0aW5hdGlvbl9wYXRoCgkJJG9sZF9kb21haW4gPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydkb21haW4nXTsKCQkkb2xkX3BhdGggPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydwYXRoJ107CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ011bHRpc2l0ZSBOZXR3b3JrIFVSTHM6IE9sZCBkb21haW46IGAnIC4gJG9sZF9kb21haW4gLiAnYDsgbmV3IGRvbWFpbjogYCcgLiAkbXVsdGlzaXRlX2Rlc3RpbmF0aW9uX2RvbWFpbiAuICdgOyBvbGQgcGF0aDogYCcgLiAkb2xkX3BhdGggLiAnYDsgbmV3IHBhdGg6IGAnIC4gJGRlc3RpbmF0aW9uX3BhdGggLiAnYC4nICk7CgoKCQkvLyBCTE9HUyBUQUJMRS0tLS0tCgoJCS8vIFVwZGF0ZSBibG9nIHBhdGggZm9yIGFsbCBzaXRlcyB0aGF0IGhhZCB0aGUgb2xkIGRvbWFpbiBhbmQgc3RhcnRlZCB3aXRoIHRoZSBvbGQgcGF0aCBpbiBCTE9HUyB0YWJsZS4KCQlpZiAoICRvbGRfcGF0aCAhPSAnLycgKSB7IC8vIFVzZWQgdG8gYmUgYSBzdWJkb21haW4gc28gd2UgY2FuIG1vcmUgc2FmZWx5IHJlcGxhY2UuCgkJCSR3cGRiLT5xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJibG9nc2AgU0VUIHBhdGg9UkVQTEFDRSggcGF0aCwgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9wYXRoICkgLiAiJywgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJGRlc3RpbmF0aW9uX3BhdGggKSAuICInKSBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIEFORCBwYXRoIExJS0UgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9wYXRoICkgLiAiJSciICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHBhdGhzIGluIGJsb2dzIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRkZXN0aW5hdGlvbl9wYXRoICkgLiAnYCAob2xkIHBhdGggd2FzIGEgc3ViZGlyZWN0b3J5KS4nICk7CgkJfSBlbHNlIHsgLy8gVXNlZCB0byBiZSBpbiByb290IHNvIG11Y2ggcHJlcGVuZCBuZXcgcGF0aC4KCQkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gImJsb2dzYCBTRVQgcGF0aD1jb25jYXQoICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoIHJ0cmltKCAkZGVzdGluYXRpb25fcGF0aCwgJy9cXCcgKSApIC4gIicsIHBhdGggKSBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBwYXRocyBpbiBibG9ncyB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gJ2AgKG9sZCBwYXRoIHdhcyByb290KS4nICk7CgkJfQoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoKCQkvLyBVcGRhdGUgYmxvZyBkb21haW4gZm9yIGFsbCBtYXRjaGluZyBzaXRlcy4KCQkkd3BkYi0+cXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAiYmxvZ3NgIFNFVCBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4gKSAuICInIFdIRVJFIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX2RvbWFpbiApIC4gIiciICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgZG9tYWluIGluIGJsb2dzIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluICkgLiAnYC4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgoKCQkvLyBTSVRFIFRBQkxFLS0tLS0KCgkJLy8gVXBkYXRlIGJsb2cgcGF0aCBmb3IgYWxsIG1hdGNoaW5nIHNpdGVzIGluIFNJVEUgdGFibGUuCgkJaWYgKCAkb2xkX3BhdGggIT0gJy8nICkgeyAvLyBVc2VkIHRvIGJlIGEgc3ViZG9tYWluIHNvIHdlIGNhbiBtb3JlIHNhZmVseSByZXBsYWNlLgoJCQkkd3BkYi0+cXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAic2l0ZWAgU0VUIHBhdGg9UkVQTEFDRSggcGF0aCwgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9wYXRoICkgLiAiJywgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJGRlc3RpbmF0aW9uX3BhdGggKSAuICInKSBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIEFORCBwYXRoIExJS0UgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9wYXRoICkgLiAiJSciICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHBhdGhzIGluIHNpdGUgdGFibGUgdG8gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJGRlc3RpbmF0aW9uX3BhdGggKSAuICdgIChvbGQgcGF0aCB3YXMgYSBzdWJkaXJlY3RvcnkpLicgKTsKCQl9IGVsc2UgeyAvLyBVc2VkIHRvIGJlIGluIHJvb3Qgc28gbXVjaCBwcmVwZW5kIG5ldyBwYXRoLgoJCQkkd3BkYi0+cXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAic2l0ZWAgU0VUIHBhdGg9Y29uY2F0KCAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCBydHJpbSggJGRlc3RpbmF0aW9uX3BhdGgsICcvXFwnICkgKSAuICInLCBwYXRoICkgV0hFUkUgZG9tYWluPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRvbGRfZG9tYWluICkgLiAiJyIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgcGF0aHMgaW4gc2l0ZSB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gJ2AgKG9sZCBwYXRoIHdhcyByb290KS4nICk7CgkJfQoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoKCQkvLyBVcGRhdGUgYmxvZyBkb21haW4gZm9yIGFsbCBtYXRjaGluZyBzaXRlcy4KCQkkd3BkYi0+cXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAic2l0ZWAgU0VUIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkbXVsdGlzaXRlX2Rlc3RpbmF0aW9uX2RvbWFpbiApIC4gIicgV0hFUkUgZG9tYWluPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRvbGRfZG9tYWluICkgLiAiJyIgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBkb21haW4gaW4gc2l0ZSB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkbXVsdGlzaXRlX2Rlc3RpbmF0aW9uX2RvbWFpbiApIC4gJ2AuJyApOwoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBtaWdyYXRpb24gc3RlcHMgZm9yIGBOZXR3b3JrIC0+IE5ldHdvcmtgIHNpdGVzLicgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1pZ3JhdGVOZXR3b3JrVG9OZXR3b3JrKCkuCgkKCQoJCglmdW5jdGlvbiBtaWdyYXRlU3RhbmRhbG9uZVRvTXVsdGlzaXRlSW1wb3J0KCkgewoJCQoJCWdsb2JhbCAkd3BkYjsKCQlnbG9iYWwgJHdwX3ZlcnNpb247CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3RhcnRpbmcgbWlncmF0aW9uIHN0ZXBzIGZvciBgU3RhbmRhbG9uZSAtPiBNdWx0aXNpdGUgSW1wb3J0YCBzaXRlcy4nICk7CgkJCgkJLy8gTm90ZSBmb3IgYW55IGRlc3RpbmF0aW9uIG9mIG11bHRpc2l0ZV9pbXBvcnQ6IFVzZXJzIHRhYmxlcyBleGlzdCB0ZW1wb3JhcmlseSBpbiB0aGVpciBub3JtYWwgbG9jYXRpb24gc28gd2UgcmVwbGFjZSB0aGVtIGxpa2UgYSBub3JtYWwgc3RhbmRhbG9uZSBzaXRlLiBUaGUgbmV4dCBpbXBvcnQgc3RlcCB3aWxsIG1lcmdlIHRoZW0gaW50byB0aGUgbXVsdGlzaXRlIHRhYmxlcy4KCQkKCQkvLyBUT0RPOiBhZGQgY29kZSBmcm9tIG1zX2ltcG9ydGJ1ZGR5LnBocCBpbnRvIGhlcmUgZm9yIGFueSB1cGRhdGVzIGlmIG5lZWRlZC4KCQkKCQkvLyBUaGUgb2xkIHVwbG9hZHMgVVJMLiBTdGFuZGFsb25lIHNvdXJjZSBsaWtlOiBodHRwOi8vZ2V0YmFja3VwYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIEJCIGRvZXNudCBjdXJyZW50bHkgc3VwcG9ydCBtb3ZlZCB1cGxvYWRzLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIHVwbG9hZHMgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMnICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZFVSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzJyApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMnICk7CgkJCgkJLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOZXcgdmlydHVhbCB1cGxvYWQgVVJMIHRvIHJlcGxhY2Ugc3RhbmRhbG9uZSB1cGxvYWQgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3RnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgkJCgkJLy8gVXBkYXRlIHVwbG9hZF9wYXRoIGluIG9wdGlvbnMgdGFibGUuCgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cF92ZXJzaW9uLCAnMy41JywgJz49JykgKSB7IC8vIEFzIG9mIFdQIHYzLjUgc3Vic3RpZXMgc2hvdWxkIGhhdmUgdXBsb2FkX3BhdGggb3B0aW9uIHJlbW92ZWQuCgkJCSR3cGRiLT5xdWVyeSggIkRFTEVURSBGUk9NIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSd1cGxvYWRfcGF0aCcgTElNSVQgMSIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVsZXRlZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSBhcyB1cGxvYWRfcGF0aCBpcyBubyBsb25nZXIgbmVlZGVkIGJ5IE11bHRpc2l0ZS4nICk7CgkJfSBlbHNlIHsKCQkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSd1cGxvYWRfcGF0aCcgTElNSVQgMSIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmFjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXBsb2FkcyBVUkwgaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiAnIC4gc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKTsKCQl9CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgkJCgkJLy8gVXBkYXRlIHVzZXIgcm9sZXMgb3B0aW9uX25hbWUgcm93LgoJCSR3cGRiLT5xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBTRVQgb3B0aW9uX25hbWU9JyIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAidXNlcl9yb2xlcycgV0hFUkUgb3B0aW9uX25hbWUgTElLRSAnJVxfdXNlclxfcm9sZXMnIExJTUlUIDEiICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXNlciByb2xlcyBvcHRpb25fbmFtZSB0byBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VyX3JvbGVzYC4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgkJCgkJLy8gVXBkYXRlIGZpbGV1cGxvYWRfdXJsIGluIG9wdGlvbnMgdGFibGUuCgkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSdmaWxldXBsb2FkX3VybCcgTElNSVQgMSIgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBmaWxldXBsb2FkX3VybCBpbiBvcHRpb25zIHRhYmxlLiBOZXcgdmFsdWU6IGAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gLiAnYC4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgbWlncmF0aW9uIHN0ZXBzIGZvciBgU3RhbmRhbG9uZSAtPiBNdWx0aXNpdGUgSW1wb3J0YCBzaXRlcy4nICk7CgoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgbWlncmF0ZVN0YW5kYWxvbmVUb011bHRpc2l0ZUltcG9ydCgpLgoJCgkKCQoJZnVuY3Rpb24gbWlncmF0ZU11bHRpc2l0ZUV4cG9ydFRvTXVsdGlzaXRlSW1wb3J0KCkgewoJCQoJCWdsb2JhbCAkd3BkYiwgJHdwX3ZlcnNpb247CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3RhcnRpbmcgbWlncmF0aW9uIHN0ZXBzIGZvciBgTXVsdGlzaXRlIEV4cG9ydCAtPiBNdWx0aXNpdGUgSW1wb3J0YCBzaXRlcy4nICk7CgkJCgkJLy8gTk9URSBmb3IgYW55IGRlc3RpbmF0aW9uIG9mIG11bHRpc2l0ZV9pbXBvcnQ6IFVzZXJzIHRhYmxlcyBleGlzdCB0ZW1wb3JhcmlseSBpbiB0aGVpciBub3JtYWwgbG9jYXRpb24gc28gd2UgcmVwbGFjZSB0aGVtIGxpa2UgYSBub3JtYWwgc3RhbmRhbG9uZSBzaXRlLiBUaGUgbmV4dCBpbXBvcnQgc3RlcCB3aWxsIG1lcmdlIHRoZW0gaW50byB0aGUgbXVsdGlzaXRlIHRhYmxlcy4KCQkKCQkvLyBUaGUgb2xkIHZpcnR1YWwgdXBsb2FkcyBVUkwuIFN0YW5kYWxvbmUgc291cmNlIGxpa2U6IGh0dHA6Ly9nZXRiYWNrdXBidWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gQkIgZG9lc250IGN1cnJlbnRseSBzdXBwb3J0IG1vdmVkIHVwbG9hZHMuIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgdmlydHVhbCB1cGxvYWRzIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmwnXSApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRVUkxzLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkRnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmwnXSApOwoJCQoJCS8vIFRoZSBuZXcgdmlydHVhbCB1cGxvYWQgVVJMLiBFeDogaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS93cC1jb250ZW50L3VwbG9hZHMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTmV3IHZpcnR1YWwgdXBsb2FkIFVSTCB0byByZXBsYWNlIG9sZCB2aXJ0dWFsIHVwbG9hZHMgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3RnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgkJCgkJLy8gVGhlIG9sZCByZWFsIGRpcmVjdCB1cGxvYWRzIFVSTC4gU3RhbmRhbG9uZSBzb3VyY2UgbGlrZTogaHR0cDovL2dldGJhY2t1cGJ1ZGR5LmNvbS93cC1jb250ZW50L3VwbG9hZHMvLiBCQiBkb2VzbnQgY3VycmVudGx5IHN1cHBvcnQgbW92ZWQgdXBsb2Fkcy4gVW5zaGlmdGVkIHRvIHBsYWNlIHRoZXNlIHJlcGxhY2VtZW50cyBGSVJTVCBpbiB0aGUgYXJyYXkgb2YgVVJMcyB0byByZXBsYWNlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09sZCByZWFsIGRpcmVjdCB1cGxvYWRzIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmxfcmV3cml0ZSddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZFVSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3VwbG9hZF91cmxfcmV3cml0ZSddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsX3Jld3JpdGUnXSApOwoJCQoJCS8vIFRoZSBuZXcgcmVhbCBkaXJlY3QgdXBsb2FkIFVSTC4gRXg6IGh0dHA6Ly9wbHVnaW5idWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gVW5zaGlmdGVkIHRvIHBsYWNlIHRoZXNlIHJlcGxhY2VtZW50cyBGSVJTVCBpbiB0aGUgYXJyYXkgb2YgVVJMcyB0byByZXBsYWNlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyByZWFsIGRpcmVjdCB1cGxvYWQgVVJMIHRvIHJlcGxhY2Ugb2xkIHZpcnR1YWwgdXBsb2FkcyBVUkw6ICcgLiAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLCAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKTsKCQkKCQkvLyBVcGRhdGUgdXBsb2FkX3BhdGggaW4gb3B0aW9ucyB0YWJsZS4KCQlpZiAoIHZlcnNpb25fY29tcGFyZSggJHdwX3ZlcnNpb24sICczLjUnLCAnPj0nKSApIHsgLy8gQXMgb2YgV1AgdjMuNSBzdWJzdGllcyBzaG91bGQgaGF2ZSB1cGxvYWRfcGF0aCBvcHRpb24gcmVtb3ZlZC4KCQkJJHdwZGItPnF1ZXJ5KCAiREVMRVRFIEZST00gYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZWxldGVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIGFzIHVwbG9hZF9wYXRoIGlzIG5vIGxvbmdlciBuZWVkZWQgYnkgTXVsdGlzaXRlLicgKTsKCQkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgkJfSBlbHNlIHsKCQkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSd1cGxvYWRfcGF0aCcgTElNSVQgMSIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXBsb2FkX3BhdGggaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiAnIC4gc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKTsKCQkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgkJfQoJCQoJCS8vIFVwZGF0ZSBmaWxldXBsb2FkX3VybCBpbiBvcHRpb25zIHRhYmxlLgoJCSR3cGRiLT5xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBTRVQgb3B0aW9uX3ZhbHVlPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICkgLiAiJyBXSEVSRSBvcHRpb25fbmFtZT0nZmlsZXVwbG9hZF91cmwnIExJTUlUIDEiICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgZmlsZXVwbG9hZF91cmwgaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddIC4gJ2AuJyApOwoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYE11bHRpc2l0ZSBFeHBvcnQgLT4gTXVsdGlzaXRlIEltcG9ydGAgc2l0ZXMuJyApOwoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgbWlncmF0ZU11bHRpc2l0ZUV4cG9ydFRvTXVsdGlzaXRlSW1wb3J0KCkuCgkKCQoJCgkvLyAqKioqKioqKioqIEJFR0lOIE1VTFRJU0lURSBFWFBPUlQgLT4gU1RBTkRBTE9ORSAgKioqKioqKioqKgoJZnVuY3Rpb24gbWlncmF0ZU11bHRpc2l0ZUV4cG9ydFRvU3RhbmRhbG9uZSgpIHsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3RhcnRpbmcgbWlncmF0aW9uIHN0ZXBzIGZvciBgTXVsdGlzaXRlIEV4cG9ydCAtPiBTdGFuZGFsb25lYCBzaXRlcy4nICk7CgkJCgkJLy8gSU1QT1JUQU5UOiBVcGxvYWQgVVJMcyBfTVVTVF8gYmUgdXBkYXRlZCBiZWZvcmUgZG9pbmcgYSBmdWxsIFVSTCByZXBsYWNlbWVudCBvciBlbHNlIHRoZSBmaXJzdCBwb3J0aW9uIG9mIHRoZSBVUkwgd2lsbCBiZSBtaWdyYXRlZCBzbyB0aGVzZSB3aWxsIG5vIGxvbmdlciBtYXRjaC4gYXJyYXlfdW5zaGlmdCgpIGlzIHVzZWQgdG8gYnVtcCB0aGVzZSB0byB0aGUgdG9wIG9mIHRoZSBsaXN0IHRvIHVwZGF0ZS4KCQkvLyBUaGVzZSB3aWxsIGhhbmRsZSBib3RoIHRoZSBSRUFMIHVybCBodHRwOi8vLi4uL3dwLWNvbnRlbnQvYmxvZ3MuZGlyLyMjL2ZpbGVzLyB0aGF0IHRoZSB2aXJ0dWFsIHBhdGggKGh0dHA6Ly8uLi4uL3dwLWNvbnRlbnQvdXBsb2Fkcy8pLgoJCQoJCS8vIFRoZSBvbGQgdmlydHVhbCB1cGxvYWQgVVJMLiBFeDogaHR0cDovL2dldGJhY2t1cGJ1ZGR5LmNvbS9maWxlcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgdmlydHVhbCB1cGxvYWQgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsgJ3VwbG9hZF91cmwnIF0gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkVVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsgJ3VwbG9hZF91cmwnIF0gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkRnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsJyBdICk7CgkJCgkJLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOZXcgdXBsb2FkIFVSTCB0byByZXBsYWNlIHZpcnR1YWwgdXBsb2FkIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMvJyApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5uZXdVUkxzLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3RnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMvJyApOwoJCQoJCS8vIE9ubHkgdXBkYXRlIGFub3RoZXIgVVJMIGlmIGl0IGRpZmZlcnMgLS0gdXN1YWxseSB3aWxsLiBUaGV5IHdpbGwgYmUgdGhlIHNhbWUgaWYgdGhlIHZpcnR1YWwgdXJsIGRvZXNuJ3QgZXhpc3QgZm9yIHNvbWUgcmVhc29uIChubyBodGFjY2VzcyBhdmFpbGFiaWxpdHkgc28gdGhlIHZpcnR1YWwgdXJsIHdvdWxkIG1hdGNoIHRoZSByZWFsIHVybCkKCQlpZiAoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsJyBdICE9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsX3Jld3JpdGUnIF0gKSB7CgkJCS8vIFRoZSBvbGQgdmlydHVhbCB1cGxvYWQgVVJMLiBFeDogaHR0cDovL2dldGJhY2t1cGJ1ZGR5LmNvbS9maWxlcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIHJlYWwgdXBsb2FkIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsX3Jld3JpdGUnIF0gKTsKCQkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZFVSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsX3Jld3JpdGUnIF0gKTsgLy8gVGhlIG9sZCByZWFsIHVwbG9hZCBVUkwuCgkJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsgJ3VwbG9hZF91cmxfcmV3cml0ZScgXSApOwoJCQkKCQkJLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTmV3IHVwbG9hZCBVUkwgdG8gcmVwbGFjZSByZWFsIHVwbG9hZCBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsKCQkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld1VSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMvJyApOyAvLyBUaGUgbmV3IHN0YW5kYWxvbmUgdXBsb2FkIFVSTC4KCQkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsgLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuCgkJfQoJCQoJCS8vIFVwZGF0ZSB1cGxvYWRfcGF0aCBpbiBvcHRpb25zIHRhYmxlIHRvIGJlIGRlZmF1bHQgYmxhbmsgdmFsdWUuCgkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JycgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHVwbG9hZHMgcGF0aCBpbiBvcHRpb25zIHRhYmxlLiBOZXcgdmFsdWU6IGBgIChibGFuayBkZWZhdWx0KS4nICk7CgkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgbWlncmF0aW9uIHN0ZXBzIGZvciBgTXVsdGlzaXRlIEV4cG9ydCAtPiBTdGFuZGFsb25lYCBzaXRlcy4nICk7CgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBtaWdyYXRlTXVsdGlzaXRlRXhwb3J0VG9TdGFuZGFsb25lKCkuCgkvLyAqKioqKioqKioqIEVORCBNVUxUSVNJVEUgRVhQT1JUIC0+IFNUQU5EQUxPTkUgKioqKioqKioqKgoJCgkKCQoJZnVuY3Rpb24gYnJ1dGVmb3JjZVRhYmxlcyggJHJlc3VtZVBvaW50ID0gJycgKSB7CgkJCgkJZ2xvYmFsICR3cGRiOwoJCS8vIExvb3AgdGhyb3VnaCB0aGUgdGFibGVzIG1hdGNoaW5nIHRoaXMgcHJlZml4LiBEb2VzIE5PVCBjaGFuZ2UgZGF0YSBpbiBvdGhlciB0YWJsZXMuCgkJLy8gVGhpcyBjaGFuZ2VzIGFjdHVhbCBkYXRhIG9uIGEgY29sdW1uIGJ5IGNvbHVtbiBiYXNpcyBmb3IgdmVyeSByb3cgaW4gZXZlcnkgdGFibGUuCgkJJHRhYmxlcyA9IGFycmF5KCk7CgkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICciIC4gc3RyX3JlcGxhY2UoICdfJywgJ1xfJywgJHRoaXMtPm92ZXJyaWRlUHJlZml4ICkgLiAiJScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiLCBBUlJBWV9BICk7CgkJZm9yZWFjaCggJHJvd3MgYXMgJHJvdyApIHsKCQkJJHRhYmxlc1tdID0gJHJvd1sndGFibGVfbmFtZSddOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdGb3VuZCAnIC4gY291bnQoICRyb3dzICkgLiAnIFdvcmRQcmVzcyB0YWJsZXMgZm9yIGJydXRlIGZvcmNlLicgKTsKCQl1bnNldCggJHJvd3MgKTsKCQkkYnJ1dGVmb3JjZV90YWJsZXMgPSBwYl9iYWNrdXBidWRkeTo6YXJyYXlfcmVtb3ZlKCAkdGFibGVzLCAkdGhpcy0+YnJ1dGVmb3JjZUV4Y2x1ZGVkVGFibGVzICk7IC8vIFJlbW92ZXMgYWxsIHRhYmxlcyBsaXN0ZWQgaW4gJGV4Y2x1ZGVkX3RhYmxlcyBmcm9tICR0YWJsZXMuCgkJdW5zZXQoICR0YWJsZXMgKTsKCQkKCQkKCQlpZiAoICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPT0gJ211bHRpc2l0ZV9pbXBvcnQnICkgewoJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvZGJyZXBsYWNlL2RicmVwbGFjZS5waHAnICk7CgkJfSBlbHNlIHsKCQkJcmVxdWlyZV9vbmNlKCAnaW1wb3J0YnVkZHkvbGliL2RicmVwbGFjZS9kYnJlcGxhY2UucGhwJyApOwoJCX0KCQkKCQkvLyBJbnN0YW50aWF0ZSBkYiByZXBsYWNlIGNsYXNzLgoJCSRkYnJlcGxhY2UgPSBuZXcgcGx1Z2luYnVkZHlfZGJyZXBsYWNlKCAkdGhpcy0+c3RhcnRUaW1lLCBzZWxmOjpUSU1FX1dJR0dMRV9ST09NLCAkdGhpcy0+cmVzdG9yZURhdGFbJ21heEV4ZWN1dGlvblRpbWUnXSApOwoKCgkJaWYgKCBpc19hcnJheSggJHJlc3VtZVBvaW50ICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Jlc3VtaW5nIGJydXRlZm9yY2Ugc3Vic3RlcHMuIFN0ZXBzIHJlbWFpbmluZzogYCcgLiBjb3VudCggJHJlc3VtZVBvaW50WzBdICkgLiAnYC4nICk7CgkJCSRzdGVwcyA9ICRyZXN1bWVQb2ludFswXTsKCQkJJHN0ZXBSZXN1bWVQb2ludCA9ICRyZXN1bWVQb2ludFsxXTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaXJzdCBydW4gb2YgYnJ1dGVmb3JjZS4gQnVpbGRpbmcgc3Vic3RlcCBsaXN0LicgKTsKCQkJJHN0ZXBSZXN1bWVQb2ludCA9ICcnOwoJCQkKCQkJJHN0ZXBzID0gYXJyYXkoCgkJCQlhcnJheSgKCQkJCQknUG9zdHMgdGFibGUgc2l0ZSBVUkxzLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdwb3N0cycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICdwb3N0X2NvbnRlbnQnLCAncG9zdF9leGNlcnB0JywgJ3Bvc3RfY29udGVudF9maWx0ZXJlZCcgKSwKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2UgdGV4dCBkYXRhLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VycycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICd1c2VyX3VybCcgKQoJCQkJKSwKCQkJCWFycmF5KAoJCQkJCSdXb3JkUHJlc3MgY29yZSBkYXRhYmFzZSB0ZXh0IGRhdGEuJywKCQkJCQkndGV4dCcsCgkJCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2NvbW1lbnRzJywKCQkJCQkkdGhpcy0+b2xkVVJMcywKCQkJCQkkdGhpcy0+bmV3VVJMcywKCQkJCQlhcnJheSggJ2NvbW1lbnRfY29udGVudCcsICdjb21tZW50X2F1dGhvcl91cmwnICkKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2UgdGV4dCBkYXRhLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdsaW5rcycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICdsaW5rX3VybCcsICdsaW5rX2ltYWdlJywgJ2xpbmtfdGFyZ2V0JywgJ2xpbmtfZGVzY3JpcHRpb24nLCAnbGlua19ub3RlcycsICdsaW5rX3JzcycgKSwKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2Ugc2VyaWFsaXplZCBkYXRhLicsCgkJCQkJJ3NlcmlhbGl6ZWQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdvcHRpb25zJywKCQkJCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2UsCgkJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLAoJCQkJCWFycmF5KCAnb3B0aW9uX3ZhbHVlJyApCgkJCQkpLAoJCQkJYXJyYXkoCgkJCQkJJ1dvcmRQcmVzcyBjb3JlIGRhdGFiYXNlIHNlcmlhbGl6ZWQgZGF0YS4nLAoJCQkJCSdzZXJpYWxpemVkJywKCQkJCQkkdGhpcy0+bmV0d29ya1ByZWZpeCAuICd1c2VybWV0YScsCgkJCQkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLAoJCQkJCSR0aGlzLT5uZXdGdWxsUmVwbGFjZSwKCQkJCQlhcnJheSggJ21ldGFfdmFsdWUnICksCgkJCQkpLAoJCQkJYXJyYXkoCgkJCQkJJ1dvcmRQcmVzcyBjb3JlIGRhdGFiYXNlIHNlcmlhbGl6ZWQgZGF0YS4nLAoJCQkJCSdzZXJpYWxpemVkJywKCQkJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAncG9zdG1ldGEnLAoJCQkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSwKCQkJCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2UsCgkJCQkJYXJyYXkoICdtZXRhX3ZhbHVlJyApLAoJCQkJKSwKCQkJCWFycmF5KAoJCQkJCSdXb3JkUHJlc3MgY29yZSBkYXRhYmFzZSBzZXJpYWxpemVkIGRhdGEuJywKCQkJCQknc2VyaWFsaXplZCcsCgkJCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2NvbW1lbnRtZXRhJywKCQkJCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2UsCgkJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLAoJCQkJCWFycmF5KCAnbWV0YV92YWx1ZScgKSwKCQkJCSksCgkJCQkKCQkJKTsKCQkJCgkJCWlmICggISBpc3NldCggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnXSApIHx8ICggdHJ1ZSAhPT0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnXSApICkgeyAvLyBza2lwIGJydXRlZm9yY2UuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCcnV0ZSBmb3JjZSBkYXRhYmFzZSBtaWdyYXRpb24gc2tpcHBlZCBiYXNlZCBvbiBhZHZhbmNlZCBzZXR0aW5ncycgKTsKCQkJfSBlbHNlIHsgLy8gZG9udCBza2lwIGJydXRlZm9yY2UuCgkJCQkKCQkJCWZvcmVhY2ggKCAkYnJ1dGVmb3JjZV90YWJsZXMgYXMgJGJydXRlZm9yY2VfdGFibGUgKSB7CgkJCQkJJHN0ZXBzW10gPSBhcnJheSgKCQkJCQkJJ0JydXRlZm9yY2luZyBlbnRpcmUgdGFibGVzOiBgJyAuIGltcGxvZGUoICcsJywgJGJydXRlZm9yY2VfdGFibGVzICkgLidgLicsCgkJCQkJCSdicnV0ZWZvcmNlX3RhYmxlJywKCQkJCQkJJGJydXRlZm9yY2VfdGFibGUsCgkJCQkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSwKCQkJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlCgkJCQkJKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQlmb3JlYWNoKCAoYXJyYXkpJHN0ZXBzIGFzICRzdGVwICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSdW5uaW5nIGJydXRlZm9yY2Ugc3Vic3RlcCB0byBtaWdyYXRlOiBgJyAuICRzdGVwWzBdIC4gJ2AuIFN1YnN0ZXBzIHJlbWFpbmluZzogYCcgLiBjb3VudCggJHN0ZXBzICkgLiAnYC4nICk7CgkJCWlmICggISBpc3NldCggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVQb2ludCddICkgKSB7IC8vIFByZXZlbnQgIldhcm5pbmc6IENhbm5vdCBhc3NpZ24gYW4gZW1wdHkgc3RyaW5nIHRvIGEgc3RyaW5nIG9mZnNldCIgaW4gUEhQIDcuMS4KCQkJCSR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSA9IGFycmF5KCk7CgkJCX0KCQkJaWYgKCBpc19hcnJheSggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVQb2ludCddICkgKSB7CgkJCQkkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVBvaW50J11bMV0gPSAnJzsgLy8gQ2xlYXIgb3V0IG5lZWRpbmcgdG8gcmVzdW1lIHRoaXMgc3Vic3RlcCBmb3Igbm93LgoJCQl9CgoJCQkvLyBSdW4gdGhlIGZ1bmN0aW9uLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBzdWJzdGVwIGAnIC4gJHN0ZXBbMF0gLiAnYC4nICk7CgkJCWlmICggJ2JydXRlZm9yY2VfdGFibGUnID09ICRzdGVwWzFdICkgeyAvLyBUYWJsZSBicnV0ZWZvcmNlIGhhcyBkaWZmZXJlbnQgcGFyYW0gY291bnQuCgkJCQkkcmVzdWx0cyA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJGRicmVwbGFjZSwgJHN0ZXBbMV0gKSwgJHN0ZXBbMl0sICRzdGVwWzNdLCAkc3RlcFs0XSwgJHN0ZXBSZXN1bWVQb2ludCApOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdHMgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICRkYnJlcGxhY2UsICRzdGVwWzFdICksICRzdGVwWzJdLCAkc3RlcFszXSwgJHN0ZXBbNF0sICRzdGVwWzVdLCAkc3RlcFJlc3VtZVBvaW50ICk7CgkJCX0KCgkJCWlmICggVFJVRSA9PT0gJHJlc3VsdHMgKSB7IC8vIFN1Y2Nlc3Mgc28gbW92ZSB0byBuZXh0IGxvb3AuCgkJCQlhcnJheV9zaGlmdCggJHN0ZXBzICk7IC8vIFNoaWZ0cyBzdGVwIG9mZiB0aGUgZnJvbnQgb2YgdGhlIGFycmF5LgoJCQkJaWYgKCAhIGlzX2FycmF5KCAkc3RlcHMgKSApIHsKCQkJCQkkc3RlcHMgPSBhcnJheSgpOwoJCQkJfQoJCQkJCgkJCQkvLyBEbyBub3RoaW5nLi4uIHdpbGwganVzdCBjb250aW51ZSB0byBuZXh0IHN0ZXAuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtaWdyYXRpb24gc3Vic3RlcCBgJyAuICRzdGVwWzBdIC4gJ2AgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LicgKTsKCgkJCQlpZiAoICR0aGlzLT5uZWFyVGltZUxpbWl0KCkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUnVubmluZyBvdXQgb2YgdGltZSBydW5uaW5nIGJydXRlZm9yY2Ugc3Vic3RlcHMuIENodW5raW5nIHN1YnN0ZXAuJyApOwoJCQkJCXJldHVybiBhcnJheSggYXJyYXkoICRzdGVwcywgJycgKSApOyAvLyBhcnJheSBvZiByZW1haW5pbmcgc3RlcHMsIG5vIHJlc3VtZSBwb2ludCBzaW5jZSBub3Qgd2l0aGluIGEgZnVuY3Rpb24uCgkJCQl9CgkJCX0gZWxzZWlmKCBpc19hcnJheSggJHJlc3VsdHMgKSApIHsgLy8gTkVFRFMgQ0hVTktJTkcuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdWJzdGVwIG1pZ3JhdGluZyB0aGUgZGF0YWJhc2UgZGlkIG5vdCBjb21wbGV0ZSBpbiB0aGUgZmlyc3QgcGFzcy4gQ2h1bmtpbmcgaW50byBtdWx0aXBsZSBwYXJ0cy4gUmVzdW1pbmcgc3Vic3RlcCBgJyAuIHByaW50X3IoICRzdGVwLCB0cnVlICkgLiAnYCBzaG9ydGx5IGF0IHBvaW50IGAnIC4gcHJpbnRfciggJHJlc3VsdHNbMF0sIHRydWUgKSAuICdgLicgKTsKCQkJCXJldHVybiBhcnJheSggYXJyYXkoICRzdGVwcywgJHJlc3VsdHNbMF0gKSApOyAvLyBBcnJheSBvZiBzdGVwcyB0byBydW4sIHJlc3VtZSBwb2ludC4KCQkJfSBlbHNlIHsgLy8gRkFMU0Ugb3Igc29tZXRoaW5nIHdlaXJkLi4uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRGF0YWJhc2UgbWlncmF0aW9uIHN1YnN0ZXAgYCcgLiAkc3RlcFswXSAuICdgIGZhaWxlZC4gU2VlIGxvZyBmb3IgZGV0YWlscy4gVGhpcyBtYXkgb25seSBiZSBhIG5vbi1mYXRhbCB3YXJuaW5nLicgKTsKCQkJCXJldHVybiBGQUxTRTsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgkJCgkJCgkJLy8gVXBkYXRlIHRhYmxlIHByZWZpeGVzIGluIHNvbWUgV29yZFByZXNzIG1ldGEgZGF0YS4gJHRoaXMtPm5ldHdvcmtQcmVmaXggaXMgc2V0IHRvIHRoZSBub3JtYWwgcHJlZml4IGluIG5vbi1tcyBlbnZpcm9ubWVudC4KCQkkb2xkX3ByZWZpeCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydkYl9wcmVmaXgnXSApOwoJCSRmaW5hbFByZWZpeCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkdGhpcy0+ZmluYWxQcmVmaXggKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgREIgcHJlZml4OiBgJyAuICRvbGRfcHJlZml4IC4gJ2A7IE92ZXJyaWRlIHByZWZpeDogYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnYC4gTmV3IGZpbmFsIERCIHByZWZpeCAob3ZlcnJpZGUgZG9lcyBub3QgYXBwbHkpOiBgJyAuICRmaW5hbFByZWZpeCAuICdgLiBOZXR3b3JrIHByZWZpeDogYCcgLiAkdGhpcy0+bmV0d29ya1ByZWZpeCAuICdgJyApOwoJCWlmICgkb2xkX3ByZWZpeCAhPSAkZmluYWxQcmVmaXggKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VwZGF0aW5nIHByZWZpeCBNRVRBIGRhdGEgaW4gdXNlcm1ldGEsIGV0Yy4nICk7CgkJCSR3cGRiLT5xdWVyeSggIlVQREFURSBgIi4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4idXNlcm1ldGFgIFNFVCBtZXRhX2tleSA9IFJFUExBQ0UobWV0YV9rZXksICciIC4gJG9sZF9wcmVmaXggLiAiJywgJyIgLiAkZmluYWxQcmVmaXggLiInICk7IiApOyAvLyB1c2VybWV0YSB0YWJsZSB0ZW1wb3JhcmlseSBpcyBpbiB0aGUgbmV3IHN1YnNpdGUncyBwcmVmaXggdW50aWwgbmV4dCBzdGVwLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBtZXRhX2tleVwncyBmb3IgREIgcHJlZml4IGluIHNpdGVcJ3MgW3N1YnNpdGU7IHRlbXBvcmFyeSBpZiBtdWx0aXNpdGVdIHVzZXJtZXRhIHRhYmxlIGZyb20gYCcgLiAkb2xkX3ByZWZpeCAuICdgIHRvIGAnIC4gJGZpbmFsUHJlZml4IC4gJ2AuJyApOwoJCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgKSB7IHBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuICR3cGRiLT5sYXN0X2Vycm9yICk7IH0KCgkJCSR3cGRiLT5xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuIm9wdGlvbnNgIFNFVCBvcHRpb25fbmFtZSA9ICciIC4gJGZpbmFsUHJlZml4IC4gInVzZXJfcm9sZXMnIFdIRVJFIG9wdGlvbl9uYW1lID0nIiAuICRvbGRfcHJlZml4IC4gInVzZXJfcm9sZXMnIExJTUlUIDEiICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIG9wdGlvbl9uYW1lIHVzZXJfcm9sZXMgREIgcHJlZml4IGluIFtzdWJzaXRlIGlmIG11bHRpc2l0ZV0gb3B0aW9ucyB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZmluYWxQcmVmaXggKSAuICdgLicgKTsKCQkJaWYgKCAhIGVtcHR5KCAkd3BkYi0+bGFzdF9lcnJvciApICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOyB9CgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdVcGRhdGVkIHByZWZpeCBNRVRBIGRhdGEuJyApOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTWlncmF0ZWQgJyAuIGNvdW50KCAkYnJ1dGVmb3JjZV90YWJsZXMgKSAuICcgdGFibGVzIHZpYSBicnV0ZSBmb3JjZS4nICk7CgkJcmV0dXJuIHRydWU7CgoJfSAvLyBFbmQgYnJ1dGVmb3JjZVRhYmxlcygpLgoKCgoJZnVuY3Rpb24gZmluYWxpemUoKSB7CgkJLy8gTEFTVExZIFVQREFURSBTSVRFL0hPTUUgVVJMUyB0byBwcmV2ZW50IGRvdWJsZSByZXBsYWNlbWVudDsganVzdCBpbiBjYXNlIQoJCWdsb2JhbCAkd3BkYjsKCQkKCQlpZiAoICEgaXNzZXQoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3RhYmxlc19zaXplcyddWyAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydkYl9wcmVmaXgnXSAuICdvcHRpb25zJyBdICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09wdGlvbnMgdGFibGUgd2FzIG5vdCBiYWNrZWQgdXAuIFNraXBwaW5nIGZpbmFsaXppbmcgZGF0YWJhc2UgVVJMcyBmb3IgX29wdGlvbnMgdGFibGUuJyApOwoJCX0gZWxzZSB7CgkJCS8vIFVwZGF0ZSBTSVRFVVJMIGluIG9wdGlvbnMgdGFibGUuIFVzdWFsbHkgbWFzcyByZXBsYWNlbWVudCB3aWxsIGNvdmVyIHRoaXMgYnV0IHNldCB0aGVzZSBoZXJlIGp1c3QgaW4gY2FzZS4KCQkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSdzaXRldXJsJyBMSU1JVCAxIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gJHdwZGItPnJvd3NfYWZmZWN0ZWQgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBTaXRlIFVSTCBpbiBvcHRpb25zIHRhYmxlIGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ29wdGlvbnNgIHRvIGAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnYC4nICk7CgkJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoKCQkJLy8gVXBkYXRlIEhPTUUgVVJMIGluIG9wdGlvbnMgdGFibGUuIFVzdWFsbHkgbWFzcyByZXBsYWNlbWVudCB3aWxsIGNvdmVyIHRoaXMgYnV0IHNldCB0aGVzZSBoZXJlIGp1c3QgaW4gY2FzZS4KCQkJaWYgKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2hvbWV1cmwnXSAhPSAnJyApIHsKCQkJCSR3cGRiLT5xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBTRVQgb3B0aW9uX3ZhbHVlPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddICkgLiAiJyBXSEVSRSBvcHRpb25fbmFtZT0naG9tZScgTElNSVQgMSIgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiAkd3BkYi0+cm93c19hZmZlY3RlZCAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIEhvbWUgVVJMIGluIG9wdGlvbnMgdGFibGUgdG8gYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2hvbWV1cmwnXSAuICdgLicgKTsKCQkJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoJCQl9CgkJfQoJCQoJCXJldHVybiB0cnVlOwoJfQoKCgoJLyoJdmVyaWZ5X2RhdGFiYXNlKCkKCSAqCQoJICoJVmVyaWZ5IHZhcmlvdXMgY29udGVudHMgb2YgdGhlIGRhdGFiYXNlIGFmdGVyIGFsbCBtaWdyYXRpb24gaXMgY29tcGxldGUuCgkgKgkKCSAqCUBwYXJhbQkJCgkgKglAcmV0dXJuCQkKCSAqLwoJZnVuY3Rpb24gdmVyaWZ5RGF0YWJhc2UoKSB7CgkJZ2xvYmFsICR3cGRiOwoKCQkvL3BiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10tPmNvbm5lY3RfZGF0YWJhc2UoKTsKCQkkZGJfcHJlZml4ID0gJHRoaXMtPm92ZXJyaWRlUHJlZml4OwoJCQoJCS8vIElmIHdwX29wdGlvbnMgd2FzIG5vdCBiYWNrZWQgdXAgdGhlbiBza2lwIHRoaXMgZnVuY3Rpb24gc2luY2UgaXQgY2hlY2tzIHRoYXQuCgkJaWYgKCAhIGlzc2V0KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd0YWJsZXNfc2l6ZXMnXVsgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnZGJfcHJlZml4J10gLiAnb3B0aW9ucycgXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPcHRpb25zIHRhYmxlIHdhcyBub3QgYmFja2VkIHVwLiBTa2lwcGluZyB2ZXJpZnlpbmcgdGhlIGRhdGFiYXNlLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3B0aW9ucyB0YWJsZSB3YXMgYmFja2VkIHVwLiBWZXJpZnlpbmcgdGhlIGRhdGFiYXNlLicgKTsKCQl9CgkJCgkJLy8gQ2hlY2sgc2l0ZSBVUkwuCgkJJHJlc3VsdCA9ICR3cGRiLT5nZXRfdmFyKCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JGRiX3ByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0nc2l0ZXVybCcgTElNSVQgMSIgKTsKCQlpZiAoICRyZXN1bHQgPT09IGZhbHNlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJldHJpZXZlIHNpdGV1cmwgZnJvbSBkYXRhYmFzZS4gQSBwb3J0aW9uIG9mIHRoZSBkYXRhYmFzZSBtYXkgbm90IGhhdmUgaW1wb3J0ZWQgKG9yIHdpdGggdGhlIHdyb25nIHByZWZpeCkuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmFsIHNpdGUgVVJMOiBgJyAuICRyZXN1bHQgLiAnYC4nICk7CgkJCUAkd3BkYi0+Zmx1c2goKTsgLy8gRnJlZSBtZW1vcnkuCgkJfQoKCQkvLyBDaGVjayBob21lIFVSTC4KCQkkcmVzdWx0ID0gJHdwZGItPmdldF92YXIoICJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gYHskZGJfcHJlZml4fW9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSdob21lJyBMSU1JVCAxIiApOwoJCWlmICggJHJlc3VsdCA9PT0gZmFsc2UgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gcmV0cmlldmUgaG9tZSBbdXJsXSBmcm9tIGRhdGFiYXNlLiBBIHBvcnRpb24gb2YgdGhlIGRhdGFiYXNlIG1heSBub3QgaGF2ZSBpbXBvcnRlZCAob3Igd2l0aCB0aGUgd3JvbmcgcHJlZml4KS4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluYWwgaG9tZSBVUkw6IGAnIC4gJHJlc3VsdCAuICdgLicgKTsKCQl9CgkJQCR3cGRiLT5mbHVzaCgpOyAvLyBGcmVlIG1lbW9yeS4KCgkJLy8gVmVyaWZ5IG1lZGlhIHVwbG9hZCBwYXRoLgoJCSRyZXN1bHQgPSAkd3BkYi0+Z2V0X3ZhciggIlNFTEVDVCBvcHRpb25fdmFsdWUgRlJPTSBgeyRkYl9wcmVmaXh9b3B0aW9uc2AgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiApOwoJCWlmICggJHJlc3VsdCA9PT0gZmFsc2UgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gcmV0cmlldmUgdXBsb2FkX3BhdGggZnJvbSBkYXRhYmFzZSB0YWJsZSAnIC4gImB7JGRiX3ByZWZpeH1vcHRpb25zYCIgLiAnLiBBIHBvcnRpb24gb2YgdGhlIGRhdGFiYXNlIG1heSBub3QgaGF2ZSBpbXBvcnRlZCAob3Igd2l0aCB0aGUgd3JvbmcgcHJlZml4KS4nICk7CgkJCSRtZWRpYV91cGxvYWRfcGF0aCA9ICd7RVJSXzM0ODM0OTg0LVVOS05PV059JzsKCQl9IGVsc2UgewoJCQkkbWVkaWFfdXBsb2FkX3BhdGggPSAkcmVzdWx0OwoJCX0KCQlAJHdwZGItPmZsdXNoKCk7IC8vIEZyZWUgbWVtb3J5LgoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNZWRpYSB1cGxvYWQgcGF0aCBpbiBkYXRhYmFzZSBvcHRpb25zIHRhYmxlOiBgJyAuICRtZWRpYV91cGxvYWRfcGF0aCAuICdgLicgKTsKCQlpZiAoIHN1YnN0ciggJG1lZGlhX3VwbG9hZF9wYXRoLCAwLCAxICkgPT0gJy8nICkgeyAvLyBBYnNvbHV0ZSBwYXRoLgoJCQlpZiAoICEgZmlsZV9leGlzdHMoICRtZWRpYV91cGxvYWRfcGF0aCApICkgeyAvLyBNZWRpYSBwYXRoIGRvZXMgbm90IGV4aXN0LgoJCQkJJG1lZGlhX3VwbG9hZF9tZXNzYWdlID0gJ1lvdXIgbWVkaWEgdXBsb2FkIHBhdGggaXMgYXNzaWduZWQgYSBkaXJlY3Rvcnkgd2hpY2ggZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IG9uIHRoaXMgc2VydmVyLiBQbGVhc2UgdmVyaWZ5IGl0IGlzIGNvcnJlY3QgaW4geW91ciBXb3JkUHJlc3Mgc2V0dGluZ3MuIEN1cnJlbnQgcGF0aDogYCcgLiAkbWVkaWFfdXBsb2FkX3BhdGggLiAnYC4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAkbWVkaWFfdXBsb2FkX21lc3NhZ2UgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJG1lZGlhX3VwbG9hZF9tZXNzYWdlICk7CgkJCX0gZWxzZSB7IC8vIE1lZGlhIHBhdGggZG9lcyBleGlzdC4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1lvdXIgbWVkaWEgdXBsb2FkIHBhdGggaXMgYXNzaWduZWQgYW4gYWJzb2x1dGUgcGF0aCB3aGljaCBhcHBlYXJzIHRvIGJlIGNvcnJlY3QuJyApOwoJCQl9CgkJfSBlbHNlIHsgLy8gUmVsYXRpdmUgcGF0aC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWW91ciBtZWRpYSB1cGxvYWQgcGF0aCBpcyBhc3NpZ25lZCBhIHJlbGF0aXZlIHBhdGg7IHZhbGlkaXR5IG5vdCB0ZXN0ZWQuJyApOwoJCX0KCQkKCQlyZXR1cm4gdHJ1ZTsKCgl9IC8vIEVuZCB2ZXJpZnlEYXRhYmFzZSgpLgoJCgkKCQoJLyoJX2FycmF5X3BhaXJzX3VuaXF1ZV9maXJzdCgpCgkgKgkKCSAqCVRha2VzIHR3byBhcnJheXMuIExvb2tzIGZvciBhbnkgZHVwbGljYXRlIHZhbHVlcyBpbiB0aGUgZmlyc3QgYXJyYXkuIFRoYXQgaXRlbSBpcyByZW1vdmVkLiBUaGUgY29ycmVzcG9uZGluZyBpdGVtIGluIHRoZSBzZWNvbmQgYXJyYXkgaXMgcmVtb3ZlZCBhbHNvLgoJICoJUmVzZXRzIGluZGV4ZXMgYXMgYSBjb3VydGVzeSB3aGlsZSBtYWludGFpbmluZyBvcmRlci4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJGEJCUZpcnN0IGFycmF5IHRvIG1ha2UgdW5pcXVlLgoJICoJQHBhcmFtCQlhcnJheQkJJGIJCVNlY29uZCBhcnJheSB0aGF0IGhhcyBpdGVtcyByZW1vdmVkIHRoYXQgd2VyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgcmVtb3ZlZCBkdXBsaWNhdGVzIGZvdW5kIGluICRhLgoJICoJQHJldHVybgkJCgkgKi8KCWZ1bmN0aW9uIF9hcnJheV9wYWlyc191bmlxdWVfZmlyc3QoICRhLCAkYiApIHsKCQkkYV91bmlxdWVzID0gYXJyYXlfdW5pcXVlKCAkYSApOyAvLyBHZXQgdW5pcXVlIHZhbHVlcyBpbiAkYS4gS2V5cyBhcmUgbWFpbnRhaW5lZC4KCQoJCSRyZXN1bHQgPSBhcnJheSgpOwoJCSRyZXN1bHRbMF0gPSAkYV91bmlxdWVzOwoJCSRyZXN1bHRbMV0gPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCAkYiwgJGFfdW5pcXVlcyApOyAvLyBHZXQgdGhlIHBhcnQgb2YgdGhlICRiIGFycmF5IHRoYXQgaXMgbWlzc2luZyBmcm9tICRhLgoJCgkJJHJlc3VsdFswXSA9IGFycmF5X21lcmdlKCAkcmVzdWx0WzBdICk7CgkJJHJlc3VsdFsxXSA9IGFycmF5X21lcmdlKCAkcmVzdWx0WzFdICk7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9IC8vIEVuZCBfYXJyYXlfcGFpcnNfdW5pcXVlX2ZpcnN0KCkuCgoKCn0gLy8gZW5kIGNsYXNzIGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQi4K ###PACKDATA,FILE_END,/classes/_migrate_database.php,importbuddy/classes/_migrate_database.php ###PACKDATA,FILE_START,/classes/core.php,importbuddy/classes/core.php PD9waHAKLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgQmFja3VwQnVkZHkuCi8vIFRPRE86IEV2ZW50dWFsbHkgYnJlYWsgb3V0IG9mIGEgbG90IG9mIHRoZXNlIGZyb20gQkIgY29yZS4gTWlncmF0aW5nIGZyb20gb2xkIGZyYW1ld29yayB0byBuZXcgcmVzdWx0ZWQgaW4gdGhpcyBtaWQtd2F5IHRyYW5zaXRpb24gYnV0IGl0J3MgYSBiaXQgbWVzc3kuLi4KCmNsYXNzIGJhY2t1cGJ1ZGR5X2NvcmUgewoKCXByaXZhdGUgc3RhdGljICRfY2FjaGVkTG9nRGlyZWN0b3J5ID0gJyc7IC8vIENhY2hlZCBsb2cgZGlyIGZvciBnZXRMb2dEaXJlY3RvcnkoKSB0byBwcmV2ZW50IGhhdmluZyB0byBjYWxsIFdQIHRvIHJldHJpZXZlLgoJCglwdWJsaWMgc3RhdGljICR3YXJuX3BsdWdpbnMgPSBhcnJheSgKCQkndzMtdG90YWwtY2FjaGUucGhwJyA9PiAnVzMgVG90YWwgQ2FjaGUnLAoJCSd3cC1jYWNoZS5waHAnID0+ICdXUCBTdXBlciBDYWNoZScsCgkJJ3dvcmRmZW5jZS5waHAnID0+ICdXb3JkZmVuY2UnLAoJKTsKCQoJCgkvKiBwcmV0dHlDcm9uSW50ZXJ2YWwoKQoJICoKCSAqIENvbnZlcnRzIGFuIGludGVydmFsIHRpbWUgcGVyaW9kIChudW1lcmljKSBpbnRvIGFuIGFycmF5IG9mIEFycmF5KCBpbnRlcnZhbCB0YWcsIHRoZSBkaXNwbGF5IHRpdGxlICkuCgkgKiBSZXR1cm5zIGZhbHNlIGlmIG5vIG1hdGNoaW5nIGludGVydmFsIGZvdW5kIHJlZ2lzdGVyZWQgd2l0aCBXb3JkUHJlc3MuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJldHR5Q3JvbkludGVydmFsKCAkaW50ZXJ2YWwgKSB7CgkJJHNjaGVkdWxlX2ludGVydmFscyA9IHdwX2dldF9zY2hlZHVsZXMoKTsKCQlmb3JlYWNoKCAkc2NoZWR1bGVfaW50ZXJ2YWxzIGFzICRpbnRlcnZhbF90YWcgPT4gJHNjaGVkdWxlX2ludGVydmFsICkgewoJCQlpZiAoICRpbnRlcnZhbCA9PSAkc2NoZWR1bGVfaW50ZXJ2YWxbJ2ludGVydmFsJ10gKSB7CgkJCQlyZXR1cm4gYXJyYXkoICRpbnRlcnZhbF90YWcsICRzY2hlZHVsZV9pbnRlcnZhbFsnZGlzcGxheSddICk7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOyAvLyBOb3QgZm91bmQuCgl9CgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJldHR5RnVuY3Rpb25UaXRsZSggJGZ1bmN0aW9uLCAkYXJncyA9ICcnICkgewoKCQlpZiAoICRmdW5jdGlvbiA9PSAnYmFja3VwX2NyZWF0ZV9kYXRhYmFzZV9kdW1wJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQmFja2luZyB1cCBkYXRhYmFzZSc7CgkJCWlmICggJycgIT0gJGFyZ3MgKSB7CgkJCQkkc3ViRnVuY3Rpb25UaXRsZSA9ICdUYWJsZXM6ICcgLiBpbXBsb2RlKCAnLCAnLCAkYXJnc1swXSApOwoJCQl9CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ2JhY2t1cF96aXBfZmlsZXMnICkgewoJCQkkZnVuY3Rpb25UaXRsZSA9ICdaaXBwaW5nIHVwIGZpbGVzJzsKCQl9IGVsc2VpZiAoICRmdW5jdGlvbiA9PSAnaW50ZWdyaXR5X2NoZWNrJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnVmVyaWZ5aW5nIGJhY2t1cCBmaWxlIGludGVncml0eSc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ3Bvc3RfYmFja3VwJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQ2xlYW5pbmcgdXAnOwoJCX0gZWxzZWlmICggJGZ1bmN0aW9uID09ICdtc19kb3dubG9hZF9leHRyYWN0X3dvcmRwcmVzcycgKSB7CgkJCSRmdW5jdGlvblRpdGxlID0gJ0Rvd25sb2FkaW5nIFdvcmRQcmVzcyBjb3JlIGZpbGVzIGZyb20gd29yZHByZXNzLm9yZyc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NyZWF0ZV93cF9jb25maWcnICkgewoJCQkkZnVuY3Rpb25UaXRsZSA9ICdHZW5lcmF0aW5nIHN0YW5kYXJkIHdwLWNvbmZpZy5waHAgZm9yIGV4cG9ydCc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NvcHlfcGx1Z2lucycgKSB7CgkJCSRmdW5jdGlvblRpdGxlID0gJ0NvcHlpbmcgcGx1Z2lucyc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NvcHlfdGhlbWVzJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQ29weWluZyB0aGVtZXMnOwoJCX0gZWxzZWlmICggJGZ1bmN0aW9uID09ICdtc19jb3B5X21lZGlhJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQ29weWluZyBtZWRpYSc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NvcHlfdXNlcnNfdGFibGUnICkgewoJCQkkZnVuY3Rpb25UaXRsZSA9ICdDb3B5aW5nIHVzZXJzJzsKCQl9IGVsc2VpZiAoICRmdW5jdGlvbiA9PSAnbXNfY2xlYW51cCcgKSB7CgkJCSRmdW5jdGlvblRpdGxlID0gJ0NsZWFuaW5nIHVwIE11bHRpc2l0ZS1zcGVjaWZpYyB0ZW1wb3JhcnkgZGF0YSc7CgkJfSBlbHNlIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAkZnVuY3Rpb247CgkJfQoKCQlyZXR1cm4gJGZ1bmN0aW9uVGl0bGU7Cgl9IC8vIGVuZCBwcmV0dHlGdW5jdGlvblRpdGxlKCkuCgoJLyoJaXNfbmV0d29ya19hY3RpdmF0ZWQoKQoJICoJCgkgKglSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBwbHVnaW4gaXMgbmV0d29yayBhY3RpdmF0ZWQgb3Igbm90LgoJICoJCgkgKglAcmV0dXJuCQlib29sZWFuCQkJVHJ1ZSBpZiBwbHVnaW4gaXMgbmV0d29yayBhY3RpdmF0ZWQsIGVsc2UgZmFsc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfbmV0d29ya19hY3RpdmF0ZWQoKSB7CgoJCWlmICggIWZ1bmN0aW9uX2V4aXN0cyggJ2lzX3BsdWdpbl9hY3RpdmVfZm9yX25ldHdvcmsnICkgKSB7IC8vIEZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIFdvcmRQcmVzcyBwYWdlcyBmb3Igc29tZSByZWFzb24gYWNjb3JkaW5nIHRvIGNvZGV4LgoJCQlyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnL3dwLWFkbWluL2luY2x1ZGVzL3BsdWdpbi5waHAnICk7CgkJfQoJCWlmICggaXNfcGx1Z2luX2FjdGl2ZV9mb3JfbmV0d29yayggYmFzZW5hbWUoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpICkgLiAnLycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdpbml0JyApICkgKSB7IC8vIFBhdGggcmVsYXRpdmUgdG8gd3AtY29udGVudFxwbHVnaW5zXCBkaXJlY3RvcnkuCgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJfSAvLyBFbmQgaXNfbmV0d29ya19hY3RpdmF0ZWQoKS4KCgoKCS8qCWJhY2t1cF9pbnRlZ3JpdHlfY2hlY2soKQoJICoJCgkgKglTY2FucyBhIGJhY2t1cCBmaWxlIGFuZCBzYXZlcyB0aGUgcmVzdWx0IGluIGRhdGEgc3RydWN0dXJlLiBDaGVja3MgZm9yIGtleSBmaWxlcyAmIHRoYXQgLnppcCBjYW4gYmUgcmVhZCBwcm9wZXJseS4gU3RvcmVzIHJlc3VsdHMgd2l0aCBkZXRhaWxzIGluIGRhdGEgc3RydWN0dXJlLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQlGdWxsIHBhdGhuYW1lICYgZmlsZW5hbWUgdG8gYmFja3VwIGZpbGUgdG8gY2hlY2suCgkgKglAcGFyYW0JCW9iagkJCSRmaWxlb3B0aW9ucwlmaWxlb3B0aW9ucyBvYmplY3QgY3VycmVudGx5IGhvbGRpbmcgdGhlIGZpbGVvcHRpb25zIGZpbGUgb3BlbiwgaWYgYW55LgoJICoJQHBhcmFtCQlhcnJheSAJCSRvcHRpb25zCQlBcnJheSBvZiBvcHRpb25zLgoJICoJQHJldHVybgkJYXJyYXkJCQkJCQlSZXR1cm5zIGludGVncml0eSBkYXRhIGFycmF5LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJhY2t1cF9pbnRlZ3JpdHlfY2hlY2soICRmaWxlLCAkZmlsZW9wdGlvbnMgPSAnJywgJG9wdGlvbnMgPSBhcnJheSgpLCAkc2tpcExvZ1JlZGlyZWN0ID0gZmFsc2UgKSB7CgkJCgkJcmV0dXJuIGluY2x1ZGUoICdfaW50ZWdyaXR5Q2hlY2sucGhwJyk7CgkJCgl9IC8vIEVuZCBiYWNrdXBfaW50ZWdyaXR5X2NoZWNrKCkuCgoKCgkvKglnZXRfc2VyaWFsX2Zyb21fZmlsZSgpCgkgKgkKCSAqCVJldHVybnMgdGhlIGJhY2t1cCBzZXJpYWwgYmFzZWQgb24gdGhlIGZpbGVuYW1lLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCUZpbGVuYW1lIGNvbnRhaW5pbmcgYSBzZXJpYWwgdG8gZXh0cmFjdC4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJU2VyaWFsIGZvdW5kLiBFbXB0eSBzdHJpbmcgaWYgdW5hYmxlIHRvIGZpbmQgc2VyaWFsLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zZXJpYWxfZnJvbV9maWxlKCAkZmlsZSApIHsKCQkKCQlpZiAoIGZhbHNlID09PSAoICRkYXNocG9zID0gc3RycnBvcyggJGZpbGUsICctJyApICkgKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJHNlcmlhbCA9ICRkYXNocG9zICsgMTsKCQkkc2VyaWFsID0gc3Vic3RyKCAkZmlsZSwgJHNlcmlhbCwgKCBzdHJsZW4oICRmaWxlICkgLSAkc2VyaWFsIC0gNCApICk7CgkJJHNlcmlhbCA9IHRyaW0oICRzZXJpYWwgKTsgLy8gVHJpbSBhbnkgcG90ZW50aWFsIHdoaXRlc3BhY2UuCgkJCgkJcmV0dXJuICRzZXJpYWw7CgkJCgl9IC8vIEVuZCBnZXRfc2VyaWFsX2Zyb21fZmlsZSgpLgoKCgoJLyoqCgkgKiB2ZXJzaW9uc19jb25maXJtKCkKCSAqCgkgKiBDaGVjayB0aGUgdmVyc2lvbiBvZiBhbiBpdGVtIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBCYWNrdXBCdWRkeSByZXF1aXJlcy4KCSAqCgkgKiBAcGFyYW0JCXN0cmluZwkJJHR5cGUJCU9wdGlvbmFsLiBJZiBsZWZ0IGJsYW5rICcnIHRoZW4gYWxsIHRlc3RzIHdpbGwgYmUgcGVyZm9ybWVkLiBWYWxpZCB2YWx1ZXM6IHdvcmRwcmVzcywgcGhwLCAnJy4KCSAqIEBwYXJhbQkJYm9vbGVhbgkJJG5vdGlmeQkJT3B0aW9uYWwuIFdoZXRoZXIgb3Igbm90IHRvIGFsZXJ0IHRvIHRoZSBzY3JlZW4gKGFuZCB0aHJvdyBlcnJvciB0byBsb2cpIG9mIGEgdmVyc2lvbiBpc3N1ZS5cCgkgKiBAcmV0dXJuCQlib29sZWFuCQkJCQlUcnVlIGlmIHRoZSBzZWxlY3RlZCB0eXBlIGlzIGEgYmFkIHZlcnNpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2ZXJzaW9uc19jb25maXJtKCAkdHlwZSA9ICcnLCAkbm90aWZ5ID0gZmFsc2UgKSB7CgoJCSRiYWRfdmVyc2lvbiA9IGZhbHNlOwoKCQlpZiAoICggJHR5cGUgPT0gJ3dvcmRwcmVzcycgKSB8fCAoICR0eXBlID09ICcnICkgKSB7CgkJCWdsb2JhbCAkd3BfdmVyc2lvbjsKCQkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cF92ZXJzaW9uLCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd3cF9taW5pbXVtJyApLCAnPD0nICkgKSB7CgkJCQlpZiAoICRub3RpZnkgPT09IHRydWUgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBzcHJpbnRmKCBfXygnRVJST1I6IEJhY2t1cEJ1ZGR5IHJlcXVpcmVzIFdvcmRQcmVzcyB2ZXJzaW9uICUxJHMgb3IgaGlnaGVyLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBiZWhhdmlvciBvciBjb21wbGV0ZSBmYWlsdXJlIGluIHRoaXMgZW52aXJvbm1lbnQuIFBsZWFzZSBjb25zaWRlciB1cGdyYWRpbmcgV29yZFByZXNzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCBzZWxmOjpfd3BfbWluaW11bSkgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6bG9nKCAnVW5zdXBwb3J0ZWQgV29yZFByZXNzIFZlcnNpb246ICcgLiAkd3BfdmVyc2lvbiAsICdlcnJvcicgKTsKCQkJCX0KCQkJCSRiYWRfdmVyc2lvbiA9IHRydWU7CgkJCX0KCQl9CgkJaWYgKCAoICR0eXBlID09ICdwaHAnICkgfHwgKCAkdHlwZSA9PSAnJyApICkgewoJCQlpZiAoIHZlcnNpb25fY29tcGFyZSggUEhQX1ZFUlNJT04sIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3BocF9taW5pbXVtJyApLCAnPD0nICkgKSB7CgkJCQlpZiAoICRub3RpZnkgPT09IHRydWUgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBzcHJpbnRmKCBfXygnRVJST1I6IEJhY2t1cEJ1ZGR5IHJlcXVpcmVzIFBIUCB2ZXJzaW9uICUxJHMgb3IgaGlnaGVyLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBiZWhhdmlvciBvciBjb21wbGV0ZSBmYWlsdXJlIGluIHRoaXMgZW52aXJvbm1lbnQuIFBsZWFzZSBjb25zaWRlciB1cGdyYWRpbmcgUEhQLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCBQSFBfVkVSU0lPTiApICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmxvZyggJ1Vuc3VwcG9ydGVkIFBIUCBWZXJzaW9uOiAnIC4gUEhQX1ZFUlNJT04gLCAnZXJyb3InICk7CgkJCQl9CgkJCQkkYmFkX3ZlcnNpb24gPSB0cnVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGJhZF92ZXJzaW9uOwoKCX0gLy8gRW5kIHZlcnNpb25zX2NvbmZpcm0oKS4KCgoKCS8qIGdldEJhY2t1cERpcmVjdG9yeSgpCQkJYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkKCSAqCgkgKiBSZXRyaWV2ZSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgYmFja3VwcyB3aXRoaW4uCgkgKgoJICogQHJldHVybglzdHJpbmcJCUZ1bGwgcGF0aCB0byBkaXJlY3RvcnksIGluY2x1ZGluZyB0cmFpbGluZyBzbGFzaC4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QmFja3VwRGlyZWN0b3J5KCkgewoJCWlmICggJycgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYWNrdXBfZGlyZWN0b3J5J10gKSB7CgkJCSRkaXIgPSBzZWxmOjpfZ2V0QmFja3VwRGlyZWN0b3J5RGVmYXVsdCgpOwoJCX0gZWxzZSB7CgkJCSRkaXIgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JhY2t1cF9kaXJlY3RvcnknXTsKCQl9CgkJcmV0dXJuICRkaXI7Cgl9CgoKCgkvKiBnZXRMb2dEaXJlY3RvcnkoKQkJCWJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpCgkgKgoJICogUmV0cmlldmUgZGlyZWN0b3J5IGZvciBzdG9yaW5nIGxvZ3Mgd2l0aGluLiBDYWNoZXMgCgkgKgoJICogQHJldHVybglzdHJpbmcJCUZ1bGwgcGF0aCB0byBkaXJlY3RvcnksIGluY2x1ZGluZyB0cmFpbGluZyBzbGFzaC4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TG9nRGlyZWN0b3J5KCkgewoJCWlmICggJycgIT0gc2VsZjo6JF9jYWNoZWRMb2dEaXJlY3RvcnkgKSB7CgkJCXJldHVybiBzZWxmOjokX2NhY2hlZExvZ0RpcmVjdG9yeTsKCQl9CgkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIHRydWUgPT09IFBCX1NUQU5EQUxPTkUgKSApIHsKCQkJcmV0dXJuIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvJzsKCQl9CgkJCgkJJHVwbG9hZHNfZGlycyA9IHdwX3VwbG9hZF9kaXIoKTsKCQlzZWxmOjokX2NhY2hlZExvZ0RpcmVjdG9yeSA9ICR1cGxvYWRzX2RpcnNbJ2Jhc2VkaXInXSAuICcvcGJfYmFja3VwYnVkZHkvJzsKCQlyZXR1cm4gc2VsZjo6JF9jYWNoZWRMb2dEaXJlY3Rvcnk7Cgl9IC8vIEVuZCBnZXRMb2dEaXJlY3RvcnkoKS4KCgoKCS8qIGdldFRlbXBEaXJlY3RvcnkoKQkJCWJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKQoJICoKCSAqIFJldHJpZXZlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGVtcG9yYXJ5IGZpbGVzIHdpdGhpbi4KCSAqCgkgKiBAcmV0dXJuCXN0cmluZwkJRnVsbCBwYXRoIHRvIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHRyYWlsaW5nIHNsYXNoLgoJICoKCSAqLwoJLy8gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRlbXBEaXJlY3RvcnkoKSB7CgkJcmV0dXJuIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJzsKCX0gLy8gRW5kIGdldFRlbXBEaXJlY3RvcnkoKS4KCgoKCS8qIF9nZXRCYWNrdXBEaXJlY3RvcnlEZWZhdWx0KCkKCSAqCgkgKiBEZWZhdWx0IGRpcmVjdG9yeSBiYWNrdXBzIHdpbGwgYmUgc3RvcmVkIGluLiBnZXRCYWNrdXBEaXJlY3RvcnkoKSB1c2VzIHRoaXMgYXMgdGhlIGRlZmF1bHQgaWYgbm8gcGF0aCBpcyBzcGVjaWZpY2FsbHkgc2V0LgoJICoKCSAqIEByZXR1cm4Jc3RyaW5nCQlGdWxsIHBhdGggdG8gZGlyZWN0b3J5LCBpbmNsdWRpbmcgdHJhaWxpbmcgc2xhc2guCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9nZXRCYWNrdXBEaXJlY3RvcnlEZWZhdWx0KCkgewoJCWlmICggZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICYmICggdHJ1ZSA9PT0gUEJfSU1QT1JUQlVERFkgKSApIHsKCQkJcmV0dXJuIEFCU1BBVEg7CgkJfQoJCSR1cGxvYWRzX2RpcnMgPSB3cF91cGxvYWRfZGlyKCk7CgkJcmV0dXJuICR1cGxvYWRzX2RpcnNbJ2Jhc2VkaXInXSAuICcvYmFja3VwYnVkZHlfYmFja3Vwcy8nOwoJfSAvLyBFbmQgX2dldEJhY2t1cERpcmVjdG9yeURlZmF1bHQoKS4KCQoJCgkKCS8vIFRha2VzIGEgcHJvZmlsZSBjdXN0b20gcm9vdCBwYXRoIGFuZCBub3JtYWxpemVzIGl0LCB0YWtpbmcgaW50byBhY2NvdW50IC8uLywgLy4uLywgZXRjLgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbm9ybWFsaXplZF9jdXN0b21fcm9vdCggJHBhdGggKSB7CgkJcmV0dXJuIHJlYWxwYXRoKCBBQlNQQVRIIC4gJHBhdGggKSAuICcvJzsKCX0gLy8gZ2V0X25vcm1hbGl6ZWRfY3VzdG9tX3Jvb3QoKS4KCQoJCgkKCS8qCWdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucygpCgkgKgkKCSAqCUdldCBzYW5pdGl6ZWQgZGlyZWN0b3J5IGV4Y2x1c2lvbnMuIEV4Y2x1c2lvbnMgYXJlIHJlbGF0aXZlIHRvIHNpdGUgcm9vdCAoQUJTUEFUSCkuIFNlZSBpbXBvcnRhbnQgbm90ZSBiZWxvdyEKCSAqCUlNUE9SVEFOVCBOT1RFOiBDYW5ub3QgZXhjbHVkZSB0aGUgdGVtcCBkaXJlY3RvcnkgaGVyZSBhcyB0aGlzIGlzIHdoZXJlIFNRTCBhbmQgREFUIGZpbGVzIGFyZSBzdG9yZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgYmFja3VwIGFyY2hpdmUuCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkgCSRwcm9maWxlCQlQcm9maWxlIGFycmF5IG9mIGRhdGEuIEtleSAnZXhjbHVkZXMnIGNhbiBiZSBhcnJheSBvciBuZXdsaW5lLWRlbGltaW5hdGVkIHN0cmluZy4KCSAqCUBwYXJhbQkJYm9vbAkkdHJpbV9zdWZmaXgJVHJ1ZSAoZGVmYXVsdCkgaWYgdHJhaWxpbmcgc2xhc2ggc2hvdWxkIGJlIHRyaW1tZWQgZnJvbSBkaXJlY3RvcmllcwoJICoJQHBhcmFtCQlzdHJpbmcJJHNlcmlhbAkJCU9wdGlvbmFsIHNlcmlhbCBvZiBjdXJyZW50IGJhY2t1cC4gQnkgZGVmYXVsdCBhbGwgc3ViZGlyZWN0b3JpZXMgd2l0aGluIHRoZSBiYWNrdXBidWRkeV90ZW1wIGRpciBhcmUgZXhwbGljaXRseSBleGNsdWRlZC4gU3BlY2lmeWluZyBhbGxvd3MgdGhpcyBzZXJpYWwgc3ViZGlyZWN0b3J5IHRvIG5vdCBiZSBleGNsdWRlZC4KCSAqCUByZXR1cm4JCWFycmF5CQkJCQlBcnJheSBvZiBkaXJlY3RvcmllcyB0byBleGNsdWRlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucyggJHByb2ZpbGUsICR0cmltX3N1ZmZpeCA9IHRydWUsICRzZXJpYWwgPSAnJyApIHsKCQkKCQkkcHJvZmlsZSA9IGFycmF5X21lcmdlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdwcm9maWxlX2RlZmF1bHRzJyApLCAkcHJvZmlsZSApOwoJCQoJCS8vIE5vIHRyYWlsaW5nIHNsYXNoICRhYnNwYXRoLgoJCSRhYnNwYXRoID0gcnRyaW0oIEFCU1BBVEgsICcvJyApOwoJCQoJCS8vIEN1c3RvbSByb290IChpZiBhbnkpLgoJCSRiYWNrdXBSb290ID0gQUJTUEFUSDsgLy8gRGVmYXVsdCByb290LgoJCWlmICggaXNzZXQoICRwcm9maWxlWydjdXN0b21fcm9vdCddICkgJiYgKCAnJyAhPSAkcHJvZmlsZVsnY3VzdG9tX3Jvb3QnXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdXNpb24gY3VzdG9tIHJvb3QgKHJhdyk6ICcgLiAkcHJvZmlsZVsnY3VzdG9tX3Jvb3QnXSApOwoJCQkkYmFja3VwUm9vdCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9ub3JtYWxpemVkX2N1c3RvbV9yb290KCAkcHJvZmlsZVsnY3VzdG9tX3Jvb3QnXSApOwoJCX0KCQkKCQkvLyBIYW5kbGUgc21hcnQgcHJvZmlsZSB0eXBlcy4KCQlpZiAoICRwcm9maWxlWyd0eXBlJ10gPT0gJ21lZGlhJyApIHsKCQkJJGJhY2t1cFJvb3QgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfbWVkaWFfcm9vdCgpOwoJCX0gZWxzZWlmICggJHByb2ZpbGVbJ3R5cGUnXSA9PSAndGhlbWVzJyApIHsKCQkJJGJhY2t1cFJvb3QgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfdGhlbWVzX3Jvb3QoKTsKCQl9IGVsc2VpZiAoICRwcm9maWxlWyd0eXBlJ10gPT0gJ3BsdWdpbnMnICkgewoJCQkkYmFja3VwUm9vdCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9wbHVnaW5zX3Jvb3QoKTsKCQl9CgkJCgkJJGV4Y2x1ZGVzID0gYXJyYXkoKTsKCQkKCQkvLyBIYXJkY29kZWQgZXhjbHVzaW9ucywgcmVsYXRpdmUgdG8gJGFic3BhdGguCgkJZm9yZWFjaCggYmFja3VwYnVkZHlfY29uc3RhbnRzOjokSEFSRENPREVEX0RJUl9FWENMVVNJT05TIGFzICRleGNsdXNpb24gKSB7CgkJCSRleGNsdWRlc1tdID0gJGFic3BhdGggLiAkZXhjbHVzaW9uOwoJCX0KCQkKCQkvLyBCYWNrdXAgc3RvcmFnZSBkaXJlY3RvcnkuCgkJJGV4Y2x1ZGVzW10gPSBzZWxmOjpnZXRCYWNrdXBEaXJlY3RvcnkoKTsKCQkKCQkvLyBMb2cgZGlyZWN0b3J5LgoJCSRleGNsdWRlc1tdID0gc2VsZjo6Z2V0TG9nRGlyZWN0b3J5KCk7CgkJCgkJLy8gTWVkaWEvdGhlbWVzL3BsdWdpbnMgZXhjbHVkZWQgb3B0aW9uLgoJCWlmICggaXNzZXQoICRwcm9maWxlWydleGNsdWRlX21lZGlhJ10gKSAmJiAoICcxJyA9PSAkcHJvZmlsZVsnZXhjbHVkZV9tZWRpYSddICkgKSB7CgkJCSRleGNsdWRlc1tdID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X21lZGlhX3Jvb3QoKTsKCQl9CgkJaWYgKCBpc3NldCggJHByb2ZpbGVbJ2V4Y2x1ZGVfdGhlbWVzJ10gKSAmJiAoICcxJyA9PSAkcHJvZmlsZVsnZXhjbHVkZV90aGVtZXMnXSApICkgewoJCQkkZXhjbHVkZXNbXSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF90aGVtZXNfcm9vdCgpOwoJCX0KCQlpZiAoIGlzc2V0KCAkcHJvZmlsZVsnZXhjbHVkZV9wbHVnaW5zJ10gKSAmJiAoICcxJyA9PSAkcHJvZmlsZVsnZXhjbHVkZV9wbHVnaW5zJ10gKSApIHsKCQkJJGV4Y2x1ZGVzW10gPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfcGx1Z2luc19yb290KCk7CgkJfQoJCQoJCS8vIEV4Y2x1ZGUgYWxsIHRlbXAgZGlyZWN0b3JpZXMgd2l0aGluIGJhY2t1cGJ1ZGR5X3RlbXAsIGV4Y2VwdCBhbnkgc3ViZGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgc2VyaWFsIHNwZWNpZmllZCAoaWYgYW55KS4KCQkkdGVtcERpcnMgPSBAZ2xvYiggc2VsZjo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJyonLCBHTE9CX09OTFlESVIgKTsKCQlpZiAoICEgaXNfYXJyYXkoICR0ZW1wRGlycyApICkgewoJCQkkdGVtcERpcnMgPSBhcnJheSgpOwoJCX0KCQlmb3JlYWNoKCAkdGVtcERpcnMgYXMgJHRlbXBEaXIgKSB7CgkJCWlmICggKCAnJyA9PSAkc2VyaWFsICkgfHwgKCBmYWxzZSA9PT0gc3Ryc3RyKCAkdGVtcERpciwgJHNlcmlhbCApICkgKSB7IC8vIElmIG5vIHNwZWNpZmljIHNlcmlhbCBzdXBwbGllZCBPUiB0aGlzIGRpciBkb2VzIG5vdCBjb250YWluIHRoZSBzZXJpYWwsIGV4Y2x1ZGUgaXQuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgYWRkaXRpb25hbCB0ZW1wIGRpcmVjdG9yeSBzdWJkaXI6IGAnIC4gJHRlbXBEaXIgLiAnYC4nICk7CgkJCQkkZXhjbHVkZXNbXSA9ICR0ZW1wRGlyOwoJCQl9CgkJfQoJCQoJCS8vIFByb2ZpbGUtc3BlY2lmaWMgT1IgZ2xvYmFsIGV4Y2x1ZGVzLgoJCWlmICggISBpc19hcnJheSggJHByb2ZpbGVbJ2V4Y2x1ZGVzJ10gKSApIHsKCQkJJHByb2ZpbGVFeGNsdXNpb25zID0gdHJpbSggJHByb2ZpbGVbJ2V4Y2x1ZGVzJ10gKTsgLy8gVHJpbSBzdHJpbmcuCgkJCWlmICggJy0xJyA9PSAkcHJvZmlsZUV4Y2x1c2lvbnMgKSB7IC8vIFVzZSBkZWZhdWx0IGdsb2JhbCBleGNsdXNpb25zIGluc3RlYWQgb2YgcHJvZmlsZS4KCQkJCSRwcm9maWxlRXhjbHVzaW9ucyA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVswXVsnZXhjbHVkZXMnXTsKCQkJCSRwcm9maWxlRXhjbHVzaW9ucyA9IHByZWdfc3BsaXQoJy9cbnxccnxcclxuLycsICRwcm9maWxlRXhjbHVzaW9ucyApOyAvLyBCcmVhayBpbnRvIGFycmF5IG9uIGFueSB0eXBlIG9mIGxpbmUgZW5kaW5nLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJvZmlsZSBpbmhlcml0aW5nIGdsb2JhbCBleGNsdXNpb25zLicgKTsKCQkJCWZvcmVhY2goICRwcm9maWxlRXhjbHVzaW9ucyBhcyAmJHByb2ZpbGVFeGNsdXNpb24gKSB7IC8vIEhhbmRsZSBwb3NzaWJsZSBwYXRoIGFib3NlICRhYnNwYXRoIGluIGN1c3RvbSByb290LgoJCQkJCSRwcm9maWxlRXhjbHVzaW9uID0gdHJpbSggJHByb2ZpbGVFeGNsdXNpb24gKTsKCQkJCQlpZiAoICcnID09PSAkcHJvZmlsZUV4Y2x1c2lvbiApIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCSRwcm9maWxlRXhjbHVzaW9uID0gJGFic3BhdGggLiAkcHJvZmlsZUV4Y2x1c2lvbjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSRwcm9maWxlRXhjbHVzaW9ucyA9IHByZWdfc3BsaXQoJy9cbnxccnxcclxuLycsICRwcm9maWxlRXhjbHVzaW9ucyApOyAvLyBCcmVhayBpbnRvIGFycmF5IG9uIGFueSB0eXBlIG9mIGxpbmUgZW5kaW5nLgoJCQkJZm9yZWFjaCggJHByb2ZpbGVFeGNsdXNpb25zIGFzICYkcHJvZmlsZUV4Y2x1c2lvbiApIHsKCQkJCQlpZiAoICcnID09ICRwcm9maWxlRXhjbHVzaW9uICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJJHByb2ZpbGVFeGNsdXNpb24gPSBydHJpbSggJGJhY2t1cFJvb3QsICcvJyApIC4gJHByb2ZpbGVFeGNsdXNpb247CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQkkcHJvZmlsZUV4Y2x1c2lvbnMgPSAkcHJvZmlsZVsnZXhjbHVkZXMnXTsKCQl9CgkJJGV4Y2x1ZGVzID0gYXJyYXlfbWVyZ2UoICRleGNsdWRlcywgJHByb2ZpbGVFeGNsdXNpb25zICk7CgkJCgkJLy8gUHJvY2VzcyBleGNsdXNpb24gdmFyaWFibGVzLgoJCWZvcmVhY2goICRleGNsdWRlcyBhcyAmJGFic29sdXRlRXhjbHVkZSApIHsKCQkJJGFic29sdXRlRXhjbHVkZSA9IHN0cl9yZXBsYWNlKCAne21lZGlhfScsIHNlbGY6OmdldF9tZWRpYV9yb290KCksICRhYnNvbHV0ZUV4Y2x1ZGUgKTsKCQkJJGFic29sdXRlRXhjbHVkZSA9IHN0cl9yZXBsYWNlKCAne3RoZW1lc30nLCBzZWxmOjpnZXRfdGhlbWVzX3Jvb3QoKSwgJGFic29sdXRlRXhjbHVkZSApOwoJCQkkYWJzb2x1dGVFeGNsdWRlID0gc3RyX3JlcGxhY2UoICd7cGx1Z2luc30nLCBzZWxmOjpnZXRfcGx1Z2luc19yb290KCksICRhYnNvbHV0ZUV4Y2x1ZGUgKTsKCQl9CgkJCgkJLy8gQ2xlYW4gdXAgJiBzYW5pdGl6ZSBhcnJheS4KCQlpZiAoICR0cmltX3N1ZmZpeCApIHsKCQkJYXJyYXlfd2FsayggJGV4Y2x1ZGVzLCBjcmVhdGVfZnVuY3Rpb24oICcmJHZhbCcsICckdmFsID0gcnRyaW0oIHRyaW0oICR2YWwgKSwgXCcvXCcgKTsnICkgKTsgLy8gQXBwbHkgdHJpbSB0byBhbGwgaXRlbXMgd2l0aGluLgoJCX0gZWxzZSB7CgkJCWFycmF5X3dhbGsoICRleGNsdWRlcywgY3JlYXRlX2Z1bmN0aW9uKCAnJiR2YWwnLCAnJHZhbCA9IHRyaW0oICR2YWwgKTsnICkgKTsgLy8gQXBwbHkgKHdoaXRlc3BhY2Utb25seSkgdHJpbSB0byBhbGwgaXRlbXMgd2l0aGluLgoJCX0KCQkKCQkvLyBBcHBseSBmaWx0ZXIgZm9yIDNyZCBwYXJ0eSBtb2RpZmljYXRpb25zLgoJCSRleGNsdWRlcyA9IGFwcGx5X2ZpbHRlcnMoICdiYWNrdXBidWRkeV96aXBfZXhjbHVzaW9ucycsICRleGNsdWRlcyApOwoJCQoJCS8vIFJlbW92ZSBkdXBsaWNhdGVzLgoJCSRleGNsdWRlcyA9IGFycmF5X3VuaXF1ZSggJGV4Y2x1ZGVzICk7CgkJCgkJLyoKCQllY2hvICdwcmUtJGV4Y2x1ZGVzOjxwcmU+JzsKCQlwcmludF9yKCAkZXhjbHVkZXMgKTsKCQllY2hvICc8L3ByZT4nOwoJCSovCgkJCgkJLy8gUmVtb3ZlIGFsbCBleGNsdXNpb25zIHRoYXQgZG8gbm90IGJlZ2luIGF0IHRoZSBiYWNrdXAgcm9vdCAoY3VzdG9tIG9yIGRlZmF1bHQpLgoJCWZvcmVhY2goICRleGNsdWRlcyBhcyAmJGFic29sdXRlRXhjbHVkZSApIHsKCQkJLy9lY2hvICc8YnI+cm9vdDogJyAuICRiYWNrdXBSb290IC4gJyB+ICcgLiAkYWJzb2x1dGVFeGNsdWRlOwoJCQlpZiAoIDAgIT09IHN0cnBvcyggJGFic29sdXRlRXhjbHVkZSwgJGJhY2t1cFJvb3QgKSApIHsKCQkJCSRhYnNvbHV0ZUV4Y2x1ZGUgPSAnJzsKCQkJfQoJCX0KCQkKCQkvLyBSZW1vdmUgYW55IGVtcHR5IC8gYmxhbmsgbGluZXMuCgkJJGV4Y2x1ZGVzID0gYXJyYXlfZmlsdGVyKCAkZXhjbHVkZXMsICdzdHJsZW4nICk7CgkJCgkJLy8gRml4IGFycmF5IGluZGV4ZXMgZm9yIHJlbW92ZWQgaXRlbXMuCgkJJGV4Y2x1ZGVzID0gYXJyYXlfdmFsdWVzKCAkZXhjbHVkZXMgKTsKCQkKCQkKCQkKCQkvLyBNYWtlIGFsbCBleGNsdXNpb25zIHJlbGF0aXZlIHRvIGJhY2t1cCByb290LgoJCWZvcmVhY2goICRleGNsdWRlcyBhcyAmJGV4Y2x1ZGUgKSB7CgkJCSRleGNsdWRlID0gJy8nIC4gc3RyX3JlcGxhY2UoICRiYWNrdXBSb290LCAnJywgJGV4Y2x1ZGUgKTsKCQl9CgkJCgkJLyoKCQllY2hvICckZXhjbHVkZXM6PHByZT4nOwoJCXByaW50X3IoICRleGNsdWRlcyApOwoJCWVjaG8gJzwvcHJlPic7CgkJKi8KCQkKCQlyZXR1cm4gJGV4Y2x1ZGVzOwoJCQoJfSAvLyBFbmQgZ2V0X2RpcmVjdG9yeV9leGNsdXNpb25zKCkuCgoKCgkvKgltYWlsX2Vycm9yKCkKCSAqCQoJICoJU2VuZHMgYW4gZXJyb3IgZW1haWwgdG8gdGhlIGRlZmluZWQgZW1haWwgYWRkcmVzcyhlcykgb24gc2V0dGluZ3MgcGFnZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCQkkbWVzc2FnZQlNZXNzYWdlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBib2R5IG9mIHRoZSBlbWFpbC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkJJG92ZXJyaWRlX3JlY2lwaWVudAlFbWFpbCBhZGRyZXNzKGVzKSB0byBzZW5kIHRvIGluc3RlYWQgb2YgdGhlIG5vcm1hbCByZWNpcGllbnQuCgkgKglAcGFyYW0JCXN0cmluZ3xhcnJheSAJU3RyaW5nIG9yIGFycmF5IG9mIGZpbGVuYW1lKHMpIHRvIHNlbmQgYXMgZW1haWwgYXR0YWNobWVudHMuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFpbF9lcnJvciggJG1lc3NhZ2UsICRvdmVycmlkZV9yZWNpcGllbnQgPSAnJywgJGF0dGFjaG1lbnRzID0gYXJyYXkoKSApIHsKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2NvbnN0YW50cy5waHAnICk7CgkJCgkJaWYgKCAhaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoJCX0KCQkKCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdWUgdG8gYSBwcm9ibGVtIHdpdGggdGhlIHBsdWdpbiBzZXR0aW5ncyB0aGVuIGxvYWQgZGVmYXVsdHMgdGVtcG9yYXJpbHkuCgkJaWYgKCAoICEgaXNfYXJyYXkoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICkgfHwgKCAhIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RhdGFfdmVyc2lvbiddICkgKSApIHsKCQkJJHNldHRpbmdzX2NvcHkgPSBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdkZWZhdWx0X29wdGlvbnMnICk7CgkJfSBlbHNlIHsKCQkJJHNldHRpbmdzX2NvcHkgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnM7CgkJfQoJCQoJCQoJCQoJCWlmICggKCB0aW1lKCkgLSAkc2V0dGluZ3NfY29weVsnbGFzdF9lcnJvcl9lbWFpbF90aW1lJ10gKSA8IGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6TUlNSU1VTV9USU1FX0JFVFdFRU5fRVJST1JfRU1BSUxTICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdXYXJuaW5nICM0Mzg5NDg0OiBUcmllZCB0byBzZW5kIGVycm9yIGVtYWlsIHRvbyBmYXN0LiBTa2lwcGluZyBzZW5kLiBNZXNzYWdlOiBgJyAuICRtZXNzYWdlIC4gJ2AuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJCgkJLy8gVHJhY2sgbGFzdCBzZW50IHRpbWUgdG8gcHJldmVudCBmbG9vZC4KCQkkc2V0dGluZ3NfY29weVsnbGFzdF9lcnJvcl9lbWFpbF90aW1lJ10gPSB0aW1lKCk7CgkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkKCQkkc3ViamVjdCA9ICRzZXR0aW5nc19jb3B5WydlbWFpbF9ub3RpZnlfZXJyb3Jfc3ViamVjdCddOwoJCSRib2R5ID0gJHNldHRpbmdzX2NvcHlbJ2VtYWlsX25vdGlmeV9lcnJvcl9ib2R5J107CgoJCSRyZXBsYWNlbWVudHMgPSBhcnJheSgKCQkJJ3tzaXRlX3VybH0nID0+IHNpdGVfdXJsKCksCgkJCSd7aG9tZV91cmx9JyA9PiBob21lX3VybCgpLAoJCQkne2JhY2t1cGJ1ZGR5X3ZlcnNpb259JyA9PiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApLAoJCQkne2N1cnJlbnRfZGF0ZXRpbWV9JyA9PiBkYXRlKERBVEVfUkZDODIyKSwKCQkJJ3toZWFkaW5nfScgPT4gJ0JhY2t1cEJ1ZGR5IEVycm9yJywKCQkJJ3tzdXBwb3J0X2Rpc3BsYXl9JyA9PiAndGFibGUnLAoJCQkne21lc3NhZ2V9JyA9PiAkbWVzc2FnZQoJCSk7CgoJCS8vIEN1c3RvbWl6ZSBTdWJqZWN0IGFuZCB1c2VyIGN1c3RvbWl6YWJsZSBtZXNzYWdlCgkJZm9yZWFjaCggJHJlcGxhY2VtZW50cyBhcyAkcmVwbGFjZV9rZXkgPT4gJHJlcGxhY2VtZW50ICkgewoJCQkkc3ViamVjdCA9IHN0cl9yZXBsYWNlKCAkcmVwbGFjZV9rZXksICRyZXBsYWNlbWVudCwgJHN1YmplY3QgKTsKCQkJJGJvZHkgPSBzdHJfcmVwbGFjZSggJHJlcGxhY2Vfa2V5LCAkcmVwbGFjZW1lbnQsICRib2R5ICk7CgkJfQoKCQkkcmVwbGFjZW1lbnRzWyd7Ym9keX0nXSA9ICRib2R5OwoKCQkvLyBDdXN0b21pemUgdGhlIGZpbmFsIGJvZHkgYmFzZWQgb24gb3VyIEhUTUwgdGVtcGxhdGUKCQlpZiAoIEBmaWxlX2V4aXN0cyggZ2V0X3RoZW1lX3Jvb3QoKSAuICcvYmFja3VwYnVkZHktZW1haWwtdGVtcGxhdGUucGhwJyApICkgewoJCQkkYm9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCBnZXRfdGhlbWVfcm9vdCgpIC4gJy9iYWNrdXBidWRkeS1lbWFpbC10ZW1wbGF0ZS5waHAnICk7CgkJfSBlbHNlIHsKCQkJJGJvZHkgPSBmaWxlX2dldF9jb250ZW50cyggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy92aWV3cy9iYWNrdXBidWRkeS1lbWFpbC10ZW1wbGF0ZS5waHAnICk7CgkJfQoJCQoJCWZvcmVhY2goICRyZXBsYWNlbWVudHMgYXMgJHJlcGxhY2Vfa2V5ID0+ICRyZXBsYWNlbWVudCApIHsKCQkJJGJvZHkgPSBzdHJfcmVwbGFjZSggJHJlcGxhY2Vfa2V5LCRyZXBsYWNlbWVudCwgJGJvZHkgKTsKCQl9CgoJCSRlbWFpbCA9ICRzZXR0aW5nc19jb3B5WydlbWFpbF9ub3RpZnlfZXJyb3InXTsKCQlpZiAoICRvdmVycmlkZV9yZWNpcGllbnQgIT0gJycgKSB7CgkJCSRlbWFpbCA9ICRvdmVycmlkZV9yZWNpcGllbnQ7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ092ZXJyaWRpbmcgZW1haWwgcmVjaXBpZW50IHRvOiBgJyAuICRvdmVycmlkZV9yZWNpcGllbnQgLiAnYC4nICk7CgkJfQoJCQoJCS8vIERlZmF1bHQgdG8gYWRtaW5fZW1haWwgaWYgbm90IGNvbmZpZ3VyZWQgYW55d2hlcmUgZWxzZS4KCQlpZiAoICcnID09ICRlbWFpbCApIHsKCQkJJGVtYWlsID0gZ2V0X29wdGlvbignYWRtaW5fZW1haWwnKTsKCQl9CgkJCgkJaWYgKCAhIGVtcHR5KCAkZW1haWwgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2VuZGluZyBlbWFpbCBlcnJvciBub3RpZmljYXRpb24gd2l0aCBzdWJqZWN0IGAnIC4gJHN1YmplY3QgLiAnYCB0byByZWNpcGllbnQocyk6IGAnIC4gJGVtYWlsIC4gJ2AuJyApOwoJCQlpZiAoICRzZXR0aW5nc19jb3B5WydlbWFpbF9yZXR1cm4nXSAhPSAnJyApIHsKCQkJCSRlbWFpbF9yZXR1cm4gPSAkc2V0dGluZ3NfY29weVsnZW1haWxfcmV0dXJuJ107CgkJCX0gZWxzZSB7CgkJCQkkZW1haWxfcmV0dXJuID0gZ2V0X29wdGlvbignYWRtaW5fZW1haWwnKTsKCQkJfQoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICd3cF9tYWlsJyApICkgewoJCQkJJHJlc3VsdCA9IHdwX21haWwoICRlbWFpbCwgJHN1YmplY3QsICRib2R5LCAnRnJvbTogQmFja3VwQnVkZHkgPCcgLiAkZW1haWxfcmV0dXJuIC4gIj5cclxuIiAuICdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsnIC4gIlxyXG4iLidSZXBseS1UbzogJy5nZXRfb3B0aW9uKCdhZG1pbl9lbWFpbCcpLiJcclxuIiwgJGF0dGFjaG1lbnRzICk7CgkJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNDU0NDM1NTQ6IFVuYWJsZSB0byBzZW5kIGVycm9yIGVtYWlsIHdpdGggV29yZFByZXNzIHdwX21haWwoKS4gVmVyaWZ5IFdvcmRQcmVzcyAmIFNlcnZlciBzZXR0aW5ncy4nICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnV2FybmluZyAjMzI4OTIzOTogd3BfbWFpbCgpIHVuYXZhaWxhYmxlLiBJbnNpZGUgV29yZFByZXNzPycgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ05vIGVtYWlsIGFkZHJlc3NlcyBhcmUgc2V0IHRvIHJlY2VpdmUgZXJyb3Igbm90aWZpY2F0aW9ucyBvbiB0aGUgU2V0dGluZ3MgcGFnZSBBTkQgZ2V0X29wdGlvbigiYWRtaW5fZW1haWwiKSBub3Qgc2V0LiBTZXR0aW5nIGEgbm90aWZpY2F0aW9uIGVtYWlsIGlzIHN1Z2dlc3RlZC4nICk7CgkJfQoJCQoJfSAvLyBFbmQgbWFpbF9lcnJvcigpLgoKCgoJLyoJbWFpbF9ub3RpZnlfc2NoZWR1bGVkKCkKCSAqCQoJICoJU2VuZHMgYSBtZXNzYWdlIGVtYWlsIHRvIHRoZSBkZWZpbmVkIGVtYWlsIGFkZHJlc3MoZXMpIG9uIHNldHRpbmdzIHBhZ2UuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc3RhcnRfb3JfY29tcGxldGUJV2hldGhlciB0aGlzIGlzIHRoZSBub3RpZmNhdGlvbiBmb3Igc3RhcnRpbmcgb3IgY29tcGxldGluZy4gVmFsaWQgdmFsdWVzOiBzdGFydCwgY29tcGxldGUsIGRlc3RpbmF0aW9uQ29tcGxldGUKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbWVzc2FnZQkJCU1lc3NhZ2UgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1haWxfbm90aWZ5X3NjaGVkdWxlZCggJHNlcmlhbCwgJHN0YXJ0X29yX2NvbXBsZXRlLCAkbWVzc2FnZSwgJGV4dHJhUmVwbGFjZW1lbnRzID0gYXJyYXkoKSApIHsKCgkJaWYgKCAhaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoJCX0KCgkJaWYgKCAkc3RhcnRfb3JfY29tcGxldGUgPT0gJ3N0YXJ0JyApIHsKCQkJJGVtYWlsID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydlbWFpbF9ub3RpZnlfc2NoZWR1bGVkX3N0YXJ0J107CgoJCQkkc3ViamVjdCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X3NjaGVkdWxlZF9zdGFydF9zdWJqZWN0J107CgkJCSRib2R5ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydlbWFpbF9ub3RpZnlfc2NoZWR1bGVkX3N0YXJ0X2JvZHknXTsKCgkJCSRyZXBsYWNlbWVudHMgPSBhcnJheSgKCQkJCSd7c2l0ZV91cmx9JyA9PiBzaXRlX3VybCgpLAoJCQkJJ3tob21lX3VybH0nID0+IGhvbWVfdXJsKCksCgkJCQkne2JhY2t1cGJ1ZGR5X3ZlcnNpb259JyA9PiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApLAoJCQkJJ3tjdXJyZW50X2RhdGV0aW1lfScgPT4gZGF0ZShEQVRFX1JGQzgyMiksCgkJCQkne2hlYWRpbmd9JyA9PiAnQmFja3VwIFN0YXJ0ZWQnLAoJCQkJJ3ttZXNzYWdlfScgPT4gJG1lc3NhZ2UKCQkJKTsKCQl9IGVsc2VpZiAoICRzdGFydF9vcl9jb21wbGV0ZSA9PSAnY29tcGxldGUnICkgewoJCQkkZW1haWwgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfY29tcGxldGUnXTsKCgkJCSRzdWJqZWN0ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydlbWFpbF9ub3RpZnlfc2NoZWR1bGVkX2NvbXBsZXRlX3N1YmplY3QnXTsKCQkJJGJvZHkgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfY29tcGxldGVfYm9keSddOwoKCQkJJGFyY2hpdmVfZmlsZSA9ICcnOwoJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZW9wdGlvbnMgaW5zdGFuY2UgIzM3LicgKTsKCQkJJGJhY2t1cF9vcHRpb25zID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2ZpbGVvcHRpb25zKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHNlcmlhbCAuICcudHh0JywgJHJlYWRfb25seSA9IHRydWUsICRpZ25vcmVfbG9jayA9IHRydWUgKTsKCQkJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSAkYmFja3VwX29wdGlvbnMtPmlzX29rKCkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciByZXRyaWV2aW5nIGZpbGVvcHRpb25zIGZpbGUgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHNlcmlhbCAuICcudHh0JyAuICdgLiBFcnIgMzU1NjQzMzIuJyApOwoJCQkJJGFyY2hpdmVfZmlsZSA9ICdbZmlsZV91bmtub3duXSc7CgkJCQkkYmFja3VwX3NpemUgPSAnW3NpemVfdW5rbm93bl0nOwoJCQkJJGJhY2t1cF90eXBlID0gJ1t0eXBlX3Vua25vd25dJzsKCQkJfSBlbHNlIHsKCQkJCSRhcmNoaXZlX2ZpbGUgPSAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2FyY2hpdmVfZmlsZSddOwoJCQkJJGJhY2t1cF9zaXplID0gJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydhcmNoaXZlX3NpemUnXTsKCQkJCSRiYWNrdXBfdHlwZSA9ICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1sndHlwZSddOwoJCQl9CgoJCQkkcmVwbGFjZW1lbnRzID0gYXJyYXkoCgkJCQkne3NpdGVfdXJsfScgPT4gc2l0ZV91cmwoKSwKCQkJCSd7aG9tZV91cmx9JyA9PiBob21lX3VybCgpLAoJCQkJJ3tiYWNrdXBidWRkeV92ZXJzaW9ufScgPT4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSwKCQkJCSd7Y3VycmVudF9kYXRldGltZX0nID0+IGRhdGUoREFURV9SRkM4MjIpLAoJCQkJJ3toZWFkaW5nfScgPT4gJ0JhY2t1cCBDb21wbGV0ZWQnLAoJCQkJJ3ttZXNzYWdlfScgPT4gJG1lc3NhZ2UsCgoJCQkJJ3tiYWNrdXBfc2VyaWFsfScgPT4gJHNlcmlhbCwKCQkJCSd7ZG93bmxvYWRfbGlua30nID0+IHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ2Rvd25sb2FkX2FyY2hpdmUnICkgLiAnJmJhY2t1cGJ1ZGR5X2JhY2t1cD0nIC4gYmFzZW5hbWUoICRhcmNoaXZlX2ZpbGUgKSwKCQkJCSd7YmFja3VwX2ZpbGV9JyA9PiBiYXNlbmFtZSggJGFyY2hpdmVfZmlsZSApLAoJCQkJJ3tiYWNrdXBfc2l6ZX0nID0+ICRiYWNrdXBfc2l6ZSwKCQkJCSd7YmFja3VwX3R5cGV9JyA9PiAkYmFja3VwX3R5cGUsCgkJCSk7CgkJfSBlbHNlaWYgKCAkc3RhcnRfb3JfY29tcGxldGUgPT0gJ2Rlc3RpbmF0aW9uQ29tcGxldGUnICkgewoJCQkkZW1haWwgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zZW5kX2ZpbmlzaCddOwoJCQkKCQkJJHN1YmplY3QgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zZW5kX2ZpbmlzaF9zdWJqZWN0J107CgkJCSRib2R5ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydlbWFpbF9ub3RpZnlfc2VuZF9maW5pc2hfYm9keSddOwoJCQkKCQkJJHJlcGxhY2VtZW50cyA9IGFycmF5KAoJCQkJJ3tzaXRlX3VybH0nID0+IHNpdGVfdXJsKCksCgkJCQkne2hvbWVfdXJsfScgPT4gaG9tZV91cmwoKSwKCQkJCSd7YmFja3VwYnVkZHlfdmVyc2lvbn0nID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksCgkJCQkne2N1cnJlbnRfZGF0ZXRpbWV9JyA9PiBkYXRlKERBVEVfUkZDODIyKSwKCQkJCSd7aGVhZGluZ30nID0+ICdCYWNrdXAgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gZGVzdGluYXRpb24nLAoJCQkJJ3ttZXNzYWdlfScgPT4gJG1lc3NhZ2UsCgkJCSk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0VSUk9SICM1NDg1Nzg0NTc4NTogRmF0YWxseSBoYWx0ZWQuIEludmFsaWQgc2NoZWR1bGUgdHlwZS4gRXhwZWN0ZWQgYHN0YXJ0YCBvciBgY29tcGxldGVgLiBHb3QgYCcgLiAkc3RhcnRfb3JfY29tcGxldGUgLiAnYC4nICk7CgkJfQoJCQoJCSRyZXBsYWNlbWVudHMgPSBhcnJheV9tZXJnZSggJHJlcGxhY2VtZW50cywgJGV4dHJhUmVwbGFjZW1lbnRzICk7CgkJCgkJLy8gQ3VzdG9taXplIFN1YmplY3QgYW5kIHVzZXIgY3VzdG9taXphYmxlIG1lc3NhZ2UKCQkkcmVwbGFjZW1lbnRzWyd7c3VwcG9ydF9kaXNwbGF5fSddID0gJ25vbmUnOwoJCWZvcmVhY2goICRyZXBsYWNlbWVudHMgYXMgJHJlcGxhY2Vfa2V5ID0+ICRyZXBsYWNlbWVudCApIHsKCQkJJHN1YmplY3QgPSBzdHJfcmVwbGFjZSggJHJlcGxhY2Vfa2V5LCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0ICk7CgkJCSRib2R5ID0gc3RyX3JlcGxhY2UoICRyZXBsYWNlX2tleSwgJHJlcGxhY2VtZW50LCAkYm9keSApOwoJCX0KCgkJJHJlcGxhY2VtZW50c1sne2JvZHl9J10gPSAkYm9keTsKCgkJLy8gQ3VzdG9taXplIHRoZSBmaW5hbCBib2R5IGJhc2VkIG9uIG91ciBIVE1MIHRlbXBsYXRlCgkJaWYgKCBAZmlsZV9leGlzdHMoIGdldF90aGVtZV9yb290KCkgLiAnL2JhY2t1cGJ1ZGR5LWVtYWlsLXRlbXBsYXRlLnBocCcgKSApIHsKCQkJJGJvZHkgPSBmaWxlX2dldF9jb250ZW50cyggZ2V0X3RoZW1lX3Jvb3QoKSAuICcvYmFja3VwYnVkZHktZW1haWwtdGVtcGxhdGUucGhwJyApOwoJCX0gZWxzZSB7CgkJCSRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoIGRpcm5hbWUoIGRpcm5hbWUoIF9fRklMRV9fICkgKSAuICcvdmlld3MvYmFja3VwYnVkZHktZW1haWwtdGVtcGxhdGUucGhwJyApOwoJCX0KCQkKCQlmb3JlYWNoKCAkcmVwbGFjZW1lbnRzIGFzICRyZXBsYWNlX2tleSA9PiAkcmVwbGFjZW1lbnQgKSB7CgkJCSRib2R5ID0gc3RyX3JlcGxhY2UoICRyZXBsYWNlX2tleSwkcmVwbGFjZW1lbnQsICRib2R5ICk7CgkJfQoKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfcmV0dXJuJ10gIT0gJycgKSB7CgkJCSRlbWFpbF9yZXR1cm4gPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX3JldHVybiddOwoJCX0gZWxzZSB7CgkJCSRlbWFpbF9yZXR1cm4gPSBnZXRfb3B0aW9uKCdhZG1pbl9lbWFpbCcpOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTZW5kaW5nIGVtYWlsIHNjaGVkdWxlIG5vdGlmaWNhdGlvbi4gU3ViamVjdDogYCcgLiAkc3ViamVjdCAuICdgOyByZWNpcGllbnQocyk6IGAnIC4gJGVtYWlsIC4gJ2AuJyApOwoJCWlmICggIWVtcHR5KCAkZW1haWwgKSApIHsKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICd3cF9tYWlsJyApICkgewoJCQkJd3BfbWFpbCggJGVtYWlsLCAkc3ViamVjdCwgJGJvZHksICdGcm9tOiBCYWNrdXBCdWRkeSA8JyAuICRlbWFpbF9yZXR1cm4gLiAiPlxyXG4iLidSZXBseS1UbzogJy5nZXRfb3B0aW9uKCdhZG1pbl9lbWFpbCcpLiJcclxuIi4nQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7JyAuICJcclxuIik7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyODkyMzkzOiB3cF9tYWlsKCkgZG9lcyBub3QgZXhpc3QuIEluc2lkZSBXb3JkUHJlc3M/JyApOwoJCQl9CgkJfQoJfSAvLyBFbmQgbWFpbF9ub3RpZnlfc2NoZWR1bGVkKCkuCgkKCQoJCgkvKgliYWNrdXBfcHJlZml4KCkKCSAqCQoJICoJU3RyaXBzIGFsbCBub24tZmlsZS1mcmllbmRseSBjaGFyYWN0ZXJzIGZyb20gdGhlIHNpdGUgVVJMLiBVc2VkIGluIG1ha2luZyBiYWNrdXAgemlwIGZpbGVuYW1lLgoJICoJCgkgKglAcmV0dXJuCQlzdHJpbmcJCVRoZSBmaWxlbmFtZSBmcmllbmRseSBjb252ZXJ0ZWQgc2l0ZSBVUkwuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYmFja3VwX3ByZWZpeCgpIHsKCQkKCQkkc2l0ZXVybCA9IHNpdGVfdXJsKCk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJ2h0dHA6Ly8nLCAnJywgJHNpdGV1cmwgKTsKCQkkc2l0ZXVybCA9IHN0cl9yZXBsYWNlKCAnaHR0cHM6Ly8nLCAnJywgJHNpdGV1cmwgKTsKCQkkc2l0ZXVybCA9IHN0cl9yZXBsYWNlKCAnLycsICdfJywgJHNpdGV1cmwgKTsKCQkkc2l0ZXVybCA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnXycsICRzaXRldXJsICk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJy4nLCAnXycsICRzaXRldXJsICk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJzonLCAnXycsICRzaXRldXJsICk7IC8vIEFsdGVybmF0aXZlIHBvcnQgZnJvbSA4MCBpcyBzdG9yZWQgaW4gdGhlIHNpdGUgdXJsLgoJCSRzaXRldXJsID0gc3RyX3JlcGxhY2UoICd+JywgJ18nLCAkc2l0ZXVybCApOyAvLyBTdHJpcCB+LgoJCXJldHVybiAkc2l0ZXVybDsKCQkKCX0gLy8gRW5kIGJhY2t1cF9wcmVmaXgoKS4KCQoJCgkKCS8qIHJlbW90ZVNlbmRSZXRyeSgpCgkgKgoJICogUmV0dXJucyB0cnVlIGlmIHJlc2VuZGluZyBvciBmYWxzZSBpZiByZXRyeSBsaW1pdCBhbHJlYWR5IG1ldC4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVtb3RlU2VuZFJldHJ5KCAmJGZpbGVvcHRpb25zX29iaiwgJHNlbmRfaWQsICRtYXhpbXVtUmV0cmllcyA9IDEgKSB7CgkJLy8gRGVzdGluYXRpb24gc2V0dGluZ3MgYXJlIHN0b3JlZCBmb3IgdGhpcyBkZXN0aW5hdGlvbiBzbyBzZWUgaWYgd2UgY2FuIHJldHJ5IHNlbmRpbmcgaXQgKGlmIHNldHRpbmdzIHBlcm1pdCkuCgkJaWYgKCBpc3NldCggJGZpbGVvcHRpb25zX29iai0+b3B0aW9uc1snZGVzdGluYXRpb25TZXR0aW5ncyddICkgJiYgKCBjb3VudCggJGZpbGVvcHRpb25zX29iai0+b3B0aW9uc1snZGVzdGluYXRpb25TZXR0aW5ncyddICkgPiAwICkgKSB7CgkJCQoJCQkvKgoJCQllY2hvICc8cHJlPic7CgkJCXByaW50X3IoICRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnMgKTsKCQkJZWNobyAnPC9wcmU+JzsKCQkJKi8KCQkJCgkJCSRkZXN0aW5hdGlvbl9zZXR0aW5ncyA9ICRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnNbJ2Rlc3RpbmF0aW9uU2V0dGluZ3MnXTsgLy8gdGhlc2UgYXJlIHRoZSBsYXRlc3Q7IGluY2x1ZGVzIGluZm8gbmVlZGVkIGZvciBjaHVua2luZyB0b28uCgkJCS8vJHNlbmRfaWQgPSAkZmlsZW9wdGlvbnNfb2JqLT5vcHRpb25zWydzZW5kSUQnXTsKCQkJJGRlbGV0ZV9hZnRlciA9ICRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnNbJ2RlbGV0ZUFmdGVyJ107CgkJCSRyZXRyaWVzID0gJGZpbGVvcHRpb25zX29iai0+b3B0aW9uc1sncmV0cmllcyddOwoJCQkkZmlsZSA9ICRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnNbJ2ZpbGUnXTsKCQkJCgkJCWlmICggJHJldHJpZXMgPCAkbWF4aW11bVJldHJpZXMgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUaW1lZCBvdXQgcmVtb3RlIHNlbmQgaGFzIG5vdCBleGNlZWRlZCByZXRyeSBsaW1pdCAoYCcgLiAkbWF4aW11bVJldHJpZXMgLiAnYCkuIFRyeWluZyB0byBzZW5kIGFnYWluLicgKTsKCgkJCQkvLyRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnNbJ3JldHJpZXMnXSsrOwoJCQkJLy8kZmlsZW9wdGlvbnNfb2JqLT5zYXZlKCk7IC8vIE5PVEU6IFJldHJ5IGNvdW50IG5vdyB1cGRhdGVzIGluIGJvb3RzdHJhcC5waHAgc2VuZCgpIGZ1bmN0aW9uLiBPbmx5IGxlYXZpbmcgdGhpcyBoZXJlIHRlbXBvcmFyaWx5IHRvIGhlbHAgZ2V0IHJpZCBvZiBmYWlsZWQgcmVzZW5kcyBmcm9tIGFjY3VtdWxhdGluZyB3aXRoIG9sZCBmb3JtYXQuCgkJCQkKCQkJCS8vIFNjaGVkdWxlIHNlbmQgb2YgdGhpcyBwaWVjZS4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NjaGVkdWxpbmcgY3JvbiB0byBzZW5kIHRvIHRoaXMgcmVtb3RlIGRlc3RpbmF0aW9uLi4uJyApOwoJCQkJJGNyb25BcmdzID0gYXJyYXkoCgkJCQkJJGRlc3RpbmF0aW9uX3NldHRpbmdzLAoJCQkJCSRmaWxlLAoJCQkJCSRzZW5kX2lkLAoJCQkJCSRkZWxldGVfYWZ0ZXIsCgkJCQkJJGlkZW50aWZpZXIgPSAnJywKCQkJCQkkaXNSZXRyeSA9IHRydWUKCQkJCSk7CgkJCQkKCQkJCS8qCgkJCQllY2hvICdjcm9uYXJnczogJzsKCQkJCWVjaG8gJzxwcmU+JzsKCQkJCXByaW50X3IoICRjcm9uQXJncyApOwoJCQkJZWNobyAnPC9wcmU+JzsKCQkJCSovCgkJCQkKCQkJCSRzY2hlZHVsZV9yZXN1bHQgPSBiYWNrdXBidWRkeV9jb3JlOjpzY2hlZHVsZV9zaW5nbGVfZXZlbnQoIHRpbWUoKSwgJ2Rlc3RpbmF0aW9uX3NlbmQnLCAkY3JvbkFyZ3MgKTsKCQkJCWlmICggJHNjaGVkdWxlX3Jlc3VsdCA9PT0gRkFMU0UgKSB7CgkJCQkJJGVycm9yID0gJ0Vycm9yIHNjaGVkdWxpbmcgZmlsZSB0cmFuc2Zlci4gUGxlYXNlIGNoZWNrIHlvdXIgQmFja3VwQnVkZHkgZXJyb3IgbG9nIGZvciBkZXRhaWxzLiBBIHBsdWdpbiBtYXkgaGF2ZSBwcmV2ZW50ZWQgc2NoZWR1bGluZyBvciB0aGUgZGF0YWJhc2UgcmVqZWN0ZWQgaXQuJzsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJCQllY2hvICRlcnJvcjsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JvbiB0byBzZW5kIHRvIHJlbW90ZSBkZXN0aW5hdGlvbiBzY2hlZHVsZWQuJyApOwoJCQkJfQoJCQkJaWYgKCAnMScgIT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydza2lwX3NwYXduX2Nyb25fY2FsbCddICkgewoJCQkJCXVwZGF0ZV9vcHRpb24oICdfdHJhbnNpZW50X2RvaW5nX2Nyb24nLCAwICk7IC8vIFByZXZlbnQgY3Jvbi1ibG9ja2luZyBmb3IgbmV4dCBpdGVtLgoJCQkJCXNwYXduX2Nyb24oIHRpbWUoKSArIDE1MCApOyAvLyBBZGRzID4gNjAgc2Vjb25kcyB0byBnZXQgYXJvdW5kIG9uY2UgcGVyIG1pbnV0ZSBjcm9uIHJ1bm5pbmcgbGltaXQuCgkJCQl9CgkJCQkKCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTWF4aW11bSByZW1vdGUgc2VuZCB0aW1lb3V0IHJldHJpZXMgKGAnIC4gJG1heGltdW1SZXRyaWVzIC4gJ2ApIHBhc3NlZCB0byBmdW5jdGlvbiBtZXQuIE5vdCByZXNlbmRpbmcuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJfSAvLyBFbmQgcmVtb3RlU2VuZFJldHJ5KCkuCgkKCQoJCgkvKiBnZXRfcmVtb3RlX3NlbmRfZGVmYXVsdHMoKQoJICoKCSAqIEdldCBkZWZhdWx0IGFycmF5IHZhbHVlcyBmb3IgdGhlIHJlbW90ZV9zZW5kcyBmaWxlb3B0aW9ucyBmaWxlcy4KCSAqIEByZXR1cm4JCWFycmF5CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9yZW1vdGVfc2VuZF9kZWZhdWx0cygpIHsKCQlyZXR1cm4gYXJyYXkoCgkJCSdkZXN0aW5hdGlvbicJCT0+CTAsCgkJCSdmaWxlJwkJCQk9PgknJywKCQkJJ2ZpbGVfc2l6ZScJCQk9PgkwLAoJCQkndHJpZ2dlcicJCQk9PgknJywJCQkJCQkvLyBXaGF0IHRyaWdnZXJlZCB0aGlzIGJhY2t1cC4gVmFsaWQgdmFsdWVzOiBzY2hlZHVsZWQsIG1hbnVhbC4KCQkJJ3NlbmRfaW1wb3J0YnVkZHknCT0+CWZhbHNlLAoJCQknc3RhcnRfdGltZScJCT0+CXRpbWUoKSwKCQkJJ2ZpbmlzaF90aW1lJwkJPT4JMCwKCQkJJ3VwZGF0ZV90aW1lJwkJPT4JdGltZSgpLAoJCQknc3RhdHVzJwkJCT0+CSdydW5uaW5nJywgIC8vIHN1Y2Nlc3MsIGZhaWx1cmUsIHJ1bm5pbmcsIHRpbWVvdXQgKGRlZmF1bHQgYXNzdW1wdGlvbiBpZiB0aGlzIGlzIG5vdCB1cGRhdGVkIGluIHRoaXMgUEhQIGxvYWQpCgkJCSd3cml0ZV9zcGVlZCcJCT0+CTAsCgkJCSdkZXN0aW5hdGlvblNldHRpbmdzJyA9PiBhcnJheSgpLAoJCQknc2VuZElEJwkJCT0+ICcnLAoJCQknZGVsZXRlQWZ0ZXInCQk9PiBmYWxzZSwKCQkJJ3JldHJpZXMnCQkJPT4gMCwKCQkpOwoJfSAvLyBFbmQgZ2V0X3JlbW90ZV9zZW5kX2RlZmF1bHRzKCk7CgkKCQoJCgkvKglzZW5kX3JlbW90ZV9kZXN0aW5hdGlvbigpCgkgKgkKCSAqCWZ1bmN0aW9uIGRlc2NyaXB0aW9uCgkgKgkKCSAqCUBwYXJhbQkJaW50CQkkZGVzdGluYXRpb25faWQJCUlEIG51bWJlciAoaW5kZXggb2YgdGhlIGRlc3RpbmF0aW9ucyBhcnJheSkgdG8gc2VuZCBpdC4KCSAqCUBwYXJhbQkJc3RyaW5nCSRmaWxlCQkJCUZ1bGwgZmlsZSBwYXRoIG9mIGZpbGUgdG8gc2VuZC4KCSAqCUBwYXJhbQkJc3RyaW5nCSR0cmlnZ2VyCQkJV2hhdCB0cmlnZ2VyZWQgdGhpcyBiYWNrdXAuIFZhbGlkIHZhbHVlczogc2NoZWR1bGVkLCBtYW51YWwuCgkgKglAcGFyYW0JCWJvb2wJJHNlbmRfaW1wb3J0YnVkZHkJV2hldGhlciBvciBub3QgaW1wb3J0YnVkZHkucGhwIHNob3VsZCBhbHNvIGJlIHNlbnQgd2l0aCB0aGUgZmlsZSB0byBkZXN0aW5hdGlvbi4KCSAqCUBwYXJhbQkJYm9vbAkkZGVsZXRlX2FmdGVyCQlXaGV0aGVyIG9yIG5vdCB0byBkZWxldGUgYWZ0ZXIgc2VuZCBzdWNjZXNzIGFmdGVyIFRISVMgc2VuZC4KCSAqCUBwYXJhbQkJYXJyYXkgCSRkZXN0aW5hdGlvbl9zZXR0aW5ncwlJZiBwYXNzZWQgdGhlbiB0aGlzIGFycmF5IGlzIHVzZWQgaW5zdGVhZCBvZiBncmFiYmluZyBmcm9tIHNldHRpbmdzLgoJICoJQHJldHVybgkJYm9vbAkJCQkJCVNlbmQgc3RhdHVzLiB0cnVlIHN1Y2Nlc3MsIGZhbHNlIGZhaWxlZC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZW5kX3JlbW90ZV9kZXN0aW5hdGlvbiggJGRlc3RpbmF0aW9uX2lkLCAkZmlsZSwgJHRyaWdnZXIgPSAnJywgJHNlbmRfaW1wb3J0YnVkZHkgPSBmYWxzZSwgJGRlbGV0ZV9hZnRlciA9IGZhbHNlLCAkaWRlbnRpZmllciA9ICcnLCAkZGVzdGluYXRpb25fc2V0dGluZ3MgPSAnJyApIHsKCQkKCQlpZiAoICEgZmlsZV9leGlzdHMoICRmaWxlICkgKSB7CgkJCS8vIENoZWNrIGlmIHV0ZjggZGVjb2RpbmcgdGhlIGZpbGVuYW1lIGhlbHBzIHVzIGZpbmQgaXQuCgkJCSR1dGZfZGVjb2RlZF9maWxlbmFtZSA9IHV0ZjhfZGVjb2RlKCAkZmlsZSApOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkdXRmX2RlY29kZWRfZmlsZW5hbWUgKSApIHsKCQkJCSRmaWxlID0gJHV0Zl9kZWNvZGVkX2ZpbGVuYW1lOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NTgzNDg5NzM0OiBVbmFibGUgdG8gc2VuZCBmaWxlIGAnIC4gJGZpbGUgLiAnYCB0byByZW1vdGUgZGVzdGluYXRpb24gYXMgaXQgbm8gbG9uZ2VyIGV4aXN0cy4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIG9yIHBlcm1pc3Npb25zIGFyZSBpbnZhbGlkLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkKCQkkbWlncmF0aW9ua2V5X3RyYW5zaWVudF90aW1lID0gNjAqNjAqMjQ7CgkJCgkJaWYgKCAnJyA9PSAkZmlsZSApIHsKCQkJJGJhY2t1cF9maWxlX3NpemUgPSA1MDAwMDsgLy8gbm90IHN1cmUgd2h5IGFueXRoaW5nIGN1cnJlbnQgd291bGQgYmUgc2VuZGluZyBpbXBvcnRidWRkeSBidXQgTk9UIHNlbmRpbmcgYSBiYWNrdXAgYnV0IGp1c3QgaW4gY2FzZS4uLgoJCX0gZWxzZSB7CgkJCSRiYWNrdXBfZmlsZV9zaXplID0gZmlsZXNpemUoICRmaWxlICk7CgkJfQoJCQoJCS8vIEdlbmVyYXRlIHJlbW90ZSBzZW5kIElEIGZvciByZWZlcmVuY2UgYW5kIGFkZCBpdCBhcyBhIG5ldyBsb2dnaW5nIHNlcmlhbCBmb3IgYmV0dGVyIHJlY29yZGluZyBkZXRhaWxzLgoJCWlmICggJycgPT0gJGlkZW50aWZpZXIgKSB7CgkJCSRpZGVudGlmaWVyID0gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDEyICk7CgkJfQoJCQoJCS8vIFNldCBtaWdyYXRpb24ga2V5IGZvciBsYXRlciBkZXRlcm1pbmluZyBsYXN0IGluaXRpYXRlZCBtaWdyYXRpb24uCgkJaWYgKCAnbWlncmF0aW9uJyA9PSAkdHJpZ2dlciApIHsKCQkJc2V0X3RyYW5zaWVudCggJ3BiX2JhY2t1cGJ1ZGR5X21pZ3JhdGlvbmtleScsICRpZGVudGlmaWVyLCAkbWlncmF0aW9ua2V5X3RyYW5zaWVudF90aW1lICk7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NlbmRpbmcgZmlsZSBgJyAuICRmaWxlIC4gJ2AgdG8gcmVtb3RlIGRlc3RpbmF0aW9uIGAnIC4gJGRlc3RpbmF0aW9uX2lkIC4gJ2Agd2l0aCBJRCBgJyAuICRpZGVudGlmaWVyIC4gJ2AgdHJpZ2dlcmVkIGJ5IGAnIC4gJHRyaWdnZXIgLiAnYC4nICk7CgkJCgkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBYm91dCB0byBjcmVhdGUgaW5pdGlhbCBmaWxlb3B0aW9ucyBkYXRhLicgKTsKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMzUuJyApOwoJCSRmaWxlb3B0aW9uc19vYmogPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zL3NlbmQtJyAuICRpZGVudGlmaWVyIC4gJy50eHQnLCAkcmVhZF9vbmx5ID0gZmFsc2UsICRpZ25vcmVfbG9jayA9IHRydWUsICRjcmVhdGVfZmlsZSA9IHRydWUgKTsKCQlpZiAoIHRydWUgIT09ICggJHJlc3VsdCA9ICRmaWxlb3B0aW9uc19vYmotPmlzX29rKCkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oJ0ZhdGFsIEVycm9yICM5MDM0IEEuIFVuYWJsZSB0byBhY2Nlc3MgZmlsZW9wdGlvbnMgZGF0YS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgRXJyb3I6ICcgLiAkcmVzdWx0ICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBkYXRhIGxvYWRlZC4nICk7CgkJJGZpbGVvcHRpb25zID0gJiRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnM7IC8vIFNldCByZWZlcmVuY2UuCgkJCgkJLy8gUmVjb3JkIHNvbWUgc3RhdGlzdGljcy4KCQkkZmlsZW9wdGlvbnMgPSBhcnJheV9tZXJnZSgKCQkJc2VsZjo6Z2V0X3JlbW90ZV9zZW5kX2RlZmF1bHRzKCksCgkJCWFycmF5KAoJCQkJJ2Rlc3RpbmF0aW9uJwkJPT4JJGRlc3RpbmF0aW9uX2lkLAoJCQkJJ2ZpbGUnCQkJCT0+CSRmaWxlLAoJCQkJJ2ZpbGVfc2l6ZScJCQk9PgkkYmFja3VwX2ZpbGVfc2l6ZSwKCQkJCSd0cmlnZ2VyJwkJCT0+CSR0cmlnZ2VyLAkJCQkJCS8vIFdoYXQgdHJpZ2dlcmVkIHRoaXMgYmFja3VwLiBWYWxpZCB2YWx1ZXM6IHNjaGVkdWxlZCwgbWFudWFsLgoJCQkJJ3NlbmRfaW1wb3J0YnVkZHknCT0+CSRzZW5kX2ltcG9ydGJ1ZGR5LAoJCQkJJ3N0YXJ0X3RpbWUnCQk9Pgl0aW1lKCksCgkJCQknZmluaXNoX3RpbWUnCQk9PgkwLAoJCQkJJ3N0YXR1cycJCQk9PgkncnVubmluZycsICAvLyBzdWNjZXNzLCBmYWlsdXJlLCBydW5uaW5nLCB0aW1lb3V0IChkZWZhdWx0IGFzc3VtcHRpb24gaWYgdGhpcyBpcyBub3QgdXBkYXRlZCBpbiB0aGlzIFBIUCBsb2FkKQoJCQkJJ3dyaXRlX3NwZWVkJwkJPT4JMCwKCQkJKQoJCSk7CgkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkKCQkvLyBEZXN0aW5hdGlvbiBzZXR0aW5ncyB3ZXJlIG5vdCBwYXNzZWQgc28gZ2V0IHRoZW0gYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uIElEIHByb3ZpZGVkLgoJCWlmICggISBpc19hcnJheSggJGRlc3RpbmF0aW9uX3NldHRpbmdzICkgKSB7CgkJCSRkZXN0aW5hdGlvbl9zZXR0aW5ncyA9ICZwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9kZXN0aW5hdGlvbnMnXVskZGVzdGluYXRpb25faWRdOwoJCX0KCQkKCQlpZiAoICRzZW5kX2ltcG9ydGJ1ZGR5ID09PSB0cnVlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdHZW5lcmF0aW5nIHRlbXBvcmFyeSBpbXBvcnRidWRkeS5waHAgZmlsZSBmb3IgcmVtb3RlIHNlbmQuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6YW50aV9kaXJlY3RvcnlfYnJvd3NpbmcoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSwgJGRpZSA9IGZhbHNlICk7CgkJCSRpbXBvcnRidWRkeV90ZW1wID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJ2ltcG9ydGJ1ZGR5LnBocCc7IC8vIEZ1bGwgcGF0aCAmIGZpbGVuYW1lIHRvIHRlbXBvcmFyeSBpbXBvcnRidWRkeQoJCQlzZWxmOjppbXBvcnRidWRkeSggJGltcG9ydGJ1ZGR5X3RlbXAgKTsgLy8gQ3JlYXRlIHRlbXBvcmFyeSBpbXBvcnRidWRkeS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnR2VuZXJhdGVkIHRlbXBvcmFyeSBpbXBvcnRidWRkeS4nICk7CgkJCSRpbXBvcnRidWRkeV9maWxlID0gJGltcG9ydGJ1ZGR5X3RlbXA7IC8vIEFkZCBpbXBvcnRidWRkeSBmaWxlIHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHNlbmQuCgkJCSRzZW5kX2ltcG9ydGJ1ZGR5ID0gdHJ1ZTsgLy8gVHJhY2sgdG8gZGVsZXRlIGFmdGVyIGZpbmlzaGVkLgoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vdCBzZW5kaW5nIGltcG9ydGJ1ZGR5LicgKTsKCQl9CgkJCgkJCgkJLy8gQ2xlYXIgZmlsZW9wdGlvbnMgc28gb3RoZXIgc3R1ZmYgY2FuIGFjY2VzcyBpdCBpZiBuZWVkZWQuCgkJJGZpbGVvcHRpb25zX29iai0+c2F2ZSgpOwoJCSRmaWxlb3B0aW9uc19vYmotPnVubG9jaygpOwoJCXVuc2V0KCAkZmlsZW9wdGlvbnNfb2JqICk7CgkJCgkJCgkJLy8gUGFzcyBvZmYgdG8gZGVzdGluYXRpb24gaGFuZGxlci4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9kZXN0aW5hdGlvbnMvYm9vdHN0cmFwLnBocCcgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDYWxsaW5nIGRlc3RpbmF0aW9uIHNlbmQoKSBmdW5jdGlvbi4nICk7CgkJJHNlbmRfcmVzdWx0ID0gcGJfYmFja3VwYnVkZHlfZGVzdGluYXRpb25zOjpzZW5kKCAkZGVzdGluYXRpb25fc2V0dGluZ3MsICRmaWxlLCAkaWRlbnRpZmllciwgJGRlbGV0ZV9hZnRlciApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGRlc3RpbmF0aW9uIHNlbmQoKSBmdW5jdGlvbi4nICk7CgoJCWlmICggISBlbXB0eSggJHNlbmRfaW1wb3J0YnVkZHkgKSAmJiBpc19yZWFkYWJsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2FsbGluZyBkZXN0aW5hdGlvbiBzZW5kKCkgZnVuY3Rpb24gZm9yIGltcG9ydGJ1ZGR5LnBocC4nICk7CgkJCSRzZW5kX3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5X2Rlc3RpbmF0aW9uczo6c2VuZCggJGRlc3RpbmF0aW9uX3NldHRpbmdzLCAkaW1wb3J0YnVkZHlfZmlsZSwgJGlkZW50aWZpZXIsICRkZWxldGVfYWZ0ZXIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgZGVzdGluYXRpb24gc2VuZCgpIGZ1bmN0aW9uIGZvciBpbXBvcnRidWRkeS5waHAuJyApOwoKCQl9CgkJCgkJc2VsZjo6a2lja19kYigpOyAvLyBLaWNrIHRoZSBkYXRhYmFzZSB0byBtYWtlIHN1cmUgaXQgZGlkbid0IGdvIGF3YXksIHByZXZlbnRpbmcgb3B0aW9ucyBzYXZpbmcuCgkJCgkJLy8gUmVsb2FkIGZpbGVvcHRpb25zLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIGxvYWQgZmlsZW9wdGlvbnMgZGF0YSBmb3Igc2F2aW5nIHNlbmQgc3RhdHVzLicgKTsKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMzQuJyApOwoJCSRmaWxlb3B0aW9uc19vYmogPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zL3NlbmQtJyAuICRpZGVudGlmaWVyIC4gJy50eHQnLCAkcmVhZF9vbmx5ID0gZmFsc2UsICRpZ25vcmVfbG9jayA9IGZhbHNlLCAkY3JlYXRlX2ZpbGUgPSBmYWxzZSApOwoJCWlmICggdHJ1ZSAhPT0gKCAkcmVzdWx0ID0gJGZpbGVvcHRpb25zX29iai0+aXNfb2soKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCBfXygnRmF0YWwgRXJyb3IgIzkwMzQgRy4gVW5hYmxlIHRvIGFjY2VzcyBmaWxlb3B0aW9ucyBkYXRhLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBFcnJvcjogJyAuICRyZXN1bHQgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBkYXRhIGxvYWRlZCBmb3IgSUQgYCcgLiAkaWRlbnRpZmllciAuICdgLicgKTsKCQkkZmlsZW9wdGlvbnMgPSAmJGZpbGVvcHRpb25zX29iai0+b3B0aW9uczsgLy8gU2V0IHJlZmVyZW5jZS4KCQkKCQkKCQkvLyBVcGRhdGUgc3RhdHMuCgkJJGZpbGVvcHRpb25zWyRpZGVudGlmaWVyXVsnZmluaXNoX3RpbWUnXSA9IG1pY3JvdGltZSh0cnVlKTsKCQlpZiAoICRzZW5kX3Jlc3VsdCA9PT0gdHJ1ZSApIHsgLy8gc3VjY2VlZGVkLgoJCQkkZmlsZW9wdGlvbnNbJ3N0YXR1cyddID0gJ3N1Y2Nlc3MnOwoJCQkkZmlsZW9wdGlvbnNbJ2ZpbmlzaF90aW1lJ10gPSBtaWNyb3RpbWUodHJ1ZSk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlbW90ZSBzZW5kIFNVQ0NFU1MuJyApOwoJCX0gZWxzZWlmICggJHNlbmRfcmVzdWx0ID09PSBmYWxzZSApIHsgLy8gZmFpbGVkLgoJCQkkZmlsZW9wdGlvbnNbJ3N0YXR1cyddID0gJ2ZhaWx1cmUnOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW1vdGUgc2VuZCBGQUlMVVJFLicgKTsKCQl9IGVsc2VpZiAoIGlzX2FycmF5KCAkc2VuZF9yZXN1bHQgKSApIHsgLy8gQXJyYXkgc28gbXVsdGlwYXJ0LgoJCQkkZmlsZW9wdGlvbnNbJ3N0YXR1cyddID0gJ211bHRpcGFydCc7CgkJCSRmaWxlb3B0aW9uc1snZmluaXNoX3RpbWUnXSA9IDA7CgkJCSRmaWxlb3B0aW9uc1snX211bHRpcGFydF9pZCddID0gJHNlbmRfcmVzdWx0WzBdOwoJCQkkZmlsZW9wdGlvbnNbJ19tdWx0aXBhcnRfc3RhdHVzJ10gPSAkc2VuZF9yZXN1bHRbMV07CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ011bHRpcGFydCBzZW5kIGluIHByb2dyZXNzLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzU0ODU3ODU1NzY0NjMuIEludmFsaWQgc3RhdHVzIHNlbmQgcmVzdWx0OiBgJyAuICRzZW5kX3Jlc3VsdCAuICdgLicgKTsKCQl9CgkJJGZpbGVvcHRpb25zX29iai0+c2F2ZSgpOwoJCQoJCQoJCS8vIElmIHdlIHNlbnQgaW1wb3J0YnVkZHkgdGhlbiBkZWxldGUgdGhlIGxvY2FsIGNvcHkgdG8gY2xlYW4gdXAuCgkJaWYgKCAkc2VuZF9pbXBvcnRidWRkeSAhPT0gZmFsc2UgKSB7CgkJCUB1bmxpbmsoICRpbXBvcnRidWRkeV90ZW1wICk7IC8vIERlbGV0ZSB0ZW1wb3JhcnkgaW1wb3J0YnVkZHkuCgkJfQoJCQoJCS8vIEFzIG9mIHY1LjA6IFBvc3Qtc2VuZCBkZWxldGlvbiBub3cgaGFuZGxlZCB3aXRoaW4gZGVzdGluYXRpb25zL2Jvb3RzdHJhcC5waHAgc2VuZCgpIHRvIHN1cHBvcnQgY2h1bmtlZCBzZW5kcy4KCQkKCQlyZXR1cm4gJHNlbmRfcmVzdWx0OwoJCQoJfSAvLyBFbmQgc2VuZF9yZW1vdGVfZGVzdGluYXRpb24oKS4KCQoJCgkKCS8qCWRlc3RpbmF0aW9uX3NlbmQoKQoJICoJCgkgKglTZW5kIGZpbGUocykgdG8gYSBkZXN0aW5hdGlvbi4gUGFzcyBmdWxsIGFycmF5IG9mIGRlc3RpbmF0aW9uIHNldHRpbmdzLgoJICoJCgkgKglAcGFyYW0JCWFycmF5CQkkZGVzdGluYXRpb25fc2V0dGluZ3MJCUFsbCBzZXR0aW5ncyBmb3IgdGhpcyBkZXN0aW5hdGlvbiBmb3IgdGhpcyBhY3Rpb24uCgkgKglAcGFyYW0JCWFycmF5CQkkZmlsZXMJCQkJCQlBcnJheSBvZiBmaWxlcyB0byBzZW5kIChmdWxsIHBhdGgpLgoJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQkJCQkJQm9vbCB0cnVlID0gc3VjY2VzcywgYm9vbCBmYWxzZSA9IGZhaWwsIGFycmF5ID0gbXVsdGlwYXJ0IHRyYW5zZmVyLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc3RpbmF0aW9uX3NlbmQoICRkZXN0aW5hdGlvbl9zZXR0aW5ncywgJGZpbGVzLCAkc2VuZF9pZCA9ICcnLCAkZGVsZXRlX2FmdGVyID0gZmFsc2UsICRpc1JldHJ5ID0gZmFsc2UgKSB7CgkJCgkJLy8gUGFzcyBvZmYgdG8gZGVzdGluYXRpb24gaGFuZGxlci4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9kZXN0aW5hdGlvbnMvYm9vdHN0cmFwLnBocCcgKTsKCQkkc2VuZF9yZXN1bHQgPSBwYl9iYWNrdXBidWRkeV9kZXN0aW5hdGlvbnM6OnNlbmQoICRkZXN0aW5hdGlvbl9zZXR0aW5ncywgJGZpbGVzLCAkc2VuZF9pZCwgJGRlbGV0ZV9hZnRlciwgJGlzUmV0cnkgKTsKCQkKCQlyZXR1cm4gJHNlbmRfcmVzdWx0OwoJCQoJfSAvLyBFbmQgZGVzdGluYXRpb25fc2VuZCgpLgoJCgkKCQoJLyoJYmFja3Vwc19saXN0KCkKCSAqCQoJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSR0eXBlCQkJVmFsaWQgb3B0aW9uczogZGVmYXVsdCwgbWlncmF0ZQoJICoJQHBhcmFtCQlib29sZWFuCQkkc3Vic2l0ZV9tb2RlCVdoZW4gaW4gc3Vic2l0ZSBtb2RlIG9ubHkgYmFja3VwcyBmb3IgdGhhdCBzcGVjaWZpYyBzdWJzaXRlIHdpbGwgYmUgbGlzdGVkLgoJICoJQHJldHVybgkJCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYmFja3Vwc19saXN0KCAkdHlwZSA9ICdkZWZhdWx0JywgJHN1YnNpdGVfbW9kZSA9IGZhbHNlICkgewoJCQoJCWlmICggKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdidWxrX2FjdGlvbicgKSA9PSAnZGVsZXRlX2JhY2t1cCcgKSAmJiAoIGlzX2FycmF5KCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdpdGVtcycgKSApICkgKSB7CgkJCSRuZWVkc19zYXZlID0gZmFsc2U7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojp2ZXJpZnlfbm9uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ193cG5vbmNlJyApICk7IC8vIFNlY3VyaXR5IGNoZWNrIHRvIHByZXZlbnQgdW5hdXRob3JpemVkIGRlbGV0aW9ucyBieSBwb3N0aW5nIGZyb20gYSByZW1vdGUgcGxhY2UuCgkJCSRkZWxldGVkX2ZpbGVzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnaXRlbXMnICkgYXMgJGl0ZW0gKSB7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICRpdGVtICkgKSB7CgkJCQkJaWYgKCBAdW5saW5rKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICRpdGVtICkgPT09IHRydWUgKSB7CgkJCQkJCSRkZWxldGVkX2ZpbGVzW10gPSAkaXRlbTsKCQkJCQkJCgkJCQkJCS8vIENsZWFudXAgYW55IHJlbGF0ZWQgZmlsZW9wdGlvbnMgZmlsZXMuCgkJCQkJCSRzZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGl0ZW0gKTsKCQkJCQkJCgkJCQkJCSRiYWNrdXBfZmlsZXMgPSBnbG9iKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICcqLnppcCcgKTsKCQkJCQkJaWYgKCAhIGlzX2FycmF5KCAkYmFja3VwX2ZpbGVzICkgKSB7CgkJCQkJCQkkYmFja3VwX2ZpbGVzID0gYXJyYXkoKTsKCQkJCQkJfQoJCQkJCQlpZiAoIGNvdW50KCAkYmFja3VwX2ZpbGVzICkgPiA1ICkgeyAvLyBLZWVwIGEgbWluaW11bSBudW1iZXIgb2YgYmFja3VwcyBpbiBhcnJheSBmb3Igc3RhdHMuCgkJCQkJCQkkdGhpc19zZXJpYWwgPSBzZWxmOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGl0ZW0gKTsKCQkJCQkJCSRmaWxlb3B0aW9uc19maWxlID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuICR0aGlzX3NlcmlhbCAuICcudHh0JzsKCQkJCQkJCWlmICggZmlsZV9leGlzdHMoICRmaWxlb3B0aW9uc19maWxlICkgKSB7CgkJCQkJCQkJQHVubGluayggJGZpbGVvcHRpb25zX2ZpbGUgKTsKCQkJCQkJCX0KCQkJCQkJCWlmICggZmlsZV9leGlzdHMoICRmaWxlb3B0aW9uc19maWxlIC4gJy5sb2NrJyApICkgewoJCQkJCQkJCUB1bmxpbmsoICRmaWxlb3B0aW9uc19maWxlIC4gJy5sb2NrJyApOwoJCQkJCQkJfQoJCQkJCQkJJG5lZWRzX3NhdmUgPSB0cnVlOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3I6IFVuYWJsZSB0byBkZWxldGUgYmFja3VwIGZpbGUgYCcgLiAkaXRlbSAuICdgLiBQbGVhc2UgdmVyaWZ5IHBlcm1pc3Npb25zLicsIHRydWUgKTsKCQkJCQl9CgkJCQl9IC8vIEVuZCBpZiBmaWxlIGV4aXN0cy4KCQkJfSAvLyBFbmQgZm9yZWFjaC4KCQkJaWYgKCAkbmVlZHNfc2F2ZSA9PT0gdHJ1ZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJCX0KCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggX18oICdEZWxldGVkOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gaW1wbG9kZSggJywgJywgJGRlbGV0ZWRfZmlsZXMgKSApOwoJCX0gLy8gRW5kIGlmIGRlbGV0aW5nIGJhY2t1cChzKS4KCQkKCQkKCQkkYmFja3VwcyA9IGFycmF5KCk7CgkJJGJhY2t1cF9zb3J0X2RhdGVzID0gYXJyYXkoKTsKCQkKCQkkZmlsZXMgPSBnbG9iKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICdiYWNrdXAqLnppcCcgKTsKCQlpZiAoICEgaXNfYXJyYXkoICRmaWxlcyApICkgewoJCQkkZmlsZXMgPSBhcnJheSgpOwoJCX0KCQkKCQkkZmlsZXMyID0gZ2xvYiggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgLiAnc25hcHNob3QqLnppcCcgKTsKCQlpZiAoICEgaXNfYXJyYXkoICRmaWxlczIgKSApIHsKCQkJJGZpbGVzMiA9IGFycmF5KCk7CgkJfQoJCQoJCSRmaWxlcyA9IGFycmF5X21lcmdlKCAkZmlsZXMsICRmaWxlczIgKTsKCQkKCQlpZiAoIGlzX2FycmF5KCAkZmlsZXMgKSAmJiAhZW1wdHkoICRmaWxlcyApICkgeyAvLyBGb3Igcm9idXN0bmVzcy4gV2l0aG91dCBvcGVuX2Jhc2VkaXIgdGhlIGdsb2IoKSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBubyBtYXRjaC4gV2l0aCBvcGVuX2Jhc2VkaXIgaW4gZWZmZWN0IHRoZSBnbG9iKCkgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gZmFsc2UgZm9yIG5vIG1hdGNoLgoJCQkKCQkJJGJhY2t1cF9wcmVmaXggPSBzZWxmOjpiYWNrdXBfcHJlZml4KCk7IC8vIEJhY2t1cCBwcmVmaXggZm9yIHRoaXMgc2l0ZS4gVXNlZCBmb3IgTVMgY2hlY2tpbmcgdGhhdCB0aGlzIHVzZXIgY2FuIHNlZSB0aGlzIGJhY2t1cC4KCQkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlX2lkID0+ICRmaWxlICkgewoJCQkJCgkJCQlpZiAoICggJHN1YnNpdGVfbW9kZSA9PT0gdHJ1ZSApICYmIGlzX211bHRpc2l0ZSgpICkgeyAvLyBJZiBhIE5ldHdvcmsgYW5kIE5PVCB0aGUgc3VwZXJhZG1pbiBtdXN0IG1ha2Ugc3VyZSB0aGV5IGNhbiBvbmx5IHNlZSB0aGUgc3BlY2lmaWMgc3Vic2l0ZSBiYWNrdXBzIGZvciBzZWN1cml0eSBwdXJwb3Nlcy4KCQkJCQkKCQkJCQkvLyBPbmx5IGFsbG93IHZpZXdpbmcgb2YgdGhlaXIgb3duIGJhY2t1cHMuCgkJCQkJaWYgKCAhIHN0cnN0ciggJGZpbGUsICRiYWNrdXBfcHJlZml4ICkgKSB7CgkJCQkJCXVuc2V0KCAkZmlsZXNbJGZpbGVfaWRdICk7IC8vIFJlbW92ZSB0aGlzIGJhY2t1cCBmcm9tIHRoZSBsaXN0LiBUaGlzIHVzZXIgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gaXQuCgkJCQkJCWNvbnRpbnVlOyAvLyBTa2lwIHByb2Nlc3NpbmcgdG8gbmV4dCBmaWxlLgoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJJHNlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkZmlsZSApOwoJCQkJCgkJCQkkb3B0aW9ucyA9IGFycmF5KCk7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHNlcmlhbCAuICcudHh0JyApICkgewoJCQkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJyApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMzMy4nICk7CgkJCQkJJGJhY2t1cF9vcHRpb25zID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2ZpbGVvcHRpb25zKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHNlcmlhbCAuICcudHh0JywgJHJlYWRfb25seSA9IGZhbHNlLCAkaWdub3JlX2xvY2sgPSBmYWxzZSwgJGNyZWF0ZV9maWxlID0gdHJ1ZSApOyAvLyBXaWxsIGNyZWF0ZSBmaWxlIHRvIGhvbGQgaW50ZWdyaXR5IGRhdGEgaWYgbm90aGluZyBleGlzdHMuCgkJCQl9IGVsc2UgewoJCQkJCSRiYWNrdXBfb3B0aW9ucyA9ICcnOwoJCQkJfQoJCQkJJGJhY2t1cF9pbnRlZ3JpdHkgPSBiYWNrdXBidWRkeV9jb3JlOjpiYWNrdXBfaW50ZWdyaXR5X2NoZWNrKCAkZmlsZSwgJGJhY2t1cF9vcHRpb25zLCAkb3B0aW9ucyApOwoJCQkJCgkJCQkvLyBCYWNrdXAgc3RhdHVzLgoJCQkJJHByZXR0eV9zdGF0dXMgPSBhcnJheSgKCQkJCQl0cnVlCT0+CSc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtc3VjY2VzcyI+R29vZDwvc3Bhbj4nLCAvLyB2NC4wKyBHb29kLgoJCQkJCSdwYXNzJwk9PgknPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXN1Y2Nlc3MiPkdvb2Q8L3NwYW4+JywgLy8gUHJlLXY0LjAgR29vZC4KCQkJCQlmYWxzZQk9PgknPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWltcG9ydGFudCI+QmFkPC9zcGFuPicsICAvLyB2NC4wKyBCYWQuCgkJCQkJJ2ZhaWwnCT0+CSc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtaW1wb3J0YW50Ij5CYWQ8L3NwYW4+JywgIC8vIFByZS12NC4wIEJhZC4KCQkJCSk7CgkJCQkKCQkJCS8vIEJhY2t1cCB0eXBlLgoJCQkJJHByZXR0eV90eXBlID0gYXJyYXkoCgkJCQkJJ2Z1bGwnCQk9PgknRnVsbCcsCgkJCQkJJ2RiJwkJPT4JJ0RhdGFiYXNlJywKCQkJCQknZmlsZXMnCQk9PgknRmlsZXMnLAoJCQkJCSd0aGVtZXMnCT0+CSdUaGVtZXMnLAoJCQkJCSdwbHVnaW5zJwk9PgknUGx1Z2lucycsCgkJCQkpOwoJCQkJCgkJCQkKCQkJCS8vIERlZmF1bHRzLi4uCgkJCQkkZGV0ZWN0ZWRfdHlwZSA9ICcnOwoJCQkJJGZpbGVfc2l6ZSA9ICcnOwoJCQkJJG1vZGlmaWVkID0gJyc7CgkJCQkkbW9kaWZpZWRfdGltZSA9IDA7CgkJCQkkaW50ZWdyaXR5ID0gJyc7CgkJCQkKCQkJCSRtYWluX3N0cmluZyA9ICdXYXJuIzI4NC4nOwoJCQkJaWYgKCBpc19hcnJheSggJGJhY2t1cF9pbnRlZ3JpdHkgKSApIHsgLy8gRGF0YSBpbnRhY3QuLi4gcHV0IGl0IGFsbCB0b2dldGhlci4KCQkJCQkvLyBDYWxjdWxhdGUgdGltZSBhZ28uCgkJCQkJJHRpbWVfYWdvID0gJyc7CgkJCQkJaWYgKCBpc3NldCggJGJhY2t1cF9pbnRlZ3JpdHlbJ21vZGlmaWVkJ10gKSApIHsKCQkJCQkJJHRpbWVfYWdvID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnRpbWVfYWdvKCAkYmFja3VwX2ludGVncml0eVsnbW9kaWZpZWQnXSApIC4gJyBhZ28nOwoJCQkJCX0KCQkJCQkKCQkJCQkkZGV0ZWN0ZWRfdHlwZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5wcmV0dGlmeSggJGJhY2t1cF9pbnRlZ3JpdHlbJ2RldGVjdGVkX3R5cGUnXSwgJHByZXR0eV90eXBlICk7CgkJCQkJaWYgKCAkZGV0ZWN0ZWRfdHlwZSA9PSAnJyApIHsKCQkJCQkJJGRldGVjdGVkX3R5cGUgPSBiYWNrdXBidWRkeV9jb3JlOjpwcmV0dHlfYmFja3VwX3R5cGUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cFR5cGVGcm9tRmlsZSggJGZpbGUgKSApOwoJCQkJCQlpZiAoICcnID09ICRkZXRlY3RlZF90eXBlICkgewoJCQkJCQkJJGRldGVjdGVkX3R5cGUgPSAnPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5Vbmtub3duPC9zcGFuPic7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ3Byb2ZpbGUnXSApICkgewoJCQkJCQkJJGRldGVjdGVkX3R5cGUgPSAnCgkJCQkJCQk8ZGl2PgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwcm9maWxlX3R5cGUtJyAuICRiYWNrdXBfaW50ZWdyaXR5WydkZXRlY3RlZF90eXBlJ10gLiAnIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IiB0aXRsZT0iJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OnByZXR0eV9iYWNrdXBfdHlwZSggJGRldGVjdGVkX3R5cGUgKSAuICciPjwvc3Bhbj4KCQkJCQkJCQk8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmbG9hdDogbGVmdDsgaGVpZ2h0OiAxNXB4OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjRUJFQkVCOyBtYXJnaW4tbGVmdDogNnB4OyBtYXJnaW4tcmlnaHQ6IDZweDsiPjwvc3Bhbj4KCQkJCQkJCQknIC4gaHRtbGVudGl0aWVzKCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ3Byb2ZpbGUnXVsndGl0bGUnXSApIC4gJwoJCQkJCQkJPC9kaXY+CgkJCQkJCQknCgkJCQkJCQk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQkJJGZpbGVfc2l6ZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRiYWNrdXBfaW50ZWdyaXR5WydzaXplJ10gKTsKCQkJCQkkbW9kaWZpZWQgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoICRiYWNrdXBfaW50ZWdyaXR5Wydtb2RpZmllZCddICksICdsLCBGIGosIFkgLSBnOmk6cyBhJyApOwoJCQkJCSRtb2RpZmllZF90aW1lID0gJGJhY2t1cF9pbnRlZ3JpdHlbJ21vZGlmaWVkJ107CgkJCQkJaWYgKCBpc3NldCggJGJhY2t1cF9pbnRlZ3JpdHlbJ3N0YXR1cyddICkgKSB7IC8vIFByZS12NC4wLgoJCQkJCQkkc3RhdHVzID0gJGJhY2t1cF9pbnRlZ3JpdHlbJ3N0YXR1cyddOwoJCQkJCX0gZWxzZSB7IC8vIHY0LjArCgkJCQkJCSRzdGF0dXMgPSAkYmFja3VwX2ludGVncml0eVsnaXNfb2snXTsKCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJLy8gQ2FsY3VsYXRlIG1haW4gcm93IHN0cmluZy4KCQkJCQlpZiAoICR0eXBlID09ICdkZWZhdWx0JyApIHsgLy8gRGVmYXVsdCBiYWNrdXAgbGlzdGluZy4KCQkJCQkJJG1haW5fc3RyaW5nID0gJzxhIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdkb3dubG9hZF9hcmNoaXZlJyApIC4gJyZiYWNrdXBidWRkeV9iYWNrdXA9JyAuIGJhc2VuYW1lKCAkZmlsZSApIC4gJyIgY2xhc3M9ImJhY2t1cGJ1ZGR5RmlsZVRpdGxlIiB0aXRsZT0iJyAuIGJhc2VuYW1lKCAkZmlsZSApIC4gJyI+JyAuICRtb2RpZmllZCAuICcgKCcgLiAkdGltZV9hZ28gLiAnKTwvYT4nOwoJCQkJCX0gZWxzZWlmICggJHR5cGUgPT0gJ21pZ3JhdGUnICkgeyAvLyBNaWdyYXRpb24gYmFja3VwIGxpc3RpbmcuCgkJCQkJCSRtYWluX3N0cmluZyA9ICc8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfaG92ZXJhY3Rpb25fbWlncmF0ZSBiYWNrdXBidWRkeUZpbGVUaXRsZSIgcmVsPSInIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnIiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnJm1pZ3JhdGU9JyAuIGJhc2VuYW1lKCAkZmlsZSApIC4gJyZ2YWx1ZT0nIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnIiB0aXRsZT0iJyAuIGJhc2VuYW1lKCAkZmlsZSApIC4gJyI+JyAuICRtb2RpZmllZCAuICcgKCcgLiAkdGltZV9hZ28gLiAnKTwvYT4nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRtYWluX3N0cmluZyA9ICd7VW5rbm93biB0eXBlLn0nOwoJCQkJCX0KCQkJCQkvLyBBZGQgY29tbWVudCB0byBtYWluIHJvdyBzdHJpbmcgaWYgYXBwbGljYWJsZS4KCQkJCQlpZiAoIGlzc2V0KCAkYmFja3VwX2ludGVncml0eVsnY29tbWVudCddICkgJiYgKCAkYmFja3VwX2ludGVncml0eVsnY29tbWVudCddICE9PSBmYWxzZSApICYmICggJGJhY2t1cF9pbnRlZ3JpdHlbJ2NvbW1lbnQnXSAhPT0gJycgKSApIHsKCQkJCQkJJG1haW5fc3RyaW5nIC49ICc8YnI+PHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5Ob3RlOiA8c3BhbiBjbGFzcz0icGJfYmFja3VwYnVkZHlfbm90ZXRleHQiPicgLiBodG1sZW50aXRpZXMoICRiYWNrdXBfaW50ZWdyaXR5Wydjb21tZW50J10gKSAuICc8L3NwYW4+PC9zcGFuPic7CgkJCQkJfQoJCQkJCQoJCQkJCS8vIE5vIGludGVncml0eSBjaGVjayBmb3IgdGhlbWVzIG9yIHBsdWdpbnMgdHlwZXMuCgkJCQkJJHJhd190eXBlID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwVHlwZUZyb21GaWxlKCAkZmlsZSApOwoJCQkJCWlmICggKCAndGhlbWVzJyA9PSAkcmF3X3R5cGUgKSB8fCAoICdwbHVnaW5zJyA9PSAkcmF3X3R5cGUgKSB8fCAoICdtZWRpYScgPT0gJHJhd190eXBlICkgfHwgKCAnZmlsZXMnID09ICRyYXdfdHlwZSApICkgewoJCQkJCQl1bnNldCggJGZpbGVDb3VudCApOwoJCQkJCQlmb3JlYWNoKCAoYXJyYXkpJGJhY2t1cF9pbnRlZ3JpdHlbJ3Rlc3RzJ10gYXMgJHRlc3QgKSB7CgkJCQkJCQlpZiAoIGlzc2V0KCAkdGVzdFsnZmlsZUNvdW50J10gKSApIHsKCQkJCQkJCQkkZmlsZUNvdW50ID0gJHRlc3RbJ2ZpbGVDb3VudCddOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSRpbnRlZ3JpdHkgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+cHJldHRpZnkoICRzdGF0dXMsICRwcmV0dHlfc3RhdHVzICkgLiAnICc7CgkJCQkJCWlmICggaXNzZXQoICRmaWxlQ291bnQgKSApIHsKCQkJCQkJCSRpbnRlZ3JpdHkgLj0gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPicgLiAkZmlsZUNvdW50IC4gJyAnIC4gX18oICdmaWxlcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvc3Bhbj4gJzsgLy8gVE9ETzogSGlkZGVuIHVudGlsIGZ1dHVyZSB2ZXJzaW9uLgoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGludGVncml0eSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5wcmV0dGlmeSggJHN0YXR1cywgJHByZXR0eV9zdGF0dXMgKSAuICcgJzsKCQkJCQl9CgkJCQkJCgkJCQkJaWYgKCBpc3NldCggJGJhY2t1cF9pbnRlZ3JpdHlbJ3NjYW5fbm90ZXMnXSApICYmIGNvdW50KCAoYXJyYXkpJGJhY2t1cF9pbnRlZ3JpdHlbJ3NjYW5fbm90ZXMnXSApID4gMCApIHsKCQkJCQkJZm9yZWFjaCggKGFycmF5KSRiYWNrdXBfaW50ZWdyaXR5WydzY2FuX25vdGVzJ10gYXMgJHNjYW5fbm90ZSApIHsKCQkJCQkJCSRpbnRlZ3JpdHkgLj0gJHNjYW5fbm90ZSAuICcgJzsKCQkJCQkJfQoJCQkJCX0KCQkJCQkkaW50ZWdyaXR5IC49ICc8YSBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnJnJlc2V0X2ludGVncml0eT0nIC4gJHNlcmlhbCAgLiAnIiB0aXRsZT0iUmVzY2FuIGludGVncml0eS4gTGFzdCBjaGVja2VkICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggJGJhY2t1cF9pbnRlZ3JpdHlbJ3NjYW5fdGltZSddICkgLiAnLiI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+PC9hPic7CgkJCQkJJGludGVncml0eSAuPSAnPGRpdiBjbGFzcz0icm93LWFjdGlvbnMiPjxhIHRpdGxlPSInIC4gX18oICdCYWNrdXAgU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnaW50ZWdyaXR5X3N0YXR1cycgKSAuICcmc2VyaWFsPScgLiAkc2VyaWFsIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94Ij4nIC4gX18oICdWaWV3IERldGFpbHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2E+PC9kaXY+JzsKCQkJCQkKCQkJCQkkc3VtTG9nRmlsZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ3N0YXR1cy0nIC4gJHNlcmlhbCAuICdfJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQkJCWlmICggZmlsZV9leGlzdHMoICRzdW1Mb2dGaWxlICkgKSB7CgkJCQkJCSRpbnRlZ3JpdHkgLj0gJzxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIj48YSB0aXRsZT0iJyAuIF9fKCAnVmlldyBCYWNrdXAgTG9nJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAndmlld19sb2cnICkgLiAnJnNlcmlhbD0nIC4gJHNlcmlhbCAuICcmIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCI+JyAuIF9fKCAnVmlldyBMb2cnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2E+PC9kaXY+JzsKCQkJCQl9CgkJCQkJCgkJCQl9IC8vIGVuZCBpZiBpc19hcnJheSggJGJhY2t1cF9vcHRpb25zICkuCgkJCQkKCQkJCQoJCQkJCgkJCQkkaW50ZWdyaXR5IC49ICc8ZGl2IGNsYXNzPSJyb3ctYWN0aW9ucyI+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2hvdmVyYWN0aW9uX2hhc2giIHJlbD0iJyAuIGJhc2VuYW1lKCAkZmlsZSApIC4gJyI+VmlldyBDaGVja3N1bTwvYT48L2Rpdj4nOwoJCQkJCgkJCQkkYmFja3Vwc1tiYXNlbmFtZSggJGZpbGUgKV0gPSBhcnJheSgKCQkJCQlhcnJheSggYmFzZW5hbWUoICRmaWxlICksICRtYWluX3N0cmluZyAuICc8YnI+PHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIiBzdHlsZT0iY29sb3I6ICNBQUE7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXRvcDogNXB4OyI+JyAuIGJhc2VuYW1lKCAkZmlsZSApIC4gJzwvc3Bhbj4nICksCgkJCQkJJGRldGVjdGVkX3R5cGUsCgkJCQkJJGZpbGVfc2l6ZSwKCQkJCQkkaW50ZWdyaXR5LAoJCQkJKTsKCgoJCQkJJGJhY2t1cF9zb3J0X2RhdGVzW2Jhc2VuYW1lKCAkZmlsZSldID0gJG1vZGlmaWVkX3RpbWU7CgoJCQl9IC8vIEVuZCBmb3JlYWNoKCkuCgoJCX0gLy8gRW5kIGlmLgoKCQkvLyBTb3J0IGJhY2t1cCBieSBkYXRlLgoJCWFyc29ydCggJGJhY2t1cF9zb3J0X2RhdGVzICk7CgkJLy8gUmUtYXJyYW5nZSBiYWNrdXBzIGJhc2VkIG9uIHNvcnQgZGF0ZXMuCgkJJHNvcnRlZF9iYWNrdXBzID0gYXJyYXkoKTsKCQlmb3JlYWNoKCAkYmFja3VwX3NvcnRfZGF0ZXMgYXMgJGJhY2t1cF9maWxlID0+ICRiYWNrdXBfc29ydF9kYXRlICkgewoJCQkkc29ydGVkX2JhY2t1cHNbJGJhY2t1cF9maWxlXSA9ICRiYWNrdXBzWyRiYWNrdXBfZmlsZV07CgkJCXVuc2V0KCAkYmFja3Vwc1skYmFja3VwX2ZpbGVdICk7CgkJfQoJCXVuc2V0KCAkYmFja3VwcyApOwoKCgkJcmV0dXJuICRzb3J0ZWRfYmFja3VwczsKCgl9IC8vIEVuZCBiYWNrdXBzX2xpc3QoKS4KCgoJLy8gMTEyOAoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXREYXRBcnJheUZyb21aaXAoICRmaWxlICkgewoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgkJJHppcGJ1ZGR5ID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApOwoJCSRzZXJpYWwgPSBzZWxmOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGZpbGUgKTsKCQkKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXS0+ZmlsZV9leGlzdHMoICRmaWxlLCAkZmluZCA9ICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHNlcmlhbCAuICcvYmFja3VwYnVkZHlfZGF0LnBocCcgKSA9PT0gdHJ1ZSApIHsgLy8gUG9zdCAyLjAgZnVsbCBiYWNrdXAKCQkJCgkJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPmZpbGVfZXhpc3RzKCAkZmlsZSwgJGZpbmQgPSAnd3AtY29udGVudC91cGxvYWRzL3RlbXBfJyAuICRzZXJpYWwgLiAnL2JhY2t1cGJ1ZGR5X2RhdC5waHAnICkgPT09IHRydWUgKSB7IC8vIFByZSAyLjAgZnVsbCBiYWNrdXAKCQkJCgkJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPmZpbGVfZXhpc3RzKCAkZmlsZSwgJGZpbmQgPSAnYmFja3VwYnVkZHlfZGF0LnBocCcgKSA9PT0gdHJ1ZSApIHsgLy8gREIgYmFja3VwCgkJCQoJCX0gZWxzZSB7IC8vIENvdWxkIG5vdCBmaW5kIERBdCBmaWxlLgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIENhbGN1bGF0ZSB0ZW1wIGRpcmVjdG9yeSAmIGxvY2sgaXQgZG93bi4KCQkkdGVtcF9kaXIgPSBnZXRfdGVtcF9kaXIoKTsKCQkkZGVzdGluYXRpb24gPSAkdGVtcF9kaXI7CgkJaWYgKCAoICggISBmaWxlX2V4aXN0cyggJGRlc3RpbmF0aW9uICkgKSAmJiAoIGZhbHNlID09PSBta2RpciggJGRlc3RpbmF0aW9uICkgKSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzQ1ODQ4NTk0NWI6IFVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGxvY2F0aW9uLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQlkaWUoICRlcnJvciApOwoJCX0KCgkJLy8gSWYgdGVtcCBkaXJlY3RvcnkgaXMgd2l0aGluIHdlYnJvb3QgdGhlbiBsb2NrIGl0IGRvd24uCgkJJHRlbXBfZGlyID0gc3RyX3JlcGxhY2UoICdcXCcsICcvJywgJHRlbXBfZGlyICk7IC8vIE5vcm1hbGl6ZSBmb3IgV2luZG93cy4KCQkkdGVtcF9kaXIgPSBydHJpbSggJHRlbXBfZGlyLCAnL1xcJyApIC4gJy8nOyAvLyBFbmZvcmNlIHNpbmdsZSB0cmFpbGluZyBzbGFzaC4KCQlpZiAoIEZBTFNFICE9PSBzdHJpc3RyKCAkdGVtcF9kaXIsIEFCU1BBVEggKSApIHsgLy8gVGVtcCBkaXIgaXMgd2l0aGluIHdlYnJvb3QuCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJGRlc3RpbmF0aW9uICk7CgkJfQoJCXVuc2V0KCAkdGVtcF9kaXIgKTsKCQkKCQkkZGVzdEZpbGVuYW1lID0gJ3RlbXBfZGF0X3JlYWQtJyAuICRzZXJpYWwgLiAnLnBocCc7CgkJJGV4dHJhY3Rpb25zID0gYXJyYXkoICRmaW5kID0+ICRkZXN0RmlsZW5hbWUgKTsKCQkkZXh0cmFjdF9yZXN1bHQgPSAkemlwYnVkZHktPmV4dHJhY3QoICRmaWxlLCAkZGVzdGluYXRpb24sICRleHRyYWN0aW9ucyApOwoJCWlmICggZmFsc2UgPT09ICRleHRyYWN0X3Jlc3VsdCApIHsgLy8gZmFpbGVkLgoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9IGVsc2UgewoJCQkkZGF0QXJyYXkgPSBzZWxmOjpnZXRfZGF0X2ZpbGVfYXJyYXkoICRkZXN0aW5hdGlvbiAuICd0ZW1wX2RhdF9yZWFkLScgLiAkc2VyaWFsIC4gJy5waHAnICk7CgkJCUB1bmxpbmsoICR0ZW1wX2RpciAuICRkZXN0RmlsZW5hbWUgKTsKCQkJaWYgKCBpc19hcnJheSggJGRhdEFycmF5ICkgKSB7CgkJCQlyZXR1cm4gJGRhdEFycmF5OwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGFycmF5KCk7CgkJCX0KCQl9CgkJCgl9IC8vIEVuZCBnZXREYXRDb250ZW50c0Zyb21aaXAoKS4KCQoJCgkKCS8qIGltcG9ydGJ1ZGR5KCkKCSAqCgkgKiBJTVBPUlRBTlQ6IElmIG91dHB1dHRpbmcgdG8gYnJvd3NlciAobm8gb3V0cHV0IGZpbGUpIG11c3QgZGllKCkgYWZ0ZXIgb3V0cHV0dGluZyBjb250ZW50IGlmIHVzaW5nIEFKQVguIERvIG5vdCBvdXRwdXQgdG8gYnJvd3NlciBhbnl0aGluZyBhZnRlciB0aGlzIGZ1bmN0aW9uIGluIHRoaXMgY2FzZS4KCSAqIElNUE9SVEFOVDogX0FMV0FZU18gcmV0dXJucyBGQUxTRSBpZiBubyBpbXBvcnRidWRkeSBwYXNzIGhhc2ggaXMgcGFzc2VkIEFORCBubyBwYXNzIGhhc2ggaXMgc2V0IGluIHRoZSBTZXR0aW5ncyBwYWdlLgoJICogSWYgJG91dHB1dF9maWxlIGlzIGJsYW5rIHRoZW4gaW1wb3J0YnVkZHkgd2lsbCBlaXRoZXIgYmUgcmV0dXJuZWQgb3IgcmV0dXJuZWQgdG8gdGhlIGJyd29zZXIgYXMgYSBkb3dubG9hZGVkIGZpbGUgYmFzZWQgb24gM3JkIHBhcmFtZXRlci4KCSAqIElmICRvdXRwdXRfZmlsZSBpcyBkZWZpbmVkIHRoZW4gcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3Mgd3JpdGluZyBmaWxlLCBlbHNlIGZhbHNlLgoJICoKCSAqIFVzZSAkaW1wb3J0YnVkZHlfcGFzc19oYXNoID0gbnVsbCB0byBsZWF2ZSAjUEFTU1dPUkQjIHBsYWNlaG9sZGVyLiBFZyBmb3IgdXNlIHdpdGggTGl2ZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbXBvcnRidWRkeSggJG91dHB1dF9maWxlID0gJycsICRpbXBvcnRidWRkeV9wYXNzX2hhc2ggPSAnJywgJHJldHVybl9ub3RfZWNobyA9IGZhbHNlICkgewoKCQlwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7IC8vIFNvbWUgcGVvcGxlIHJ1biBvdXQgb2YgUEhQIG1lbW9yeS4KCgkJaWYgKCBudWxsICE9PSAkaW1wb3J0YnVkZHlfcGFzc19oYXNoICkgewoJCQlpZiAoICRpbXBvcnRidWRkeV9wYXNzX2hhc2ggPT0gJycgKSB7CgkJCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmxvYWQoKTsKCQkJCX0KCQkJCSRpbXBvcnRidWRkeV9wYXNzX2hhc2ggPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2ltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCddOwoJCQl9CgkJCQoJCQlpZiAoICRpbXBvcnRidWRkeV9wYXNzX2hhc2ggPT0gJycgKSB7CgkJCQkkbWVzc2FnZSA9ICdXYXJuaW5nICM5MDMyIC0gWW91IGhhdmUgbm90IHNldCBhbiBJbXBvcnRCdWRkeSBwYXNzd29yZCBvbiB0aGUgQmFja3VwQnVkZHkgU2V0dGluZ3MgcGFnZS4gQSBjb3B5IG9mIHRoZSBpbXBvcnRidWRkeS5waHAgZmlsZSBuZWVkZWQgdG8gcmVzdG9yZSB5b3VyIGJhY2t1cCBpcyBpbmNsdWRlZCBpbiBGdWxsIGJhY2t1cCB6aXAgZmlsZXMgZm9yIGNvbnZlbmllbmNlLiBTaW5jZSBhIHBhc3N3b3JkIGlzIG5vdCBhIHJhbmRvbSBvbmUgaGFzIGJlZW4gYXBwbGllZCB0byB0aGlzIGltcG9ydGJ1ZGR5LnBocCBzbyB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgIkZvcmdvdCBQYXNzd29yZCIgb3B0aW9uIGlmIHVzaW5nIGl0IHRvIHJlc3RvcmUuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJG1lc3NhZ2UgKTsKCQkJCSRpbXBvcnRidWRkeV9wYXNzX2hhc2ggPSBwYl9iYWNrdXBidWRkeTo6cmFuZG9tX3N0cmluZyggNDUgKTsgLy8gUmFuZG9tIGxvbmcgaGFzaCBmb3IgZHVtbXkgcGFzc3dvcmQuCgkJCX0KCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBpbXBvcnRidWRkeSBjb3JlIGZpbGUgaW50byBtZW1vcnkuJyApOwoJCSRvdXRwdXQgPSBmaWxlX2dldF9jb250ZW50cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL19pbXBvcnRidWRkeS9faW1wb3J0YnVkZHkucGhwJyApOwoJCQoJCWlmICggKCBudWxsICE9PSAkaW1wb3J0YnVkZHlfcGFzc19oYXNoICkgJiYgKCAkaW1wb3J0YnVkZHlfcGFzc19oYXNoICE9ICcnICkgKSB7CgkJCSRvdXRwdXQgPSBwcmVnX3JlcGxhY2UoJy8jUEFTU1dPUkQjLycsICRpbXBvcnRidWRkeV9wYXNzX2hhc2gsICRvdXRwdXQsIDEgKTsgLy8gT25seSByZXBsYWNlcyBmaXJzdCBpbnN0YW5jZS4KCQl9CgoJCSR2ZXJzaW9uX3N0cmluZyA9IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgLiAnIChkb3dubG9hZGVkICcgLiBkYXRlKCBEQVRFX1czQyApIC4gJyknOwoKCQkvLyBJZiBvbiBERVYgc3lzdGVtICguZ2l0IGRpciBleGlzdHMpIHRoZW4gYXBwZW5kIHNvbWUgZGV0YWlscyBvbiBjdXJyZW50LgoJCWlmICggZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0RFVicgKSAmJiAoIHRydWUgPT09IEJBQ0tVUEJVRERZX0RFViApICkgewoJCQlpZiAoIEBmaWxlX2V4aXN0cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnLy5naXQvbG9ncy9IRUFEJyApICkgewoJCQkJJGNvbW1pdF9sb2cgPSBlc2NhcGVzaGVsbGFyZyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnLy5naXQvbG9ncy9IRUFEJyApOwoJCQkJJGNvbW1pdF9saW5lID0gc3RyX3JlcGxhY2UoICdcJycsICdgJywgZXhlYyggInRhaWwgLW4gMSB7JGNvbW1pdF9sb2d9IiApICk7CgkJCQkkdmVyc2lvbl9zdHJpbmcgLj0gJyA8c3BhbiBzdHlsZT0iZm9udC1zaXplOiA4cHg7Ij5bREVWOiAnIC4gJGNvbW1pdF9saW5lIC4gJ108L3NwYW4+JzsKCQkJfQoJCX0KCgkJJG91dHB1dCA9IHByZWdfcmVwbGFjZSgnLyNWRVJTSU9OIy8nLCAkdmVyc2lvbl9zdHJpbmcsICRvdXRwdXQsIDEgKTsgLy8gT25seSByZXBsYWNlcyBmaXJzdCBpbnN0YW5jZS4KCgkJLy8gUEFDSyBJTVBPUlRCVUREWQoJCSRfcGFja2RhdGEgPSBhcnJheSggLy8gTk8gVFJBSUxJTkcgT1IgUFJFQ0VFRElORyBTTEFTSEVTIQoKCQkJJ19pbXBvcnRidWRkeS9pbXBvcnRidWRkeScJCQkJCQkJPT4JCSdpbXBvcnRidWRkeScsCgkJCSdjbGFzc2VzL19taWdyYXRlX2RhdGFiYXNlLnBocCcJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvX21pZ3JhdGVfZGF0YWJhc2UucGhwJywKCQkJJ2NsYXNzZXMvY29yZS5waHAnCQkJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9jbGFzc2VzL2NvcmUucGhwJywKCQkJJ2NsYXNzZXMvaW1wb3J0LnBocCcJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvY2xhc3Nlcy9pbXBvcnQucGhwJywKCQkJJ2NsYXNzZXMvcmVzdG9yZS5waHAnCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvcmVzdG9yZS5waHAnLAoJCQknY2xhc3Nlcy9fcmVzdG9yZUZpbGVzLnBocCcJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9jbGFzc2VzL19yZXN0b3JlRmlsZXMucGhwJywKCQkJJ2NsYXNzZXMvcmVtb3RlX2FwaS5waHAnCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvcmVtb3RlX2FwaS5waHAnLAoJCQkKCQkJJ2pzL2pxdWVyeS5sZWFuTW9kYWwubWluLmpzJwkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2pzL2pxdWVyeS5sZWFuTW9kYWwubWluLmpzJywKCQkJJ2Nzcy9hbmltYXRlLmNzcycJCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2Nzcy9hbmltYXRlLmNzcycsCgoJCQknaW1hZ2VzL3dvcmtpbmcuZ2lmJwkJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9pbWFnZXMvd29ya2luZy5naWYnLAoJCQknaW1hZ2VzL2J1bGxldF9nby5wbmcnCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2ltYWdlcy9idWxsZXRfZ28ucG5nJywKCQkJJ2ltYWdlcy9mYXZpY29uLnBuZycJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvaW1hZ2VzL2Zhdmljb24ucG5nJywKCQkJJ2ltYWdlcy9zb3J0X2Rvd24ucG5nJwkJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9pbWFnZXMvc29ydF9kb3duLnBuZycsCgkJCSdpbWFnZXMvaWNvbl9tZW51XzMyeDMyLnBuZycJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9pbWFnZXMvaWNvbl9tZW51XzMyeDMyLnBuZycsCgoJCQknbGliL2RicmVwbGFjZScJCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi9kYnJlcGxhY2UnLAoJCQknbGliL2RiaW1wb3J0JwkJCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi9kYmltcG9ydCcsCgkJCSdsaWIvY29tbWFuZGJ1ZGR5JwkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL2NvbW1hbmRidWRkeScsCgkJCSdsaWIvemlwYnVkZHknCQkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL3ppcGJ1ZGR5JywKCQkJJ2xpYi9teXNxbGJ1ZGR5JwkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL215c3FsYnVkZHknLAoJCQknbGliL3RleHRyZXBsYWNlYnVkZHknCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi90ZXh0cmVwbGFjZWJ1ZGR5JywKCQkJJ2xpYi9jcGFuZWwnCQkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL2NwYW5lbCcsCgoJCQkncGx1Z2luYnVkZHknCQkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHknLAoKCQkJJ2NvbnRyb2xsZXJzL3BhZ2VzL3NlcnZlcl9pbmZvJwkJCQkJCT0+CQknaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvcGFnZXMvc2VydmVyX2luZm8nLAoJCQknY29udHJvbGxlcnMvcGFnZXMvc2VydmVyX3Rvb2xzLnBocCcJCQkJCT0+CQknaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvcGFnZXMvc2VydmVyX3Rvb2xzLnBocCcsCgoJCQkvLyBTdGFzaAoJCQkvLydkZXN0aW5hdGlvbnMvc3Rhc2gyL2luaXQucGhwJwkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL3N0YXNoMi9pbml0LnBocCcsCgkJCSdkZXN0aW5hdGlvbnMvc3Rhc2gyL2NsYXNzLml0eF9oZWxwZXIyLnBocCcJCQkJPT4JCSdpbXBvcnRidWRkeS9saWIvc3Rhc2gyL2NsYXNzLml0eF9oZWxwZXIyLnBocCcsCgkJCSdkZXN0aW5hdGlvbnMvc3Rhc2gyL2NsYXNzLml0Y3JlZC5waHAnCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi9zdGFzaDIvY2xhc3MuaXRjcmVkLnBocCcsCgkJCSdkZXN0aW5hdGlvbnMvc3Rhc2gyL2NsYXNzLXBocGFzcy5waHAnCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi9zdGFzaDIvY2xhc3MtcGhwYXNzLnBocCcsCgkJCSdkZXN0aW5hdGlvbnMvX3MzbGliL2F3cy1zZGsvbGliL3JlcXVlc3Rjb3JlJwkJCT0+CQknaW1wb3J0YnVkZHkvbGliL3JlcXVlc3Rjb3JlJywKCQkpOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2FkaW5nIGVhY2ggZmlsZSBpbnRvIG1lbW9yeSBmb3Igd3JpdGluZyBtYXN0ZXIgaW1wb3J0YnVkZHkgZmlsZS4nICk7CgoJCSRvdXRwdXQgLj0gIlxuPD9waHAgLypcbiMjI1BBQ0tEQVRBLEJFR0lOXG4iOwoJCWZvcmVhY2goICRfcGFja2RhdGEgYXMgJHBhY2tfc291cmNlID0+ICRwYWNrX2Rlc3RpbmF0aW9uICkgewoJCQkkcGFja19zb3VyY2UgPSAnLycgLiAkcGFja19zb3VyY2U7CgkJCWlmICggaXNfZGlyKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICRwYWNrX3NvdXJjZSApICkgewoJCQkJJGZpbGVzID0gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT5kZWVwc2NhbmRpciggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAkcGFja19zb3VyY2UgKTsKCQkJfSBlbHNlIHsKCQkJCSRmaWxlcyA9IGFycmF5KCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICRwYWNrX3NvdXJjZSApOwoJCQl9CgkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCWlmICggaXNfZmlsZSggJGZpbGUgKSApIHsKCQkJCQkkc291cmNlID0gc3RyX3JlcGxhY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpLCAnJywgJGZpbGUgKTsKCQkJCQkkZGVzdGluYXRpb24gPSAkcGFja19kZXN0aW5hdGlvbiAuIHN1YnN0ciggJHNvdXJjZSwgc3RybGVuKCAkcGFja19zb3VyY2UgKSApOwoJCQkJCSRvdXRwdXQgLj0gIiMjI1BBQ0tEQVRBLEZJTEVfU1RBUlQseyRzb3VyY2V9LHskZGVzdGluYXRpb259XG4iOwoJCQkJCSRvdXRwdXQgLj0gYmFzZTY0X2VuY29kZSggZmlsZV9nZXRfY29udGVudHMoICRmaWxlICkgKTsKCQkJCQkkb3V0cHV0IC49ICJcbiI7CgkJCQkJJG91dHB1dCAuPSAiIyMjUEFDS0RBVEEsRklMRV9FTkQseyRzb3VyY2V9LHskZGVzdGluYXRpb259XG4iOwoJCQkJfQoJCQl9CgkJfQoJCSRvdXRwdXQgLj0gIiMjI1BBQ0tEQVRBLEVORFxuKi8iOwoJCSRvdXRwdXQgLj0gIlxuXG5cblxuXG5cblxuXG5cblxuIjsKCgkJaWYgKCB0cnVlID09PSAkcmV0dXJuX25vdF9lY2hvICkgewoJCQlyZXR1cm4gJG91dHB1dDsKCQl9CgoJCWlmICggJG91dHB1dF9maWxlID09ICcnICkgeyAvLyBObyBmaWxlIHNvIG91dHB1dCB0byBicm93c2VyLgoJCQloZWFkZXIoICdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyApOwoJCQloZWFkZXIoICdDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IG5hbWU9aW1wb3J0YnVkZHkucGhwJyApOwoJCQloZWFkZXIoICdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1pbXBvcnRidWRkeS5waHAnICk7CgkJCWhlYWRlciggJ0V4cGlyZXM6IDAnICk7CgkJCWhlYWRlciggJ0NvbnRlbnQtTGVuZ3RoOiAnIC4gc3RybGVuKCAkb3V0cHV0ICkgKTsKCgkJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJCQllY2hvICRvdXRwdXQ7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoKCQkJLy8gQkUgU1VSRSBUTyBkaWUoKSBBRlRFUiBUSElTIEFORCBOT1QgT1VUUFVUIFRPIEJST1dTRVIhCgkJfSBlbHNlIHsgLy8gV3JpdGUgdG8gZmlsZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnV3JpdGluZyBpbXBvcnRidWRkeSBtYXN0ZXIgZmlsZSB0byBkaXNrLicgKTsKCQkJaWYgKCBmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoICRvdXRwdXRfZmlsZSwgJG91dHB1dCApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0ODM4OTQ6IFVuYWJsZSB0byB3cml0ZSB0byBmaWxlIGAnIC4gJG91dHB1dF9maWxlIC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgkJCgl9IC8vIEVuZCBpbXBvcnRidWRkeSgpLgoJCgkKCQoJLy8gTGVhZGluZyAmIHRyYWlsaW5nIHNsYXNoLiBEb2VzIG5vdCBjcmVhdGUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZWRpYV9yb290KCkgewoJCSR1cGxvYWRzX2RpcnMgPSB3cF91cGxvYWRfZGlyKCBudWxsLCBmYWxzZSApOwoJCXJldHVybiBydHJpbSggJHVwbG9hZHNfZGlyc1snYmFzZWRpciddLCAnLycgKSAuICcvJzsKCX0gLy8gRW5kIGdldF9tZWRpYV9yb290KCkuCgkKCQoJCgkvLyBMZWFkaW5nICYgdHJhaWxpbmcgc2xhc2guCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF90aGVtZXNfcm9vdCgpIHsKCQlyZXR1cm4gcnRyaW0oIGRpcm5hbWUoIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnkoKSApLCAnLycgKSAuICcvJzsKCX0gLy8gRW5kIGdldF90aGVtZXNfcm9vdCgpLgoJCgkKCQoJLy8gTGVhZGluZyAmIHRyYWlsaW5nIHNsYXNoLgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfcGx1Z2luc19yb290KCkgewoJCXJldHVybiBydHJpbSggV1BfUExVR0lOX0RJUiwgJy8nICkgLiAnLyc7Cgl9IC8vIEVuZCBnZXRfcGx1Z2luc19yb290KCkuCgkKCQoJCgkvKiBwcmV0dHlfYmFja3VwX3R5cGUoKQoJICoKCSAqIFJldHVybiBhIG5pY2UgaHVtYW4gc3RyaW5nIGZvciBhIHNwZWNpZmllZCBiYWNrdXAgdHlwZS4KCSAqCgkgKiBAcGFyYW0gCXN0cmluZwkkdHlwZQlUeXBlIG9mIGJhY2t1cC4gRWcuIGZ1bGwsIGRiLCBmaWxlcy4KCSAqIEByZXR1cm4Jc3RyaW5nCQkJUHJldHR5IG5hbWUgZm9yIHR5cGUgb2YgYmFja3VwLiBFZy4gRnVsbCwgRGF0YWJhc2UsIEZpbGVzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZXR0eV9iYWNrdXBfdHlwZSggJHR5cGUgKSB7CgkJJHR5cGVzID0gYXJyYXkoCgkJCSdmdWxsJyA9PiAnRnVsbCcsCgkJCSdkYicgPT4gJ0RhdGFiYXNlJywKCQkJJ2ZpbGVzJyA9PiAnRmlsZXMnLAoJCQkndGhlbWVzJyA9PiAnVGhlbWVzJywKCQkJJ3BsdWdpbnMnID0+ICdQbHVnaW5zJywKCQkJJ21lZGlhJyA9PiAnTWVkaWEnLAoJCSk7CgkJCgkJaWYgKCBpc3NldCggJHR5cGVzWyAkdHlwZSBdICkgKSB7CgkJCXJldHVybiAkdHlwZXNbICR0eXBlIF07CgkJfSBlbHNlIHsKCQkJcmV0dXJuICR0eXBlOwoJCX0KCX0gLy8gRW5kIHByZXR0eV9iYWNrdXBfdHlwZSgpLgoJCgkKCQoJLyogcHJldHR5X2Rlc3RpbmF0aW9uX3R5cGUoKQoJICoKCSAqIFRha2UgYSBkZXN0aW5hdGlvbiB0eXBlIHNsdWcgYW5kIGNoYW5nZSBpdCBpbnRvIGEgdXNlci1mcmllbmRseSBkaXNwbGF5IG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCUludGVybmFsIGRlc3RpbmF0aW9uIHNsdWcuIEVnOiBzMwoJICogQHJldHVybglzdHJpbmcJCUZyaWVuZGx5IGRlc3RpbmF0aW9uIHRpdGxlLiBFZzogQW1hem9uIFMzCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZXR0eV9kZXN0aW5hdGlvbl90eXBlKCAkdHlwZSApIHsKCQlpZiAoICR0eXBlID09ICdyYWNrc3BhY2UnICkgewoJCQlyZXR1cm4gJ1JhY2tzcGFjZSc7CgkJfSBlbHNlaWYgKCAkdHlwZSA9PSAnZW1haWwnICkgewoJCQlyZXR1cm4gJ0VtYWlsJzsKCQl9IGVsc2VpZiAoICR0eXBlID09ICdzMycgKSB7CgkJCXJldHVybiAnQW1hem9uIFMzJzsKCQl9IGVsc2VpZiAoICR0eXBlID09ICdzMzInICkgewoJCQlyZXR1cm4gJ0FtYXpvbiBTMyB2Mic7CgkJfSBlbHNlaWYgKCAkdHlwZSA9PSAnczMzJyApIHsKCQkJcmV0dXJuICdBbWF6b24gUzMgdjMnOwoJCX0gZWxzZWlmICggJHR5cGUgPT0gJ2Z0cCcgKSB7CgkJCXJldHVybiAnRlRQJzsKCQl9IGVsc2VpZiAoICR0eXBlID09ICdzdGFzaDInICkgewoJCQlyZXR1cm4gJ0JhY2t1cEJ1ZGR5IFN0YXNoIHYyJzsKCQl9IGVsc2VpZiAoICR0eXBlID09ICdzdGFzaDMnICkgewoJCQlyZXR1cm4gJ0JhY2t1cEJ1ZGR5IFN0YXNoIHYzJzsKCQl9IGVsc2VpZiAoICR0eXBlID09ICdzZnRwJyApIHsKCQkJcmV0dXJuICdzRlRQJzsKCQl9IGVsc2VpZiAoICR0eXBlID09ICdkcm9wYm94MicgKSB7CgkJCXJldHVybiAnRHJvcGJveCB2Mic7CgkJfSBlbHNlaWYgKCAkdHlwZSA9PSAnZ2RyaXZlJyApIHsKCQkJcmV0dXJuICdHb29nbGUgRHJpdmUnOwoJCX0gZWxzZWlmICggJHR5cGUgPT0gJ3NpdGUnICkgewoJCQlyZXR1cm4gJ0JhY2t1cEJ1ZGR5IERlcGxveW1lbnQnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkdHlwZTsKCQl9Cgl9IC8vIEVuZCBwcmV0dHlfZGVzdGluYXRpb25fdHlwZSgpLgoKCgoJLyogYnVpbGRfaWNpY2xlKCkKCSAqCgkgKiBCdWlsZCBkaXJlY3RvcnkgdHJlZSBmb3IgdXNlIHdpdGggdGhlICJpY2ljbGUiIGphdmFzY3JpcHQgbGlicmFyeSBmb3IgdGhlIGdyYXBoaWNhbCBkaXJlY3RvcnkgZGlzcGxheSBvbiBTZXJ2ZXIgVG9vbHMgcGFnZS4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRkaXIJCQkKCSAqIEBwYXJhbQk/CQkkYmFzZQkJCQoJICogQHBhcmFtCT8JCSRpY2ljbGVfanNvbgkKCSAqIEBwYXJhbQlpbnQJCSRtYXhfZGVwdGgJCU1heGltdW0gZGVwdGggb2YgdHJlZSB0byBkaXNwbGF5LiAgTm90ZSB0aGF0IGRlZXBlciBkZXB0aHMgYXJlIHN0aWxsIHRyYXZlcnNlZCBmb3Igc2l6ZSBjYWxjdWxhdGlvbnMuIERlZmF1bHQ6IDEwCgkgKiBAcGFyYW0JaW50CQkkZGVwdGhfY291bnQJRGVmYXVsdDogMAoJICogQHBhcmFtCWJvb2wJJGlzX3Jvb3QJCURlZmF1bHQ6IHRydWUKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGRfaWNpY2xlKCAkZGlyLCAkYmFzZSwgJGljaWNsZV9qc29uLCAkbWF4X2RlcHRoID0gMTAsICRkZXB0aF9jb3VudCA9IDAsICRpc19yb290ID0gdHJ1ZSApIHsKCQkkYmdfY29sb3IgPSAnMDA1MjgyJzsKCgkJJGRlcHRoX2NvdW50Kys7CgkJJGJnX2NvbG9yID0gZGVjaGV4KCBoZXhkZWMoICRiZ19jb2xvciApIC0gKCAkZGVwdGhfY291bnQgKiAxNSApICk7CgoJCSRpY2ljbGVfanNvbiA9ICd7JyAuICJcbiI7CgoJCSRkaXJfbmFtZSA9ICRkaXI7CgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCAkZGlyICk7CgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoICdcXCcsICcvJywgJGRpcl9uYW1lICk7CgoJCSRkaXJfc2l6ZSA9IDA7CgkJJHN1YiA9IG9wZW5kaXIoICRkaXIgKTsKCQkkaGFzX2NoaWxkcmVuID0gZmFsc2U7CgkJd2hpbGUoICRmaWxlID0gcmVhZGRpciggJHN1YiApICkgewoJCQlpZiAoICggJGZpbGUgPT0gJy4nICkgfHwgKCAkZmlsZSA9PSAnLi4nICkgKSB7CgkJCQljb250aW51ZTsgLy8gTmV4dCBsb29wLgoJCQl9IGVsc2VpZiAoIGlzX2RpciggJGRpciAuICcvJyAuICRmaWxlICkgKSB7CgoJCQkJJGRpcl9hcnJheSA9ICcnOwoJCQkJJHJlc3BvbnNlID0gc2VsZjo6YnVpbGRfaWNpY2xlKCAkZGlyIC4gJy8nIC4gJGZpbGUsICRiYXNlLCAkZGlyX2FycmF5LCAkbWF4X2RlcHRoLCAkZGVwdGhfY291bnQsIGZhbHNlICk7CgkJCQlpZiAoICggJG1heF9kZXB0aC0xID4gMCApIHx8ICggJG1heF9kZXB0aCA9PSAtMSApICkgeyAvLyBPbmx5IGFkZHMgdG8gdGhlIHZpc3VhbCB0cmVlIGlmIGRlcHRoIGlzbnQgZXhjZWVkZWQuCgkJCQkJaWYgKCAkbWF4X2RlcHRoID4gMCApIHsKCQkJCQkJJG1heF9kZXB0aCA9ICRtYXhfZGVwdGggLSAxOwoJCQkJCX0KCgkJCQkJaWYgKCAkaGFzX2NoaWxkcmVuID09PSBmYWxzZSApIHsgLy8gZmlyc3QgbG9vcCBhZGQgY2hpbGRyZW4gc2VjdGlvbgoJCQkJCQkkaWNpY2xlX2pzb24gLj0gJyJjaGlsZHJlbiI6IFsnIC4gIlxuIjsKCQkJCQl9IGVsc2UgewoJCQkJCQkkaWNpY2xlX2pzb24gLj0gJywnOwoJCQkJCX0KCQkJCQkkaWNpY2xlX2pzb24gLj0gJHJlc3BvbnNlWzBdOwoKCQkJCQkkaGFzX2NoaWxkcmVuID0gdHJ1ZTsKCQkJCX0KCQkJCSRkaXJfc2l6ZSArPSAkcmVzcG9uc2VbMV07CgkJCQl1bnNldCggJHJlc3BvbnNlICk7CgkJCQl1bnNldCggJGZpbGUgKTsKCgoJCQl9IGVsc2UgewoJCQkJJHN0YXRzID0gc3RhdCggJGRpciAuICcvJyAuICRmaWxlICk7CgkJCQkkZGlyX3NpemUgKz0gJHN0YXRzWydzaXplJ107CgkJCQl1bnNldCggJGZpbGUgKTsKCQkJfQoJCX0KCQljbG9zZWRpciggJHN1YiApOwoJCXVuc2V0KCAkc3ViICk7CgoJCWlmICggJGhhc19jaGlsZHJlbiA9PT0gdHJ1ZSApIHsKCQkJJGljaWNsZV9qc29uIC49ICcgXScgLiAiXG4iOwoJCX0KCgkJaWYgKCAkaGFzX2NoaWxkcmVuID09PSB0cnVlICkgewoJCQkkaWNpY2xlX2pzb24gLj0gJywnOwoJCX0KCgkJJGljaWNsZV9qc29uIC49ICciaWQiOiAibm9kZV8nIC4gc3RyX3JlcGxhY2UoICcvJywgJzonLCAkZGlyX25hbWUgKSAuICc6IF4nIC4gc3RyX3JlcGxhY2UoICcgJywgJ34nLCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkZGlyX3NpemUgKSApIC4gJyInIC4gIlxuIjsKCgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoICcvJywgJycsIHN0cnJjaHIoICRkaXJfbmFtZSwgJy8nICkgKTsKCQlpZiAoICRkaXJfbmFtZSA9PSAnJyApIHsgLy8gU2V0IHJvb3QgdG8gYmUgLy4KCQkJJGRpcl9uYW1lID0gJy8nOwoJCX0KCQkkaWNpY2xlX2pzb24gLj0gJywgIm5hbWUiOiAiJyAuICRkaXJfbmFtZSAuICcgKCcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkZGlyX3NpemUgKSAuICcpIicgLiAiXG4iOwoKCQkkaWNpY2xlX2pzb24gLj0gJywiZGF0YSI6IHsgIiRkaW0iOiAnIC4gKCAkZGlyX3NpemUgKyAxMCApIC4gJywgIiRjb2xvciI6ICIjJyAuIHN0cl9wYWQoICRiZ19jb2xvciwgNiwgJzAnLCBTVFJfUEFEX0xFRlQgKSAuICciIH0nIC4gIlxuIjsKCQkkaWNpY2xlX2pzb24gLj0gJ30nOwoKCQlpZiAoICRpc19yb290ICE9PSB0cnVlICkgewoJCQkvLyRpY2ljbGVfanNvbiAuPSAnLHgnOwoJCX0KCgkJcmV0dXJuIGFycmF5KCAkaWNpY2xlX2pzb24sICRkaXJfc2l6ZSApOwoJfSAvLyBFbmQgYnVpbGRfaWNpY2xlKCkuCgoKCgkvKiBwcmVmbGlzaF9jaGVjaygpCgkgKgoJICogZGVzY3JpcHRpb24KCSAqCgkgKi8KCS8vIHJldHVybiBhcnJheSBvZiB0ZXN0cyBhbmQgdGhlaXIgcmVzdWx0cy4KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJlZmxpZ2h0X2NoZWNrKCkgewoJCSR0ZXN0cyA9IGFycmF5KCk7CgkJCgkJLy8gTVVMVElTSVRFIEJFVEEgV0FSTklORy4KCQlpZiAoIGlzX211bHRpc2l0ZSgpICYmIGJhY2t1cGJ1ZGR5X2NvcmU6OmlzX25ldHdvcmtfYWN0aXZhdGVkKCkgJiYgIWRlZmluZWQoICdQQl9ERU1PX01PREUnICkgKSB7IC8vIE11bHRpc2l0ZSBpbnN0YWxsYXRpb24uCgkJCSR0ZXN0c1tdID0gYXJyYXkoCgkJCQkndGVzdCcJCT0+CSdtdWx0aXNpdGVfYmV0YScsCgkJCQknc3VjY2VzcycJPT4JZmFsc2UsCgkJCQknbWVzc2FnZScJPT4JJ1dBUk5JTkc6IEJhY2t1cEJ1ZGR5IE11bHRpc2l0ZSBmdW5jdGlvbmFsaXR5IGlzIEVYUEVSSU1FTlRBTCBhbmQgTk9UIG9mZmljaWFsbHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBpc3N1ZXMgYXJlIGtub3duLiBVc2FnZSBvZiBpdCBpcyBhdCB5b3VyIG93biByaXNrIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uLiBTdGFuZGFsb25lIFdvcmRQcmVzcyBzaXRlcyBhcmUgc3VnZ2VzdGVkLiBZb3UgbWF5IHVzZSB0aGUgIkV4cG9ydCIgZmVhdHVyZSB0byBleHBvcnQgeW91ciBzdWJzaXRlcyBpbnRvIHN0YW5kYWxvbmUgV29yZFByZXNzIHNpdGVzLiBUbyBlbmFibGUgZXhwZXJpbWVudGFsIEJhY2t1cEJ1ZGR5IE11bHRpc2l0ZSBmdW5jdGlvbmFsaXR5IHlvdSBtdXN0IGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8geW91ciB3cC1jb25maWcucGhwIGZpbGU6IDxiPmRlZmluZSggXCdQQl9CQUNLVVBCVUREWV9NVUxUSVNJVEVfRVhQRVJJTUVOVFwnLCB0cnVlICk7PC9iPicKCQkJKTsKCQl9IC8vIGVuZCBuZXR3b3JrLWFjdGl2YXRlZCBtdWx0aXNpdGUuCgkJCgkJLy8gTE9PUEJBQ0tTIFRFU1QuCgkJaWYgKCAoICRsb29wYmFja19yZXNwb25zZSA9IHNlbGY6Omxvb3BiYWNrX3Rlc3QoKSApID09PSB0cnVlICkgewoJCQkkc3VjY2VzcyA9IHRydWU7CgkJCSRtZXNzYWdlID0gJyc7CgkJfSBlbHNlIHsgLy8gZmFpbGVkCgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCWlmICggZGVmaW5lZCggJ0FMVEVSTkFURV9XUF9DUk9OJyApICYmICggQUxURVJOQVRFX1dQX0NST04gPT0gdHJ1ZSApICkgewoJCQkJJG1lc3NhZ2UgPSBfXygnUnVubmluZyBpbiBBbHRlcm5hdGUgV29yZFByZXNzIENyb24gbW9kZS4gSFRUUCBMb29wYmFjayBDb25uZWN0aW9ucyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyBzZXJ2ZXIgYnV0IHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhpcyBpbiB0aGUgd3AtY29uZmlnLnBocCBmaWxlICh0aGlzIGlzIGEgZ29vZCB0aGluZykuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIDxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9jb2RleC9wYWdlL0JhY2t1cEJ1ZGR5Ol9GcmVxdWVudF9TdXBwb3J0X0lzc3VlcyNIVFRQX0xvb3BiYWNrX0Nvbm5lY3Rpb25zX0Rpc2FibGVkIiB0YXJnZXQ9Il9ibGFuayI+JyAuIF9fKCdBZGRpdGlvbmFsIEluZm9ybWF0aW9uIEhlcmUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2E+Lic7CgkJCX0gZWxzZSB7CgkJCQkkbWVzc2FnZSA9IF9fKCdIVFRQIExvb3BiYWNrIENvbm5lY3Rpb25zIGFyZSBub3QgZW5hYmxlZCBvbiB0aGlzIHNlcnZlciBvciBhcmUgbm90IGZ1bmN0aW9uaW5nIHByb3Blcmx5LiBZb3UgbWF5IGVuY291bnRlciBzdGFsbGVkLCBzaWduaWZpY2FudGx5IGRlbGF5ZWQgYmFja3Vwcywgb3Igb3RoZXIgZGlmZmljdWx0aWVzLiBTZWUgZGV0YWlscyBpbiB0aGUgYm94IGJlbG93LiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYSBjb25mbGljdGluZyBwbHVnaW4gc3VjaCBhcyBhIGNhY2hpbmcgcGx1Z2luLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyA8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vY29kZXgvcGFnZS9CYWNrdXBCdWRkeTpfRnJlcXVlbnRfU3VwcG9ydF9Jc3N1ZXMjSFRUUF9Mb29wYmFja19Db25uZWN0aW9uc19EaXNhYmxlZCIgdGFyZ2V0PSJfYmxhbmsiPicgLiBfXygnQ2xpY2sgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT4nOwoJCQkJJG1lc3NhZ2UgLj0gJyA8Yj5EZXRhaWxzOjwvYj4gPHRleHRhcmVhIHN0eWxlPSJoZWlnaHQ6IDUwcHg7IHdpZHRoOiAxMDAlOyI+JyAuICRsb29wYmFja19yZXNwb25zZSAuICc8L3RleHRhcmVhPic7CgkJCX0KCQl9CgkJJHRlc3RzW10gPSBhcnJheSgKCQkJJ3Rlc3QnCQk9PgknbG9vcGJhY2tzJywKCQkJJ3N1Y2Nlc3MnCT0+CSRzdWNjZXNzLAoJCQknbWVzc2FnZScJPT4JJG1lc3NhZ2UsCgkJKTsKCQkKCQkvLyBDUk9OQkFDS1MgVEVTVC4KCQlpZiAoICggJGNyb25iYWNrX3Jlc3BvbnNlID0gc2VsZjo6Y3JvbmJhY2tfdGVzdCgpICkgPT09IHRydWUgKSB7CgkJCSRzdWNjZXNzID0gdHJ1ZTsKCQkJJG1lc3NhZ2UgPSAnJzsKCQl9IGVsc2UgeyAvLyBmYWlsZWQKCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkJaWYgKCBkZWZpbmVkKCAnQUxURVJOQVRFX1dQX0NST04nICkgJiYgKCBBTFRFUk5BVEVfV1BfQ1JPTiA9PSB0cnVlICkgKSB7CgkJCQkkbWVzc2FnZSA9IF9fKCdSdW5uaW5nIGluIEFsdGVybmF0ZSBXb3JkUHJlc3MgQ3JvbiBtb2RlLiBIVFRQIGNyb25iYWNrIENvbm5lY3Rpb25zIGFyZSBub3QgZW5hYmxlZCBvbiB0aGlzIHNlcnZlciBidXQgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGlzIGluIHRoZSB3cC1jb25maWcucGhwIGZpbGUgKHRoaXMgaXMgYSBnb29kIHRoaW5nKS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgPGEgaHJlZj0iaHR0cDovL2l0aGVtZXMuY29tL2NvZGV4L3BhZ2UvQmFja3VwQnVkZHk6X0ZyZXF1ZW50X1N1cHBvcnRfSXNzdWVzI0hUVFBfY3JvbmJhY2tfQ29ubmVjdGlvbnNfRGlzYWJsZWQiIHRhcmdldD0iX2JsYW5rIj4nIC4gX18oJ0FkZGl0aW9uYWwgSW5mb3JtYXRpb24gSGVyZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT4uJzsKCQkJfSBlbHNlIHsKCQkJCSRtZXNzYWdlID0gX18oJ0hUVFAgbG9vcGJhY2sgY29ubmVjdGlvbnMgYXJlIG5vdCBlbmFibGVkIHRvIHRoZSB3cC1jcm9uLnBocCBvbiB0aGlzIHNlcnZlciBvciBhcmUgbm90IGZ1bmN0aW9uaW5nIHByb3Blcmx5LiBZb3UgbWF5IGVuY291bnRlciBzdGFsbGVkLCBzaWduaWZpY2FudGx5IGRlbGF5ZWQgYmFja3Vwcywgb3Igb3RoZXIgZGlmZmljdWx0aWVzLiBTZWUgZGV0YWlscyBpbiB0aGUgYm94IGJlbG93LiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYSBjb25mbGljdGluZyBwbHVnaW4gc3VjaCBhcyBhIGNhY2hpbmcgcGx1Z2luLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyA8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vY29kZXgvcGFnZS9CYWNrdXBCdWRkeTpfRnJlcXVlbnRfU3VwcG9ydF9Jc3N1ZXMjSFRUUF9Mb29wYmFja19Db25uZWN0aW9uc19EaXNhYmxlZCIgdGFyZ2V0PSJfYmxhbmsiPicgLiBfXygnQ2xpY2sgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT4nOwoJCQkJJG1lc3NhZ2UgLj0gJyA8Yj5EZXRhaWxzOjwvYj4gPHRleHRhcmVhIHN0eWxlPSJoZWlnaHQ6IDUwcHg7IHdpZHRoOiAxMDAlOyI+JyAuICRjcm9uYmFja19yZXNwb25zZSAuICc8L3RleHRhcmVhPic7CgkJCX0KCQl9CgkJJHRlc3RzW10gPSBhcnJheSgKCQkJJ3Rlc3QnCQk9PgknY3JvbmJhY2tzJywKCQkJJ3N1Y2Nlc3MnCT0+CSRzdWNjZXNzLAoJCQknbWVzc2FnZScJPT4JJG1lc3NhZ2UsCgkJKTsKCQkKCQkvLyBQT1NTSUJMRSBDQUNISU5HIFBMVUdJTiBDT05GTElDVCBXQVJOSU5HLgoJCSRzdWNjZXNzID0gdHJ1ZTsKCQkkbWVzc2FnZSA9ICcnOwoJCSRmb3VuZF9wbHVnaW5zID0gYXJyYXkoKTsKCQlpZiAoICEgaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSRhY3RpdmVfcGx1Z2lucyA9IHNlcmlhbGl6ZSggZ2V0X29wdGlvbiggJ2FjdGl2ZV9wbHVnaW5zJyApICk7CgkJCWZvcmVhY2goIHNlbGY6OiR3YXJuX3BsdWdpbnMgYXMgJHdhcm5fcGx1Z2luID0+ICR3YXJuX3BsdWdpbl90aXRsZSApIHsKCQkJCWlmICggRkFMU0UgIT09IHN0cnBvcyggJGFjdGl2ZV9wbHVnaW5zLCAkd2Fybl9wbHVnaW4gKSApIHsgLy8gUGx1Z2luIGFjdGl2ZS4KCQkJCQkkZm91bmRfcGx1Z2luc1tdID0gJHdhcm5fcGx1Z2luX3RpdGxlOwoJCQkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCBjb3VudCggJGZvdW5kX3BsdWdpbnMgKSA+IDAgKSB7CgkJCSRtZXNzYWdlID0gX18oICdPbmUgb3IgbW9yZSBjYWNoaW5nIG9yIHNlY3VyaXR5IHBsdWdpbnMga25vd24gdG8gcG9zc2libHkgY2F1c2UgcHJvYmxlbXMgd2FzIGRldGVjdGVkIGFzIGFjdGl2YXRlZC4gU29tZSBjYWNoaW5nIG9yIHNlY3VyaXR5IHBsdWdpbiBjb25maWd1cmF0aW9ucyBtYXkgcG9zc2libHkgY2FjaGUgb3IgaW50ZXJmZXJlIHdpdGggYmFja3VwIHByb2Nlc3NlcyBvciBXb3JkUHJlc3MgY3Jvbi4gSWYgeW91IGVuY291bnRlciBwcm9ibGVtcyBjbGVhciB0aGUgY2FjaGluZyBwbHVnaW5cJ3MgY2FjaGUgb3IgY2hlY2sgc2VjdXJpdHkgc2V0dGluZ3MgKGRlYWN0aXZhdGluZyB0aGUgcGx1Z2luIG1heSBoZWxwKSB0byB0cm91Ymxlc2hvb3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnICc7CgkJCSRtZXNzYWdlIC49IF9fKCAnQWN0aXZhdGVkIGNhY2hpbmcgcGx1Z2lucyBkZXRlY3RlZDonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgJzsKCQkJJG1lc3NhZ2UgLj0gaW1wbG9kZSggJywgJywgJGZvdW5kX3BsdWdpbnMgKTsKCQkJJG1lc3NhZ2UgLj0gJy4nOwoJCX0KCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkndGVzdCcJCT0+CSdsb29wYmFja3MnLAoJCQknc3VjY2VzcycJPT4JJHN1Y2Nlc3MsCgkJCSdtZXNzYWdlJwk9PgkkbWVzc2FnZSwKCQkpOwoKCQkvLyBXT1JEUFJFU1MgSU4gU1VCRElSRUNUT1JJRVMgVEVTVC4KCQkkd29yZHByZXNzX2xvY2F0aW9ucyA9IHNlbGY6OmdldF93b3JkcHJlc3NfbG9jYXRpb25zKCk7CgkJaWYgKCBjb3VudCggJHdvcmRwcmVzc19sb2NhdGlvbnMgKSA+IDAgKSB7CgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCSRtZXNzYWdlID0gX18oICdXb3JkUHJlc3MgbWF5IGhhdmUgYmVlbiBkZXRlY3RlZCBpbiBvbmUgb3IgbW9yZSBzdWJkaXJlY3Rvcmllcy4gQmFja2luZyB1cCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgV29yZFByZXNzIG1heSByZXN1bHQgaW4gc2VydmVyIHRpbWVvdXRzIGR1ZSB0byBpbmNyZWFzZWQgYmFja3VwIHRpbWUuIFlvdSBtYXkgZXhjbHVkZSBXb3JkUHJlc3MgZGlyZWN0b3JpZXMgdmlhIHRoZSBTZXR0aW5ncyBwYWdlLiBEZXRlY3RlZCBub24tZXhjbHVkZWQgbG9jYXRpb25zOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gaW1wbG9kZSggJywgJywgJHdvcmRwcmVzc19sb2NhdGlvbnMgKTsKCQl9IGVsc2UgewoJCQkkc3VjY2VzcyA9IHRydWU7CgkJCSRtZXNzYWdlID0gJyc7CgkJfQoJCSR0ZXN0c1tdID0gYXJyYXkoCgkJCSd0ZXN0JwkJPT4JJ3dvcmRwcmVzc19zdWJkaXJlY3RvcmllcycsCgkJCSdzdWNjZXNzJwk9Pgkkc3VjY2VzcywKCQkJJ21lc3NhZ2UnCT0+CSRtZXNzYWdlLAoJCSk7CgoJCS8vIExvZyBmaWxlIGRpcmVjdG9yeSB3cml0YWJsZSBmb3Igc3RhdHVzIGxvZ2dpbmcuCgkJJHN0YXR1c19kaXJlY3RvcnkgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsKCQlpZiAoICEgZmlsZV9leGlzdHMoICRzdGF0dXNfZGlyZWN0b3J5ICkgKSB7CgkJCWlmICggZmFsc2UgPT09IHBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJHN0YXR1c19kaXJlY3RvcnksICRkaWUgPSBmYWxzZSApICkgewoJCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkJCSRtZXNzYWdlID0gJ1RoZSBzdGF0dXMgbG9nIGZpbGUgZGlyZWN0b3J5IGAnIC4gJHN0YXR1c19kaXJlY3RvcnkgLiAnYCBpcyBub3QgY3JlYXRhYmxlIG9yIHBlcm1pc3Npb25zIHByZXZlbnQgYWNjZXNzLiBWZXJpZnkgcGVybWlzc2lvbnMgb2YgaXQgYW5kL29yIGl0cyBwYXJlbnQgZGlyZWN0b3J5LiBCYWNrdXAgc3RhdHVzIGluZm9ybWF0aW9uIHdpbGwgYmUgdW5hdmFpbGFibGUgdW50aWwgdGhpcyBpcyByZXNvbHZlZC4nOwoJCQl9CgkJfQoJCWlmICggISBpc193cml0YWJsZSggJHN0YXR1c19kaXJlY3RvcnkgKSApIHsKCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkJJG1lc3NhZ2UgPSAnVGhlIHN0YXR1cyBsb2cgZmlsZSBkaXJlY3RvcnkgYCcgLiAkc3RhdHVzX2RpcmVjdG9yeSAuICdgIGlzIG5vdCB3cml0YWJsZS4gUGxlYXNlIHZlcmlmeSBwZXJtaXNzaW9ucyBiZWZvcmUgY3JlYXRpbmcgYSBiYWNrdXAuIEJhY2t1cCBzdGF0dXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1bmF2YWlsYWJsZSB1bnRpbCB0aGlzIGlzIHJlc29sdmVkLic7CgkJfSBlbHNlIHsKCQkJJHN1Y2Nlc3MgPSB0cnVlOwoJCQkkbWVzc2FnZSA9ICcnOwoJCX0KCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkndGVzdCcJCT0+CSdzdGF0dXNfZGlyZWN0b3J5X3dyaXRhYmxlJywKCQkJJ3N1Y2Nlc3MnCT0+CSRzdWNjZXNzLAoJCQknbWVzc2FnZScJPT4JJG1lc3NhZ2UsCgkJKTsKCgkJLy8gQ0hFQ0sgWklQIEFWQUlMQUJJTElUWS4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoKCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKTsKCQl9CgoJCS8qKioqKiBCRUdJTiBMT09LSU5HIEZPUiBVTkZJTklTSEVEIFJFQ0VOVCBCQUNLVVBTICoqKioqLwoJCWlmICggJycgIT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X2JhY2t1cF9zZXJpYWwnXSApIHsKCQkJJGxhc3RCYWNrdXBGaWxlb3B0aW9ucyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfYmFja3VwX3NlcmlhbCddIC4gJy50eHQnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkbGFzdEJhY2t1cEZpbGVvcHRpb25zICkgKSB7CgkJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMzMi4nICk7CgkJCQkkYmFja3VwX29wdGlvbnMgPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoICRsYXN0QmFja3VwRmlsZW9wdGlvbnMsICRyZWFkX29ubHkgPSB0cnVlICk7CgkJCQlpZiAoIHRydWUgIT09ICggJHJlc3VsdCA9ICRiYWNrdXBfb3B0aW9ucy0+aXNfb2soKSApIHx8ICggISBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd1cGRhdGVkX3RpbWUnXSApICkgKSB7CgkJCQkJLy8gTk9URTogSWYgdGhpcyBmaWxlcyBkdXJpbmcgYSBiYWNrdXAgaXQgbWF5IHRyeSB0byByZWFkIHRoZSBmaWxlb3B0aW9ucyBmaWxlIHRvbyBlYXJseSBkdWUgdG8gdGhlIGxhc3RfYmFja3VwX3NlcmlhbCBiZWluZyBzZXQuIFN1cHByZXNzaW5nIGVycm9ycyBmb3Igbm93LgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VuYWJsZSB0byByZXRyaWV2ZSBmaWxlb3B0aW9ucyBmaWxlICh0aGlzIGlzIG5vcm1hbCBpZiBhIGJhY2t1cCBpcyBjdXJyZW50bHkgaW4gcHJvY2VzcyAmIG1heSBiZSBpZ25vcmVkKSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfYmFja3VwX3NlcmlhbCddIC4gJy50eHQnIC4gJ2AuIEVyciA1NDQ3ODIzNjc2NS4gRGV0YWlsczogYCcgLiAkcmVzdWx0IC4gJ2AuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1sndXBkYXRlZF90aW1lJ10gPCAxODAgKSB7IC8vIEJlZW4gbGVzcyB0aGFuIDNtaW4gc2luY2UgbGFzdCBiYWNrdXAuCgoJCQkJCQlpZiAoICFlbXB0eSggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddICkgKSB7IC8vIExvb2sgZm9yIGluY29tcGxldGUgc3RlcHMuCgkJCQkJCQkkZm91bmRfdW5maW5pc2hlZCA9IGZhbHNlOwoJCQkJCQkJZm9yZWFjaCggKGFycmF5KSRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snc3RlcHMnXSBhcyAkc3RlcCApIHsKCQkJCQkJCQlpZiAoICRzdGVwWydmaW5pc2hfdGltZSddID09ICcwJyApIHsgLy8gRm91bmQgYW4gdW5maW5pc2hlZCBzdGVwLgoJCQkJCQkJCQkkZm91bmRfdW5maW5pc2hlZCA9IHRydWU7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0gLy8gZW5kIGZvcmVhY2guCgoJCQkJCQkJaWYgKCAkZm91bmRfdW5maW5pc2hlZCA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkJCQkJCQkndGVzdCcJCT0+CSdyZWNlbnRfYmFja3VwJywKCQkJCQkJCQkJJ3N1Y2Nlc3MnCT0+CWZhbHNlLAoJCQkJCQkJCQknbWVzc2FnZScJPT4JX18oJ0EgYmFja3VwIHdhcyByZWNlbnRseSBzdGFydGVkIGFuZCByZXBvcnRzIHVuZmluaXNoZWQgc3RlcHMuIFlvdSBzaG91bGQgd2FpdCB1bmxlc3MgeW91IGFyZSBzdXJlIHRoZSBwcmV2aW91cyBiYWNrdXAgaGFzIGNvbXBsZXRlZCBvciBmYWlsZWQgdG8gYXZvaWQgcGxhY2luZyBhIGhlYXZ5IGxvYWQgb24geW91ciBzZXJ2ZXIuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLgoJCQkJCQkJCQkJJyBMYXN0IHVwZGF0ZWQ6ICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd1cGRhdGVkX3RpbWUnXSApIC4gJzsgJy4KCQkJCQkJCQkJCScgU2VyaWFsOiAnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X2JhY2t1cF9zZXJpYWwnXQoJCQkJCQkJCSwKCQkJCQkJCQkpOwoJCQkJCQkJfSAvLyBlbmQgJGZvdW5kX3VuZmluaXNoZWQgPT09IHRydWUuCgoJCQkJCQl9IC8vIGVuZCBpZi4KCgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCS8qKioqKiBFTkQgTE9PS0lORyBGT1IgVU5GSU5JU0hFRCBSRUNFTlQgQkFDS1VQUyAqKioqKi8KCgkJLyoqKioqIEJFR0lOIExPT0tJTkcgRk9SIEJBQ0tVUCBGSUxFUyBJTiBTSVRFIFJPT1QgKioqKiovCgkJJGZpbGVzID0gZ2xvYiggQUJTUEFUSCAuICdiYWNrdXAtKi56aXAnICk7CgkJaWYgKCAhaXNfYXJyYXkoICRmaWxlcyApIHx8IGVtcHR5KCAkZmlsZXMgKSApIHsKCQkJJGZpbGVzID0gYXJyYXkoKTsKCQl9CgkJCgkJJGZpbGVzMiA9IGdsb2IoIEFCU1BBVEggLiAnc25hcHNob3QtKi56aXAnICk7CgkJaWYgKCAhaXNfYXJyYXkoICRmaWxlczIgKSB8fCBlbXB0eSggJGZpbGVzMiApICkgewoJCQkkZmlsZXMyID0gYXJyYXkoKTsKCQl9CgkJCgkJJGZpbGVzID0gYXJyYXlfbWVyZ2UoICRmaWxlcywgJGZpbGVzMiApOwoJCWZvcmVhY2goICRmaWxlcyBhcyAmJGZpbGUgKSB7CgkJCSRmaWxlID0gYmFzZW5hbWUoICRmaWxlICk7CgkJfQoJCQoJCWlmICggY291bnQoICRmaWxlcyApID4gMCApIHsKCQkJJGZpbGVzX3N0cmluZyA9IGltcGxvZGUoICcsICcsICRmaWxlcyApOwoJCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkJJ3Rlc3QnCQk9Pgkncm9vdF9iYWNrdXBzLScgLiAkZmlsZXNfc3RyaW5nLAoJCQkJJ3N1Y2Nlc3MnCT0+CWZhbHNlLAoJCQkJJ21lc3NhZ2UnCT0+CSdPbmUgb3IgbW9yZSBiYWNrdXAgZmlsZXMsIGAnIC4gJGZpbGVzX3N0cmluZyAuICdgIHdhcyBmb3VuZCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzaXRlLiBUaGlzIG1heSBiZSBsZWZ0b3ZlciBmcm9tIGEgcmVjZW50IHJlc3RvcmUuIFlvdSBzaG91bGQgdXN1YWxseSByZW1vdmUgYmFja3VwIGZpbGVzIGZyb20gdGhlIHNpdGUgcm9vdCBmb3Igc2VjdXJpdHkuJywKCQkJKTsKCQl9CgkJLyoqKioqIEVORCBMT09LSU5HIEZPUiBCQUNLVVAgRklMRVMgSU4gU0lURSBST09UICoqKioqLwoJCQoJCWlmICggISBpc193cml0YWJsZSggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKSApIHsKCQkJJHRlc3RzW10gPSBhcnJheSgKCQkJCSd0ZXN0JwkJPT4JJ2JhY2t1cF9kaXJfcGVybWlzc2lvbnMnLAoJCQkJJ3N1Y2Nlc3MnCT0+CWZhbHNlLAoJCQkJJ21lc3NhZ2UnCT0+CSdJbnZhbGlkIGJhY2t1cCBkaXJlY3RvcnkgcGVybWlzc2lvbnMuIFZlcmlmeSB0aGUgZGlyZWN0b3J5IGAnIC4gYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgLiAnYCBpcyB3cml0YWJsZS4nCgkJCSk7CgkJfQoJCQoJCS8qIFRISVMgTUFZIE5PVCBFWElTVCBZRVQuCgkJaWYgKCAhIGlzX3dyaXRhYmxlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgKSApIHsKCQkJJHRlc3RzW10gPSBhcnJheSgKCQkJCSd0ZXN0JwkJPT4JJ3RlbXBfZGlyX3Blcm1pc3Npb25zJywKCQkJCSdzdWNjZXNzJwk9PglmYWxzZSwKCQkJCSdtZXNzYWdlJwk9PgknSW52YWxpZCB0ZW1wIGRpcmVjdG9yeSBwZXJtaXNzaW9ucy4gVmVyaWZ5IHRoZSBkaXJlY3RvcnkgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgLiAnYCBpcyB3cml0YWJsZS4nCgkJCSk7CgkJfQoJCSovCgkJCgkJcmV0dXJuICR0ZXN0czsKCgl9IC8vIEVuZCBwcmVmbGlnaHRfY2hlY2soKS4KCgoKCS8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KCS8qCWxvb3BiYWNrX3Rlc3QoKQoJICoJCgkgKglDb25uZWN0cyBiYWNrIHRvIHNhbWUgc2l0ZSB2aWEgQUpBWCBjYWxsIHRvIGFuIEFKQVggc2x1ZyB0aGF0IGhhcyBOT1QgYmVlbiByZWdpc3RlcmVkLgoJICoJV29yZFByZXNzIEFKQVggcmV0dXJucyBhIC0xIChvciAwIGluIG5ld2VyIHZlcnNpb24/KSBmb3IgdGhlc2UuIEFsc28gbm90IGxvZ2dlZCBpbnRvCgkgKglhZG1pbiB3aGVuIGNvbm5lY3RpbmcgYmFjay4gQ2hlY2tzIHRvIHNlZSBpZiBib2R5IGNvbnRhaW5zIC0xIC8gMC4gSWYgbG9vcGJhY2tzIGFyZSBub3QKCSAqCWVuYWJsZWQgdGhlbiB3aWxsIGZhaWwgY29ubmVjdGluZyBvciBkbyBzb21ldGhpbmcgZWxzZS4KCSAqCQoJICoJCgkgKglAcGFyYW0JCQoJICoJQHJldHVybgkJYm9vbGVhbgkJVHJ1ZSBvbiBzdWNjZXNzLCBzdHJpbmcgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9vcGJhY2tfdGVzdCgpIHsKCQkkbG9vcGJhY2tfdXJsID0gYWRtaW5fdXJsKCdhZG1pbi1hamF4LnBocCcpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Rlc3RpbmcgbG9vcGJhY2sgY29ubmVjdGlvbnMgYnkgY29ubmVjdGluZyBiYWNrIHRvIHNpdGUgYXQgdGhlIFVSTDogYCcgLiAkbG9vcGJhY2tfdXJsIC4gJ2AuIEl0IHNob3VsZCBkaXNwbGF5IHNpbXBseSAiMCIgb3IgIi0xIiBpbiB0aGUgYm9keS4nICk7CgoJCSRyZXNwb25zZSA9IHdwX3JlbW90ZV9nZXQoCgkJCSRsb29wYmFja191cmwsCgkJCWFycmF5KAoJCQkJJ21ldGhvZCcgPT4gJ0dFVCcsCgkJCQkndGltZW91dCcgPT4gOCwgLy8gWCBzZWNvbmQgZGVsYXkuIEEgbG9vcGJhY2sgc2hvdWxkIGJlIHZlcnkgZmFzdC4KCQkJCSdyZWRpcmVjdGlvbicgPT4gNSwKCQkJCSdodHRwdmVyc2lvbicgPT4gJzEuMCcsCgkJCQknYmxvY2tpbmcnID0+IHRydWUsCgkJCQknaGVhZGVycycgPT4gYXJyYXkoKSwKCQkJCSdib2R5JyA9PiBudWxsLAoJCQkJJ2Nvb2tpZXMnID0+IGFycmF5KCksCgkJCQknc3NsdmVyaWZ5JyA9PiBhcHBseV9maWx0ZXJzKCAnaHR0cHNfbG9jYWxfc3NsX3ZlcmlmeScsIGZhbHNlICkKCQkJKQoJCSk7CgkJCgkJZ2xvYmFsICRiYWNrdXBidWRkeV9sb29wYmFja19kZXRhaWxzOwoJCWlmICggaXNfd3BfZXJyb3IoICRyZXNwb25zZSApICkgeyAvLyBMb29wYmFjayBmYWlsZWQuIFNvbWUga2luZCBvZiBlcnJvci4KCQkJJGVycm9yID0gJHJlc3BvbnNlLT5nZXRfZXJyb3JfbWVzc2FnZSgpOwoJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMzg6IExvb3BiYWNrIHRlc3QgZXJyb3I6IGAnIC4gJGVycm9yIC4gJ2AuIFVSTDogYCcgLiAkbG9vcGJhY2tfdXJsIC4gJ2AuIElmIHlvdSBuZWVkIHRvIGNvbnRhY3QgeW91ciB3ZWIgaG9zdCwgdGVsbCB0aGVtIHRoYXQgd2hlbiBQSFAgdHJpZXMgdG8gY29ubmVjdCBiYWNrIHRvIHRoZSBzaXRlIGF0IHRoZSBVUkwgYCcgLiAkbG9vcGJhY2tfdXJsIC4gJ2AgdmlhIGN1cmwgKG9yIG90aGVyIGZhbGxiYWNrIGNvbm5lY3Rpb24gbWV0aG9kIGJ1aWx0IGludG8gV29yZFByZXNzKSB0aGF0IGl0IGdldHMgdGhlIGVycm9yIGAnIC4gJGVycm9yIC4gJ2AuIFRoaXMgbWVhbnMgdGhhdCBXb3JkUHJlc3NcJyBidWlsdC1pbiBzaW11bGF0ZWQgY3JvbiBzeXN0ZW0gY2Fubm90IGZ1bmN0aW9uIHByb3Blcmx5LCBicmVha2luZyBzb21lIFdvcmRQcmVzcyBmZWF0dXJlcyAmIHN1YnNlcXVlbnRseSBzb21lIHBsdWdpbnMuIFRoZXJlIG1heSBiZSBhIHByb2JsZW0gd2l0aCB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gKGVnIGxvY2FsIEROUyBwcm9ibGVtcywgbW9kX3NlY3VyaXR5LCBldGMpIHByZXZlbnRpbmcgY29ubmVjdGlvbnMgZnJvbSB3b3JraW5nIHByb3Blcmx5Lic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQkkYmFja3VwYnVkZHlfbG9vcGJhY2tfZGV0YWlscyA9ICdFcnJvcjogJyAuICRlcnJvcjsKCQkJcmV0dXJuICRlcnJvcjsKCQl9IGVsc2UgewoJCQlpZiAoICggJHJlc3BvbnNlWydib2R5J10gPT0gJy0xJyApIHx8ICggJHJlc3BvbnNlWydib2R5J10gPT0gJzAnICkgKSB7IC8vIExvb3BiYWNrIHN1Y2NlZWRlZC4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0hUVFAgTG9vcGJhY2sgdGVzdCBzdWNjZXNzLiBSZXR1cm5lZCBgJyAuICRyZXNwb25zZVsnYm9keSddIC4gJ2AuJyApOwoJCQkJJGJhY2t1cGJ1ZGR5X2xvb3BiYWNrX2RldGFpbHMgPSAnUmV0dXJuZWQ6IGAnIC4gJHJlc3BvbnNlWydib2R5J10gLiAnYCB3aXRoIGNvZGUgYCcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ2NvZGUnXSAuICcgJyAuICRyZXNwb25zZVsncmVzcG9uc2UnXVsnbWVzc2FnZSddIC4gJ2AuJzsKCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgeyAvLyBMb29wYmFjayBmYWlsZWQuCgkJCQkkZXJyb3IgPSAnV2FybmluZyAjOTAzODogQ29ubmVjdGVkIHRvIHNlcnZlciBidXQgdW5leHBlY3RlZCBvdXRwdXQ6IGAnIC4gaHRtbGVudGl0aWVzKCAkcmVzcG9uc2VbJ2JvZHknXSAuICdgLiBDb2RlOiBgJyAuICRyZXNwb25zZVsncmVzcG9uc2UnXVsnY29kZSddIC4gJyAnIC4gJHJlc3BvbnNlWydyZXNwb25zZSddWydtZXNzYWdlJ10gLiAnICcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ21lc3NhZ2UnXSAuICdgLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJGVycm9yICk7CgkJCQkkYmFja3VwYnVkZHlfbG9vcGJhY2tfZGV0YWlscyA9ICRlcnJvcjsKCQkJCXJldHVybiAkZXJyb3I7CgkJCX0KCQl9Cgl9IC8vIEVuZCBsb29wYmFja190ZXN0KCkuCgkKCQoJCgkvKiBjcm9uYmFja190ZXN0KCkKCSAqCgkgKiBkZXNjcmlwdGlvbgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcm9uYmFja190ZXN0KCkgewoJCSRnbXRfdGltZSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCSRkb2luZ193cF9jcm9uID0gc3ByaW50ZiggJyUuMjJGJywgJGdtdF90aW1lICk7CgkJJGNyb25VUkwgPSBhZGRfcXVlcnlfYXJnKCAnZG9pbmdfd3BfY3JvbicsICRkb2luZ193cF9jcm9uLCBzaXRlX3VybCggJ3dwLWNyb24ucGhwJyApICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGVzdGluZyB3cC1jcm9uLnBocCBsb29wYmFjayBjb25uZWN0aW9ucyBieSBjb25uZWN0aW5nIGJhY2sgdG8gc2l0ZSBhdCB0aGUgVVJMOiBgJyAuICRjcm9uVVJMIC4gJ2AuIEV4cGVjdCAyMDAgT0sgcmVzcG9uc2UuJyApOwoJCQoJCSRjcm9uX3JlcXVlc3QgPSBhcnJheSgKCQkJJ3VybCcgID0+ICRjcm9uVVJMLAoJCQkna2V5JyAgPT4gJGRvaW5nX3dwX2Nyb24sCgkJCSdhcmdzJyA9PiBhcnJheSgKCQkJCSd0aW1lb3V0JyAgID0+IDQsCgkJCQknYmxvY2tpbmcnICA9PiB0cnVlLAoJCQkJLyoqIFRoaXMgZmlsdGVyIGlzIGRvY3VtZW50ZWQgaW4gd3AtaW5jbHVkZXMvY2xhc3MtaHR0cC5waHAgKi8KCQkJCSdzc2x2ZXJpZnknID0+IGFwcGx5X2ZpbHRlcnMoICdodHRwc19sb2NhbF9zc2xfdmVyaWZ5JywgZmFsc2UgKQoJCQkpCgkJKTsKCQkKCQkkcmVzcG9uc2UgPSB3cF9yZW1vdGVfcG9zdCggJGNyb25fcmVxdWVzdFsndXJsJ10sICRjcm9uX3JlcXVlc3RbJ2FyZ3MnXSApOwoJCQoJCWdsb2JhbCAkYmFja3VwYnVkZHlfY3JvbmJhY2tfZGV0YWlsczsKCQlpZiAoIGlzX3dwX2Vycm9yKCAkcmVzcG9uc2UgKSApIHsgLy8gTG9vcGJhY2sgZmFpbGVkLiBTb21lIGtpbmQgb2YgZXJyb3IuCgkJCSRlcnJvciA9ICRyZXNwb25zZS0+Z2V0X2Vycm9yX21lc3NhZ2UoKTsKCQkJJGVycm9yID0gJ3dwLWNyb24ucGhwIGxvb3BiYWNrIHRlc3QgZXJyb3I6IGAnIC4gJGVycm9yIC4gJ2AuIFVSTDogYCcgLiAkY3JvblVSTCAuICdgLiBJZiB5b3UgbmVlZCB0byBjb250YWN0IHlvdXIgd2ViIGhvc3QsIHRlbGwgdGhlbSB0aGF0IHdoZW4gUEhQIHRyaWVzIHRvIGNvbm5lY3QgYmFjayB0byB0aGUgc2l0ZSBhdCB0aGUgVVJMIGAnIC4gJGNyb25VUkwgLiAnYCB2aWEgY3VybCAob3Igb3RoZXIgZmFsbGJhY2sgY29ubmVjdGlvbiBtZXRob2QgYnVpbHQgaW50byBXb3JkUHJlc3MpIHRoYXQgaXQgZ2V0cyB0aGUgZXJyb3IgYCcgLiAkZXJyb3IgLiAnYC4gVGhpcyBtZWFucyB0aGF0IFdvcmRQcmVzc1wnIGJ1aWx0LWluIHNpbXVsYXRlZCBjcm9uIHN5c3RlbSBjYW5ub3QgZnVuY3Rpb24gcHJvcGVybHksIGJyZWFraW5nIHNvbWUgV29yZFByZXNzIGZlYXR1cmVzICYgc3Vic2VxdWVudGx5IHNvbWUgcGx1Z2lucy4gVGhlcmUgbWF5IGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAoZWcgbG9jYWwgRE5TIHByb2JsZW1zLCBtb2Rfc2VjdXJpdHksIGV0YykgcHJldmVudGluZyBjb25uZWN0aW9ucyBmcm9tIHdvcmtpbmcgcHJvcGVybHkuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCSRiYWNrdXBidWRkeV9jcm9uYmFja19kZXRhaWxzID0gJGVycm9yOwoJCQlyZXR1cm4gJGVycm9yOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3dwLWNyb24ucGhwIGxvb3BiYWNrIHRlc3Qgc3VjY2Vzcy4gUmV0dXJuZWQgYCcgLiAkcmVzcG9uc2VbJ2JvZHknXSAuICdgLicgKTsKCQkJJGJhY2t1cGJ1ZGR5X2Nyb25iYWNrX2RldGFpbHMgPSAnUmV0dXJuZWQ6IGAnIC4gJHJlc3BvbnNlWydib2R5J10gLiAnYCB3aXRoIGNvZGUgYCcgLiAkcmVzcG9uc2VbJ3Jlc3BvbnNlJ11bJ2NvZGUnXSAuICcgJyAuICRyZXNwb25zZVsncmVzcG9uc2UnXVsnbWVzc2FnZSddIC4gJ2AuJzsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfSAvLyBFbmQgY3JvbmJhY2tfdGVzdCgpLgoKCgoJLyogZ2V0X3dvcmRwcmVzc19sb2NhdGlvbnMoKQoJICoKCSAqIEdldCBhbiBhcnJheSBvZiBzdWJkaXJlY3RvcmllcyB3aGVyZSBwb3RlbnRpYWwgV29yZFByZXNzIGluc3RhbGxhdGlvbnMgaGF2ZSBiZWVuIGRldGVjdGVkLgoJICoKCSAqIEByZXR1cm4JYXJyYXkJQXJyYXkgb2YgZnVsbCBwYXRocywgV0lUSE9VVCB0cmFpbGluZyBzbGFzaGVzLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfd29yZHByZXNzX2xvY2F0aW9ucygpIHsKCQkkd29yZHByZXNzX2xvY2F0aW9ucyA9IGFycmF5KCk7CgoJCSRmaWxlcyA9IGdsb2IoIEFCU1BBVEggLiAnKi8nICk7CgkJaWYgKCAhaXNfYXJyYXkoICRmaWxlcyApIHx8IGVtcHR5KCAkZmlsZXMgKSApIHsKCQkJJGZpbGVzID0gYXJyYXkoKTsKCQl9CgoJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGUgLiAnd3AtY29uZmlnLnBocCcgKSApIHsKCQkJCSR3b3JkcHJlc3NfbG9jYXRpb25zW10gID0gcnRyaW0oICcvJyAuIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJGZpbGUgKSwgJy9cXCcgKTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIGFueSBleGNsdWRlZCBkaXJlY3RvcmllcyBmcm9tIHNob3dpbmcgdXAgaW4gdGhpcy4KCQkkZGlyZWN0b3J5X2V4Y2x1c2lvbnMgPSBzZWxmOjpnZXRfZGlyZWN0b3J5X2V4Y2x1c2lvbnMoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVswXSApOyAvLyBkZWZhdWx0IHByb2ZpbGUuCgkJJHdvcmRwcmVzc19sb2NhdGlvbnMgPSBhcnJheV9kaWZmKCAkd29yZHByZXNzX2xvY2F0aW9ucywgJGRpcmVjdG9yeV9leGNsdXNpb25zICk7CgoJCXJldHVybiAkd29yZHByZXNzX2xvY2F0aW9uczsKCX0gLy8gRW5kIGdldF93b3JkcHJlc3NfbG9jYXRpb25zKCkuCgkKCQoJCgkvKglnZXRfc2l0ZV9zaXplKCkKCSAqCQoJICoJUmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBzaXRlIHNpemUgYW5kIHRoZSBzaXRlIHNpemUgc2FucyBleGNsdXNpb25zLiBTYXZlcyB1cGRhdGVzIHN0YXRzIGluIG9wdGlvbnMuCgkgKgkKCSAqCUByZXR1cm4JCWFycmF5CQlJbmRleCAwOiBzaXRlIHNpemU7IEluZGV4IDE6IHNpdGUgc2l6ZSBzYW5zIGV4Y2x1ZGVkIGZpbGVzL2RpcnMuOyBJbmRleCAyOiBUb3RhbCBudW1iZXIgb2Ygb2JqZWN0cyAoZmlsZXMrZm9sZGVycyk7IEluZGV4IDM6IFRvdGFsIG9iamVjdHMgc2FucyBleGNsdWRlZCBmaWxlcy9mb2xkZXJzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zaXRlX3NpemUoKSB7CgkJJGV4Y2x1c2lvbnMgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfZGlyZWN0b3J5X2V4Y2x1c2lvbnMoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVswXSApOwoJCSRkaXJfYXJyYXkgPSBhcnJheSgpOwoJCSRyZXN1bHQgPSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmRpcl9zaXplX21hcCggQUJTUEFUSCwgQUJTUEFUSCwgJGV4Y2x1c2lvbnMsICRkaXJfYXJyYXkgKTsKCQl1bnNldCggJGRpcl9hcnJheSApOyAvLyBGcmVlIHRoaXMgbGFyZ2UgY2h1bmsgb2YgbWVtb3J5LgoKCQkkdG90YWxfc2l6ZSA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9zaXplJ10gPSAkcmVzdWx0WzBdOwoJCSR0b3RhbF9zaXplX2V4Y2x1ZGVkID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemVfZXhjbHVkZWQnXSA9ICRyZXN1bHRbMV07CgkJJHRvdGFsX29iamVjdHMgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfb2JqZWN0cyddID0gJHJlc3VsdFsyXTsKCQkkdG90YWxfb2JqZWN0c19leGNsdWRlZCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkJ10gPSAkcmVzdWx0WzNdOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9zaXplX3VwZGF0ZWQnXSA9IHRpbWUoKTsKCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoKCQlyZXR1cm4gYXJyYXkoICR0b3RhbF9zaXplLCAkdG90YWxfc2l6ZV9leGNsdWRlZCwgJHRvdGFsX29iamVjdHMsICR0b3RhbF9vYmplY3RzX2V4Y2x1ZGVkICk7Cgl9IC8vIEVuZCBnZXRfc2l0ZV9zaXplKCkuCgoKCgkvKglnZXRfZGF0YWJhc2Vfc2l6ZSgpCgkgKgkKCSAqCVJldHVybiBhcnJheSBvZiBkYXRhYmFzZSBzaXplLCBkYXRhYmFzZSBzYW5zIGV4Y2x1c2lvbnMuCgkgKgkKCSAqCUByZXR1cm4JCWFycmF5CQkJSW5kZXggMDogZGIgc2l6ZSwgSW5kZXggMTogZGIgc2l6ZSBzYW5zIGV4Y2x1c2lvbnMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2RhdGFiYXNlX3NpemUoICRwcm9maWxlX2lkID0gMCApIHsKCQlnbG9iYWwgJHdwZGI7CgkJJHByZWZpeCA9ICR3cGRiLT5wcmVmaXg7CgkJJHByZWZpeF9sZW5ndGggPSBzdHJsZW4oICR3cGRiLT5wcmVmaXggKTsKCgkJJGFkZGl0aW9uYWxfaW5jbHVkZXMgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfbXlzcWxkdW1wX2FkZGl0aW9uYWwoICdpbmNsdWRlcycsIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVskcHJvZmlsZV9pZF0gKTsKCQkkYWRkaXRpb25hbF9leGNsdWRlcyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9teXNxbGR1bXBfYWRkaXRpb25hbCggJ2V4Y2x1ZGVzJywgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyRwcm9maWxlX2lkXSApOwoKCQkkdG90YWxfc2l6ZSA9IDA7CgkJJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zID0gMDsKCQkkcm93cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgVEFCTEUgU1RBVFVTIiwgQVJSQVlfQSApOwoJCWZvcmVhY2goICRyb3dzIGFzICRyb3cgKSB7CgkJCSRleGNsdWRlZCA9IHRydWU7IC8vIERlZmF1bHQuCgoJCQkvLyBUQUJMRSBTVEFUVVMuCgkJCSRyb3dzYiA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIkNIRUNLIFRBQkxFIGB7JHJvd1snTmFtZSddfWAiLCBBUlJBWV9BICk7CgkJCWZvcmVhY2goICRyb3dzYiBhcyAkcm93YiApIHsKCQkJCWlmICggJHJvd2JbJ01zZ190eXBlJ10gPT0gJ3N0YXR1cycgKSB7CgkJCQkJJHN0YXR1cyA9ICRyb3diWydNc2dfdGV4dCddOwoJCQkJfQoJCQl9CgkJCXVuc2V0KCAkcm93c2IgKTsKCgkJCS8vIFRBQkxFIFNJWkUuCgkJCSRzaXplID0gKCAkcm93WydEYXRhX2xlbmd0aCddICsgJHJvd1snSW5kZXhfbGVuZ3RoJ10gKTsKCQkJJHRvdGFsX3NpemUgKz0gJHNpemU7CgoKCQkJLy8gSEFORExFIEVYQ0xVU0lPTlMuCgkJCWlmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyRwcm9maWxlX2lkXVsnYmFja3VwX25vbndwX3RhYmxlcyddID09IDAgKSB7IC8vIE9ubHkgbWF0Y2hpbmcgcHJlZml4LgoJCQkJaWYgKCAoIHN1YnN0ciggJHJvd1snTmFtZSddLCAwLCAkcHJlZml4X2xlbmd0aCApID09ICRwcmVmaXggKSBPUiAoIGluX2FycmF5KCAkcm93WydOYW1lJ10sICRhZGRpdGlvbmFsX2luY2x1ZGVzICkgKSApIHsKCQkJCQlpZiAoICFpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9leGNsdWRlcyApICkgewoJCQkJCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKz0gJHNpemU7CgkJCQkJCSRleGNsdWRlZCA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsgLy8gQWxsIHRhYmxlcy4KCQkJCWlmICggIWluX2FycmF5KCAkcm93WydOYW1lJ10sICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICkgKSB7CgkJCQkJJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zICs9ICRzaXplOwoJCQkJCSRleGNsdWRlZCA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplJ10gPSAkdG90YWxfc2l6ZTsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemVfZXhjbHVkZWQnXSA9ICR0b3RhbF9zaXplX3dpdGhfZXhjbHVzaW9uczsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemVfdXBkYXRlZCddID0gdGltZSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgoJCXVuc2V0KCAkcm93cyApOwoKCQlyZXR1cm4gYXJyYXkoICR0b3RhbF9zaXplLCAkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKTsKCX0gLy8gRW5kIGdldF9kYXRhYmFzZV9zaXplKCkuCgoKCgkvKiBraWNrX2RiKCkKCSAqCgkgKiBBdHRlbXB0IHRvIHZlcmlmeSB0aGUgZGF0YWJhc2Ugc2VydmVyIGlzIHN0aWxsIGFsaXZlIGFuZCBmdW5jdGlvbmluZy4gIElmIG5vdCwgdHJ5IHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBraWNrX2RiKCkgewoJCQoJCSRraWNrX2RiID0gdHJ1ZTsgLy8gQ2hhbmdlIHRydWUgdG8gZmFsc2UgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB0byBkaXNhYmxlIGtpY2tlci4KCQkKCQkvLyBOZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBhY3RpdmUuIFNvbWV0aW1lcyBpdCBnb2VzIGF3YXkgZHVyaW5nIGxvbmcgYm91dHMgZG9pbmcgb3RoZXIgdGhpbmdzIC0tIHNpZ2guCgkJLy8gVGhpcyBpcyBub3QgZXNzZW50aWFsIHNvIHVzZSBpbmNsdWRlIGFuZCBub3QgcmVxdWlyZSAoc3VwcHJlc3MgYW55IHdhcm5pbmcpCgkJaWYgKCAka2lja19kYiA9PT0gdHJ1ZSApIHsKCQkJQGluY2x1ZGVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi93cGRidXRpbHMvd3BkYnV0aWxzLnBocCcgKTsKCQkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV93cGRidXRpbHMnICkgKSB7CgkJCQkvLyBUaGlzIGlzIHRoZSBkYXRhYmFzZSBvYmplY3Qgd2Ugd2FudCB0byB1c2UKCQkJCWdsb2JhbCAkd3BkYjsKCQkJCQoJCQkJLy8gR2V0IG91ciBoZWxwZXIgb2JqZWN0IGFuZCBsZXQgaXQgdXNlIHVzIHRvIG91dHB1dCBzdGF0dXMgbWVzc2FnZXMKCQkJCSRkYmhlbHBlciA9IG5ldyBwbHVnaW5idWRkeV93cGRidXRpbHMoICR3cGRiICk7CgkJCQkKCQkJCS8vIElmIHdlIGNhbm5vdCBraWNrIHRoZSBkYXRhYmFzZSBpbnRvIGxpZmUgdGhlbiBzaWduYWwgdGhlIGVycm9yIGFuZCByZXR1cm4gZmFsc2Ugd2hpY2ggd2lsbCBzdG9wIHRoZSBiYWNrdXAKCQkJCS8vIE90aGVyd2lzZSBhbGwgaXMgb2sgYW5kIHdlIGNhbiBqdXN0IGZhbGwgdGhyb3VnaCBhbmQgbGV0IHRoZSBmdW5jdGlvbiByZXR1cm4gdHJ1ZQoJCQkJaWYgKCAhJGRiaGVscGVyLT5raWNrKCkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oJ0RhdGFiYXNlIFNlcnZlciBoYXMgZ29uZSBhd2F5LCB1bmFibGUgdG8gdXBkYXRlIHJlbW90ZSBkZXN0aW5hdGlvbiB0cmFuc2ZlciBzdGF0dXMuIFRoaXMgaXMgbW9zdCBvZnRlbiBjYXVzZWQgYnkgbXlzcWwgcnVubmluZyBvdXQgb2YgbWVtb3J5IG9yIHRpbWluZyBvdXQgZmFyIHRvbyBlYXJseS4gUGxlYXNlIGNvbnRhY3QgeW91ciBob3N0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBVdGlscyBub3QgYXZhaWxhYmxlIHNvIGNhbm5vdCB2ZXJpZnkgZGF0YWJhc2UgY29ubmVjdGlvbiBzdGF0dXMgLSBqdXN0IG5vdGlmeQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRGF0YWJhc2UgU2VydmVyIGNvbm5lY3Rpb24gc3RhdHVzIHVudmVyaWZpZWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJfQoJCX0KCQkKCX0gLy8gRW5kIGtpY2tfZGIoKS4KCgoKCS8qIHZlcmlmeV9kaXJlY3RvcmllcygpCgkgKgoJICogVmVyaWZ5IGV4aXN0YW5jZSBhbmQgc2VjdXJpdHkgb2Yga2V5IGRpcmVjdG9yaWVzLiBSZXN1bHQgYXZhaWxhYmxlIHZpYSBnbG9iYWwgJHBiX2JhY2t1cGJ1ZGR5X2RpcmVjdG9yeV92ZXJpZmljYXRpb24gd2l0aCByZXR1cm4gdmFsdWUuCgkgKgoJICogQHJldHVybgkJYm9vbAkJdHJ1ZSBvbiBzdWNjZXNzIGNyZWF0aW5nIC8gdmVyaWZ5aW5nLCBlbHNlIGZhbHNlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2ZXJpZnlfZGlyZWN0b3JpZXMoICRza2lwVGVtcEdlbmVyYXRpb24gPSBmYWxzZSApIHsKCQkKCQkkc3VjY2VzcyA9IHRydWU7CgkJCgkJLy8gVXBkYXRlIGJhY2t1cCBkaXJlY3RvcnkgaWYgdW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZWZpbmVkIG9uZS4KCQlpZiAoICEgQGlzX3dyaXRhYmxlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCYWNrdXAgZGlyZWN0b3J5IGludmFsaWQuIFVwZGF0aW5nIGZyb20gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICdgIHRvIGRlZmF1bHQuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JhY2t1cF9kaXJlY3RvcnknXSA9ICcnOyAvLyBSZXNldCB0byBkZWZhdWx0IChibGFuaykuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJfQoJCSRyZXNwb25zZSA9IHBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCksICRkaWUgPSBmYWxzZSApOwoJCWlmICggZmFsc2UgPT09ICRyZXNwb25zZSApIHsKCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQl9CgkJCgkJLy8gVXBkYXRlIGxvZyBkaXJlY3RvcnkgaWYgdW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZWZpbmVkIG9uZS4KCQlpZiAoICEgQGlzX3dyaXRhYmxlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2cgZGlyZWN0b3J5IGludmFsaWQuIFVwZGF0aW5nIGZyb20gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdgIHRvIGRlZmF1bHQuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19kaXJlY3RvcnknXSA9ICcnOyAvLyBSZXNldCB0byBkZWZhdWx0IChibGFuaykuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCksICRkaWUgPSBmYWxzZSApOwoJCWlmICggZmFsc2UgPT09ICRyZXNwb25zZSApIHsKCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQl9CgkJCgkJLy8gVXBkYXRlIHRlbXAgZGlyZWN0b3J5IGlmIHVuYWJsZSB0byB3cml0ZSB0byB0aGUgZGVmaW5lZCBvbmUuCgkJaWYgKCB0cnVlICE9PSAkc2tpcFRlbXBHZW5lcmF0aW9uICkgewoJCQlpZiAoICEgQGlzX3dyaXRhYmxlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RlbXBvcmFyeSBkaXJlY3RvcnkgaW52YWxpZC4gVXBkYXRpbmcgZnJvbSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSAuICdgIHRvIGRlZmF1bHQuJyApOwoJCQkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZW1wX2RpcmVjdG9yeSddID0gJyc7CgkJCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQl9CgkJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpLCAkZGllID0gZmFsc2UgKTsKCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3BvbnNlICkgewoJCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkJfQoJCX0KCQkKCQkvLyBJZiB0ZW1wIGRpcmVjdG9yeSBleGlzdHMgKHNob3VsZCBvbmx5IGJlIHRyYW5zaWVudCBidXQganVzdCBpbiBjYXNlIGl0IGlzIGhhbmdpbmcgYXJvdW5kKSBtYWtlIHN1cmUgaXQncyBzZWN1cmVkLiBCQiB3aWxsIHRyeSB0byBkZWxldGUgdGhpcyBkaXJlY3RvcnkgYnV0IGlmIGl0IGNhbid0IGl0IHdpbGwgYXQgbGVhc3QgYmUgY2hlY2tlZCB0byBiZSBzZWN1cmUuCgkJaWYgKCBmaWxlX2V4aXN0cyggYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpLCAkZGllID0gZmFsc2UgKTsKCQl9CgkJCgkJZ2xvYmFsICRwYl9iYWNrdXBidWRkeV9kaXJlY3RvcnlfdmVyaWZpY2F0aW9uOwoJCSRwYl9iYWNrdXBidWRkeV9kaXJlY3RvcnlfdmVyaWZpY2F0aW9uID0gJHN1Y2Nlc3M7CgkJcmV0dXJuICRzdWNjZXNzOwoJCQoJfSAvLyBFbmQgdmVyaWZ5X2RpcmVjdG9yaWVzKCkuCgkKCQoJCgkvKiBzY2hlZHVsZV9zaW5nbGVfZXZlbnQoKQoJICoKCSAqIEFQSSB0byB3cF9zY2hlZHVsZV9zaW5nbGVfZXZlbnQoKSB0aGF0IGFsc28gdmVyaWZpZXMgdGhhdCB0aGUgc2NoZWR1bGUgYWN0dWFsbHkgZ290IGNyZWF0ZWQgaW4gV29yZFBSZXNzLgoJICogU29tZXRpbWVzIHRoZSBkYXRhYmFzZSByZWplY3RzIHRoaXMgdXBkYXRlIHNvIHdlIG5lZWQgdG8gZG8gYWN0dWFsIHZlcmlmaWNhdGlvbi4KCSAqCgkgKiBAcGFyYW0JaW50CQkJJHJlc2NoZWR1bGVDb3VudAlOdW1lcmljIGNvdW50ZXIgb2YgaG93IG1hbnkgdGltZXMgdGhpcyBzY2hlZHVsZSBoYXMgYmVlbiAnYnVtcGVkJy4gIFRoaXMgaGVscHMgcHJldmVudCBpbmZpbml0ZSBsb29wcyBvZiBidW1waW5nIGNyb25zLiAgQkIgbGltaXRzIHRvIG9ubHkgb25lIEJCIGNyb24gYWN0aW9uIHBlciBQSFAgcGFnZSBsb2FkIHRvIGluc3VyZSBmdWxsIHJ1bnRpbWUgcGVyIHByb2Nlc3MuCgkgKiBAcmV0dXJuCWJvb2xlYW4JCQkJCQkJVHJ1ZSBvbiB2ZXJpZmllZCBzY2hlZHVsZSBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNjaGVkdWxlX3NpbmdsZV9ldmVudCggJHRpbWUsICRtZXRob2QsICRhcmdzLCAkcmVzY2hlZHVsZUNvdW50ID0gMCApIHsKCQkkdGFnID0gJ2JhY2t1cGJ1ZGR5X2Nyb24nOwoJCQoJCS8vIE1ha2Ugc3VyZSBsaXZlX3BlcmlvZGljIG5ldmVyIGdldHMgc2NoZWR1bGVkIG11bHRpcGxlIHRpbWVzLgoJCWlmICggJ2xpdmVfcGVyaW9kaWMnID09PSAkbWV0aG9kICkgewoJCQkkc2luZ2xlX3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCBhcnJheSggJG1ldGhvZCwgJGFyZ3MsICRyZXNjaGVkdWxlQ291bnQgKSApOyAvLyBDaGVjayBpZiB0YWcgYWxyZWFkeSBzY2hlZHVsZWQuCgkJCWlmICggRkFMU0UgIT09ICRzaW5nbGVfc2NoZWR1bGVkICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjODM5MjQ5NzQzOiBBbiBleGlzdGluZyBzY2hlZHVsZSBhcHBlYXJzIHRvIGFscmVhZHkgZXhpc3QgZm9yIHRoaXMgdGFnIHdoaWNoIGlzIGxpbWl0ZWQgdG8gYSBzaW5nbGUgaW5zdGFuY2UuIFRoaXMgbWF5IGJlIGEgdGVtcG9yYXJ5IGlzc3VlIG9yIHRoaXMgbWF5IGJlIGNhdXNlZCBieSBjcm9uIGludGVyZmVyZW5jZSBzdWNoIGFzIGJ5IFczVEMuIERldGFpbHM6IGAnIC4gcHJpbnRfciggJHNpbmdsZV9zY2hlZHVsZWQsIHRydWUgKSAuICdgLicgKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJCQoJCSRzY2hlZHVsZV9yZXN1bHQgPSB3cF9zY2hlZHVsZV9zaW5nbGVfZXZlbnQoICR0aW1lLCAkdGFnLCBhcnJheSggJG1ldGhvZCwgJGFyZ3MsICRyZXNjaGVkdWxlQ291bnQgKSApOyAvLyBTY2hlZHVsZS4KCQlpZiAoIEZBTFNFID09PSAkc2NoZWR1bGVfcmVzdWx0ICkgeyAvLyBJZiBmYWlsZWQsIHNsZWVwIDEgdGhlbiB0cnkgYWdhaW4uCgkJCXNsZWVwKCBiYWNrdXBidWRkeV9jb25zdGFudHM6OlNDSEVEVUxFX1JFVFJZX1dBSVQgKTsKCQkJJHNjaGVkdWxlX3Jlc3VsdCA9IHdwX3NjaGVkdWxlX3NpbmdsZV9ldmVudCggJHRpbWUsICR0YWcsIGFycmF5KCAkbWV0aG9kLCAkYXJncywgJHJlc2NoZWR1bGVDb3VudCApICk7IC8vIFNjaGVkdWxlLgoJCX0KCQlpZiAoIEZBTFNFID09PSAkc2NoZWR1bGVfcmVzdWx0ICkgeyAvLyBTdGlsbCBjb3VsZCBub3Qgc2NoZWR1bGUuIFdhcm4uCgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjNDgzOTM0ODk6IFRoaXMgbWF5IG5vdCBiZSBhIGZhdGFsIGVycm9yLiBJZ25vcmUgaWYgcHJvY2VzcyBwcm9jZWVkcyB3aXRob3V0IG90aGVyIGVycm9ycy4gVW5hYmxlIHRvIGNyZWF0ZSBzY2hlZHVsZSBhcyB3cF9zY2hlZHVsZV9zaW5nbGVfZXZlbnQoKSByZXR1cm5lZCBmYWxzZS4gQSBwbHVnaW4gbWF5IGhhdmUgcHJldmVudGVkIGl0IG9yIGl0IGlzIGFscmVhZHkgc2NoZWR1bGVkLicgKTsKCQkJLy9yZXR1cm4gZmFsc2U7CgkJfQoJCQoJCSRuZXh0X3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCBhcnJheSggJG1ldGhvZCwgJGFyZ3MsICRyZXNjaGVkdWxlQ291bnQgKSApOyAvLyBSZXRyaWV2ZSBzY2hlZHVsZSB0byB2ZXJpZnkgaXQgc3R1Y2suCgkJCgkJaWYgKCBGQUxTRSA9PT0gJG5leHRfc2NoZWR1bGVkICkgewoJCQlzbGVlcCggYmFja3VwYnVkZHlfY29uc3RhbnRzOjpTQ0hFRFVMRV9SRVRSWV9XQUlUICk7CgkJCSRuZXh0X3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCBhcnJheSggJG1ldGhvZCwgJGFyZ3MsICRyZXNjaGVkdWxlQ291bnQgKSApOyAvLyBSZXRyaWV2ZSBzY2hlZHVsZSB0byB2ZXJpZnkgaXQgc3R1Y2suCgkJfQoJCQoJCWlmICggRkFMU0UgPT09ICRuZXh0X3NjaGVkdWxlZCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1dhcm5pbmcgIzM0ODk0OTM0OiBUaGlzIG1heSBub3QgYmUgYSBmYXRhbCBlcnJvci4gSWdub3JlIGlmIHByb2Nlc3MgcHJvY2VlZHMgd2l0aG91dCBvdGhlciBlcnJvcnMuIFdvcmRQcmVzcyByZXBvcnRlZCBzdWNjZXNzIHNjaGVkdWxpbmcgQlVUIHdwX25leHRfc2NoZWR1bGVkKCkgY291bGQgTk9UIGNvbmZpcm0gc2NoZWR1bGUgZXhpc3RhbmNlLiBBIHBsdWdpbiBtYXkgaGF2ZSBwcmV2ZW50ZWQgaXQgKGVnIGNhY2hpbmcpIG9yIGl0IGlzIGFscmVhZHkgc2NoZWR1bGVkIChidXQgY291bGQgbm90IGJlIGRldGVjdGVkKS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBzY2hlZHVsZV9zaW5nbGVfZXZlbnQoKS4KCgoKCS8qIHNjaGVkdWxlX2V2ZW50KCkKCSAqCgkgKiBBUEkgdG8gd3Bfc2NoZWR1bGVfZXZlbnQoKSB0aGF0IGFsc28gdmVyaWZpZXMgdGhhdCB0aGUgc2NoZWR1bGUgYWN0dWFsbHkgZ290IGNyZWF0ZWQgaW4gV29yZFBSZXNzLgoJICogU29tZXRpbWVzIHRoZSBkYXRhYmFzZSByZWplY3RzIHRoaXMgdXBkYXRlIHNvIHdlIG5lZWQgdG8gZG8gYWN0dWFsIHZlcmlmaWNhdGlvbi4KCSAqCgkgKiBAcmV0dXJuCWJvb2xlYW4JCQlUcnVlIG9uIHZlcmlmaWVkIHNjaGVkdWxlIHN1Y2Nlc3MsIGVsc2UgZmFsc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2NoZWR1bGVfZXZlbnQoICR0aW1lLCAkcGVyaW9kLCAkbWV0aG9kLCAkYXJncyApIHsKCQkkdGFnID0gJ2JhY2t1cGJ1ZGR5X2Nyb24nOwoJCSRzY2hlZHVsZV9yZXN1bHQgPSB3cF9zY2hlZHVsZV9ldmVudCggJHRpbWUsICRwZXJpb2QsICR0YWcsIGFycmF5KCAkbWV0aG9kLCAkYXJncyApICk7CgkJCgkJLy8gSWYgZmFpbGVkLCBzbGVlcCAxIHRoZW4gdHJ5IGFnYWluLgoJCWlmICggRkFMU0UgPT09ICRzY2hlZHVsZV9yZXN1bHQgKSB7CgkJCXNsZWVwKCBiYWNrdXBidWRkeV9jb25zdGFudHM6OlNDSEVEVUxFX1JFVFJZX1dBSVQgKTsKCQkJJHNjaGVkdWxlX3Jlc3VsdCA9IHdwX3NjaGVkdWxlX2V2ZW50KCAkdGltZSwgJHBlcmlvZCwgJHRhZywgYXJyYXkoICRtZXRob2QsICRhcmdzICkgKTsKCQl9CgkJCgkJaWYgKCBGQUxTRSA9PT0gJHNjaGVkdWxlX3Jlc3VsdCApIHsKCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnV2FybmluZyAjODM5MjgyMzQ6IFRoaXMgbWF5IG5vdCBiZSBhIGZhdGFsIGVycm9yLiBJZ25vcmUgaWYgYmFja3VwIHByb2NlZWRzIHdpdGhvdXQgb3RoZXIgZXJyb3JzLiBVbmFibGUgdG8gY3JlYXRlIHNjaGVkdWxlIGFzIHdwX3NjaGVkdWxlX2V2ZW50KCkgcmV0dXJuZWQgZmFsc2UuIEEgcGx1Z2luIG1heSBoYXZlIHByZXZlbnRlZCBpdCBvciBpdCBpcyBhbHJlYWR5IHNjaGVkdWxlZC4nICk7CgkJCS8vcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkkbmV4dF9zY2hlZHVsZWQgPSB3cF9uZXh0X3NjaGVkdWxlZCggJHRhZywgYXJyYXkoICRtZXRob2QsICRhcmdzICkgKTsKCQkKCQkvLyBJZiBmYWlsZWQsIHNsZWVwIDEgdGhlbiB0cnkgYWdhaW4uCgkJaWYgKCBGQUxTRSA9PT0gJG5leHRfc2NoZWR1bGVkICkgewoJCQlzbGVlcCggYmFja3VwYnVkZHlfY29uc3RhbnRzOjpTQ0hFRFVMRV9SRVRSWV9XQUlUICk7CgkJCSRuZXh0X3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCBhcnJheSggJG1ldGhvZCwgJGFyZ3MgKSApOwoJCX0KCQkKCQlpZiAoIEZBTFNFID09PSAkbmV4dF9zY2hlZHVsZWQgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODI5MzgzMjk6IFRoaXMgbWF5IG5vdCBiZSBhIGZhdGFsIGVycm9yLiBJZ25vcmUgaWYgYmFja3VwIHByb2NlZWRzIHdpdGhvdXQgb3RoZXIgZXJyb3JzLiBXb3JkUHJlc3MgcmVwb3J0ZWQgc3VjY2VzcyBzY2hlZHVsaW5nIEJVVCB3cF9uZXh0X3NjaGVkdWxlZCgpIGNvdWxkIE5PVCBjb25maXJtIHNjaGVkdWxlIGV4aXN0YW5jZSBvZiBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AuIEEgcGx1Z2luIG1heSBoYXZlIHByZXZlbnRlZCBpdCAoZWcgY2FjaGluZykgb3IgaXQgaXMgYWxyZWFkeSBzY2hlZHVsZWQgKGJ1dCBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQpLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBzY2hlZHVsZV9ldmVudCgpLgoKCgoJLyogdW5zY2hlZHVsZV9ldmVudCgpCgkgKgoJICogQVBJIHRvIHdwX3Vuc2NoZWR1bGVfZXZlbnQoKSB0aGF0IGFsc28gdmVyaWZpZXMgdGhhdCB0aGUgc2NoZWR1bGUgYWN0dWFsbHkgZ290IHJlbW92ZWQgV29yZFBSZXNzLgoJICogU29tZXRpbWVzIHRoZSBkYXRhYmFzZSByZWplY3RzIHRoaXMgdXBkYXRlIHNvIHdlIG5lZWQgdG8gZG8gYWN0dWFsIHZlcmlmaWNhdGlvbi4KCSAqCgkgKiBAcmV0dXJuCWJvb2xlYW4JCQlUcnVlIG9uIHZlcmlmaWVkIHNjaGVkdWxlIGRlbGV0aW9uIHN1Y2Nlc3MsIGVsc2UgZmFsc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW5zY2hlZHVsZV9ldmVudCggJHRpbWUsICR0YWcsICRhcmdzICkgewoJCSR1bnNjaGVkdWxlX3Jlc3VsdCA9IHdwX3Vuc2NoZWR1bGVfZXZlbnQoICR0aW1lLCAkdGFnLCAkYXJncyApOwoJCSRuZXh0X3NjaGVkdWxlZCA9IHdwX25leHRfc2NoZWR1bGVkKCAkdGFnLCAkYXJncyApOwoJCWlmICggRkFMU0UgPT09ICR1bnNjaGVkdWxlX3Jlc3VsdCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZzogVW5hYmxlIHRvIHJlbW92ZSBzY2hlZHVsZSBmb3IgdGFnIGAnIC4gJHRhZyAuICdgIGFzIHdwX3Vuc2NoZWR1bGVfZXZlbnQoKSByZXR1cm5lZCBmYWxzZS4gQSBwbHVnaW4gbWF5IGhhdmUgcHJldmVudGVkIGl0IG9yIGl0IGlzIGFscmVhZHkgdW5zY2hlZHVsZWQuIFRoaXMgbWF5IG5vdCBiZSBhIHByb2JsZW0uJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmICggRkFMU0UgIT09ICRuZXh0X3NjaGVkdWxlZCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1dvcmRQcmVzcyByZXBvcnRlZCBzdWNjZXNzIHVuc2NoZWR1bGluZyBCVVQgd3BfbmV4dF9zY2hlZHVsZWQoKSBjb25maXJtZWQgc2NoZWR1bGUgZXhpc3RhbmNlIG9mIHRhZyBgJyAuICR0YWcgLiAnYC4gVGhlIGRhdGFiYXNlIG1heSBoYXZlIHJlamVjdGVkIHRoZSByZW1vdmFsLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCB1bnNjaGVkdWxlX2V2ZW50KCkuCgoKCgkvKiBub3JtYWxpemVfY29tbWVudF9kYXRhKCkKCSAqCgkgKiBIYW5kbGUgbm9ybWFsaXppbmcgemlwIGNvbW1lbnQgZGF0YSwgZGVmYXVsdHMsIGV0Yy4KCSAqCgkgKiBAcGFyYW0JYXJyYXkJJGNvbW1lbnQJQXJyYXkgb2YgbWV0YSBkYXRhIHRvIG5vcm1hbGl6ZSAmIGFwcGx5IGRlZmF1bHRzIHRvLgoJICogQHJldHVybglhcnJheQkJCQlOb3JtYWxpemVkIGFycmF5LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZV9jb21tZW50X2RhdGEoICRjb21tZW50ICkgewoKCQkkZGVmYXVsdHMgPSBhcnJheSgKCQkJJ3NlcmlhbCcJCT0+CScnLAoJCQknc2l0ZXVybCcJCT0+CScnLAoJCQkndHlwZScJCQk9PgknJywKCQkJJ3Byb2ZpbGUnCQk9PgknJywKCQkJJ2NyZWF0ZWQnCQk9PgknJywKCQkJJ2dlbmVyYXRvcicJCT0+CScnLAoJCQknZGJfcHJlZml4JwkJPT4JJycsCgkJCSdiYl92ZXJzaW9uJwk9PgknJywKCQkJJ3dwX3ZlcnNpb24nCT0+CScnLAoJCQkncG9zdHMnCQkJPT4JJycsCgkJCSdwYWdlcycJCQk9PgknJywKCQkJJ2NvbW1lbnRzJwkJPT4JJycsCgkJCSd1c2VycycJCQk9PgknJywKCQkJJ2RhdF9wYXRoJwkJPT4JJycsCgkJCSdub3RlJwkJCT0+CScnLAoJCSk7CgoJCWlmICggISBpc19hcnJheSggJGNvbW1lbnQgKSApIHsgLy8gUGxhaW4gdGV4dDsgcGxhY2UgaW4gbm90ZSBmaWVsZC4KCQkJCgkJCWlmICggTlVMTCAhPT0gKCAkbWF5YmVDb21tZW50ID0ganNvbl9kZWNvZGUoICRjb21tZW50LCB0cnVlICkgKSApIHsKCQkJCXJldHVybiBhcnJheV9tZXJnZSggJGRlZmF1bHRzLCAkbWF5YmVDb21tZW50ICk7CgkJCX0gZWxzZSB7CgkJCQoJCQkJaWYgKCBpc19zdHJpbmcoICRjb21tZW50ICkgKSB7CgkJCQkJJGRlZmF1bHRzWydub3RlJ10gPSAkY29tbWVudDsKCQkJCX0KCQkJCXJldHVybiAkZGVmYXVsdHM7CgkJCX0KCQl9IGVsc2UgeyAvLyBBcnJheS4gTWVyZ2UgZGVmYXVsdHMgYW5kIHJldHVybi4KCQkJcmV0dXJuIGFycmF5X21lcmdlKCAkZGVmYXVsdHMsICRjb21tZW50ICk7CgkJfQoKCX0gLy8gRW5kIG5vcm1hbGl6ZV9jb21tZW50X2RhdGEoKS4KCQoJCgkKCS8qIHByZXR0eV9tZXRhX2luZm8oKQoJICoKCSAqIFRyYW5zbGF0ZXMgbWV0YSBpbmZvcm1hdGlvbiBmaWVsZCBuYW1lcyBhbmQgdmFsdWVzIGludG8gbmljZSByZWFkYWJsZSBmb3Jtcy4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRjb21tZW50X2xpbmVfbmFtZQkJTWV0YSBmaWVsZCBuYW1lLgoJICogQHBhcmFtCXN0cmluZwkkY29tbWVudF9saW5lX3ZhbHVlCQlWYWx1ZSBvZiBtZXRhIGl0ZW0uCgkgKiBAcmV0dXJuCWFycmF5fGZhbHNlIAkJCQkJQXJyYXkgd2l0aCB0d28gZW50cmllczogdGhlIHVwZGF0ZXMgY29tbWVudCBsaW5lIG5hbWUgYW5kIHVwZGF0ZWQgY29tbWVudCBsaW5lIHZhbHVlLiBmYWxzZSBpZiBlbXB0eS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJldHR5X21ldGFfaW5mbyggJGNvbW1lbnRfbGluZV9uYW1lLCAkY29tbWVudF9saW5lX3ZhbHVlICkgewoKCQlpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAnc2VyaWFsJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1VuaXF1ZSBzZXJpYWwgaWRlbnRpZmllcic7CgkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX25hbWUgPT0gJ3NpdGV1cmwnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnU2l0ZSBVUkwnOwoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICd0eXBlJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ0JhY2t1cCBUeXBlJzsKCQkJaWYgKCAkY29tbWVudF9saW5lX3ZhbHVlID09ICdkYicgKSB7CgkJCQkkY29tbWVudF9saW5lX3ZhbHVlID0gJ0RhdGFiYXNlJzsKCQkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX3ZhbHVlID09ICdmdWxsJyApIHsKCQkJCSRjb21tZW50X2xpbmVfdmFsdWUgPSAnRnVsbCc7CgkJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV92YWx1ZSA9PSAnZXhwb3J0JyApIHsKCQkJCSRjb21tZW50X2xpbmVfdmFsdWUgPSAnTXVsdGlzaXRlIFN1YnNpdGUgRXhwb3J0JzsKCQkJfQoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICdwcm9maWxlJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ0JhY2t1cCBQcm9maWxlJzsKCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAnY3JlYXRlZCcgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdDcmVhdGlvbiBEYXRlJzsKCQkJaWYgKCAkY29tbWVudF9saW5lX3ZhbHVlICE9ICcnICkgewoJCQkJJGNvbW1lbnRfbGluZV92YWx1ZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggJGNvbW1lbnRfbGluZV92YWx1ZSApICk7CgkJCX0KCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAnYmJfdmVyc2lvbicgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdCYWNrdXBCdWRkeSB2ZXJzaW9uIGF0IGNyZWF0aW9uJzsKCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAnd3BfdmVyc2lvbicgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdXb3JkUHJlc3MgdmVyc2lvbiBhdCBjcmVhdGlvbic7CgkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX25hbWUgPT0gJ2RhdF9wYXRoJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ0JhY2t1cEJ1ZGR5IGRhdGEgZmlsZSAocmVsYXRpdmUpJzsKCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAncG9zdHMnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnVG90YWwgUG9zdHMnOwoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICdwYWdlcycgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdUb3RhbCBQYWdlcyc7CgkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX25hbWUgPT0gJ2NvbW1lbnRzJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1RvdGFsIENvbW1lbnRzJzsKCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAndXNlcnMnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnVG90YWwgVXNlcnMnOwoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICdub3RlJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1VzZXItc3BlY2lmaWVkIG5vdGUnOwoJCQlpZiAoICRjb21tZW50X2xpbmVfdmFsdWUgIT0gJycgKSB7CgkJCQkkY29tbWVudF9saW5lX3ZhbHVlID0gJyInIC4gaHRtbGVudGl0aWVzKCAkY29tbWVudF9saW5lX3ZhbHVlICkgLiAnIic7CgkJCX0KCQl9IGVsc2UgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAkY29tbWVudF9saW5lX25hbWU7CgkJfQoKCQlpZiAoICRjb21tZW50X2xpbmVfdmFsdWUgIT0gJycgKSB7CgkJCXJldHVybiBhcnJheSggJGNvbW1lbnRfbGluZV9uYW1lLCAkY29tbWVudF9saW5lX3ZhbHVlICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGFycmF5KCAkY29tbWVudF9saW5lX25hbWUsICctRW1wdHktJyApOwoJCX0KCgl9IC8vIEVuZCBwcmV0dHlfbWV0YV9pbmZvKCkuCgoKCgkvKiBhbGVydF9jb3JlX3RhYmxlX2V4Y2x1ZGVzKCkKCSAqCgkgKiBPdXRwdXRzIGFuIGFsZXJ0IHdhcm5pbmcgaWYgYSBjb3JlIGRiIHRhYmxlIGlzIGV4Y2x1ZGVkLgoJICoKCSAqIEBwYXJhbQlhcnJheSAJCSRleGNsdWRlcwlBcnJheSBvZiB0YWJsZXMgZXhjbHVkZWQgZnJvbSB0aGUgYmFja3VwLgoJICogQHJldHVybglhcnJheSAJCQkJCUFycmF5IG9mIG1lc3NhZ2Ugd2FybmluZ3MgYWJvdXQgcG90ZW50aWFsIGlzc3VlcyBmb3VuZCB3aXRoIHRoZXNlIGV4Y2x1c2lvbnMsIGlmIGFueS4gSW5kZXggPSB1bmlxdWUgaWRlbnRpZmVyLCBWYWx1ZSA9IG1lc3NhZ2UuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFsZXJ0X2NvcmVfdGFibGVfZXhjbHVkZXMoICRleGNsdWRlcyApIHsKCQlnbG9iYWwgJHdwZGI7CgkJJHByZWZpeCA9ICR3cGRiLT5wcmVmaXg7CgoJCS8vIElmIHRoZXNlIHRhYmxlcyBhcmUgZm91bmQgZXhjbHVkZWQgdGhlbiB3YXJuIHRoYXQgbWF5IGJlIGEgYmFkIGlkZWEuCgkJJHdhcm5fdGFibGVzID0gYXJyYXkoCgkJCSRwcmVmaXggLiAnY29tbWVudHMnLAoJCQkkcHJlZml4IC4gJ3Bvc3RzJywKCQkJJHByZWZpeCAuICd1c2VycycsCgkJCSRwcmVmaXggLiAnY29tbWVudG1ldGEnLAoJCQkkcHJlZml4IC4gJ3Bvc3RtZXRhJywKCQkJJHByZWZpeCAuICd0ZXJtX3JlbGF0aW9uc2hpcHMnLAoJCQkkcHJlZml4IC4gJ29wdGlvbnMnLAoJCQkkcHJlZml4IC4gJ3Rlcm1fdGF4b25vbXknLAoJCQkkcHJlZml4IC4gJ2xpbmtzJywKCQkJJHByZWZpeCAuICd0ZXJtcycsCgkJKTsKCgkJJHJldHVybl9hcnJheSA9IGFycmF5KCk7CgkJZm9yZWFjaCggJHdhcm5fdGFibGVzIGFzICR3YXJuX3RhYmxlICkgewoJCQlpZiAoIGluX2FycmF5KCAkd2Fybl90YWJsZSwgJGV4Y2x1ZGVzICkgKSB7CgkJCQkkcmV0dXJuX2FycmF5WydleGNsdWRpbmdfY29yZXRhYmxlLScgLiBtZDUoICR3YXJuX3RhYmxlICldID0gJ1dhcm5pbmc6IFlvdSBhcmUgZXhjbHVkaW5nIG9uZSBvciBtb3JlIGNvcmUgV29yZFByZXNzIHRhYmxlcyBgJyAuICR3YXJuX3RhYmxlIC4gJ2Agd2hpY2ggbWF5IHJlc3VsdCBpbiBhbiBpbmNvbXBsZXRlIGJhY2t1cC4gUmVtb3ZlIGV4Y2x1c2lvbnMgb3IgYmFja3VwIHdpdGggYW5vdGhlciBwcm9maWxlIG9yIG1ldGhvZC4nOwoJCQl9CgkJfQoKCQlyZXR1cm4gJHJldHVybl9hcnJheTsKCX0gLy8gRW5kIGFsZXJ0X2NvcmVfdGFibGVzX2V4Y2x1ZGVzKCkuCgkKCQoJCgkvKiBhbGVydF9jb3JlX2ZpbGVfZXhjbHVkZXMoKQoJICoKCSAqIE91dHB1dHMgYW4gYWxlcnQgd2FybmluZyBpZiBhIGNvcmUgZGIgdGFibGUgaXMgZXhjbHVkZWQuCgkgKgoJICogQHBhcmFtCWFycmF5IAkJJGV4Y2x1ZGVzCQlBcnJheSBvZiBwYXRocyBleGNsdWRlZCBmcm9tIHRoZSBiYWNrdXAuCgkgKiBAcmV0dXJuCWFycmF5IAkJCQkJCUFycmF5IG9mIG1lc3NhZ2Ugd2FybmluZ3MgYWJvdXQgcG90ZW50aWFsIGlzc3VlcyBmb3VuZCB3aXRoIHRoZXNlIGV4Y2x1c2lvbnMsIGlmIGFueS4gSW5kZXggPSB1bmlxdWUgaWRlbnRpZmVyLCBWYWx1ZSA9IG1lc3NhZ2UuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFsZXJ0X2NvcmVfZmlsZV9leGNsdWRlcyggJGV4Y2x1ZGVzICkgewoKCQkvLyBJZiB0aGVzZSBwYXRocyBhcmUgZm91bmQgZXhjbHVkZWQgdGhlbiB3YXJuIHRoYXQgbWF5IGJlIGEgYmFkIGlkZWEuCgkJJHdhcm5fZGlycyA9IGFycmF5KCAvLyBObyB0cmFpbGluZyBzbGFzaC4KCQkJJy93cC1jb250ZW50JywKCQkJJy93cC1jb250ZW50L3VwbG9hZHMnLAoJCQknL3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wJywKCQkJJy8nIC4gbHRyaW0oIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKSwgJ1xcLycgKSwKCQkpOwoKCQlmb3JlYWNoKCAkZXhjbHVkZXMgYXMgJiRleGNsdWRlICkgeyAvLyBTdHJpcCB0cmFpbGluZyBzbGFzaChlcykuCgkJCSRleGNsdWRlID0gcnRyaW0oICRleGNsdWRlLCAnXFwvJyApOwoJCX0KCgkJJHJldHVybl9hcnJheSA9IGFycmF5KCk7CgkJZm9yZWFjaCggJHdhcm5fZGlycyBhcyAkd2Fybl9kaXIgKSB7CgkJCWlmICggaW5fYXJyYXkoICR3YXJuX2RpciwgJGV4Y2x1ZGVzICkgKSB7CgkJCQkkcmV0dXJuX2FycmF5WydleGNsdWRpbmdfY29yZWZpbGUtJyAuIG1kNSggJHdhcm5fZGlyICldID0gJ1dhcm5pbmc6IFlvdSBhcmUgZXhjbHVkaW5nIG9uZSBvciBtb3JlIFdvcmRQcmVzcyBjb3JlIG9yIEJhY2t1cEJ1ZGR5IGRpcmVjdG9yaWVzIGAnIC4gJHdhcm5fZGlyIC4gJ2Agd2hpY2ggbWF5IHJlc3VsdCBpbiBhbiBpbmNvbXBsZXRlIG9yIG1hbGZ1bmN0aW9uaW5nIGJhY2t1cC4gUmVtb3ZlIGV4Y2x1c2lvbnMgb3IgYmFja3VwIHdpdGggYW5vdGhlciBwcm9maWxlIG9yIG1ldGhvZCB0byBhdm9pZCBwcm9ibGVtcy4nOwoJCQl9CgkJfQoKCQlyZXR1cm4gJHJldHVybl9hcnJheTsKCX0gLy8gRW5kIGFsZXJ0X2NvcmVfZmlsZV9leGNsdWRlcygpLgoJCgkKCQoJLyogZ2V0WmlwTWV0YSgpCgkgKgoJICogT3V0cHV0IG1ldGEgaW5mbyBpbiBhIHRhYmxlLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRmaWxlCQkJQmFja3VwIGZpbGUgdG8gZ2V0IGNvbW1lbnQgbWV0YSBkYXRhIGZyb20uCgkgKiBAcmV0dXJuCWFycmF5fGZhbHNlCQkJCQlBcnJheSBvZiBtZXRhIGRhdGEgb3IgZmFsc2Ugb24gZmFpbHVyZSB0byByZXRyaWV2ZS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0WmlwTWV0YSggJGZpbGUgKSB7CgkJaWYgKCAhaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSApICkgewoJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpICk7CgkJfQoJCSRjb21tZW50X21ldGEgPSBhcnJheSgpOwoJCWlmICggaXNzZXQoICRmaWxlICkgKSB7CgkJCSRjb21tZW50ID0gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddLT5nZXRfY29tbWVudCggJGZpbGUgKTsKCQkJJGNvbW1lbnQgPSBiYWNrdXBidWRkeV9jb3JlOjpub3JtYWxpemVfY29tbWVudF9kYXRhKCAkY29tbWVudCApOwoKCQkJJGNvbW1lbnRfbWV0YSA9IGFycmF5KCk7CgkJCWZvcmVhY2goICRjb21tZW50IGFzICRjb21tZW50X2xpbmVfbmFtZSA9PiAkY29tbWVudF9saW5lX3ZhbHVlICkgeyAvLyBMb29wIHRocm91Z2ggYWxsIG1ldGEgZmllbGRzIGluIHRoZSBjb21tZW50IGFycmF5IHRvIGRpc3BsYXkuCgoJCQkJaWYgKCBmYWxzZSAhPT0gKCAkcmVzcG9uc2UgPSBiYWNrdXBidWRkeV9jb3JlOjpwcmV0dHlfbWV0YV9pbmZvKCAkY29tbWVudF9saW5lX25hbWUsICRjb21tZW50X2xpbmVfdmFsdWUgKSApICkgewoJCQkJCSRyZXNwb25zZVswXSA9ICc8c3BhbiB0aXRsZT0iJyAuICRjb21tZW50X2xpbmVfbmFtZSAuICciPicgLiAkcmVzcG9uc2VbMF0gLiAnPC9zcGFuPic7CgkJCQkJJGNvbW1lbnRfbWV0YVskY29tbWVudF9saW5lX25hbWVdID0gJHJlc3BvbnNlOwoJCQkJfQoKCQkJfQoJCX0KCgkJaWYgKCBjb3VudCggJGNvbW1lbnRfbWV0YSApID4gMCApIHsKCQkJcmV0dXJuICRjb21tZW50X21ldGE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0gLy8gRW5kIGdldFppcE1ldGEoKS4KCQoJCgkKCS8qIGdldF9kYXRfZmlsZV9hcnJheSgpCgkgKgoJICogR2V0IHRoZSBEQVQgZmlsZSBjb250ZW50cyBhcyBhbiBhcnJheS4KCSAqCgkgKiBAcGFyYW0JCXN0cmluZwkJJGRhdF9maWxlCQlGdWxsIHBhdGggdG8gREFUIGZpbGUgdG8gZGVjb2RlIGFuZCBwYXJzZS4KCSAqIEByZXR1cm4JCWFycmF5fGZhbHNlCQkJCQlBcnJheSBvZiBEQVQgY29udGVudC4gQm9vbCBmYWxzZSB3aGVuIHVuYWJsZSB0byByZWFkLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfZGF0X2ZpbGVfYXJyYXkoICRkYXRfZmlsZSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2FkaW5nIGJhY2t1cCBkYXQgZmlsZS4nICk7CgoJCWlmICggZmlsZV9leGlzdHMoICRkYXRfZmlsZSApICkgewoJCQkkYmFja3VwZGF0YSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkZGF0X2ZpbGUgKTsKCQl9IGVsc2UgeyAvLyBNaXNzaW5nLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkwMDM6IEJhY2t1cEJ1ZGR5IGRhdGEgZmlsZSAoYmFja3VwYnVkZHlfZGF0LnBocCkgbWlzc2luZyBvciB1bnJlYWRhYmxlLiBUaGVyZSBtYXkgYmUgYSBwcm9ibGVtIHdpdGggdGhlIGJhY2t1cCBmaWxlLCB0aGUgZmlsZXMgY291bGQgbm90IGJlIGV4dHJhY3RlZCAoeW91IG1heSBtYW51YWxseSBleHRyYWN0IHRoZSB6aXAgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSB0byBtYW51YWxseSBkbyB0aGlzIHBvcnRpb24gb2YgcmVzdG9yZSksIG9yIHRoZSBmaWxlcyB3ZXJlIGRlbGV0ZWQgYmVmb3JlIHRoaXMgcG9ydGlvbiBvZiB0aGUgcmVzdG9yZSB3YXMgcmVhY2hlZC4gIFN0YXJ0IHRoZSBpbXBvcnQgcHJvY2VzcyBvdmVyIG9yIHRyeSBtYW51YWxseSBleHRyYWN0aW5nICh1bnppcHBpbmcpIHRoZSBmaWxlcyB0aGVuIHN0YXJ0aW5nIG92ZXIuIFJlc3RvcmUgd2lsbCBub3QgY29udGludWUgdG8gcHJvdGVjdCBpbnRlZ3JpdHkgb2YgYW55IGV4aXN0aW5nIGRhdGEuJyApOwoJCQkvL2RpZSggJyBIYWx0ZWQuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIFVuc2VyaWFsaXplIGRhdGE7IElmIGl0IGZhaWxzIGl0IHRoZW4gZGVjb2RlcyB0aGUgb2JzY3VmYXRlZCBkYXRhIHRoZW4gdW5zZXJpYWxpemVzIGl0LiAobmV3IGRhdCBmaWxlIG1ldGhvZCBzdGFydGluZyBhdCAyLjApLgoJCWlmICggIWlzX3NlcmlhbGl6ZWQoICRiYWNrdXBkYXRhICkgfHwgKCBmYWxzZSA9PT0gKCAkcmV0dXJuID0gdW5zZXJpYWxpemUoICRiYWNrdXBkYXRhICkgKSApICkgewoJCQkvLyBTa2lwIGZpcnN0IGxpbmUuCgkJCSRzZWNvbmRfbGluZV9wb3MgPSBzdHJwb3MoICRiYWNrdXBkYXRhLCAiXG4iICkgKyAxOwoJCQkkYmFja3VwZGF0YSA9IHN1YnN0ciggJGJhY2t1cGRhdGEsICRzZWNvbmRfbGluZV9wb3MgKTsKCQkJCgkJCS8vIERlY29kZSBiYWNrIGludG8gYW4gYXJyYXkuCgkJCSRyZXR1cm4gPSB1bnNlcmlhbGl6ZSggYmFzZTY0X2RlY29kZSggJGJhY2t1cGRhdGEgKSApOwoJCX0KCQkKCQlpZiAoICEgaXNfYXJyYXkoICRyZXR1cm4gKSApIHsgLy8gSW52YWxpZCBEQVQgY29udGVudC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM1NDU1NDUuIFVuYWJsZSB0byByZWFkL2RlY29kZSBEQVQgZmlsZS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3VjY2Vzc2Z1bGx5IGxvYWRlZCBiYWNrdXAgZGF0IGZpbGUgYCcgLiAkZGF0X2ZpbGUgLiAnYC4nICk7CgkJJHJldHVybl9jZW5zb3JlZCA9ICRyZXR1cm47CgkJJHJldHVybl9jZW5zb3JlZFsnZGJfcGFzc3dvcmQnXSA9ICcqSElEREVOKic7CgkJJHJldHVybl9jZW5zb3JlZCA9IHByaW50X3IoICRyZXR1cm5fY2Vuc29yZWQsIHRydWUgKTsKCQkkcmV0dXJuX2NlbnNvcmVkID0gc3RyX3JlcGxhY2UoIGFycmF5KCAiXG4iLCAiXHIiICksICc7ICcsICRyZXR1cm5fY2Vuc29yZWQgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEQVQgY29udGVudHM6ICcgLiAkcmV0dXJuX2NlbnNvcmVkICk7CgkJcmV0dXJuICRyZXR1cm47Cgl9IC8vIEVuZCBnZXRfZGF0X2ZpbGVfYXJyYXkoKS4KCQoJCgkKCS8qIGRldGVybWluZUxhdGVzdFZlcnNpb24oKQoJICoKCSAqIExhdGVzdCB2ZXJzaW9uIGluZm8uIEFycmF5IG9mIGxhdGVzdCBtYWpvcixtaW5vci4gRmFsc2Ugb24gZmFpbCB0byBnZXQuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVybWluZUxhdGVzdFZlcnNpb24oICRieXBhc3NDYWNoZSA9IGZhbHNlICkgewoJCSRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbl9jYWNoZV9taW51dGVzID0gNjAqMTI7IC8vIERlZmluZSBob3cgbWFueSBtaW51dGVzIHRvIGNhY2hlIHRoZSBsYXRlc3QgYmFja3VwYnVkZHkgdmVyc2lvbiBudW1iZXIuCgkJCgkJZnVuY3Rpb24gcGJfYmFja3VwYnVkZHlfc3BsaXQyKCAkc3RyaW5nLCRuZWVkbGUsJG50aCApIHsKCQkJJG1heCA9IHN0cmxlbigkc3RyaW5nKTsKCQkJJG4gPSAwOwoJCQlmb3IoJGk9MDskaTwkbWF4OyRpKyspewoJCQkJaWYgKCRzdHJpbmdbJGldPT0kbmVlZGxlKXsKCQkJCQkkbisrOwoJCQkJCWlmKCRuPj0kbnRoKXsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCSRhcnJbXSA9IHN1YnN0cigkc3RyaW5nLDAsJGkpOwoJCQkkYXJyW10gPSBzdWJzdHIoJHN0cmluZywkaSsxLCRtYXgpOwoJCQlyZXR1cm4gJGFycjsKCQl9CgkJCgkJaWYgKCB0cnVlID09PSAkYnlwYXNzQ2FjaGUgKSB7CgkJCSRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiA9IGZhbHNlOwoJCX0gZWxzZSB7CgkJCSRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiA9IGdldF90cmFuc2llbnQoICdwYl9iYWNrdXBidWRkeV9sYXRlc3RfdmVyc2lvbicgKTsKCQl9CgkJCgkJaWYgKCAoIGZhbHNlID09PSAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gKSB8fCAoICEgaXNfYXJyYXkoICRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiApICkgKSB7CgkJCSRyZXNwb25zZSA9IHdwX3JlbW90ZV9nZXQoICdodHRwOi8vYXBpLml0aGVtZXMuY29tL3Byb2R1Y3QvdmVyc2lvbj9hcGlrZXk9aXhobzdkazBwMjQ0bjBvYiZwYWNrYWdlPWJhY2t1cGJ1ZGR5JmNoYW5uZWw9c3RhYmxlJywgYXJyYXkoCgkJCQkJJ21ldGhvZCcgPT4gJ0dFVCcsCgkJCQkJJ3RpbWVvdXQnID0+IDcsCgkJCQkJJ3JlZGlyZWN0aW9uJyA9PiAzLAoJCQkJCSdodHRwdmVyc2lvbicgPT4gJzEuMCcsCgkJCQkJLy8nYmxvY2tpbmcnID0+IHRydWUsCgkJCQkJJ2hlYWRlcnMnID0+IGFycmF5KCksCgkJCQkJJ2JvZHknID0+IG51bGwsCgkJCQkJJ2Nvb2tpZXMnID0+IGFycmF5KCkKCQkJCSkKCQkJKTsKCQkJaWYoIGlzX3dwX2Vycm9yKCAkcmVzcG9uc2UgKSApIHsKCQkJCSRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiA9IGFycmF5KCAwLCAwICk7IC8vIFNldCB0byAwIGZvciB0cmFuc2llbnQgdG8gcHJldmVudCBoaXR0aW5nIHNlcnZlciBhZ2FpbiBmb3IgYSBiaXQgc2luY2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcuCgkJCX0gZWxzZSB7CgkJCQkkbWlub3JWZXJzaW9uID0gJHJlc3BvbnNlWydib2R5J107CgkJCQkkbWFqb3JWZXJzaW9uID0gcGJfYmFja3VwYnVkZHlfc3BsaXQyKCAkbWlub3JWZXJzaW9uLCAnLicsIDMgKTsKCQkJCSRtYWpvclZlcnNpb24gPSAkbWFqb3JWZXJzaW9uWzBdOwoJCQkJJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uID0gYXJyYXkoICRtaW5vclZlcnNpb24sICRtYWpvclZlcnNpb24gKTsKCQkJfQoJCQlzZXRfdHJhbnNpZW50KCAncGJfYmFja3VwYnVkZHlfbGF0ZXN0X3ZlcnNpb24nLCAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24sIDYwKiAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb25fY2FjaGVfbWludXRlcyApOwoJCX0gLy8gZW5kIG5vdCBjYWNoZWQuCgoJCWlmICggKCAwID09ICRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvblswXSApICYmICggMCA9PSAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb25bMV0gKSApIHsgLy8gU2VydmVyIG5vdCByZXNwb25kaW5nLgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uOwoKCX0gLy8gRW5kIGRldGVybWluZUxhdGVzdFZlcnNpb24oKS4KCQoJCgkKCS8qIGRlcGxveW1lbnRJbXBvcnRCdWRkeSgpCgkgKgoJICogUmVuZGVycyBpbXBvcnRidWRkeSBvbiB0aGlzIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkJJGJhY2t1cEZpbGUJCQkJRnVsbCBmaWxlbmFtZSB3aXRoIHBhdGggdG8gYmFja3VwIGZpbGUgdG8gaW1wb3J0LgoJICogQHBhcmFtCXN0cmluZwkJCSRhZGRpdGlvbmFsU3RhdGVJbmZvCUFycmF5IG9mIGFkZGl0aW9uYWwgc3RhdGUgaW5mb3JtYXRpb24gdG8gbWVyZ2UgaW50byBzdGF0ZSBhcnJheSwgc3VjaCBhcyBzZXNzaW9uIHRva2Vucy4KCSAqIEByZXR1cm4Jc3RyaW5nfGFycmF5IAkJCQkJCQlJZiBzdHJpbmcgdGhlbiBpbXBvcnRidWRkeSBzZXJpYWwuICBJZiBhcnJheSB0aGVuIGFuIGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLiBBcnJheSBmb3JtYXQ6IGFycmF5KCBmYWxzZSwgJ0Vycm9yIG1lc3NhZ2UuJyApLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXBsb3ltZW50SW1wb3J0QnVkZHkoICRwYXNzd29yZCwgJGJhY2t1cEZpbGUsICRhZGRpdGlvbmFsU3RhdGVJbmZvID0gJycsICRkb0NsZWFudXAgPSB0cnVlICkgewoJCWlmICggISBmaWxlX2V4aXN0cyggJGJhY2t1cEZpbGUgKSApIHsKCQkJJGVycm9yID0gJ0Vycm9yICM0Mzg0ODM3ODogQmFja3VwIGZpbGUgYCcgLiAkYmFja3VwRmlsZSAuICdgIG5vdCBmb3VuZCB1cGxvYWRlZC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IpOwoJCQlyZXR1cm4gYXJyYXkoIGZhbHNlLCAkZXJyb3IgKTsKCQl9CgkJCgkJaWYgKCB0cnVlID09PSAkZG9DbGVhbnVwICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOT1Qgc2tpcHBpbmcgY2xlYW51cCBwcm9jZWR1cmVzIGF0IGVuZCBvZiBpbXBvcnRidWRkeSBEZXBsb3ltZW50IGJhc2VkIG9uIGFkdmFuY2VkIERlcGxveW1lbnQgc2V0dGluZ3MuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NLSVBQSU5HIENMRUFOVVAgcHJvY2VkdXJlcyBhdCBlbmQgb2YgaW1wb3J0YnVkZHkgRGVwbG95bWVudCBiYXNlZCBvbiBhZHZhbmNlZCBEZXBsb3ltZW50IHNldHRpbmdzLicgKTsKCQl9CgkJCgkJJGJhY2t1cFNlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkYmFja3VwRmlsZSApOwoJCQoJCSRpbXBvcnRGaWxlU2VyaWFsID0gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDE1ICk7CgkJJGltcG9ydEZpbGVuYW1lID0gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0RmlsZVNlcmlhbCAuICcucGhwJzsKCQliYWNrdXBidWRkeV9jb3JlOjppbXBvcnRidWRkeSggQUJTUEFUSCAuICRpbXBvcnRGaWxlbmFtZSwgJHBhc3N3b3JkICk7CgkJCgkJLy8gUmVuZGVyIGRlZmF1bHQgY29uZmlnIGZpbGUgb3ZlcnJpZGVzLiBPdmVycnJpZGVzIGRlZmF1bHQgcmVzdG9yZS5waHAgc3RhdGUgZGF0YS4KCQkkc3RhdGUgPSBhcnJheSgpOwoJCWdsb2JhbCAkd3BkYjsKCQkkc3RhdGVbJ3R5cGUnXSA9ICdkZXBsb3knOwoJCSRzdGF0ZVsnYXJjaGl2ZSddID0gJGJhY2t1cEZpbGU7CgkJJHN0YXRlWydzaXRldXJsJ10gPSBwcmVnX3JlcGxhY2UoICd8LyokfCcsICcnLCBzaXRlX3VybCgpICk7IC8vIFN0cmlwIHRyYWlsaW5nIHNsYXNoZXMuCgkJJHN0YXRlWydob21ldXJsJ10gPSBwcmVnX3JlcGxhY2UoICd8LyokfCcsICcnLCBob21lX3VybCgpICk7IC8vIFN0cmlwIHRyYWlsaW5nIHNsYXNoZXMuCgkJJHN0YXRlWydyZXN0b3JlRmlsZXMnXSA9IGZhbHNlOwoJCSRzdGF0ZVsnbWlncmF0ZUh0YWNjZXNzJ10gPSBmYWxzZTsKCQkkc3RhdGVbJ3JlbW90ZV9hcGknXSA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncmVtb3RlX2FwaSddOyAvLyBGb3IgdXNlIGJ5IGltcG9ydGJ1ZGR5IGFwaSBhdXRoLiBFbmFibGVzIHJlbW90ZSBhcGkgaW4gdGhpcyBpbXBvcnRidWRkeS4KCQkkc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc2VydmVyJ10gPSBEQl9IT1NUOwoJCSRzdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydkYXRhYmFzZSddID0gREJfTkFNRTsKCQkkc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndXNlcm5hbWUnXSA9IERCX1VTRVI7CgkJJHN0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10gPSBEQl9QQVNTV09SRDsKCQkkc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10gPSAkd3BkYi0+cHJlZml4OwoJCSRzdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydyZW5hbWVQcmVmaXgnXSA9IHRydWU7CgkJJHN0YXRlWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydEJ1ZGR5J10gPSAkZG9DbGVhbnVwOwoJCSRzdGF0ZVsnY2xlYW51cCddWydkZWxldGVJbXBvcnRCdWRkeURpcmVjdG9yeSddID0gJGRvQ2xlYW51cDsKCQkkc3RhdGVbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0TG9nJ10gPSAkZG9DbGVhbnVwOwoJCQoJCWlmICggaXNfYXJyYXkoICRhZGRpdGlvbmFsU3RhdGVJbmZvICkgKSB7CgkJCSRzdGF0ZSA9IGFycmF5X21lcmdlKCAkc3RhdGUsICRhZGRpdGlvbmFsU3RhdGVJbmZvICk7CgkJfQoJCQoJCS8vZXJyb3JfbG9nKCBwcmludF9yKCAkc3RhdGUsIHRydWUgKSApOwoJCQoJCS8vIFdyaXRlIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGVzLgoJCSRzdGF0ZV9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydEZpbGVTZXJpYWwgLiAnLXN0YXRlLnBocCc7CgkJaWYgKCBmYWxzZSA9PT0gKCAkZmlsZV9oYW5kbGUgPSBAZm9wZW4oICRzdGF0ZV9maWxlLCAndycgKSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzgzODQ3ODQ6IFRlbXAgc3RhdGUgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zLiAoJyAuICRzdGF0ZV9maWxlIC4gJyknIDsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yKTsKCQkJcmV0dXJuIGFycmF5KCBmYWxzZSwgJGVycm9yICk7CgkJfQoJCWZ3cml0ZSggJGZpbGVfaGFuZGxlLCAiPD9waHAgZGllKCdBY2Nlc3MgRGVuaWVkLicpOyAvLyA8IS0tID8+XG4iIC4gYmFzZTY0X2VuY29kZSggc2VyaWFsaXplKCAkc3RhdGUgKSApICk7CgkJZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkKCQkKCQkkdW5kb0ZpbGUgPSAnYmFja3VwYnVkZHlfZGVwbG95X3VuZG8tJyAuICRiYWNrdXBTZXJpYWwgLiAnLnBocCc7CgkJLy8kdW5kb1VSTCA9IHJ0cmltKCBzaXRlX3VybCgpLCAnL1xcJyApIC4gJy8nIC4gJHVuZG9GaWxlOwoJCWlmICggZmFsc2UgPT09IGNvcHkoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL19yb2xsYmFja191bmRvLnBocCcsIEFCU1BBVEggLiAkdW5kb0ZpbGUgKSApIHsKCQkJJGVycm9yID0gJ0Vycm9yICMzMjg5NDQ3OiBVbmFibGUgdG8gd3JpdGUgdW5kbyBmaWxlIGAnIC4gQUJTUEFUSCAuICR1bmRvRmlsZSAuICdgLiBDaGVjayBwZXJtaXNzaW9ucyBvbiBkaXJlY3RvcnkuJyA7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvcik7CgkJCXJldHVybiBhcnJheSggZmFsc2UsICRlcnJvciApOwoJCX0KCQkKCQlyZXR1cm4gJGltcG9ydEZpbGVTZXJpYWw7CgkJCgl9IC8vIEVuZCBkZXBsb3ltZW50SW1wb3J0QnVkZHkoKS4KCQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGV0ZWN0TGlrZWx5SGlnaGVzdEV4ZWN1dGlvblRpbWUoKSB7CgkJJGRldGVjdGVkX2V4ZWN1dGlvbiA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmRldGVjdE1heEV4ZWN1dGlvblRpbWUoKTsKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gPiAkZGV0ZWN0ZWRfZXhlY3V0aW9uICkgewoJCQkkZGV0ZWN0ZWRfZXhlY3V0aW9uID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX3J1bnRpbWUnXTsKCQl9CgkJcmV0dXJuICRkZXRlY3RlZF9leGVjdXRpb247Cgl9IC8vIEVuZCBkZXRlY3RMaWtlbHlIaWdoZXN0RXhlY3V0aW9uVGltZSgpLgoJCgkKCQoJLyogZGV0ZWN0TWF4RXhlY3V0aW9uVGltZSgpCgkgKgoJICogQXR0ZW1wdCB0byBkZXRlY3QgdGhlIG1heCBleGVjdXRpb24gdGltZSBhbGxvd2VkIGJ5IFBIUC4gRGVmYXVsdHMgdG8gMzAgaWYgdW5hYmxlIHRvIGRldGVjdCBvciBhIHN1c3BpY2lvdXMgdmFsdWUgaXMgZGV0ZWN0ZWQuCgkgKiBOT1RFOiBUaGlzIERPRVMgdGFrZSBpbnRvIGFjY291bnQgdGhlIFRFU1RFRCBQSFAgcnVudGltZSBJRiBpdHMgdmFsdWUgaXMgYXZhaWxhYmxlLiBMZXNzZXIgb2YgdHdvIHZhbHVlcyBvZiB1c2VkLgoJICogSU1QT1JUQU5UOiBUaGlzIGRvZXMgTk9UIHRha2UgaW50byBhY2NvdW50IHVzZXItc3BlY2lmaWVkIG92ZXJyaWRlIHZpYSBzZXR0aW5ncyBwYWdlLiBGb3IgdGhhdCwgdXNlIGFkanVzdGVkTWF4RXhlY3V0aW9uVGltZSgpLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVjdE1heEV4ZWN1dGlvblRpbWUoKSB7CgkJJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSA9IHN0cl9pcmVwbGFjZSggJ3MnLCAnJywgaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSApOwoJCWlmICggaXNfbnVtZXJpYyggJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSApICkgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZTsKCQl9IGVsc2UgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gMzA7CgkJfQoJCWlmICggJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSA8PSAwICkgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gMzA7CgkJfQoJCQoJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gKSAmJiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gPiAwICkgKSB7IC8vIENoZWNrIGlzc2V0IGZvciBpbXBvcnRidWRkeS4KCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddIDwgJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSApIHsKCQkJCSRkZXRlY3RlZF9tYXhfZXhlY3V0aW9uX3RpbWUgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddOwoJCQl9CgkJfQoJCQoJCXJldHVybiAkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lOwoJfSAvLyBFbmQgZGV0ZWN0TWF4RXhlY3V0aW9uVGltZSgpLgoJCgkKCQoJLy8gU2FtZSBhcyBkZXRlY3RlZE1heEV4ZWN1dGlvblRpbWUgRVhDRVBUIHRha2VzIGludG8gYWNjb3VudCB1c2VyIG92ZXJyaWRlZCB2YWx1ZSBpbiBzZXR0aW5ncyAoaWYgYW55KS4uCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkanVzdGVkTWF4RXhlY3V0aW9uVGltZSggJG1heCA9ICcnICkgewoJCWlmICggJycgPT0gJG1heCApIHsKCQkJaWYgKCAhIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddICkgKSB7CgkJCQkkbWF4ID0gJzMwJzsKCQkJfSBlbHNlIHsKCQkJCSRtYXggPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddOwoJCQl9CgkJfQoJCQoJCSRkZXRlY3RlZCA9IHNlbGY6OmRldGVjdE1heEV4ZWN1dGlvblRpbWUoKTsKCQlpZiAoICggJycgIT0gJG1heCApICYmICggaXNfbnVtZXJpYyggJG1heCApICkgJiYgKCAkbWF4ID4gMCApICkgeyAvLyBJZiBzZXQgYW5kIGEgbnVtYmVyLCB1c2UgdXNlci1zcGVjaWZpZWQgcnVudGltZS4KCQkJcmV0dXJuICRtYXg7CgkJfSBlbHNlIHsgLy8gTm90aGluZyB1c2VyLXNwZWNpZmllZCBzbyB1c2VyIGRldGVjdGVkIHZhbHVlLgoJCQlyZXR1cm4gJGRldGVjdGVkOwoJCX0KCX0gLy8gRW5kIGFkanVzdGVkTWF4RXhlY3V0aW9uVGltZSgpLgoJCgkKCQoJLyogZGJFc2NhcGUoKQoJICoKCSAqIEVzY2FwZSBTUUwgdXNpbmcgZWl0aGVyIG15c3FsIG9yIG15c3FsaSBiYXNlZCBvbiB3aGljaGV2ZXIgV29yZFByZXNzIGlzIHVzaW5nLgoJICogV1AgMy45IGludHJvZHVjaW5nIG15c3FsaSBzdXBwb3J0LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRiRXNjYXBlKCAkc3FsICkgewoJCWdsb2JhbCAkd3BkYjsKCQlpZiAoIGlzc2V0KCAkd3BkYi0+dXNlX215c3FsaSApICYmICggdHJ1ZSA9PT0gJHdwZGItPnVzZV9teXNxbGkgKSApIHsgLy8gUG9zc2libGUgcG9zdCBXUCAzLjkKCQkJcmV0dXJuIG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoICR3cGRiLT5kYmgsICRzcWwgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCAkc3FsICk7CgkJfQoJfSAvLyBFbmQgZGJFc2NhcGUoKS4KCQoJCgkKCS8qIHZlcmlmeUFqYXhBY2Nlc3MoKQoJICoKCSAqICEhIElNUE9SVEFOVCBGT1IgQU5ZIEFKQVggUEFHRVMgRk9SIFNFQ1VSSVRZICEhIFZlcmlmeSB1c2VyIGlzIGJvdGggbG9nZ2VkIGludG8gYWRtaW4gYW5kIGhhcyBhcHByb3ByaWF0ZSByb2xlIGFjY2VzcyB0byBCYWNrdXBCdWRkeS4KCSAqCgkgKiBAcmV0dXJuCWRpZSgpfHRydWUJCU9uIGZhaWx1cmUsIGRpZXMvaGFsdHMgUEhQIHNjcmlwdCBmb3Igc2VjdXJpdHkuICBPbiBhY2Nlc3MgZnJhbnRlZCwgcmV0dXJucyB0cnVlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2ZXJpZnlBamF4QWNjZXNzKCkgewoJCWlmICggISBpc19hZG1pbigpICkgewoJCQlkaWUoICdFcnJvciAjMjM4OTgzMy4gQWNjZXNzIERlbmllZC4nICk7CgkJfQoJCWlmICggISBjdXJyZW50X3VzZXJfY2FuKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JvbGVfYWNjZXNzJ10gKSApIHsKCQkJZGllKCAnRXJyb3IgIzIzNzM4MjMuIEFjY2VzcyBEZW5pZWQuJyApOwoJCX0KCQkKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHZlcmlmeUFqYXhBY2Nlc3MoKS4KCQoJCgkKCS8qIGdldE5vdGlmaWNhdGlvbnMoKQoJICoKCSAqIGRlc2NyaXB0aW9uCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbnMoKSB7CgkJJGRlZmF1bHQgPSBhcnJheSgpOwoJCXJldHVybiBnZXRfc2l0ZV9vcHRpb24oIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6Tk9USUZJQ0FUSU9OU19PUFRJT05fU0xVRywgJGRlZmF1bHQsIGZhbHNlICk7Cgl9IC8vIEVuZCBnZXROb3RpZmljYXRpb25zKCkuCgkKCQoJCgkvKiByZXBsYWNlTm90aWZpY2F0aW9ucygpCgkgKgoJICogZGVzY3JpcHRpb24KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZU5vdGlmaWNhdGlvbnMoICRub3RpZmljYXRpb25BcnJheSApIHsKCQkvLyBTYXZlLgoJCWFkZF9zaXRlX29wdGlvbiggYmFja3VwYnVkZHlfY29uc3RhbnRzOjpOT1RJRklDQVRJT05TX09QVElPTl9TTFVHLCAkbm90aWZpY2F0aW9uQXJyYXksICcnLCAnbm8nICk7CgkJdXBkYXRlX3NpdGVfb3B0aW9uKCBiYWNrdXBidWRkeV9jb25zdGFudHM6Ok5PVElGSUNBVElPTlNfT1BUSU9OX1NMVUcsICRub3RpZmljYXRpb25BcnJheSApOwoJfSAvLyBFbmQgcmVwbGFjZU5vdGlmaWNhdGlvbnMoKS4KCQoJCgkKCS8qIGdldEJhY2t1cFR5cGVGcm9tRmlsZSgpCgkgKgoJICogRGV0ZXJtaW5lIGJhY2t1cCB0eXBlIGZyb20gZmlsZSB3aGV0aGVyIGJ5IGZpbGVuYW1lIG9yIGVtYmVkZGVkIGZpbGVvcHRpb25zLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGZpbGUJCQkJRnVsbCBmaWxlbmFtZSBwYXRoIG9mIGJhY2t1cCB0byBkZXRlcm1pbmUgdHlwZSBvZi4KCSAqIEBwYXJhbQlib29sCSRza2lwX2ZpbGVvcHRpb25zCVdoZW4gZmFsc2UgaWYgdGhlIGJhY2t1cCB0eXBlIGNhbm5vdCBiZSBkZXRlY3RlZCB2aWEgZmlsZW5hbWUgdGhlbiB0cnkgdG8gb3BlbiB0aGUgZmlsZW9wdGlvbnMgZmlsZSB0byBnZXQgbW9yZSBkZXRhaWxzLiBTZXQgdHJ1ZSBmb3Igbm9uLWNydWNpYWwgY2FzZXMgZm9yIHNwZWVkLgoJICogQHJldHVybglzdHJpbmcJCQkJCQlUeXBlIG9mIGJhY2t1cCAoZWcgZnVsbCwgZGIpLiBJZiB1bmtub3duLCBlbXB0eSBzdHJpbmcgJycgcmV0dXJuZWQuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEJhY2t1cFR5cGVGcm9tRmlsZSggJGZpbGUsICRxdWlldCA9IGZhbHNlLCAkc2tpcF9maWxlb3B0aW9ucyA9IGZhbHNlICkgewoJCQoJCS8vIElmIG5vdCBhIHppcCBmaWxlLCByZXR1cm4gYmxhbmsuCgkJaWYgKCAnemlwJyAhPSBzdHJ0b2xvd2VyKCBzdWJzdHIoICRmaWxlLCAtMyApICkgKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJCgkJaWYgKCBmYWxzZSA9PT0gJHF1aWV0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXRlY3RpbmcgYmFja3VwIHR5cGUgaWYgcG9zc2libGUuJyApOwoJCX0KCQkKCQkvLyBUcnkgdG8gZmlndXJlIG91dCB0eXBlIHZpYSBmaWxlbmFtZS4KCQlpZiAoIHN0cmlzdHIoICRmaWxlLCAnLWRiLScgKSAhPT0gZmFsc2UgKSB7CgkJCSR0eXBlID0gJ2RiJzsKCQl9IGVsc2VpZiAoIHN0cmlzdHIoICRmaWxlLCAnLWZ1bGwtJyApICE9PSBmYWxzZSApIHsKCQkJJHR5cGUgPSAnZnVsbCc7CgkJfSBlbHNlaWYgKCBzdHJpc3RyKCAkZmlsZSwgJy1maWxlcy0nICkgIT09IGZhbHNlICkgewoJCQkkdHlwZSA9ICdmaWxlcyc7CgkJfSBlbHNlaWYgKCBzdHJpc3RyKCAkZmlsZSwgJy10aGVtZXMtJyApICE9PSBmYWxzZSApIHsKCQkJJHR5cGUgPSAndGhlbWVzJzsKCQl9IGVsc2VpZiAoIHN0cmlzdHIoICRmaWxlLCAnLXBsdWdpbnMtJyApICE9PSBmYWxzZSApIHsKCQkJJHR5cGUgPSAncGx1Z2lucyc7CgkJfQoJCQoJCWlmICggaXNzZXQoICR0eXBlICkgKSB7CgkJCWlmICggZmFsc2UgPT09ICRxdWlldCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RldGVjdGVkIGJhY2t1cCB0eXBlIGFzIGAnIC4gJHR5cGUgLiAnYCB2aWEgZmlsZW5hbWUuJyApOwoJCQl9CgkJCXJldHVybiAkdHlwZTsKCQl9CgkJCgkJLy8gU2VlIGlmIHdlIGNhbiBnZXQgYmFja3VwIHR5cGUgZnJvbSBmaWxlb3B0aW9ucyBkYXRhLgoJCWlmICggZmFsc2UgPT09ICRza2lwX2ZpbGVvcHRpb25zICkgewoJCQkkZmlsZW9wdGlvbnNGaWxlID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkZmlsZSApIC4gJy50eHQnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkZmlsZW9wdGlvbnNGaWxlICkgKSB7CgkJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQkJCSRiYWNrdXBfb3B0aW9ucyA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggJGZpbGVvcHRpb25zRmlsZSwgJHJlYWRfb25seSA9IHRydWUsICRpZ25vcmVfbG9jayA9IHRydWUgKTsKCQkJCWlmICggZmlsZV9leGlzdHMgKCAkZmlsZW9wdGlvbnNGaWxlICkgKSB7CgkJCQkJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSAkYmFja3VwX29wdGlvbnMtPmlzX29rKCkgKSApIHsKCQkJCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdXYXJuaW5nIG9ubHk6IFVuYWJsZSB0byBvcGVuIGZpbGVvcHRpb25zIGZpbGUgYCcgLiAkZmlsZW9wdGlvbnNGaWxlIC4gJ2AuIFRoaXMgbWF5IGJlIG5vcm1hbC4nICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaWYgKCBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydpbnRlZ3JpdHknXVsnZGV0ZWN0ZWRfdHlwZSddICkgKSB7CgkJCQkJCQlpZiAoIGZhbHNlID09PSAkcXVpZXQgKSB7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGV0ZWN0ZWQgYmFja3VwIHR5cGUgYXMgYCcgLiAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2ludGVncml0eSddWydkZXRlY3RlZF90eXBlJ10gLiAnYCB2aWEgaW50ZWdyaXR5IGNoZWNrIGRhdGEuJyApOwoJCQkJCQkJfQoJCQkJCQkJcmV0dXJuICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snaW50ZWdyaXR5J11bJ2RldGVjdGVkX3R5cGUnXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQkKCQlyZXR1cm4gJyc7IC8vIFR5cGUgdW5rbm93bi4KCQkKCX0gLy8gRW5kIGdldEJhY2t1cFR5cGVGcm9tRmlsZSgpLgoJCgkKCQoJLyogY2FsY3VsYXRlQXJjaGl2ZUZpbGVuYW1lKCkKCSAqCgkgKiBDYWxjdWxhdGVzIHRoZSBiYWNrdXAgemlwIGZpbGVuYW1lLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWxjdWxhdGVBcmNoaXZlRmlsZW5hbWUoICRzZXJpYWwsICR0eXBlLCAkcHJvZmlsZSApIHsKCQkKCQkvLyBQcmVwYXJlIHNvbWUgdmFsdWVzIGZvciBzZXR0aW5nIHVwIHRoZSBiYWNrdXAgZGF0YS4KCQkkc2l0ZXVybF9zdHJpcHBlZCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmJhY2t1cF9wcmVmaXgoKTsKCgkJLy8gQWRkIHByb2ZpbGUgdG8gZmlsZW5hbWUgaWYgc2V0IGluIG9wdGlvbnMgYW5kIGV4aXN0cwoJCWlmICggZW1wdHkoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYXJjaGl2ZV9uYW1lX3Byb2ZpbGUnXSApIHx8IGVtcHR5KCAkcHJvZmlsZVsndGl0bGUnXSApICkgewoJCQkkYmFja3VwZmlsZV9wcm9maWxlID0gJyc7CgkJfSBlbHNlIHsKCQkJJGJhY2t1cGZpbGVfcHJvZmlsZSA9IHNhbml0aXplX2ZpbGVfbmFtZSggc3RydG9sb3dlciggJHByb2ZpbGVbJ3RpdGxlJ10gKSApOwoJCQkkYmFja3VwZmlsZV9wcm9maWxlID0gc3RyX3JlcGxhY2UoICcvJywgJ18nLCAkYmFja3VwZmlsZV9wcm9maWxlICk7CgkJCSRiYWNrdXBmaWxlX3Byb2ZpbGUgPSBzdHJfcmVwbGFjZSggJ1xcJywgJ18nLCAkYmFja3VwZmlsZV9wcm9maWxlICk7CgkJCSRiYWNrdXBmaWxlX3Byb2ZpbGUgPSBzdHJfcmVwbGFjZSggJy4nLCAnXycsICRiYWNrdXBmaWxlX3Byb2ZpbGUgKTsKCQkJJGJhY2t1cGZpbGVfcHJvZmlsZSA9IHN0cl9yZXBsYWNlKCAnICcsICdfJywgJGJhY2t1cGZpbGVfcHJvZmlsZSApOwoJCQkkYmFja3VwZmlsZV9wcm9maWxlID0gc3RyX3JlcGxhY2UoICctJywgJ18nLCAkYmFja3VwZmlsZV9wcm9maWxlICk7CgkJCSRiYWNrdXBmaWxlX3Byb2ZpbGUgLj0gJy0nOwoJCX0KCQkKCQkvLyBDYWxjdWxhdGUgY3VzdG9taXphYmxlIHNlY3Rpb24gb2YgYXJjaGl2ZSBmaWxlbmFtZSAoZGF0ZSB2cyBkYXRlK3RpbWUpLgoJCWlmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhcmNoaXZlX25hbWVfZm9ybWF0J10gPT0gJ2RhdGV0aW1lJyApIHsgLy8gImRhdGV0aW1lIiA9IERhdGUgKyB0aW1lLgoJCQkkYmFja3VwZmlsZV9kYXRldGltZSA9IGRhdGUoIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6QVJDSElWRV9OQU1FX0ZPUk1BVF9EQVRFVElNRSwgcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApICk7CgkJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FyY2hpdmVfbmFtZV9mb3JtYXQnXSA9PSAnZGF0ZXRpbWUyNCcgKSB7IC8vICJkYXRldGltZSIgPSBEYXRlICsgdGltZSBpbiAyNGhyIGZvcm1hdC4KCQkJJGJhY2t1cGZpbGVfZGF0ZXRpbWUgPSBkYXRlKCBiYWNrdXBidWRkeV9jb25zdGFudHM6OkFSQ0hJVkVfTkFNRV9GT1JNQVRfREFURVRJTUUyNCwgcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApICk7CgkJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FyY2hpdmVfbmFtZV9mb3JtYXQnXSA9PSAndGltZXN0YW1wJyApIHsgLy8gImRhdGV0aW1lIiA9IERhdGUgKyB0aW1lIGluIDI0aHIgZm9ybWF0LgoJCQkkYmFja3VwZmlsZV9kYXRldGltZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCB0aW1lKCkgKTsKCQl9IGVsc2UgeyAvLyAiZGF0ZSIgPSBkYXRlIG9ubHkgKHRoZSBkZWZhdWx0KS4KCQkJJGJhY2t1cGZpbGVfZGF0ZXRpbWUgPSBkYXRlKCBiYWNrdXBidWRkeV9jb25zdGFudHM6OkFSQ0hJVkVfTkFNRV9GT1JNQVRfREFURSwgcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApICk7CgkJfQoJCSRhcmNoaXZlRmlsZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJ2JhY2t1cC0nIC4gJHNpdGV1cmxfc3RyaXBwZWQgLiAnLScgLiAkYmFja3VwZmlsZV9kYXRldGltZSAuICctJyAuICRiYWNrdXBmaWxlX3Byb2ZpbGUgLiAkdHlwZSAuICctJyAuICRzZXJpYWwgLiAnLnppcCc7CgkJCgkJLy8gTWFrZSBkdXJlIHdlIGNhbiBtYWtlIGJhY2t1cCBkaXIgJiBpdCBleGlzdHMgJiBpcyBwcm90ZWN0ZWQuCgkJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSwgJGRpZSA9IGZhbHNlICk7CgkJaWYgKCAhIGZpbGVfZXhpc3RzKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg0ODkzNDM0OiBCYWNrdXAgc3RvcmFnZSBkaXJlY3RvcnkgYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSAuICdgIGRvZXMgbm90IGV4aXN0IGFuZCB1bmFibGUgdG8gY3JlYXRlIGl0LiBDaGVjayBwZXJtaXNzaW9ucy4gSWYgdXNpbmcgYSBjdXN0b20gcGF0aCB2ZXJpZnkgaXQgaXMgY29ycmVjdC4nICk7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGN1bGF0ZWQgYXJjaGl2ZSBmaWxlOiBgJyAuICRhcmNoaXZlRmlsZSAuICdgLicgKTsKCQlyZXR1cm4gJGFyY2hpdmVGaWxlOwoJfSAvLyBFbmQgY2FsY3VsYXRlQXJjaGl2ZUZpbGVuYW1lKCkuCgkKCQoJCgkvKiBoYXNoR2xvYigpCgkgKgoJICogQ2FsY3VsYXRlIGNvbXBhcmlzb24gZGF0YSBmb3IgYWxsIGZpbGVzIHdpdGhpbiBhIHBhdGguIFVzZWZ1bCBmb3IgdHJhY2tpbmcgZmlsZSBjaGFuZ2VzIGJldHdlZW4gdHdvIGxvY2F0aW9ucy4KCSAqCgkgKiBAcGFyYW0JYXJyYXkgCSRleGNsdWRlcwkJRGlyZWN0b3JpZXMgdG8gZXhjbHVkZSwgUkVMQVRJVkUgdG8gdGhlIHJvb3QuIEluY2x1ZGUgTEVBRElORyBzbGFzaCBmb3IgZWFjaCBlbnRyeS4KCSAqIEBwYXJhbQlhcnJheQkkdXRmOF9lbmNvZGUJU2hvdWxkIHdlIGVuY29kZSBhbnkgZmlsZSBuYW1lcyB0aGF0IGFyZSBpbiBVVEYtOCBmb3JtYXQ/CgkgKiBAcmV0dXJuCWFycmF5IAkJCQkJTmVzdGVkIGFycmF5IG9mIGZpbGUvZGlyZWN0b3J5IHN0cnVjdHVyZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNoR2xvYiggJHJvb3QsICRnZW5lcmF0ZV9zaGExID0gZmFsc2UsICRleGNsdWRlcyA9IGFycmF5KCksICR1dGY4X2VuY29kZSA9IGZhbHNlICkgewoJCQoJCSRyb290ID0gcnRyaW0oICRyb290LCAnL1xcJyApOyAvLyBNYWtlIHN1cmUgbm8gdHJhaWxpbmcgc2xhc2guCgkJJGV4Y2x1ZGVzID0gc3RyX3JlcGxhY2UoICRyb290LCAnJywgJGV4Y2x1ZGVzICk7CgkJJGZpbGVzID0gKGFycmF5KSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmRlZXBzY2FuZGlyKCAkcm9vdCApOyAvLyBBcyBvZiB2Ny4wIGNoYW5nZWQgZnJvbSBkZWVwc2NhbiB0byBkZWVwZ2xvYiB0byBnZXQgYW55IGRpcnMgb3IgZmlsZXMgYmVnaW5uaW5nIHdpdGggYSBwZXJpb2QuCgkJJHJvb3RfbGVuID0gc3RybGVuKCAkcm9vdCApOwoJCSRoYXNoZWRGaWxlcyA9IGFycmF5KCk7CgkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlX2lkID0+ICYkZmlsZSApIHsKCQkJJG5ld19maWxlID0gc3Vic3RyKCAkZmlsZSwgJHJvb3RfbGVuICk7CgkJCQoJCQkvLyBJZiB0aGlzIGZpbGUvZGlyZWN0b3J5IGJlZ2lucyB3aXRoIGFuIGV4Y2x1c2lvbiB0aGVuIGp1bXAgdG8gbmV4dCBmaWxlL2RpcmVjdG9yeS4KCQkJZm9yZWFjaCggJGV4Y2x1ZGVzIGFzICRleGNsdWRlICkgewoJCQkJaWYgKCBiYWNrdXBidWRkeV9jb3JlOjpzdGFydHNXaXRoKCAkbmV3X2ZpbGUsICRleGNsdWRlICkgKSB7CgkJCQkJY29udGludWUgMjsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gT21pdCBkaXJlY3RvcmllcyB0aGVtc2VsdmVzLgoJCQlpZiAoIGlzX2RpciggJGZpbGUgKSApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQoJCQkkc3RhdCA9IHN0YXQoICRmaWxlICk7CgkJCWlmICggRkFMU0UgPT09ICRzdGF0ICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byByZWFkIGZpbGUgYCcgLiAkZmlsZSAuICdgIHN0YXQuIFNraXBwaW5nIGZpbGUuJyApOwoJCQkJY29udGludWU7CgkJCX0KCQkJCgkJCS8vIElmIHRoZSBmaWxlbmFtZSBpcyBpbiBVVEYtOCBhbmQgdGhlIGZsYWcgaXMgc2V0LCBlbmNvZGUgYmVmb3JlIHVzaW5nIGFzIGFuIGFycmF5IGtleQoJCQlpZiAoICR1dGY4X2VuY29kZSAmJiAoICdVVEYtOCcgPT0gbWJfZGV0ZWN0X2VuY29kaW5nKCAkbmV3X2ZpbGUgKSApICkgewoJCQkJJG5ld19maWxlID0gdXRmOF9lbmNvZGUoICRuZXdfZmlsZSApOwoJCQl9CgkJCQoJCQkkaGFzaGVkRmlsZXNbJG5ld19maWxlXSA9IGFycmF5KAoJCQkJJ3NpemUnCQk9PiAkc3RhdFsnc2l6ZSddLAoJCQkJJ21vZGlmaWVkJwk9PiAkc3RhdFsnbXRpbWUnXSwKCQkJKTsKCQkJaWYgKCBkZWZpbmVkKCAnQkFDS1VQQlVERFlfREVWJyApICYmICggdHJ1ZSA9PT0gQkFDS1VQQlVERFlfREVWICkgKSB7CgkJCQkkaGFzaGVkRmlsZXNbJG5ld19maWxlXVsnZGVidWdfZmlsZW5hbWUnXSA9IGJhc2U2NF9lbmNvZGUoICRmaWxlICk7CgkJCQkkaGFzaGVkRmlsZXNbJG5ld19maWxlXVsnZGVidWdfZmlsZWxlbmd0aCddID0gc3RybGVuKCAkZmlsZSApOwoJCQl9CgkJCWlmICggKCB0cnVlID09PSAkZ2VuZXJhdGVfc2hhMSApICYmICggJHN0YXRbJ3NpemUnXSA8IDEwNzM3NDE4MjQgKSApIHsgLy8gPCAxMDBtYgoJCQkJJGhhc2hlZEZpbGVzWyRuZXdfZmlsZV1bJ3NoYTEnXSA9IHNoYTFfZmlsZSggJGZpbGUgKTsKCQkJfQoJCQl1bnNldCggJGZpbGVzWyRmaWxlX2lkXSApOyAvLyBCZXR0ZXIgdG8gZnJlZSBtZW1vcnkgb3IgbGVhdmUgb3V0IGZvciBwZXJmb3JtYW5jZT8KCQkJCgkJfQoJCXVuc2V0KCAkZmlsZXMgKTsKCQkKCQlyZXR1cm4gJGhhc2hlZEZpbGVzOwoJCQoJfSAvLyBFbmQgaGFzaEdsb2IuCgkKCQoJCgkvLyBzZWFyY2ggYmFja3dhcmRzIHN0YXJ0aW5nIGZyb20gaGF5c3RhY2sgbGVuZ3RoIGNoYXJhY3RlcnMgZnJvbSB0aGUgZW5kCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoJGhheXN0YWNrLCAkbmVlZGxlKSB7CgkJaWYgKCAnJyA9PSAkbmVlZGxlICkgeyAvLyBCbGFuayBuZWVkbGUgaXMgaW52YWxpZCBzbyBhbHdheXMgc2F5IGZhbHNlLCBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgYmxhbmsuCgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuICRuZWVkbGUgPT09ICIiIHx8IHN0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAtc3RybGVuKCRoYXlzdGFjaykpICE9PSBGQUxTRTsKCX0gLy8gRW5kIGJhY2t1cGJ1ZGR5X3N0YXJ0c1dpdGgoKS4KCQoJCgkKCS8qIGFkZE5vdGlmaWNhdGlvbigpCgkgKgoJICogCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZE5vdGlmaWNhdGlvbiggJHNsdWcsICR0aXRsZSwgJG1lc3NhZ2UgPSAnJywgJGRhdGEgPSBhcnJheSgpLCAkdXJnZW50ID0gZmFsc2UsICR0aW1lID0gJycgKSB7CgkJCgkJaWYgKCAnJyA9PSAkdGltZSApIHsKCQkJJHRpbWUgPSB0aW1lKCk7CgkJfQoJCQoJCS8vIENyZWF0ZSB0aGlzIG5ldyBub3RpZmljYXRpb24gZGF0YS4KCQkkbm90aWZpY2F0aW9uID0gYXJyYXkoCgkJCSdzbHVnJyA9PiAkc2x1ZywKCQkJJ3RpbWUnID0+ICR0aW1lLAoJCQkndGl0bGUnID0+ICR0aXRsZSwKCQkJJ21lc3NhZ2UnID0+ICRtZXNzYWdlLAoJCQknZGF0YScgPT4gJGRhdGEsCgkJCSd1cmdlbnQnID0+IGZhbHNlLAoJCSk7CgkJJG5vdGlmaWNhdGlvbiA9IGFycmF5X21lcmdlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdub3RpZmljYXRpb25fZGVmYXVsdHMnICksICRub3RpZmljYXRpb24gKTsgLy8gQXBwbHkgZGVmYXVsdHMuCgkJCgkJLy8gTG9hZCBjdXJyZW50IG5vdGlmaWNhdGlvbnMuCgkJJG5vdGlmaWNhdGlvbkFycmF5ID0gc2VsZjo6Z2V0Tm90aWZpY2F0aW9ucygpOwoJCQoJCS8vIEFkZCB0byBjdXJyZW50IG5vdGlmaWNhdGlvbnMuCgkJZG9fYWN0aW9uKCAnYmFja3VwYnVkZHlfY29yZV9hZGRfbm90aWZpY2F0aW9uJywgJG5vdGlmaWNhdGlvbiApOwoJCSRub3RpZmljYXRpb25BcnJheVtdID0gJG5vdGlmaWNhdGlvbjsKCQkKCQkvLyBPbmx5IGtlZXAgbGFzdCBYIG5vdGlmaWNhdGlvbnMgdG8gcHJldmVudCBidWlsZHVwLgoJCSRub3RpZmljYXRpb25BcnJheSA9IGFycmF5X3NsaWNlKCAkbm90aWZpY2F0aW9uQXJyYXksICggLTEgKiBiYWNrdXBidWRkeV9jb25zdGFudHM6Ok5PVElGSUNBVElPTlNfTUFYX0NPVU5UICksIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6Tk9USUZJQ0FUSU9OU19NQVhfQ09VTlQsIHRydWUgKTsKCQkKCQkvLyBTYXZlLgoJCXNlbGY6OnJlcGxhY2VOb3RpZmljYXRpb25zKCAkbm90aWZpY2F0aW9uQXJyYXkgKTsKCQkKCX0gLy8gRW5kIGFkZE5vdGlmaWNhdGlvbigpLgoJCgkKCQoJLyogZ2V0X215c3FsZHVtcF9hZGRpdGlvbmFsKCkKCSAqCgkgKiBHZXQgYWRkaXRpb25hbCBpbmNsdWRlcyBvciBleGNsdWRlcyBvZiBkYiB0YWJsZXMuIFBvcHVsYXRlcyB7cHJlZml4fSB2YXJpYWJsZSBhbmQgc2FuaXRpemVzLCByZW1vdmVzIGR1cGVzLCBldGMuIFJldHVybnMgYXJyYXkuCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X215c3FsZHVtcF9hZGRpdGlvbmFsKCAkaW5jbHVkZXNPckV4Y2x1ZGVzLCAkcHJvZmlsZSwgJG92ZXJyaWRlX3ByZWZpeCA9ICcnICkgewoJCWlmICggKCAnaW5jbHVkZXMnICE9ICRpbmNsdWRlc09yRXhjbHVkZXMgKSAmJiAoICdleGNsdWRlcycgIT0gJGluY2x1ZGVzT3JFeGNsdWRlcyApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzgzOTMyODk3MzogSW52YWxpZCBnZXRJbmNsdWRlRXhjbHVkZVRhYmxlcygpIHBhcmFtZXRlciBpbiBjb3JlLnBocC4nOwoJCQllcnJvcl9sb2coICdCYWNrdXBCdWRkeSAnIC4gJGVycm9yICk7CgkJCWVjaG8gJGVycm9yOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCWlmICggISBpc3NldCggJHByb2ZpbGVbICdteXNxbGR1bXBfYWRkaXRpb25hbF8nIC4gJGluY2x1ZGVzT3JFeGNsdWRlcyBdICkgKSB7CgkJCWVycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5IEVycm9yICM0Mzg5MzQ4OTM0OiBQcm9maWxlIG1pc3NpbmcgZXhwZWN0ZWQga2V5LiBQcm9maWxlOiBgJyAuIHByaW50X3IoICRwcm9maWxlLCB0cnVlICkgLiAnYC4nICk7CgkJfQoJCQoJCSR0YWJsZXMgPSBleHBsb2RlKCAiXG4iLCAkcHJvZmlsZVsgJ215c3FsZHVtcF9hZGRpdGlvbmFsXycgLiAkaW5jbHVkZXNPckV4Y2x1ZGVzIF0gKTsKCQlhcnJheV93YWxrKCAkdGFibGVzLCBjcmVhdGVfZnVuY3Rpb24oJyYkdmFsJywgJyR2YWwgPSB0cmltKCR2YWwpOycpKTsgIC8vIFRyaW0gd2hpdGVzcGFjZSBhcm91bmQgdGFibGVzLgoJCQoJCWlmICggJycgPT0gJG92ZXJyaWRlX3ByZWZpeCApIHsKCQkJZ2xvYmFsICR3cGRiOwoJCQkkcHJlZml4ID0gJHdwZGItPnByZWZpeDsKCQl9IGVsc2UgewoJCQkkcHJlZml4ID0gJG92ZXJyaWRlX3ByZWZpeDsKCQl9CgkJZm9yZWFjaCggJHRhYmxlcyBhcyAmJHRhYmxlICkgewoJCQkkdGFibGUgPSBzdHJfcmVwbGFjZSggJ3twcmVmaXh9JywgJHByZWZpeCwgJHRhYmxlICk7IC8vIFBvcHVsYXRlIHByZWZpeCB2YXJpYWJsZS4KCQl9CgkJCgkJJHRhYmxlcyA9IGFycmF5X3VuaXF1ZSggJHRhYmxlcyApOyAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCgkJcmV0dXJuICR0YWJsZXM7Cgl9IC8vIEVuZCBnZXRfbXlzcWxkdW1wX2FkZGl0aW9uYWwoKS4KCQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvY2Vzc19iYWNrdXAoICRzZXJpYWwgPSAnYmxhbmsnICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzZXRfc3RhdHVzX3NlcmlhbCggJHNlcmlhbCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy0tLSBOZXcgUEhQIHByb2Nlc3MuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSdW5uaW5nIHByb2Nlc3MgZm9yIHNlcmlhbCBgJyAuICRzZXJpYWwgLiAnYC4uLicgKTsKCQkKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2JhY2t1cC5waHAnICk7CgkJJG5ld0JhY2t1cCA9IG5ldyBwYl9iYWNrdXBidWRkeV9iYWNrdXAoKTsKCQlyZXR1cm4gJG5ld0JhY2t1cC0+cHJvY2Vzc19iYWNrdXAoICRzZXJpYWwgKTsKCX0KCQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmVyaWZ5SG91c2VrZWVwaW5nKCkgewoJCWlmICggaXNfbXVsdGlzaXRlKCkgKSB7IC8vIEZvciBNdWx0aXNpdGUgb25seSBydW4gb24gbWFpbiBOZXR3b3JrIHNpdGUuCgkJCWlmICggISBpc19tYWluX3NpdGUoKSApIHsKCQkJCXJldHVybjsKCQkJfQoJCX0KCQkKCQlpZiAoIGZhbHNlID09PSB3cF9uZXh0X3NjaGVkdWxlZCggJ2JhY2t1cGJ1ZGR5X2Nyb24nLCBhcnJheSggJ2hvdXNla2VlcGluZycsIGFycmF5KCkgKSApICkgeyAvLyBpZiBzY2hlZHVsZSBkb2VzIG5vdCBleGlzdC4uLgoJCQliYWNrdXBidWRkeV9jb3JlOjpzY2hlZHVsZV9ldmVudCggdGltZSgpICsgKCA2MCo2MCAqIDIgKSwgJ2RhaWx5JywgJ2hvdXNla2VlcGluZycsIGFycmF5KCkgKTsgLy8gQWRkIHNjaGVkdWxlLgoJCX0KCX0gLy8gRW5kIHZlcmlmeUhvdXNla2VlcGluZygpLgoJCgkKCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2ZXJpZnlMaXZlQ3JvbigpIHsKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9kZXN0aW5hdGlvbnMvbGl2ZS9saXZlLnBocCcgKTsKCQlpZiAoIGZhbHNlID09PSBiYWNrdXBidWRkeV9saXZlOjpnZXRMaXZlSUQoKSApIHsgLy8gSWYgbm8gTGl2ZSBkZXN0aW5hdGlvbiBzZXQgdXAgdGhlbiByZXR1cm4uCgkJCXJldHVybjsKCQl9CgkJaWYgKCBmYWxzZSA9PT0gd3BfbmV4dF9zY2hlZHVsZWQoICdiYWNrdXBidWRkeV9jcm9uJywgYXJyYXkoICdsaXZlJywgYXJyYXkoKSApICkgKSB7IC8vIGlmIHNjaGVkdWxlIGRvZXMgbm90IGV4aXN0Li4uCgkJCWJhY2t1cGJ1ZGR5X2NvcmU6OnNjaGVkdWxlX2V2ZW50KCB0aW1lKCkgKyAoIDYwKjYwICksICdob3VybHknLCAnbGl2ZScsIGFycmF5KCkgKTsgLy8gQWRkIHNjaGVkdWxlLgoJCX0KCX0gLy8gRW5kIHZlcmlmeUxpdmVDcm9uKCkuCgkKCQoJCgkvKglfY2FsY3VsYXRlX3RhYmxlcygpCgkgKgkKCSAqCVRha2VzIGEgYmFzZSBsZXZlbCB0byBjYWxjdWxhdGUgdGFibGVzIGZyb20uICBUaGVuIGFkZHMgYWRkaXRpb25hbCB0YWJsZXMuICBUaGVuIHJlbW92ZXMgYW55IGV4Y2x1c2lvbnMuIFJldHVybnMgYXJyYXkgb2YgZmluYWwgdGFibGUgbGlzdGluZyB0byBiYWNrdXAuCgkgKgkKCSAqCUBzZWUgZHVtcCgpLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJGJhc2VfZHVtcF9tb2RlCQkJRGV0ZXJtaW5lcyB3aGljaCBkYXRhYmFzZSB0YWJsZXMgdG8gZHVtcCBieSBkZWZhdWx0LiBWYWxpZCB2YWx1ZXM6ICBhbGwsIG5vbmUsIHByZWZpeAoJICoJQHBhcmFtCQlhcnJheQkJJGFkZGl0aW9uYWxfaW5jbHVkZXMJQXJyYXkgb2YgYWRkaXRpb25hbCB0YWJsZShzKSB0byBJTkNMVURFIGluIGR1bXAuIEFkZGVkIGluIGFkZGl0aW9uIHRvIHRob3NlIGZvdW5kIGJ5IHRoZSAkYmFzZV9kdW1wX21vZGUKCSAqCUBwYXJhbQkJYXJyYXkJCSRhZGRpdGlvbmFsX2V4Y2x1ZGVzCUFycmF5IG9mIGFkZGl0aW9uYWwgdGFibGUocykgdG8gRVhDTFVERSBmcm9tIGR1bXAuIFJlbW92ZWQgZnJvbSB0aG9zZSBmb3VuZCBieSB0aGUgJGJhc2VfZHVtcF9tb2RlICsgJGFkZGl0aW9uYWxfaW5jbHVkZXMuCgkgKglAcmV0dXJuCQlhcnJheQkJCQkJCQkJQXJyYXkgb2YgdGFibGVzIHRvIGJhY2t1cC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWxjdWxhdGVfdGFibGVzKCAkYmFzZV9kdW1wX21vZGUsICRhZGRpdGlvbmFsX2luY2x1ZGVzID0gYXJyYXkoKSwgJGFkZGl0aW9uYWxfZXhjbHVkZXMgPSBhcnJheSgpICkgewoJCQoJCWdsb2JhbCAkd3BkYjsKCQkkd3BkYi0+c2hvd19lcnJvcnMoKTsgLy8gVHVybiBvbiBlcnJvciBkaXNwbGF5LgoJCQoJCSR0YWJsZXMgPSBhcnJheSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGN1bGF0aW5nIG15c3FsIGRhdGFiYXNlIHRhYmxlcyB0byBiYWNrdXAuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Jhc2UgZGF0YWJhc2UgZHVtcCBtb2RlIChiZWZvcmUgaW5jbHVzaW9ucy9leGNsdXNpb25zKTogYCcgLiAkYmFzZV9kdW1wX21vZGUgLiAnYC4nICk7CgkJCgkJLy8gQ2FsY3VsYXRlIGJhc2UgdGFibGVzLgoJCWlmICggJGJhc2VfZHVtcF9tb2RlID09ICdhbGwnICkgeyAvLyBBbGwgdGFibGVzIGluIGRhdGFiYXNlIHRvIHN0YXJ0IHdpdGguCgkJCSRzcWwgPSAnU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCknOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3RhcnRBY3Rpb24nLCAnc2NoZW1hVGFibGVzJyApOwoJCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZmluaXNoQWN0aW9uJywgJ3NjaGVtYVRhYmxlcycgKTsKCQkJaWYgKCAoIG51bGwgPT09ICRyZXN1bHRzICkgfHwgKCBmYWxzZSA9PT0gJHJlc3VsdHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODQ5Mzg5NGE6IFVuYWJsZSB0byBjYWxjdWxhdGUgZGF0YWJhc2UgdGFibGVzIHdpdGggcXVlcnk6IGAnIC4gJHNxbCAuICdgLiBDaGVjayBkYXRhYmFzZSBwZXJtaXNzaW9ucyBvciBjb250YWN0IGhvc3QuJyApOwoJCQl9CgkJCWZvcmVhY2goIChhcnJheSkkcmVzdWx0cyBhcyAkcmVzdWx0ICkgewoJCQkJYXJyYXlfcHVzaCggJHRhYmxlcywgJHJlc3VsdFsndGFibGVfbmFtZSddICk7CgkJCX0KCQkJdW5zZXQoICRyZXN1bHRzICk7CgkJCgkJfSBlbHNlaWYgKCAkYmFzZV9kdW1wX21vZGUgPT0gJ25vbmUnICkgeyAvLyBOb25lIHRvIHN0YXJ0IHdpdGguCgkJCQoJCQkvLyBEbyBub3RoaW5nLgoJCQkKCQl9IGVsc2VpZiAoICRiYXNlX2R1bXBfbW9kZSA9PSAncHJlZml4JyApIHsgLy8gVGFibGVzIG1hdGNoaW5nIHByZWZpeC4KCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RldGVybWluaW5nIGRhdGFiYXNlIHRhYmxlcyB3aXRoIHByZWZpeCBgJyAuICR3cGRiLT5wcmVmaXggLiAnYC4nICk7CgkJCSRwcmVmaXhfc3FsID0gc3RyX3JlcGxhY2UoICdfJywgJ1xfJywgJHdwZGItPnByZWZpeCApOwoJCQkkc3FsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJ3skcHJlZml4X3NxbH0lJyBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdzdGFydEFjdGlvbicsICdzY2hlbWFUYWJsZXMnICk7CgkJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdmaW5pc2hBY3Rpb24nLCAnc2NoZW1hVGFibGVzJyApOwoJCQlpZiAoICggbnVsbCA9PT0gJHJlc3VsdHMgKSB8fCAoIGZhbHNlID09PSAkcmVzdWx0cyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NDkzODk0YjogVW5hYmxlIHRvIGNhbGN1bGF0ZSBkYXRhYmFzZSB0YWJsZXMgd2l0aCBxdWVyeTogYCcgLiAkc3FsIC4gJ2AuIENoZWNrIGRhdGFiYXNlIHBlcm1pc3Npb25zIG9yIGNvbnRhY3QgaG9zdC4nICk7CgkJCX0KCQkJZm9yZWFjaCggKGFycmF5KSRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCQlhcnJheV9wdXNoKCAkdGFibGVzLCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKTsKCQkJfQoJCQl1bnNldCggJHJlc3VsdHMgKTsKCQkJCgkJfSBlbHNlIHsgLy8gdW5rbm93biBkdW1wIG1vZGUuCgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzQ1NDU0NTogVW5rbm93biBkYXRhYmFzZSBkdW1wIG1vZGUuJyApOyAvLyBTaG91bGQgbmV2ZXIgc2VlIHRoaXMuCgkJCQoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCYXNlIGRhdGFiYXNlIHRhYmxlcyBiYXNlZCBvbiBzZXR0aW5ncyAoJyAuIGNvdW50KCAkdGFibGVzICkgLiAnIHRhYmxlcyk6IGAnIC4gaW1wbG9kZSggJywnLCAkdGFibGVzICkgLiAnYCcgKTsKCQkKCQkvLyBBZGQgYWRkaXRpb25hbCB0YWJsZXMuCgkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGFibGVzLCAkYWRkaXRpb25hbF9pbmNsdWRlcyApOwoJCSR0YWJsZXMgPSBhcnJheV9maWx0ZXIoICR0YWJsZXMgKTsgLy8gVHJpbSBhbnkgcGhhbnRvbSB0YWJsZXMgdGhhdCB0aGUgYWJvdmUgbGluZSBtYXkgaGF2ZSBpbnRyb2R1Y2VkLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIHRhYmxlcyBhZnRlciBhZGRpdGlvbiAoJyAuIGNvdW50KCAkdGFibGVzICkgLiAnIHRhYmxlcyk6IGAnIC4gaW1wbG9kZSggJywnLCAkdGFibGVzICkgLiAnYCcgKTsKCQkKCQkvLyBSZW1vdmUgZXhjbHVkZWQgdGFibGVzLgoJCSR0YWJsZXMgPSBhcnJheV9kaWZmKCAkdGFibGVzLCAkYWRkaXRpb25hbF9leGNsdWRlcyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIHRhYmxlcyBhZnRlciBleGNsdXNpb24gKCcgLiBjb3VudCggJHRhYmxlcyApIC4gJyB0YWJsZXMpOiBgJyAuIGltcGxvZGUoICcsJywgJHRhYmxlcyApIC4gJ2AnICk7CgkJCgkJLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGUgdGFibGVzLgoJCSR0YWJsZXMgPSBhcnJheV91bmlxdWUoICR0YWJsZXMgKTsKCQkKCQlyZXR1cm4gYXJyYXlfdmFsdWVzKCAkdGFibGVzICk7IC8vIENsZWFuIHVwIGluZGV4aW5nICYgcmV0dXJuLgoJCQoJfSAvLyBFbmQgY2FsY3VsYXRlX3RhYmxlcygpLgoJCgkKCS8vIGFycmF5IG9mIGRhdCBjb250ZW50cyBvbiBzdWNjZXNzLCBlbHNlIHN0cmluZyBlcnJvciBtZXNzYWdlLgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW5kZXJfZGF0X2NvbnRlbnRzKCAkc2V0dGluZ3MsICRkYXRfZmlsZSApIHsKCQkKCQkkc2V0dGluZ3MgPSBhcnJheV9tZXJnZSggYXJyYXkoCgkJCSdzdGFydF90aW1lJwkJCT0+IDAsCgkJCSdiYWNrdXBfdHlwZScJCQk9PiAnJywKCQkJJ3Byb2ZpbGUnCQkJCT0+IGFycmF5KCksCgkJCSdzZXJpYWwnCQkJCT0+ICcnLAoJCQknYnJlYWtvdXRfdGFibGVzJwkJPT4gYXJyYXkoKSwKCQkJJ3RhYmxlX3NpemVzJwkJCT0+IGFycmF5KCksCgkJCSdmb3JjZV9zaW5nbGVfZGJfZmlsZScJPT4gZmFsc2UsCgkJCSdkZXBsb3ltZW50X2RpcmVjdGlvbicJPT4gJycsCgkJCSd0cmlnZ2VyJwkJCQk9PiAnJywKCQkJJ3NraXBfZGF0YWJhc2VfZHVtcCcJPT4gZmFsc2UsCgkJCSdkYl9leGNsdWRlcycJCQk9PiBhcnJheSgpLAoJCQknZGJfaW5jbHVkZXMnCQkJPT4gYXJyYXkoKQoJCSksICRzZXR0aW5ncyApOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdDcmVhdGluZyBEQVQgKGRhdGEpIGZpbGUgc25hcHNob3R0aW5nIHNpdGUgJiBiYWNrdXAgaW5mb3JtYXRpb24uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkKCQlnbG9iYWwgJHdwZGIsICRjdXJyZW50X2Jsb2c7CgkJCgkJJGlzX211bHRpc2l0ZSA9ICRpc19tdWx0aXNpdGVfZXhwb3J0ID0gZmFsc2U7IC8vJGZyb21fbXVsdGlzaXRlIGlzIGZyb20gYSBzaXRlIHdpdGhpbiBhIG5ldHdvcmsKCQkkdXBsb2FkX3VybF9yZXdyaXRlID0gJHVwbG9hZF91cmwgPSAnJzsKCQlpZiAoICggaXNfbXVsdGlzaXRlKCkgJiYgKCAkc2V0dGluZ3NbJ3RyaWdnZXInXSA9PSAnc2NoZWR1bGVkJyApICkgfHwgKGlzX211bHRpc2l0ZSgpICYmIGlzX25ldHdvcmtfYWRtaW4oKSApICkgeyAvLyBNUyBOZXR3b3JrIEV4cG9ydCBJRiAoIGluIGEgbmV0d29yayBhbmQgdHJpZ2dlcmVkIGJ5IGEgc2NoZWR1bGUgKSBPUiAoIGluIGEgbmV0d29yayBhbmQgbG9nZ2VkIGluIGFzIG5ldHdvcmsgYWRtaW4pCgkJCSRpc19tdWx0aXNpdGUgPSB0cnVlOwoJCX0gZWxzZWlmICggaXNfbXVsdGlzaXRlKCkgKSB7IC8vIE1TIEV4cG9ydCAoaW5kaXZpZHVhbCBzaXRlKQoJCQkkaXNfbXVsdGlzaXRlX2V4cG9ydCA9IHRydWU7CgkJCSR1cGxvYWRzID0gd3BfdXBsb2FkX2RpcigpOwoJCQkkdXBsb2FkX3VybF9yZXdyaXRlID0gc2l0ZV91cmwoIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJHVwbG9hZHNbICdiYXNlZGlyJyBdICkgKTsgLy8gVVJMIHdlIHJld3JpdGUgdXBsb2FkcyB0by4gUkVBTCBkaXJlY3QgdXJsLgoJCQkkdXBsb2FkX3VybCA9ICR1cGxvYWRzWyAnYmFzZXVybCcgXTsgLy8gUHJldHR5IHZpcnR1YWwgcGF0aCB0byB1cGxvYWRzIGRpcmVjdG9yeS4KCQl9CgkJCgkJLy8gSGFuZGxlIHdwLWNvbmZpZy5waHAgZmlsZSBpbiBhIHBhcmVudCBkaXJlY3RvcnkuCgkJaWYgKCAkc2V0dGluZ3NbJ2JhY2t1cF90eXBlJ10gPT0gJ2Z1bGwnICkgewoJCQkkd3BfY29uZmlnX3BhcmVudCA9IGZhbHNlOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnICkgKSB7IC8vIHdwLWNvbmZpZyBpbiBub3JtYWwgcGxhY2UuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwIGZvdW5kIGluIG5vcm1hbCBsb2NhdGlvbi4nICk7CgkJCX0gZWxzZSB7IC8vIHdwLWNvbmZpZyBub3QgaW4gbm9ybWFsIHBsYWNlLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnd3AtY29uZmlnLnBocCBub3QgZm91bmQgaW4gbm9ybWFsIGxvY2F0aW9uOyBjaGVja2luZyBwYXJlbnQgZGlyZWN0b3J5LicgKTsKCQkJCWlmICggQGZpbGVfZXhpc3RzKCBkaXJuYW1lKCBBQlNQQVRIICkgLiAnL3dwLWNvbmZpZy5waHAnICkgJiYgISBAZmlsZV9leGlzdHMoIGRpcm5hbWUoIEFCU1BBVEggKSAuICcvd3Atc2V0dGluZ3MucGhwJyApICkgeyAvLyBDb25maWcgaW4gcGFyZW50LiBFcnJvcnMgc3VwcHJlc3NlZCBkdWUgdG8gcG9zc2libGUgb3Blbl9iYXNlZGlyIHJlc3RyaWN0aW9ucy4KCQkJCQkkd3BfY29uZmlnX3BhcmVudCA9IHRydWU7CgkJCQl9IGVsc2UgeyAvLyBGb3VuZCBubyB3cC1jb25maWcucGhwIGFueXdoZXJlLgoJCQkJCWlmICggISBAZmlsZV9leGlzdHMoIGRpcm5hbWUoIEFCU1BBVEggKSAuICcvd3Atc2V0dGluZ3MucGhwJyApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzgzOTM0ODogd3AtY29uZmlnLnBocCBub3QgZm91bmQgaW4gbm9ybWFsIGxvY2F0aW9uIChgJyAuIEFCU1BBVEggLiAnYCkgbm9yIHBhcmVudCBkaXJlY3RvcnkgKGAnIC4gZGlybmFtZSggQUJTUEFUSCApIC4gJ2ApLiBDaGVjayB0aGF0IGZpbGUgZXhpc3RzIGFuZCBoYXMgcHJvcGVyIHJlYWQgcGVybWlzc2lvbnMuIENoZWNrIGxvZyBhYm92ZSBmb3IgbW9yZSBlcnJvcnMuJyApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODM5MzQ4Yjogd3AtY29uZmlnLnBocCBub3QgZm91bmQgaW4gbm9ybWFsIGxvY2F0aW9uIChgJyAuIEFCU1BBVEggLiAnYCkgbm9yIHBhcmVudCBkaXJlY3RvcnkgKGAnIC4gZGlybmFtZSggQUJTUEFUSCApIC4gJ2ApIHdpdGhvdXQgd3Atc2V0dGluZ3MucGhwLiBDaGVjayB0aGF0IGZpbGUgZXhpc3RzIGFuZCBoYXMgcHJvcGVyIHJlYWQgcGVybWlzc2lvbnMuIENoZWNrIGxvZyBhYm92ZSBmb3IgbW9yZSBlcnJvcnMuJyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCSR3cF9jb25maWdfcGFyZW50ID0gZmFsc2U7CgkJfQoJCQoJCWdsb2JhbCAkd3BfdmVyc2lvbjsKCQkKCQkkdG90YWxQb3N0cyA9IDA7CgkJZm9yZWFjaCggd3BfY291bnRfcG9zdHMoICdwb3N0JyApIGFzICRjb3VudHR5cGUgPT4gJGNvdW50ICkgewoJCQkkdG90YWxQb3N0cyArPSAkY291bnQ7CgkJfQoJCSR0b3RhbFBhZ2VzID0gMDsKCQlmb3JlYWNoKCB3cF9jb3VudF9wb3N0cyggJ3BhZ2UnICkgYXMgJGNvdW50dHlwZSA9PiAkY291bnQgKSB7CgkJCSR0b3RhbFBhZ2VzICs9ICRjb3VudDsKCQl9CgkJJHRvdGFsQ29tbWVudHMgPSAwOwoJCWZvcmVhY2goIHdwX2NvdW50X2NvbW1lbnRzKCkgYXMgJGNvdW50dHlwZSA9PiAkY291bnQgKSB7CgkJCSR0b3RhbENvbW1lbnRzICs9ICRjb3VudDsKCQl9CgkJJHRvdGFsVXNlcnMgPSBjb3VudF91c2VycygpOwoJCSR0b3RhbFVzZXJzID0gJHRvdGFsVXNlcnNbJ3RvdGFsX3VzZXJzJ107CgkJCgkJaWYgKCAhIGlzc2V0KCAkc2V0dGluZ3NbJ2N1c3RvbV9yb290J10gKSB8fCAoICcnID09ICRzZXR0aW5nc1snY3VzdG9tX3Jvb3QnXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3RhcnRTdWJGdW5jdGlvbicsIGpzb25fZW5jb2RlKCBhcnJheSggJ2Z1bmN0aW9uJyA9PiAncG9zdF9jb3VudCcsICd0aXRsZScgPT4gJ0ZvdW5kICcgLiAkdG90YWxQb3N0cyAuICcgcG9zdHMsICcgLiAkdG90YWxQYWdlcyAuICcgcGFnZXMsIGFuZCAnIC4gJHRvdGFsQ29tbWVudHMgLiAnIGNvbW1lbnRzLicgKSApICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdzdGFydFN1YkZ1bmN0aW9uJywganNvbl9lbmNvZGUoIGFycmF5KCAnZnVuY3Rpb24nID0+ICdwb3N0X2NvdW50JywgJ3RpdGxlJyA9PiAnRm91bmQgJyAuICR0b3RhbFVzZXJzIC4gJyB1c2VyIGFjY291bnRzLicgKSApICk7CgkJfQoJCQoJCSRkYXRfY29udGVudCA9IGFycmF5KAoJCQkKCQkJLy8gQmFja3VwIEluZm8uCgkJCSdiYWNrdXBidWRkeV92ZXJzaW9uJwkJPT4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSwKCQkJJ3dvcmRwcmVzc192ZXJzaW9uJwkJCT0+ICR3cF92ZXJzaW9uLAkJCQkJCQkJCQkJCQkvLyBXb3JkUHJlc3MgdmVyc2lvbi4KCQkJJ3BocF92ZXJzaW9uJwkJCQk9PiBQSFBfVkVSU0lPTiwKCQkJCgkJCSdiYWNrdXBfdGltZScJCQkJPT4gJHNldHRpbmdzWydzdGFydF90aW1lJ10sCQkJCQkJCQkvLyBUaW1lIGJhY2t1cCBiZWdhbi4KCQkJJ2JhY2t1cF90eXBlJwkJCQk9PiAkc2V0dGluZ3NbJ2JhY2t1cF90eXBlJ10sCQkJCQkJCQkJCS8vIEJhY2t1cCB0eXBlOiBmdWxsLCBkYiwgZmlsZXMKCQkJJ3Byb2ZpbGUnCQkJCQk9PiAkc2V0dGluZ3NbJ3Byb2ZpbGUnXSwJCQkJCQkJCQkvLyBBcnJheSBvZiBwcm9maWxlIHNldHRpbmdzLgoJCQknZGVmYXVsdF9wcm9maWxlJwkJCT0+IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVswXSwJCQkJCQkvLyBEZWZhdWx0IHByb2ZpbGUuCgkJCSdzZXJpYWwnCQkJCQk9PiAkc2V0dGluZ3NbJ3NlcmlhbCddLAkJCQkJCQkJCS8vIFVuaXF1ZSBpZGVudGlmaWVyIChyYW5kb20pIGZvciB0aGlzIGJhY2t1cC4KCQkJJ3RyaWdnZXInCQkJCQk9PiAkc2V0dGluZ3NbJ3RyaWdnZXInXSwJCQkJCQkJCQkJCQkJLy8gV2hhdCB0cmlnZ2VyZWQgdGhpcyBiYWNrdXAuIFZhbGlkIHZhbHVlczogc2NoZWR1bGVkLCBtYW51YWwuCgkJCSd3cC1jb25maWdfaW5fcGFyZW50JwkJPT4gJHdwX2NvbmZpZ19wYXJlbnQsCQkJCQkJCQkJCQkvLyBXaGV0aGVyIG9yIG5vdCB0aGUgd3AtY29uZmlnLnBocCBmaWxlIGlzIGluIG9uZSBwYXJlbnQgZGlyZWN0b3J5IHVwLiBJZiBpbiBwYXJlbnQgZGlyZWN0b3J5IGl0IHdpbGwgYmUgY29waWVkIGludG8gdGhlIHRlbXAgc2VyaWFsIGRpcmVjdG9yeSBhbG9uZyB3aXRoIHRoZSAuc3FsIGFuZCBEQVQgZmlsZS4gT24gcmVzdG9yZSB3ZSB3aWxsIE5PVCBwbGFjZSBpbiBhIHBhcmVudCBkaXJlY3RvcnkgZHVlIHRvIHBvdGVudGlhbCBwZXJtaXNzaW9uIGlzc3VlcywgZXRjLiBJdCB3aWxsIGJlIG1vdmVkIGludG8gdGhlIG5vcm1hbCBsb2NhdGlvbi4gVmFsdWUgc2V0IHRvIHRydWUgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbiBpZiBhcHBsaWNhYmxlLgoJCQknZGVwbG95bWVudF9kaXJlY3Rpb24nCQk9PiAkc2V0dGluZ3NbJ2RlcGxveW1lbnRfZGlyZWN0aW9uJ10sCQkJCQkJLy8gRGVwbG95bWVudCBkaXJlY3Rpb24sIGlmIGFueS4KCQkJCgkJCS8vIFdvcmRQcmVzcyBJbmZvLgoJCQknYWJzcGF0aCcJCQkJCT0+IEFCU1BBVEgsCgkJCSdzaXRldXJsJwkJCQkJPT4gc2l0ZV91cmwoKSwKCQkJJ2hvbWV1cmwnCQkJCQk9PiBob21lX3VybCgpLAoJCQknYmxvZ25hbWUnCQkJCQk9PiBnZXRfb3B0aW9uKCAnYmxvZ25hbWUnICksCgkJCSdibG9nZGVzY3JpcHRpb24nCQkJPT4gZ2V0X29wdGlvbiggJ2Jsb2dkZXNjcmlwdGlvbicgKSwKCQkJJ2FjdGl2ZV9wbHVnaW5zJwkJCT0+IGltcGxvZGUoICcsICcsIGdldF9vcHRpb24oICdhY3RpdmVfcGx1Z2lucycgKSApLAkJCQkvLyBMaXN0IG9mIGFjdGl2ZSBwbHVnaW5zIGF0IHRpbWUgb2YgYmFja3VwLgoJCQkncG9zdHMnCQkJCQkJPT4gJHRvdGFsUG9zdHMsCQkJCQkJCQkJCQkJCS8vIFRvdGFsIFdQIHBvc3RzLCBwdWJsaXNoZXMsIGRyYWZ0LCBwcml2YXRlLCB0cmFzaCwgZXRjLgoJCQkncGFnZXMnCQkJCQkJPT4gJHRvdGFsUGFnZXMsCQkJCQkJCQkJCQkJCS8vIFRvdGFsIFdQIHBhZ2VzLCBwdWJsaXNoZXMsIGRyYWZ0LCBwcml2YXRlLCB0cmFzaCwgZXRjLgoJCQknY29tbWVudHMnCQkJCQk9PiAkdG90YWxDb21tZW50cywJCQkJCQkJCQkJCQkvLyBUb3RhbCBXUCBjb21tZW50cywgYXBwcm92ZWQsIHNwYW0sIGV0YwoJCQkndXNlcnMnCQkJCQkJPT4gJHRvdGFsVXNlcnMsCQkJCQkJCQkJCQkJCS8vIFRvdGFsIHVzZXJzIG9uIHNpdGUuCgkJCSd3cF9jb250ZW50X3VybCcJCQk9PiBXUF9DT05URU5UX1VSTCwKCQkJJ3dwX2NvbnRlbnRfZGlyJwkJCT0+IFdQX0NPTlRFTlRfRElSLAoJCQkKCQkJLy8gRGF0YWJhc2UgSW5mby4gUmVtYWluaW5nIHNlbnNpdGl2ZSBpbmZvIGFkZGVkIGluIGFmdGVyIHByaW50aW5nIG91dCBEQVQgKGZvciBzZWN1cml0eSkuCgkJCSdkYl9jaGFyc2V0JwkJCQk9PiAkd3BkYi0+Y2hhcnNldCwJCQkJCQkJCQkJCQkvLyBDaGFyc2V0IG9mIHRoZSBkYXRhYmFzZS4gRWcgdXRmOCwgdXRmbWI0LiBAc2luY2UgdjYuMC4wLjYuCgkJCSdkYl9jb2xsYXRlJwkJCQk9PiAkd3BkYi0+Y29sbGF0ZSwJCQkJCQkJCQkJCQkvLyBDb2xsYXRlIG9mIHRoZSBkYXRhYmFzZS4gRWcgdXRmOCwgdXRmbWI0LiBAc2luY2UgdjYuMC4wLjYuCgkJCSdkYl9wcmVmaXgnCQkJCQk9PiAkd3BkYi0+cHJlZml4LAkJCQkJCQkJCQkJCS8vIERCIHByZWZpeC4gRWc6IHdwXwoJCQknZGJfc2VydmVyJwkJCQkJPT4gREJfSE9TVCwJCQkJCQkJCQkJCQkJCS8vIERCIGhvc3QgLyBzZXJ2ZXIgYWRkcmVzcy4KCQkJJ2RiX25hbWUnCQkJCQk9PiBEQl9OQU1FLAkJCQkJCQkJCQkJCQkJLy8gREIgbmFtZS4KCQkJJ2RiX3VzZXInCQkJCQk9PiAnJywJCQkJCQkJCQkJCQkJCQkvLyBTZXQgc2V2ZXJhbCBsaW5lcyBkb3duIGFmdGVyIHByaW50aW5nIG91dCBEQVQuCgkJCSdkYl9wYXNzd29yZCcJCQkJPT4gJycsCQkJCQkJCQkJCQkJCQkJLy8gU2V0IHNldmVyYWwgbGluZXMgZG93biBhZnRlciBwcmludGluZyBvdXQgREFULgoJCQknZGJfZXhjbHVzaW9ucycJCQkJPT4gaW1wbG9kZSggJywnLCAkc2V0dGluZ3NbJ2RiX2V4Y2x1ZGVzJ10gKSwKCQkJJ2RiX2luY2x1c2lvbnMnCQkJCT0+IGltcGxvZGUoICcsJywgJHNldHRpbmdzWydkYl9pbmNsdWRlcyddICksCgkJCSdkYl92ZXJzaW9uJwkJCQk9PiAkd3BkYi0+ZGJfdmVyc2lvbigpLAkJCQkJCQkJCQkJLy8gRGF0YWJhc2Ugc2VydmVyIChteXNxbCkgdmVyc2lvbi4KCQkJJ2JyZWFrb3V0X3RhYmxlcycJCQk9PiAkc2V0dGluZ3NbJ2JyZWFrb3V0X3RhYmxlcyddLAkJCQkJCQkvLyBUYWJsZXMgYnJva2VuIG91dCBpbnRvIGluZGl2aWR1YWwgYmFja3VwIHN0ZXBzLgoJCQkndGFibGVzX3NpemVzJwkJCQk9PiAkc2V0dGluZ3NbJ3RhYmxlX3NpemVzJ10sCQkJCQkJCQkvLyBUYWJsZXMgYmFja2VkIHVwIGFuZCB0aGVpciBzaXplcy4KCQkJJ2ZvcmNlX3NpbmdsZV9kYl9maWxlJwkJPT4gJHNldHRpbmdzWydmb3JjZV9zaW5nbGVfZGJfZmlsZSddLAkJCQkJCS8vIFRhYmxlcyBmb3JjZWQgaW50byBhIHNpbmdsZSBkYl8xLnNxbCBmaWxlLgoJCQknc2tpcF9kYXRhYmFzZV9kdW1wJwkJPT4gJHNldHRpbmdzWydza2lwX2RhdGFiYXNlX2R1bXAnXSwKCQkJCgkJCS8vIE11bHRpc2l0ZSBJbmZvLgoJCQknaXNfbXVsdGlzaXRlJyAJCQkJPT4gJGlzX211bHRpc2l0ZSwJCQkJCQkJCQkJCQkvLyBGdWxsIE5ldHdvcmsgYmFja3VwPwoJCQknaXNfbXVsdGlzaXRlX2V4cG9ydCcgCQk9PiAkaXNfbXVsdGlzaXRlX2V4cG9ydCwJCQkJCQkJCQkJLy8gU3Vic2l0ZSBiYWNrdXAgKGV4cG9ydCk/CgkJCSdkb21haW4nCQkJCQk9PiBpc19vYmplY3QoICRjdXJyZW50X2Jsb2cgKSA/ICRjdXJyZW50X2Jsb2ctPmRvbWFpbiA6ICcnLAkJLy8gRXg6IGJvYi5jb20KCQkJJ3BhdGgnCQkJCQkJPT4gaXNfb2JqZWN0KCAkY3VycmVudF9ibG9nICkgPyAkY3VycmVudF9ibG9nLT5wYXRoIDogJycsCQkvLyBFeDogL3dvcmRwcmVzcy8KCQkJJ3VwbG9hZF91cmwnIAkJCQk9PiAkdXBsb2FkX3VybCwgIAkJCQkJCQkJCQkJCS8vIFByZXR0eSBVUkwuCgkJCSd1cGxvYWRfdXJsX3Jld3JpdGUnIAkJPT4gJHVwbG9hZF91cmxfcmV3cml0ZSwJCQkJCQkJCQkJCS8vIFJlYWwgZXhpc3RpbmcgVVJMIHRoYXQgdGhlIHByZXR0eSBVUkwgd2lsbCBiZSByZXdyaXR0ZW4gdG8uCgkJCQoJCQkvLyBJbXBvcnRCdWRkeSBPcHRpb25zLgoJCQkvLyAnaW1wb3J0X2Rpc3BsYXlfcHJldmlvdXNfdmFsdWVzJwk9PglwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2ltcG9ydF9kaXNwbGF5X3ByZXZpb3VzX3ZhbHVlcyddLAkvLyBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9uIGltcG9ydC4gVXNlZnVsIGlmIGN1c3RvbWVyIGRvZXMgbm90IHdhbnQgdG8gYmxhdGFudGx5IGRpc3BsYXkgcHJldmlvdXMgdmFsdWVzIHRvIGFueW9uZSByZXN0b3JpbmcgdGhlIGJhY2t1cC4KCQkJCgkJKTsgLy8gRW5kIHNldHRpbmcgJGRhdF9jb250ZW50LgoJCQoJCQoJCS8vIElmIGN1cnJlbnRseSB1c2luZyBTU0wgb3IgZm9yY2luZyBhZG1pbiBTU0wgdGhlbiB3ZSB3aWxsIGNoZWNrIHRoZSBoYXJkY29kZWQgZGVmaW5lZCBVUkwgdG8gbWFrZSBzdXJlIGl0IG1hdGNoZXMuCgkJaWYgKCBpc19zc2woKSBPUiAoIGRlZmluZWQoICdGT1JDRV9TU0xfQURNSU4nICkgJiYgRk9SQ0VfU1NMX0FETUlOID09IHRydWUgKSApIHsKCQkJJGRhdF9jb250ZW50WydzaXRldXJsJ10gPSBnZXRfb3B0aW9uKCdzaXRldXJsJyk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0NvbXBlbnNhdGluZyBmb3IgU1NMIGluIHNpdGV1cmwuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQl9CgkJCgkJLy8gT3V0cHV0IGZvciB0cm91Ymxlc2hvb3RpbmcuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnREFUIGZpbGUgY29udGVudHMgKHNhbnMgZGF0YWJhc2UgdXNlci9wYXNzKTogJyAuIHN0cl9yZXBsYWNlKCAiXG4iLCAnOyAnLCBwcmludF9yKCAkZGF0X2NvbnRlbnQsIHRydWUgKSApICk7CgkJCgkJLy8gUmVtYWluaW5nIERCIHNldHRpbmdzLgoJCSRkYXRfY29udGVudFsnZGJfdXNlciddID0gREJfVVNFUjsKCQkkZGF0X2NvbnRlbnRbJ2RiX3Bhc3N3b3JkJ10gPSBEQl9QQVNTV09SRDsKCQkKCQkKCQkvLyBTZXJpYWxpemUgLmRhdCBmaWxlIGFycmF5LgoJCSRlbmNvZGVkX2RhdF9jb250ZW50ID0gIjw/cGhwIGRpZSgnQWNjZXNzIERlbmllZC4nKTsgLy8gPCEtLSA/PlxuIiAuIGJhc2U2NF9lbmNvZGUoIHNlcmlhbGl6ZSggJGRhdF9jb250ZW50ICkgKTsKCQkKCQkvLyBUT0RPOiByZW1vdmUgZXhpc3RzIG5vdGUgaWYgbm8gbW9yZSBwcm9ibGVtcyB3aXRoIHRoaXMgYWZ0ZXIgYWRkaW5nIHRoZSBhYm92ZSBkaXJlY3RvcnkgbWFraW5nLgoJCSRleGlzdGVkID0gJ25vJzsKCQlpZiAoIGZpbGVfZXhpc3RzKCAkZGF0X2ZpbGUgKSApIHsKCQkJJGV4aXN0ZWQgPSAneWVzJzsKCQl9CgkJCgkJLy8gV3JpdGUgZGF0YSB0byB0aGUgZGF0IGZpbGUuCgkJaWYgKCBmYWxzZSA9PT0gKCAkZmlsZV9oYW5kbGUgPSBmb3BlbiggJGRhdF9maWxlLCAndycgKSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMTc6IFVuYWJsZSB0byBmb3BlbiBEQVQgZmlsZSBgJyAuICRkYXRfZmlsZSAuICdgLiBDaGVjayBmaWxlL2RpcmVjdG9yeSBwZXJtaXNzaW9ucy4gQWxyZWFkeSBleGlzdGVkPzogYCcgLiAkZXhpc3RlZCAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJcmV0dXJuICRlcnJvcjsKCQl9CgkJaWYgKCBmYWxzZSA9PT0gZndyaXRlKCAkZmlsZV9oYW5kbGUsICRlbmNvZGVkX2RhdF9jb250ZW50ICkgKSB7CgkJCSRlcnJvciA9ICdFcnJvciAjMzQ4OTM0ODQzOiBVbmFibGUgdG8gZndyaXRlIHRvIERBVCBmaWxlIGAnIC4gJGRhdF9maWxlIC4gJ2AuIENoZWNrIGZpbGUvZGlyZWN0b3J5IHBlcm1pc3Npb25zLiBBbHJlYWR5IGV4aXN0ZWQ/OiBgJyAuICRleGlzdGVkIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCQlyZXR1cm4gJGVycm9yOwoJCX0KCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkKCQlyZXR1cm4gJGRhdF9jb250ZW50OyAvLyBBcnJheSBvZiBkYXQgY29udGVudCB3aGljaCB3YXMgd3JpdHRlbiB0byBEQVQgZmlsZS4KCQkKCX0gLy8gRW5kIHJlbmRlcl9kYXRfY29udGVudHMoKS4KCQoJCgkKCS8qIHRydW5jYXRlX2ZpbGVfYmVnaW5uaW5nKCkKCSAqCgkgKiBUcnVuY2F0ZXMgYSBmaWxlIGZyb20gdGhlIEJFR0lOTklORy4gRWcgZm9yIHRyaW1taW5nIGxvZ3Mgd2hpbGUgbGVhdmluZyB0aGUgbW9zdCByZWNlbnQgKGF0IHRoZSBib3R0b20pIGNvbnRlbnQuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRydW5jYXRlX2ZpbGVfYmVnaW5uaW5nKCRmaWxlbmFtZSwkbWF4ZmlsZXNpemUsJGtlZXBQZXJjZW50ID0gNTAgKXsKCQlAY2xlYXJzdGF0Y2FjaGUoIHRydWUsICRmaWxlbmFtZSApOwoJCWlmICggZmFsc2UgPT09ICggJHNpemUgPSBAZmlsZXNpemUoICRmaWxlbmFtZSApICkgKSB7CgkJCXJldHVybjsgLy8gRmlsZSBkaWQgbm90IGV4aXN0L2Nhbm5vdCBhY2Nlc3MuCgkJfQoJCWlmICgkc2l6ZTwkbWF4ZmlsZXNpemUpIHJldHVybjsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUcnVuY2F0aW5nIExBUkdFIGZpbGUgYCcgLiAkZmlsZW5hbWUgLiAnYCBvZiBzaXplIGAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHNpemUgKSAuICdgIGV4Y2VlZGluZyB0aHJlc2hvbGQsIG9ubHkga2VlcGluZyBuZXdlc3QgJyAuICRrZWVwUGVyY2VudCAuICclLicgKTsKCQkKCQkkbWF4ZmlsZXNpemU9JG1heGZpbGVzaXplICogKCAka2VlcFBlcmNlbnQgLyAxMDAgKTsgLy8ga2VlcCBuZXdlc3QgcGFydCB1cCB0byBjZXRhaW4gcGVyY2VudC4KCQkkZmg9Zm9wZW4oJGZpbGVuYW1lLCJyKyIpOwoJCWlmICggZmFsc2UgPT09ICggJHN0YXJ0ID0gQGZ0ZWxsKCRmaCkgKSApIHsKCQkJcmV0dXJuOyAvLyBGaWxlIGRpZCBub3QgZXhpc3QvY2Fubm90IGFjY2Vzcy4KCQl9CgkJZnNlZWsoICRmaCwgLSRtYXhmaWxlc2l6ZSwgU0VFS19FTkQgKTsgLy8gU2VlayB0byBtaWRkbGUgZnJvbSB0aGUgZW5kLgoJCSRzdGFydCA9IGZnZXRzKCAkZmggKTsgLy8gR2V0IHN0YXJ0IHBvc2l0aW9uLgoJCSRsZW5ndGggPSAoIChpbnQpJHNpemUgLSAoaW50KSRzdGFydCApOwoJCQoJCS8vIENhdGNoIGluc3RhbmNlcyB3aGVyZSBmcmVhZCBsZW5ndGggcGFyYW1ldGVyIHdhcyBjb21pbmcgaW4gbGVzcyB0aGFuIDAuCgkJaWYgKCAkbGVuZ3RoIDwgMSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gUmVhZCBpbiBmaWxlIGZyb20gbWlkZGxlIHBvaW50LgoJCSRjb250ZW50cyA9IGZyZWFkKCAkZmgsICRsZW5ndGggKTsKCQkKCQkvLyBGaW5kIGZpcnN0IG5ld2xpbmUgJiBjdXQgb2ZmIGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IHNvIHdlIG1ha2Ugc3VyZSB0byBzdGFydCBhdCBhIGZyZXNoIGxpbmUgKG5vIGhhbGYgbGluZXMgYXMgYmVnaW5uaW5nKS4KCQkkZmlyc3RfbmV3bGluZSA9IHN0cnBvcyggJGNvbnRlbnRzLCAiXG4iICk7CgkJaWYgKCBmYWxzZSA9PT0gJGZpcnN0X25ld2xpbmUgKSB7CgkJCSRmaXJzdF9uZXdsaW5lID0gMDsgLy8gTm8gbmV3bGluZS4KCQl9IGVsc2UgewoJCQkkZmlyc3RfbmV3bGluZSA9ICRmaXJzdF9uZXdsaW5lICsgMTsgLy8gQWZ0ZXIgbmV3IGxpbmUuCgkJfQoJCSRjb250ZW50cyA9IHN1YnN0ciggJGNvbnRlbnRzLCAkZmlyc3RfbmV3bGluZSApOyAvLyBDdXQgb3V0IHVwIHRvIHRoZSBmaXJzdCBuZXdsaW5lIChqdXN0IGFmdGVyKS4KCQkKCQkvLyBXcml0ZSBuZXcgZmlsZSBjb250ZW50cyBvdmVyIGV4aXN0aW5nIGZpbGUgZGF0YS4KCQlmdHJ1bmNhdGUoICRmaCwgMCApOyAvLyBFcmFzZSBjdXJyZW50IGNvbnRlbnRzLgoJCWZzZWVrKCAkZmgsIDAgKTsKCQlmd3JpdGUoICRmaCwgJGNvbnRlbnRzICk7CgkJCgkJLy8gQ2xlYW51cC4KCQlmY2xvc2UoJGZoKTsKCX0gLy8gRW5kIHRydW5jYXRlX2ZpbGVfYmVnaW5uaW5nKCkuCgkKCQoJCgkvLyBBdHRyaWJ1dGlvbjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yOTYxNjE4L2hvdy10by1yZWFkLW9ubHktNS1sYXN0LWxpbmUtb2YtdGhlLXRleHQtZmlsZS1pbi1waHAKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhZF9iYWNrd2FyZF9saW5lKCRmaWxlbmFtZSwgJGxpbmVzLCAkcmV2ZXJzID0gZmFsc2UpIHsKCQkkb2Zmc2V0ID0gLTE7CgkJJGMgPSAnJzsKCQkkcmVhZCA9ICcnOwoJCSRpID0gMDsKCQkkZnAgPSBAZm9wZW4oJGZpbGVuYW1lLCAiciIpOwoJCXdoaWxlKCAkbGluZXMgJiYgZnNlZWsoJGZwLCAkb2Zmc2V0LCBTRUVLX0VORCkgPj0gMCApIHsKCQkgICAgJGMgPSBmZ2V0YygkZnApOwoJCSAgICBpZigkYyA9PSAiXG4iIHx8ICRjID09ICJcciIpewoJCSAgICAgICAgJGxpbmVzLS07CgkJICAgICAgICBpZiggJHJldmVycyApewoJCSAgICAgICAgICAgICRyZWFkWyRpXSA9IHN0cnJldigkcmVhZFskaV0pOwoJCSAgICAgICAgICAgICRpKys7CgkJICAgICAgICB9CgkJICAgIH0KCQkgICAgaWYoICRyZXZlcnMgKSAkcmVhZFskaV0gLj0gJGM7CgkJICAgIGVsc2UgJHJlYWQgLj0gJGM7CgkJICAgICRvZmZzZXQtLTsKCQl9CgkJZmNsb3NlICgkZnApOwoJCWlmKCAkcmV2ZXJzICl7CgkJICAgIGlmKCRyZWFkWyRpXSA9PSAiXG4iIHx8ICRyZWFkWyRpXSA9PSAiXHIiKQoJCSAgICAgICAgYXJyYXlfcG9wKCRyZWFkKTsKCQkgICAgZWxzZSAkcmVhZFskaV0gPSBzdHJyZXYoJHJlYWRbJGldKTsKCQkgICAgcmV0dXJuIGltcGxvZGUoJycsJHJlYWQpOwoJCX0KCQlyZXR1cm4gc3RycmV2KHJ0cmltKCRyZWFkLCJcblxyIikpOwoJfQoJCgkKCS8vIE9MRCBmdW5jdGlvbi4gTW9yZSBwcmVjaXNlIGJ1dCBTTE9XLi4uCgkvKiB0cnVuY2F0ZV9maWxlX2JlZ2lubmluZygpCgkgKgoJICogVHJ1bmNhdGVzIGEgZmlsZSBmcm9tIHRoZSBCRUdJTk5JTkcuIEVnIGZvciB0cmltbWluZyBsb2dzIHdoaWxlIGxlYXZpbmcgdGhlIG1vc3QgcmVjZW50IChhdCB0aGUgYm90dG9tKSBjb250ZW50LgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cnVuY2F0ZV9maWxlX2JlZ2lubmluZ19zbG93KCRmaWxlbmFtZSwkbWF4ZmlsZXNpemUsJGtlZXBQZXJjZW50ID0gNTAgKXsKCQkkc2l6ZT1maWxlc2l6ZSgkZmlsZW5hbWUpOwoJCWlmICgkc2l6ZTwkbWF4ZmlsZXNpemUpIHJldHVybjsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUcnVuY2F0aW5nIExBUkdFIGZpbGUgYCcgLiAkZmlsZW5hbWUgLiAnYCBvZiBzaXplIGAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHNpemUgKSAuICdgIGV4Y2VlZGluZyB0aHJlc2hvbGQsIG9ubHkga2VlcGluZyBuZXdlc3QgJyAuICRrZWVwUGVyY2VudCAuICclLicgKTsKCQkKCQkkbWF4ZmlsZXNpemU9JG1heGZpbGVzaXplKiAoICRrZWVwUGVyY2VudCAvIDEwMCApOyAvLyBrZWVwIG5ld2VzdCBwYXJ0IHVwIHRvIGNldGFpbiBwZXJjZW50LgoJCSRmaD1mb3BlbigkZmlsZW5hbWUsInIrIik7CgkJJHN0YXJ0PWZ0ZWxsKCRmaCk7CgkJZnNlZWsoJGZoLC0kbWF4ZmlsZXNpemUsU0VFS19FTkQpOyRkcm9wPWZnZXRzKCRmaCk7CgkJJG9mZnNldD1mdGVsbCgkZmgpOwoJCWZvciAoJHg9MDskeDwkbWF4ZmlsZXNpemU7JHgrKyl7CgkJCWZzZWVrKCRmaCwkeCskb2Zmc2V0KTsKCQkJJGM9ZmdldGMoJGZoKTsKCQkJZnNlZWsoJGZoLCR4KTsKCQkJZndyaXRlKCRmaCwkYyk7CgkJfQoJCWZ0cnVuY2F0ZSgkZmgsJG1heGZpbGVzaXplLXN0cmxlbigkZHJvcCkpOwoJCWZjbG9zZSgkZmgpOwoJfSAvLyBFbmQgdHJ1bmNhdGVfZmlsZV9iZWdpbm5pbmcoKS4KCQoJCgkKCS8qIHBocF9ydW50aW1lX3Rlc3QoKQoJICoKCSAqIEF0dGVtcHRzIHRvIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIG1heGltdW0gUEhQIGV4ZWN1dGlvbiB0aW1lIGJ5IHdyaXRpbmcgdG8gYSB0ZXh0IGZpbGUgb25jZSBwZXIgc2Vjb25kIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgcGJfYmFja3VwYnVkZHkgY2xhc3MgbG9hZGVkLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwaHBfcnVudGltZV90ZXN0KCAkc2NoZWR1bGVfcmVzdWx0cyA9IGZhbHNlLCAkZm9yY2VfcnVuID0gZmFsc2UgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQmVnaW5uaW5nIFBIUCBydW50aW1lIHRlc3QgZnVuY3Rpb24uJyApOwoJCSR0ZXN0X2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdwaHBfcnVudGltZV90ZXN0LnR4dCc7IAoJCQoJCS8vIE1ha2Ugc3VyZSBub3QgcnVubmluZyB0b28gb2Z0ZW4sIGV2ZW4gaWYgc2NoZWR1bGVkLgoJCWlmICggZmFsc2UgPT09ICRmb3JjZV9ydW4gKSB7CgkJCSRlbGFwc2VkID0gdGltZSgpIC0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfcnVudGltZSddOwoJCQlpZiAoICRlbGFwc2VkIDwgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfcnVudGltZV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSApIHsgLy8gTm90IGVub3VnaCB0aW1lIGVsYXBzZWQgc2luY2UgbGFzdCBydW4uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOb3QgZW5vdWdoIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IFBIUCBydW50aW1lIHRlc3QgaW50ZXJ2YWwuIEVsYXBzZWQ6IGAnIC4gJGVsYXBzZWQgLiAnYC4gSW50ZXJ2YWwgbGltaXQ6IGAnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfcnVudGltZV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSAuICdgLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkKCQkvLyBJZiB0ZXN0IGZpbGUgYWxyZWFkeSBleGlzdHMsIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhIHRlc3QgaXMgYWxyZWFkeSBydW5uaW5nLgoJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJaWYgKCBmYWxzZSAhPT0gKCAkbGFzdF91cGRhdGVfdGltZSA9IGZpbGVtdGltZSggJHRlc3RfZmlsZSApICkgKSB7IC8vIGlmIHdlIGNhbiBnZXQgZmlsZW10aW1lLi4uCgkJCQlpZiAoICggdGltZSgpIC0gJGxhc3RfdXBkYXRlX3RpbWUgKSA8IGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6UEhQX1JVTlRJTUVfUkVURVNUX0RFTEFZICkgeyAvLyBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSBsYXN0IHNjYW4gbGFzdCB1cGRhdGVkIGZpbGUgc28gaXQgTUFZIHN0aWxsIGJlIGdvaW5nLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUCBydW50aW1lIHRlc3Q6IE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IHRlc3QgdXBkYXRlZCB0aGUgZmlsZS4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoJCQoJCS8vIE9wZW4gdGVzdCBmaWxlIGZvciB3cml0aW5nLgoJCWlmICggZmFsc2UgPT09ICggJGZzbyA9IEBmb3BlbiggJHRlc3RfZmlsZSwgJ3cnICkgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBTY2hlZHVsZSByZXN1bHRzIGNhbGN1bGF0aW9uIHRvIGhhcHBlbiBhZnRlcndhcmRzIGlmIGVuYWJsZWQuCgkJaWYgKCB0cnVlID09PSAkc2NoZWR1bGVfcmVzdWx0cyApIHsKCQkJLy8gU2NoZWR1bGUgdGVzdCByZXN1bHRzIGNhbGN1bGF0aW9uIHRvIHJ1bi4KCQkJJGNyb25BcmdzID0gYXJyYXkoKTsKCQkJJHNjaGVkdWxlX3Jlc3VsdCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OnNjaGVkdWxlX3NpbmdsZV9ldmVudCggdGltZSgpICsgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpQSFBfUlVOVElNRV9URVNUX01BWF9USU1FICsgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpQSFBfUlVOVElNRV9SRVRFU1RfREVMQVkgKyA1LCAncGhwX3J1bnRpbWVfdGVzdF9yZXN1bHRzJywgJGNyb25BcmdzICk7CgkJCWlmICggdHJ1ZSA9PT0gJHNjaGVkdWxlX3Jlc3VsdCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUCBydW50aW1lIHRlc3QgcmVzdWx0cyBjcm9uIGV2ZW50IHNjaGVkdWxlZC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnUEhQIHJ1bnRpbWUgdGVzdCByZXN1bHRzIGNyb24gZXZlbnQgRkFJTEVEIHRvIGJlIHNjaGVkdWxlZC4nICk7CgkJCX0KCQl9CgkJCgkJLy8gT25jZSBwZXIgc2Vjb25kIHdyaXRlIHRvIHRoZSBmaWxlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHRoZSB0ZXN0IGJlZ2FuLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0IFBIUCBydW50aW1lIHRlc3QgbG9vcHMuJyApOwoJCSRsb29wX2NvdW50ID0gMDsgCgkJJGxvb3BzX3Blcl9zZWNvbmQgPSBmYWxzZTsKCQkkdG90YWxfbG9vcHMgPSBiYWNrdXBidWRkeV9jb25zdGFudHM6OlBIUF9SVU5USU1FX1RFU1RfTUFYX1RJTUU7IC8vIFtkZWZhdWx0OiAzMDAgKHNlYykgPSA1bWluXQoJCQoJCS8vIFN0b3JlIGN1cnJlbnQgZXJyb3IgcmVwb3J0aW5nIGxldmVsIGFuZCB0ZW1wIHNldCB0byAwCgkJJHJlcG9ydGluZ19sZXZlbCA9IGVycm9yX3JlcG9ydGluZygpOwoJCWVycm9yX3JlcG9ydGluZyggMCApOwoJCQoJCXdoaWxlKCAkbG9vcF9jb3VudCA8PSAkdG90YWxfbG9vcHMgKSB7CgkJCSRsb29wX2NvdW50Kys7CgkJCUBmdHJ1bmNhdGUoICRmc28sIDAgKTsgLy8gRXJhc2UgZXhpc3RpbmcgZmlsZSBjb250ZW50cy4KCQkJJHRpbWVfZWxhcHNlZCA9IHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSwgMiApOyAKCQkJaWYgKCBmYWxzZSA9PT0gQGZ3cml0ZSggJGZzbywgJHRpbWVfZWxhcHNlZCApICkgeyAvLyBVcGRhdGUgdGltZSBlbGFwc2VkIGludG8gZmlsZS4KCQkJCSR0b3RhbF9sb29wcyA9IDA7IAoJCQkJLy8gUmVzZXQgb3JpZ2luYWwgZXJyb3JfcmVwb3J0aW5nIGxldmVsIGJlZm9yZSBleGl0aW5nLgoJCQkJZXJyb3JfcmVwb3J0aW5nKCAkcmVwb3J0aW5nX2xldmVsICk7CgkJCQlicmVhazsgLy8gU3RvcCBzaW5jZSB3cml0aW5nIGZhaWxlZC4KCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJGxvb3BzX3Blcl9zZWNvbmQgKSB7CgkJCQkkc3RhcnQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkJCSRjb3VudGVyID0gMDsgCgkJCQkKCQkJCXdoaWxlICggJGNvdW50ZXIrKyA8IDEwMDAwMCApIHt9IAoJCQkJCgkJCQkkdGltZSA9IG1pY3JvdGltZSggdHJ1ZSApIC0gJHN0YXJ0OwoJCQkJJGxvb3BzX3Blcl9zZWNvbmQgPSAkY291bnRlciAvICR0aW1lOwoJCQkJCgkJCQlpZiAoICR0aW1lID49IDEgKSB7CgkJCQkJJGxvb3BfY291bnQgKz0gZmxvb3IoICR0aW1lICk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIFdhc3RlIHRoZSByZW1haW5pbmcgcG9ydGlvbiBvZiBhIHNlY29uZAoJCQkJCXdoaWxlICggJGNvdW50ZXIrKyA8ICRsb29wc19wZXJfc2Vjb25kICkge30gCgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkY291bnRlciA9IDA7IAoJCQkJLy8gV2FzdGUgYXBwcm94aW1hdGVseSAxIHNlY29uZAoJCQkJd2hpbGUgKCAkY291bnRlcisrIDwgJGxvb3BzX3Blcl9zZWNvbmQgKSB7fSAKCQkJfQoJCX0gLy8gZW5kIHdoaWxlLgoJCQoJCS8vIFNldCBlcnJvciByZXBvcnRpbmcgYmFjayB0byBvcmlnaW5hbCBsZXZlbCwgYWx0aG91Z2ggdGhlIHNjcmlwdCBpcyBwcm9iYWJseSBkZWFkIGF0IHRoaXMgcG9pbnQuCgkJZXJyb3JfcmVwb3J0aW5nKCAkcmVwb3J0aW5nX2xldmVsICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRW5kIFBIUCBydW50aW1lIHRlc3QgbG9vcHMuJyApOwoJCQoJCUBmY2xvc2UoICRmc28gKTsKCQkKCX0gLy8gRW5kIHBocF9ydW50aW1lX3Rlc3QoKS4KCQoJCgkKCS8qIHBocF9tZW1vcnlfdGVzdCgpCgkgKgoJICogQXR0ZW1wdHMgdG8gY2FsY3VsYXRlIHRoZSBhY3R1YWwgbWF4aW11bSBQSFAgbWVtb3J5IGxpbWl0IGJ5IHdyaXRpbmcgdG8gYSB0ZXh0IGZpbGUgd2hpbGUgaW5jcmVhc2luZyBtZW1vcnkgdXNhZ2UuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBocF9tZW1vcnlfdGVzdCggJHNjaGVkdWxlX3Jlc3VsdHMgPSBmYWxzZSwgJGZvcmNlX3J1biA9IGZhbHNlICkgewoJCSRpbmNyZW1lbnRNQiA9IDE7IC8vIEhvdyBtYW55IE1CIHRvIGluY3JlbWVudCBwZXIgY2h1bmsuCgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQmVnaW5uaW5nIFBIUCBtZW1vcnkgdGVzdCBmdW5jdGlvbi4nICk7CgkJJHRlc3RfZmlsZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ3BocF9tZW1vcnlfdGVzdC50eHQnOyAKCQkKCQkvLyBNYWtlIHN1cmUgbm90IHJ1bm5pbmcgdG9vIG9mdGVuLCBldmVuIGlmIHNjaGVkdWxlZC4KCQlpZiAoIGZhbHNlID09PSAkZm9yY2VfcnVuICkgewoJCQkkZWxhcHNlZCA9IHRpbWUoKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbGFzdF90ZXN0ZWRfcGhwX21lbW9yeSddOwoJCQlpZiAoICRlbGFwc2VkIDwgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfbWVtb3J5X3Rlc3RfbWluaW11bV9pbnRlcnZhbCddICkgeyAvLyBOb3QgZW5vdWdoIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IHJ1bi4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vdCBlbm91Z2ggdGltZSBlbGFwc2VkIHNpbmNlIGxhc3QgUEhQIG1lbW9yeSB0ZXN0IGludGVydmFsLiBFbGFwc2VkOiBgJyAuICRlbGFwc2VkIC4gJ2AuIEludGVydmFsIGxpbWl0OiBgJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwX21lbW9yeV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSAuICdgLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkKCQkvLyBJZiB0ZXN0IGZpbGUgYWxyZWFkeSBleGlzdHMsIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhIHRlc3QgaXMgYWxyZWFkeSBydW5uaW5nLgoJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJaWYgKCBmYWxzZSAhPT0gKCAkbGFzdF91cGRhdGVfdGltZSA9IGZpbGVtdGltZSggJHRlc3RfZmlsZSApICkgKSB7IC8vIGlmIHdlIGNhbiBnZXQgZmlsZW10aW1lLi4uCgkJCQlpZiAoICggdGltZSgpIC0gJGxhc3RfdXBkYXRlX3RpbWUgKSA8IGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6UEhQX01FTU9SWV9SRVRFU1RfREVMQVkgKSB7IC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIGxhc3Qgc2NhbiBsYXN0IHVwZGF0ZWQgZmlsZSBzbyBpdCBNQVkgc3RpbGwgYmUgZ29pbmcuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUEhQIG1lbW9yeSB0ZXN0OiBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB0ZXN0IHVwZGF0ZWQgdGhlIGZpbGUuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkvLyBPcGVuIHRlc3QgZmlsZSBmb3Igd3JpdGluZy4KCQlpZiAoIGZhbHNlID09PSAoICRmc28gPSBAZm9wZW4oICR0ZXN0X2ZpbGUsICd3JyApICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gU2NoZWR1bGUgcmVzdWx0cyBjYWxjdWxhdGlvbiB0byBoYXBwZW4gYWZ0ZXJ3YXJkcyBpZiBlbmFibGVkLgoJCWlmICggdHJ1ZSA9PT0gJHNjaGVkdWxlX3Jlc3VsdHMgKSB7CgkJCS8vIFNjaGVkdWxlIHRlc3QgcmVzdWx0cyBjYWxjdWxhdGlvbiB0byBydW4uCgkJCSRjcm9uQXJncyA9IGFycmF5KCk7CgkJCSRzY2hlZHVsZV9yZXN1bHQgPSBiYWNrdXBidWRkeV9jb3JlOjpzY2hlZHVsZV9zaW5nbGVfZXZlbnQoIHRpbWUoKSArIGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6UEhQX01FTU9SWV9SRVRFU1RfREVMQVkgKyA1LCAncGhwX21lbW9yeV90ZXN0X3Jlc3VsdHMnLCAkY3JvbkFyZ3MgKTsKCQkJaWYgKCB0cnVlID09PSAkc2NoZWR1bGVfcmVzdWx0ICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUEhQIG1lbW9yeSB0ZXN0IHJlc3VsdHMgY3JvbiBldmVudCBzY2hlZHVsZWQuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1BIUCBtZW1vcnkgdGVzdCByZXN1bHRzIGNyb24gZXZlbnQgRkFJTEVEIHRvIGJlIHNjaGVkdWxlZC4nICk7CgkJCX0KCQl9CgkJCgkJLy8gU3RvcmUgY3VycmVudCBlcnJvciByZXBvcnRpbmcgbGV2ZWwgYW5kIHRlbXAgc2V0IHRvIDAKCQkkcmVwb3J0aW5nX2xldmVsID0gZXJyb3JfcmVwb3J0aW5nKCk7CgkJZXJyb3JfcmVwb3J0aW5nKCAwICk7CgkJCgkJLy8gT25jZSBwZXIgc2Vjb25kIHdyaXRlIHRvIHRoZSBmaWxlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHRoZSB0ZXN0IGJlZ2FuLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0IFBIUCBtZW1vcnkgdGVzdCBsb29wcy4nICk7CgkJJGxvb3BDb3VudCA9IDA7CgkJJGJ1ZmZlciA9ICcnOwoJCSRsb29wID0gdHJ1ZTsKCQl3aGlsZSggdHJ1ZSA9PT0gJGxvb3AgKSB7CgkJCSRsb29wQ291bnQrKzsKCQkJaWYgKCAkbG9vcENvdW50ID4gMTAwMCApIHsKCQkJCSRsb29wID0gZmFsc2U7CgkJCQllcnJvcl9yZXBvcnRpbmcoICRyZXBvcnRpbmdfbGV2ZWwgKTsgLy8gU2V0IGVycm9yIHJlcG9ydGluZyBiYWNrIHRvIG9yaWdpbmFsIGxldmVsLCBhbHRob3VnaCB0aGUgc2NyaXB0IGlzIHByb2JhYmx5IGRlYWQgYXQgdGhpcyBwb2ludC4KCQkJCWJyZWFrOwoJCQl9CgkJCQoJCQkvLyRidWZmZXIgLj0gc3RyX3JlcGVhdCggJy0nLCAxMDQ4NTc2ICogJGluY3JlbWVudE1CICk7CgkJCSR7ICdtZW1fc3RyXycgLiAkbG9vcENvdW50fSA9IHN0cl9wYWQoICcnLCAxMDQ4NTc2ICogJGluY3JlbWVudE1CICk7CgkJCQoJCQkvLyR1c2FnZSA9IHJvdW5kKCBtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDQ4NTc2LCAyICk7CgkJCSR1c2FnZSA9IHJvdW5kKCBtZW1vcnlfZ2V0X3VzYWdlKCB0cnVlICkgLyAxMDQ4NTc2LCAyICk7CgkJCQoJCQlAZnRydW5jYXRlKCAkZnNvLCAwICk7IC8vIEVyYXNlIGV4aXN0aW5nIGZpbGUgY29udGVudHMuCgkJCWlmICggZmFsc2UgPT09IEBmd3JpdGUoICRmc28sICR1c2FnZSApICkgeyAvLyBVcGRhdGUgdGltZSBlbGFwc2VkIGludG8gZmlsZS4KCQkJCSRsb29wID0gZmFsc2U7CgkJCQllcnJvcl9yZXBvcnRpbmcoICRyZXBvcnRpbmdfbGV2ZWwgKTsgLy8gU2V0IGVycm9yIHJlcG9ydGluZyBiYWNrIHRvIG9yaWdpbmFsIGxldmVsLCBhbHRob3VnaCB0aGUgc2NyaXB0IGlzIHByb2JhYmx5IGRlYWQgYXQgdGhpcyBwb2ludC4KCQkJCWJyZWFrOyAvLyBTdG9wIHNpbmNlIHdyaXRpbmcgZmFpbGVkLgoJCQl9CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0VuZCBQSFAgbWVtb3J5IHRlc3QgbG9vcHMuJyApOwoJCQoJCSRidWZmZXIgPSAnJzsKCQlAZmNsb3NlKCAkZnNvICk7CgkJZXJyb3JfcmVwb3J0aW5nKCAkcmVwb3J0aW5nX2xldmVsICk7IC8vIFNldCBlcnJvciByZXBvcnRpbmcgYmFjayB0byBvcmlnaW5hbCBsZXZlbCwgYWx0aG91Z2ggdGhlIHNjcmlwdCBpcyBwcm9iYWJseSBkZWFkIGF0IHRoaXMgcG9pbnQuCgkJCgl9IC8vIEVuZCBwaHBfbWVtb3J5X3Rlc3QoKS4KCQoJCgkKCS8qIHBocF9ydW50aW1lX3Rlc3RfcmVzdWx0cygpCgkgKgoJICogU3RvcmVzIHRlc3RlZCBydW50aW1lIGluIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10sIHJvdW5kZWQgdXAgdG8gbmV4dCB3aG9sZSBudW1iZXIuIE5vdGU6IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gaXMgMCB1bnRpbCB0ZXN0IGlzIHN1Y2Nlc3NmdWwuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBocF9ydW50aW1lX3Rlc3RfcmVzdWx0cygpIHsKCQkkdGVzdF9maWxlID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAncGhwX3J1bnRpbWVfdGVzdC50eHQnOyAKCQkKCQkvLyBJZiB0ZXN0IGZpbGUgYWxyZWFkeSBleGlzdHMsIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhIHRlc3QgaXMgYWxyZWFkeSBydW5uaW5nLgoJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJJGxhc3RfdXBkYXRlX3RpbWUgPSBmaWxlbXRpbWUoICR0ZXN0X2ZpbGUgKTsKCQkJaWYgKCAoIHRpbWUoKSAtICRsYXN0X3VwZGF0ZV90aW1lICkgPCBiYWNrdXBidWRkeV9jb25zdGFudHM6OlBIUF9SVU5USU1FX1JFVEVTVF9ERUxBWSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUCBydW50aW1lIHRlc3QgcmVzdWx0czogTm90IGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdGVzdCB1cGRhdGVkIHRoZSBmaWxlLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gZWxzZSB7IC8vIEZpbGUgZG9lcyBub3QgZXhpc3QuCgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gUmVhZCBmaWxlIGNvbnRlbnRzLgoJCWlmICggZmFsc2UgPT09ICggJHRlc3RlZF9ydW50aW1lID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCAkdGVzdF9maWxlICkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4MjkzNDg5NDogVW5hYmxlIHRvIHJlYWQgcGhwIHJ1bnRpbWUgdGVzdCByZXN1bHRzIGZpbGUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIFNhbml0aXplLgoJCSR0ZXN0ZWRfcnVudGltZSA9IHRyaW0oICR0ZXN0ZWRfcnVudGltZSApOwoJCQoJCS8vIFZlcmlmeSBub3QgYmxhbmsuCgkJaWYgKCAnJyA9PSAkdGVzdGVkX3J1bnRpbWUgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05PVEU6IFBIUCBydW50aW1lIHRlc3QgYmxhbmsuIEl0IG1heSBiZSBpbiBwcm9ncmVzcy4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gVmVyaWZ5IG51bWVyaWMuCgkJaWYgKCAhIGlzX251bWVyaWMoICR0ZXN0ZWRfcnVudGltZSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyODQ5MzQ3MzQ6IFBIUCBydW50aW1lIHRlc3QgcmVzdWx0cyBub24tbnVtZXJpYy4gVHJpbW1lZCByZXN1bHQ6IGAnIC4gJHRlc3RlZF9ydW50aW1lIC4gJ2AuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gPSBjZWlsKCAkdGVzdGVkX3J1bnRpbWUgKTsgLy8gUm91bmQgdXAuCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfcnVudGltZSddID0gdGltZSgpOyAvLyBUaW1lc3RhbXAgdGVzdCByZXN1bHRzIHdlcmUgbGFzdCBzYXZlZC4KCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQoJCUB1bmxpbmsoICR0ZXN0X2ZpbGUgKTsgLy8gRGVsZXRlIHRlc3QgZmlsZSBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgoJCQoJCXJldHVybiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddOwoJCQoJfSAvLyBFbmQgcGhwX3J1bnRpbWVfdGVzdF9yZXN1bHRzKCkuCgkKCQoJCgkvKiBwaHBfbWVtb3J5X3Rlc3RfcmVzdWx0cygpCgkgKgoJICogU3RvcmVzIHRlc3RlZCBtZW1vcnkgaW4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddLCByb3VuZGVkIHVwIHRvIG5leHQgd2hvbGUgbnVtYmVyLiBOb3RlOiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfbWVtb3J5J10gaXMgMCB1bnRpbCB0ZXN0IGlzIHN1Y2Nlc3NmdWwuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBocF9tZW1vcnlfdGVzdF9yZXN1bHRzKCkgewoJCSR0ZXN0X2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdwaHBfbWVtb3J5X3Rlc3QudHh0JzsgCgkJCgkJLy8gSWYgdGVzdCBmaWxlIGFscmVhZHkgZXhpc3RzLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBsb29rIGxpa2UgYSB0ZXN0IGlzIGFscmVhZHkgcnVubmluZy4KCQlpZiAoIGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCSRsYXN0X3VwZGF0ZV90aW1lID0gZmlsZW10aW1lKCAkdGVzdF9maWxlICk7CgkJCWlmICggKCB0aW1lKCkgLSAkbGFzdF91cGRhdGVfdGltZSApIDwgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpQSFBfTUVNT1JZX1JFVEVTVF9ERUxBWSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUCBtZW1vcnkgdGVzdCByZXN1bHRzOiBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB0ZXN0IHVwZGF0ZWQgdGhlIGZpbGUuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsgLy8gRmlsZSBkb2VzIG5vdCBleGlzdC4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBSZWFkIGZpbGUgY29udGVudHMuCgkJaWYgKCBmYWxzZSA9PT0gKCAkdGVzdGVkX21lbW9yeSA9IEBmaWxlX2dldF9jb250ZW50cyggJHRlc3RfZmlsZSApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNjYzNjQ6IFVuYWJsZSB0byByZWFkIHBocCBtZW1vcnkgdGVzdCByZXN1bHRzIGZpbGUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIFNhbml0aXplLgoJCSR0ZXN0ZWRfbWVtb3J5ID0gdHJpbSggJHRlc3RlZF9tZW1vcnkgKTsKCQkKCQkvLyBWZXJpZnkgbm90IGJsYW5rLgoJCWlmICggJycgPT0gJHRlc3RlZF9tZW1vcnkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05PVEU6IFBIUCBtZW1vcnkgdGVzdCBibGFuay4gSXQgbWF5IGJlIGluIHByb2dyZXNzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBWZXJpZnkgbnVtZXJpYy4KCQlpZiAoICEgaXNfbnVtZXJpYyggJHRlc3RlZF9tZW1vcnkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM3Njg0MzU0OTkwOiBQSFAgbWVtb3J5IHRlc3QgcmVzdWx0cyBub24tbnVtZXJpYy4gVHJpbW1lZCByZXN1bHQ6IGAnIC4gJHRlc3RlZF9tZW1vcnkgLiAnYC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddID0gY2VpbCggJHRlc3RlZF9tZW1vcnkgKTsgLy8gUm91bmQgdXAuCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfbWVtb3J5J10gPSB0aW1lKCk7IC8vIFRpbWVzdGFtcCB0ZXN0IHJlc3VsdHMgd2VyZSBsYXN0IHNhdmVkLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJCgkJQHVubGluayggJHRlc3RfZmlsZSApOyAvLyBEZWxldGUgdGVzdCBmaWxlIGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCgkJCgkJcmV0dXJuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9tZW1vcnknXTsKCQkKCX0gLy8gRW5kIHBocF9tZW1vcnlfdGVzdF9yZXN1bHRzKCkuCgkKCQoJCgkvLyBBdHRyaWI6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTkwNDIxL2NhbGxlci1mdW5jdGlvbi1pbi1waHAtNS8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q2FsbGluZ0Z1bmN0aW9uTmFtZSgkY29tcGxldGVUcmFjZT1mYWxzZSkgewogICAgICAgICR0cmFjZT1kZWJ1Z19iYWNrdHJhY2UoKTsKICAgICAgICBpZigkY29tcGxldGVUcmFjZSkKICAgICAgICB7CiAgICAgICAgICAgICRzdHIgPSAnJzsKICAgICAgICAgICAgZm9yZWFjaCgkdHJhY2UgYXMgJGNhbGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHN0ciAuPSAieyRjYWxsZXJbJ2Z1bmN0aW9uJ119KCkiOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRjYWxsZXJbJ2NsYXNzJ10pKQogICAgICAgICAgICAgICAgICAgICRzdHIgPSAieyRjYWxsZXJbJ2NsYXNzJ119eyRjYWxsZXJbJ3R5cGUnXX0iIC4gJHN0cjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkY2FsbGVyPSR0cmFjZVsyXTsKICAgICAgICAgICAgJHN0ciA9ICJ7JGNhbGxlclsnZnVuY3Rpb24nXX0oKSI7CiAgICAgICAgICAgIGlmIChpc3NldCgkY2FsbGVyWydjbGFzcyddKSkKICAgICAgICAgICAgICAgICRzdHIgPSAieyRjYWxsZXJbJ2NsYXNzJ119eyRjYWxsZXJbJ3R5cGUnXX0iIC4gJHN0cjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzdHI7CiAgICB9CgoJCgkKfSAvLyBFbmQgY2xhc3MgYmFja3VwYnVkZHlfY29yZS4K ###PACKDATA,FILE_END,/classes/core.php,importbuddy/classes/core.php ###PACKDATA,FILE_START,/classes/import.php,importbuddy/classes/import.php PD9waHAKY2xhc3MgcGJfYmFja3VwYnVkZHlfaW1wb3J0IHsKCQoJCgkKCQoJCgkKCQoJLyoqCgkgKgl3aXBlUHJlZml4KCkKCSAqCgkgKglDbGVhciBvdXQgdGFibGVzIG1hdGNoaW5nIHN1cHBsaWVkIHByZWZpeC4KCSAqCgkgKglAcmV0dXJuCQkJYm9vbGVhbgkJQ3VycmVudGx5IGFsd2F5cyB0cnVlLgoJICovCglmdW5jdGlvbiB3aXBlUHJlZml4KCAkcHJlZml4LCAkY29uZmlybSA9IGZhbHNlICkgewoJCWlmICggJGNvbmZpcm0gIT09IHRydWUgKSB7CgkJCWRpZSggJ0Vycm9yICM1NDY2NTY2YjogUGFyYW1ldGVyIDIgdG8gd2lwZVByZWZpeCgpIG11c3QgYmUgYm9vbGVhbiB0cnVlIHRvIHByb2NlZWQuJyApOwoJCX0KCQkKCQlpZiAoICRwcmVmaXggPT0gJycgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ05vIGRhdGFiYXNlIHByZWZpeCBzcGVjaWZpZWQgdG8gd2lwZS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQmVnaW5uaW5nIHdpcGUgb2YgZGF0YWJhc2UgdGFibGVzIG1hdGNoaW5nIHByZWZpeCBgJyAuICRwcmVmaXggLiAnYC4uLicgKTsKCQkKCQkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJCS8vJHRoaXMtPmNvbm5lY3RfZGF0YWJhc2UoKTsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoIHN0cl9yZXBsYWNlKCAnXycsICdcXycsICRwcmVmaXggKSApIC4gIiUnIEFORCB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIiwgQVJSQVlfQSApOwoJCSR0YWJsZV93aXBlX2NvdW50ID0gY291bnQoICRyb3dzICk7CgkJZm9yZWFjaCggJHJvd3MgYXMgJHJvdyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBpbmcgdGFibGUgYCcgLiAkcm93Wyd0YWJsZV9uYW1lJ10gLiAnYC4nICk7CgkJCSR3cGRiLT5xdWVyeSggJ0RST1AgVEFCTEUgYCcgLiAkcm93Wyd0YWJsZV9uYW1lJ10gLiAnYCcgKTsKCQl9CgkJdW5zZXQoICRyb3dzICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV2lwZWQgZGF0YWJhc2Ugb2YgJyAuICR0YWJsZV93aXBlX2NvdW50IC4gJyB0YWJsZXMuJyApOwoJCQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgd2lwZVByZWZpeCgpLgoJCgkKCQoJLyoqCgkgKgl3aXBlRGF0YWJhc2UoKQoJICoKCSAqCUNsZWFyIG91dCB0aGUgZXhpc3RpbmcgZGF0YWJhc2UgdG8gcHJlcGFyZSBmb3IgaW1wb3J0aW5nIG5ldyBkYXRhLgoJICoKCSAqCUByZXR1cm4JCQlib29sZWFuCQlDdXJyZW50bHkgYWx3YXlzIHRydWUuCgkgKi8KCWZ1bmN0aW9uIHdpcGVEYXRhYmFzZSggJGNvbmZpcm0gPSBmYWxzZSApIHsKCQlpZiAoICRjb25maXJtICE9PSB0cnVlICkgewoJCQlkaWUoICdFcnJvciAjNTQ2NjU2NmE6IFBhcmFtZXRlciAxIHRvIHdpcGVEZGF0YWJhc2UoKSBtdXN0IGJlIGJvb2xlYW4gdHJ1ZSB0byBwcm9jZWVkLicgKTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQmVnaW5uaW5nIHdpcGUgb2YgQUxMIGRhdGFiYXNlIHRhYmxlcy4uLicgKTsKCQkKCQkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJCS8vJHRoaXMtPmNvbm5lY3RfZGF0YWJhc2UoKTsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSIsIEFSUkFZX0EgKTsKCQkkdGFibGVfd2lwZV9jb3VudCA9IGNvdW50KCAkcm93cyApOwoJCWZvcmVhY2goICRyb3dzIGFzICRyb3cgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Ryb3BwaW5nIHRhYmxlIGAnIC4gJHJvd1sndGFibGVfbmFtZSddIC4gJ2AuJyApOwoJCQkkd3BkYi0+cXVlcnkoICdEUk9QIFRBQkxFIGAnIC4gJHJvd1sndGFibGVfbmFtZSddIC4gJ2AnICk7CgkJfQoJCXVuc2V0KCAkcm93cyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1dpcGVkIGRhdGFiYXNlIG9mICcgLiAkdGFibGVfd2lwZV9jb3VudCAuICcgdGFibGVzLicgKTsKCQkKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHdpcGVEYXRhYmFzZSgpLgoJCgkKCQoJLyoJcHJlZ19lc2NhcGVfYmFjaygpCgkgKgkKCSAqCUVzY2FwZSBiYWNrcmVmZXJlbmNlcyBmcm9tIHN0cmluZyBmb3IgdXNlIHdpdGggcmVnZXguIFVzZWQgYnkgbWlncmF0ZV93cF9jb25maWcoKS4KCSAqCUBzZWUgbWlncmF0ZV93cF9jb25maWcoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHN0cmluZwkJU3RyaW5nIHRvIGVzY2FwZS4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJRXNjYXBlZCBzdHJpbmcuCgkgKi8KCWZ1bmN0aW9uIHByZWdfZXNjYXBlX2JhY2soJHN0cmluZykgewoJCS8vIFJlcGxhY2UgJCB3aXRoIFwkIGFuZCBcIHdpdGggXFwKCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcjKD88IVxcXFwpKFxcJHxcXFxcKSMnLCAnXFxcXCQxJywgJHN0cmluZyk7CgkJcmV0dXJuICRzdHJpbmc7Cgl9IC8vIEVuZCBwcmVnX2VzY2FwZV9iYWNrKCkuCgkKCQoJCgkKCQoJCgkKCS8vIFRPRE86IHN3aXRjaCB0byB1c2luZyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzX2JveCgpIGluc3RlYWQuCgkvKioKCSAqCXN0YXR1c19ib3goKQoJICoKCSAqCURpc3BsYXlzIGEgdGV4dGFyZWEgZm9yIHBsYWNpbmcgc3RhdHVzIHRleHQgaW50by4KCSAqCgkgKglAcGFyYW0JCQkkZGVmYXVsdF90ZXh0CXN0cmluZwkJRmlyc3QgbGluZSBvZiB0ZXh0IHRvIGRpc3BsYXkuCgkgKglAcGFyYW0JCQlib29sZWFuCQkJJGhpZGRlbgkJV2hldGhlciBvciBub3QgdG8gYXBwbHkgZGlzcGxheTogbm9uZTsgQ1NTLgoJICoJQHJldHVybgkJCQkJCQlzdHJpbmcJCUhUTUwgZm9yIHRleHRhcmVhLgoJICovCglmdW5jdGlvbiBzdGF0dXNfYm94KCAkZGVmYXVsdF90ZXh0ID0gJycsICRoaWRkZW4gPSBmYWxzZSApIHsKCQlkZWZpbmUoICdQQl9TVEFUVVMnLCB0cnVlICk7IC8vIFRlbGxzIGZyYW1ld29yayBzdGF0dXMoKSBmdW5jdGlvbiB0byBvdXRwdXQgZnV0dXJlIGxvZ2dpbmcgaW5mbyBpbnRvIHN0YXR1cyBib3ggdmlhIGphdmFzY3JpcHQuCgkJJHJldHVybiA9ICc8ZGl2IGlkPSJwYl9iYWNrdXBidWRkeV9zdGF0dXNfd3JhcCIgc3R5bGU9InBhZGRpbmc6IDA7Ij48cHJlIHJlYWRvbmx5PSJyZWFkb25seSIgaWQ9ImJhY2t1cGJ1ZGR5X21lc3NhZ2VzIiB3cmFwPSJvZmYiJzsKCQlpZiAoICRoaWRkZW4gPT09IHRydWUgKSB7CgkJCSRyZXR1cm4gLj0gJyBzdHlsZT0iZGlzcGxheTogbm9uZTsgIic7CgkJfQoJCSRyZXR1cm4gLj0gJz4nIC4gJGRlZmF1bHRfdGV4dCAuICc8L3ByZT4nOwoJCSRyZXR1cm4gLj0gJzxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPgoJCQk8YnV0dG9uIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkiIG9uQ2xpY2s9ImJhY2t1cGJ1ZGR5X3NhdmVMb2dBc0ZpbGUoKTsiIHN0eWxlPSJtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyBkaXNwbGF5OiBpbmhlcml0OyBmb250LXNpemU6IDAuOWVtOyI+RG93bmxvYWQgU3RhdHVzIExvZyAoLnR4dCk8L2J1dHRvbj4KCQk8L2Rpdj4nOwoJCSRyZXR1cm4gLj0gJzwvZGl2Pic7CgkJCgkJcmV0dXJuICRyZXR1cm47Cgl9CgkKCQoJCgkKCQoJCn0gLy8gRW5kIGNsYXNzLgo/Pgo= ###PACKDATA,FILE_END,/classes/import.php,importbuddy/classes/import.php ###PACKDATA,FILE_START,/classes/restore.php,importbuddy/classes/restore.php PD9waHAKLy8gRHVzdGluIEJvbHRvbiAyMDE0LgpjbGFzcyBiYWNrdXBidWRkeV9yZXN0b3JlIHsKCQoJCglwdWJsaWMgJF9zdGF0ZSA9IGFycmF5KCk7CQkvLyBIb2xkcyBjdXJyZW50IHN0YXRlIGRhdGEuIFJldHJpZXZlIHdpdGggZ2V0U3RhdGUoKSBhbmQgcGFzcyBvbnRvIG5leHQgcnVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KCXByaXZhdGUgJF9lcnJvcnMgPSBhcnJheSgpOwkJLy8gSG9sZCBlcnJvciBzdHJpbmdzIHRvIHJldHJpZXZlIHdpdGggZ2V0RXJyb3JzKCkuCglwcml2YXRlICRfZGJDb25uZWN0ZWQgPSBmYWxzZTsJLy8gVHJ1ZSBpZiBhbHJlYWR5IGNvbm5lY3RlZCB0aGlzIHNlc3Npb24uCgkKCQoJLyogX19jb25zdHJ1Y3QoKQoJICoKCSAqIFJPTExCQUNLLCBSRVNUT1JFCgkgKgoJICogQHBhcmFtCXN0cmluZwkkdHlwZQkJCVJlc3RvcmUgdHlwZTogcm9sbGJhY2sgKHJvbGwgYmFjayBmcm9tIGluc2lkZSBXb3JkUHJlc3MpLCByZXN0b3JlIChpbXBvcnRidWRkeSkKCSAqIEBwYXJhbQlhcnJheSAJJGV4aXN0aW5EYXRhCVN0YXRlIGRhdGEgZnJvbSBhIHByZXZpb3VzIGluc3RhbnRpYXRpb24uIFByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBnZXRTdGF0ZSgpLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkdHlwZSwgJGV4aXN0aW5nU3RhdGUgPSAnJyApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb25zdHJ1Y3Rpbmcgcm9sbGJhY2sgY2xhc3MuJyApOwoJCQoJCWlmICggKCAncm9sbGJhY2snICE9ICR0eXBlICkgJiYgKCAncmVzdG9yZScgIT0gJHR5cGUgKSApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0ludmFsaWQgcmVzdG9yZSB0eXBlIGAnIC4gaHRtbGVudGl0aWVzKCAkdHlwZSApIC4gJ2AuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKCBhcnJheSggJiR0aGlzLCAnc2h1dGRvd25fZnVuY3Rpb24nICkgKTsKCQkKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTZXR0aW5nIHJlc3RvcmUgc3RhdGUgZGVmYXVsdHMuJyApOwoJCSR0aGlzLT5fc3RhdGUgPSBhcnJheSgKCQkJJ3R5cGUnID0+ICR0eXBlLAoJCQknYXJjaGl2ZScgPT4gJycsCQkJCQkvLyBGdWxsIGFyY2hpdmUgcGF0aCAmIGZpbGVuYW1lLgoJCQknc2VyaWFsJyA9PiAnJywJCQkJCQkvLyBDYWxjdWxhdGVkIGJhY2t1cCBzZXJpYWwuCgkJCSd0ZW1wUGF0aCcgPT4gJycsCQkJCQkvLyBUZW1wb3JhcnkgcGF0aCB0byBkbyBleHRyYWN0aW9ucyBpbnRvLiBUcmFpbGluZyBwYXRoLgoJCQknZGF0JyA9PiBhcnJheSgpLAkJCQkJLy8gREFUIGZpbGUgYXJyYXkuCgkJCSd1bmRvVVJMJyA9PiAnJywJCQkJCS8vIFVSTCB0byB0aGUgdW5kbyBzY3JpcHQsIGVnIGh0dHA6Ly95b3VyLmNvbS9iYWNrdXBidWRkeV9yb2xsYmFja191bmRvLVhYWFhYWFhYLnBocAoJCQknZm9yY2VNeXNxbE1ldGhvZHMnID0+IGFycmF5KCksCQkvLyBteXNxbCBtZXRob2RzIHRvIGZvcmNlIGZvciBpbXBvcnRpbmcuIERlZmF1bHQgdG8gZW1wdHkgYXJyYXkgdG8gYXV0by1kZXRlY3QuCgkJCSdhdXRvQWR2YW5jZScgPT4gdHJ1ZSwJCQkJLy8gV2hldGhlciBvciBub3QgdG8gYXV0byBhZHZhbmNlIChpZSBmb3Igd2ViLWJhc2VkIHJvbGxiYWNrIGF1dG8tcmVmcmVzaCB0byBuZXh0IHN0ZXApLgoJCQknbWF4RXhlY3V0aW9uVGltZScgPT4gYmFja3VwYnVkZHlfY29yZTo6ZGV0ZWN0TWF4RXhlY3V0aW9uVGltZSgpLAkJCS8vIElmIHNldCB0aGVuIG92ZXJyaWRlIGRldGVjdGVkIG1heCBleGVjdXRpb24gdGltZS4KCQkJJ2RiSW1wb3J0UG9pbnQnID0+IDAsCQkJCS8vIEZvciBjb21wYXQgbW9kZSBteXNxbCwgbmV4dCByb3cgdG8gc3RhcnQgaW1wb3J0byBuLgoJCQknemlwTWV0aG9kU3RyYXRlZ3knID0+ICdhbGwnLAkJLy8JWmlwIG1ldGhvZHMgdG8gdXNlLiBWYWxpZDogYWxsLCB6aXBhcmNoaXZlLCBwY2x6aXAKCQkJJ3Jlc3RvcmVGaWxlcycgPT4gdHJ1ZSwKCQkJJ3Jlc3RvcmVEYXRhYmFzZScgPT4gdHJ1ZSwKCQkJJ21pZ3JhdGVIdGFjY2VzcycgPT4gdHJ1ZSwKCQkJJ2RhdGFiYXNlU2V0dGluZ3MnID0+IGFycmF5KAoJCQkJCQkJCQknc2VydmVyJyA9PiAnJywKCQkJCQkJCQkJJ2RhdGFiYXNlJyA9PiAnJywKCQkJCQkJCQkJJ3VzZXJuYW1lJyA9PiAnJywKCQkJCQkJCQkJJ3Bhc3N3b3JkJyA9PiAnJywKCQkJCQkJCQkJJ3ByZWZpeCcgPT4gJycsCgkJCQkJCQkJCSd0ZW1wUHJlZml4JyA9PiAnJywgLy8gVXNlZCBieSBkZXBsb3ltZW50IHRvIGltcG9ydCB0byBhIHRlbXBvcmFyeSBwcmVmaXguIE1pZ3JhdGlvbiB3aWxsIG1pZ3JhdGUgZGF0YSB0byB0aGUgcmVhbCBwcmVmaXggdGhvdWdoLiBUaGVuIHRoZSBkYiB3aWxsIGJlIHN3YXBwZWQgb3V0IGJldHdlZW4gZXhpc3RpbmcgYW5kIHRlbXBQcmVmaXguCgkJCQkJCQkJCSd3aXBlUHJlZml4JyA9PiBmYWxzZSwKCQkJCQkJCQkJJ3JlbmFtZVByZWZpeCcgPT4gZmFsc2UsIC8vIFRlbXBvcmFyaWx5IHJlbmFtZSBleGlzdGluZyB0YWJsZXMgdG8gYW5vdGhlciBwcmVmaXggZm9yIGFsbG93aW5nIHVuZG8gb2YgZGIgaW1wb3J0LgoJCQkJCQkJCQknd2lwZURhdGFiYXNlJyA9PiBmYWxzZSwKCQkJCQkJCQkJJ2lnbm9yZVNxbEVycm9ycycgPT4gZmFsc2UsCgkJCQkJCQkJCSdzcWxGaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJJ3NxbEZpbGVzTG9jYXRpb24nID0+ICcnLAoJCQkJCQkJCQknZGF0YWJhc2VNZXRob2RTdHJhdGVneScgPT4gJ3BocCcsIC8vIERlZmF1bHRzIHRvIHBocCBkdWUgdG8gY2h1bmtpbmcgYWJpbGl0eS4KCQkJCQkJCQkJLy8naW1wb3J0UmVzdW1lRmlsZXMnPT4gYXJyYXkoKSwgLy8gSU1QT1JUQU5UOiBMZWF2ZSB1bnNldCBpbiBkZWZhdWx0LiBPbmNlIHNldCwgZW1wdHl5IGFycmF5IG1lYW5zIGZpbmlzaGVkIGFsbCBmaWxlcy4KCQkJCQkJCQkJJ2ltcG9ydFJlc3VtZVBvaW50Jz0+ICcnLCAvLyBDdXJyZW50IGZpbGUgcG9pbnRlciB2YWx1ZSAoZnJvbSBmdGVsbCgpKSBmb3IgY2h1bmtlZCByZXN1bWVkIFNRTCBmaWxlIGltcG9ydC4KCQkJCQkJCQkJJ2ltcG9ydGVkUmVzdW1lUm93cycgPT4gMCwgLy8gVG90YWwgbnVtYmVyIG9mIHJvd3MgaW1wb3J0ZWQgdGh1cyBmYXIgd2hlbiBjaHVua2luZy4gW0lORk9STUFUSU9OIE9OTFldCgkJCQkJCQkJCSdpbXBvcnRlZFJlc3VtZUZhaWxzJyA9PiAwLCAvLyBUb3RhbCBudW1iZXIgb2YgU1FMIHF1ZXJpZXMgdGhhdCBmYWlsZWQgZXhlY3V0aW9uZyB3aGVuIGNodW5raW5nLiBbSU5GT1JNQVRJT04gT05MWV0KCQkJCQkJCQkJJ2ltcG9ydGVkUmVzdW1lVGltZScgPT4gMCwgLy8gVG90YWwgdGltZSBvZiBhY3R1YWwgaW1wb3J0IHdoZW4gY2h1bmtpbmcuIFtJTkZPUk1BVElPTiBPTkxZXQoJCQkJCQkJCQknbWlncmF0ZURhdGFiYXNlJyA9PiB0cnVlLAoJCQkJCQkJCQknbWlncmF0ZURhdGFiYXNlQnJ1dGVGb3JjZScgPT4gdHJ1ZSwKCQkJCQkJCQkJJ21pZ3JhdGVSZXN1bWVTdGVwcycgPT4gJycsCgkJCQkJCQkJCSdtaWdyYXRlUmVzdW1lUG9pbnQnID0+ICcnLAoJCQkJCQkJCSksCgkJCSdjbGVhbnVwJyA9PiBhcnJheSgJCQkJCS8vIFN0ZXAgNiBjbGVhbnVwIG9wdGlvbnMuCgkJCQknc2V0X2Jsb2dfcHVibGljJyA9PiAnJywJCQkvLyBTZWFyY2ggZW5naW5lIHZpc2liaWxpdHkuIEVtcHR5IHN0cmluZyB0byBrZWVwIHRoZSBzYW1lLiB0cnVlIHRvIGVuYWJsZSAob3B0aW9uIHNldCB0byAxKSwgZmFsc2UgdG8gZGlzYWJsZSAob3B0aW9uIHNldCB0byAwKS4KCQkJCSdkZWxldGVBcmNoaXZlJyA9PiB0cnVlLAoJCQkJJ2RlbGV0ZVRlbXBGaWxlcycgPT4gdHJ1ZSwKCQkJCSdkZWxldGVJbXBvcnRCdWRkeScgPT4gdHJ1ZSwKCQkJCSdkZWxldGVJbXBvcnRCdWRkeURpcmVjdG9yeScgPT4gdHJ1ZSwKCQkJCSdkZWxldGVJbXBvcnRMb2cnID0+IHRydWUsCgkJCQkJCQkJKSwKCQkJJ3BvdGVudGlhbFByb2JsZW1zJyA9PiBhcnJheSgpLAkJLy8gQXJyYXkgb2YgcG90ZW50aWFsIGlzc3VlcyBlbmNvdW50ZXJlZCB0byBzaG93IHRoZSB1c2VyIEFGVEVSIGltcG9ydCBpcyBkb25lLgoJCQkvLydibG9nUHVibGljU3RhdHVzJyA9PiAnJywJCQkvLyAxLCAwLCBvciBlbXB0eSBzdHJpbmcgZm9yIHVudGVzdGVkL3Vua25vd24uCgkJCSdzdGVwSGlzdG9yeScgPT4gYXJyYXkoKSwJCQkvLyBBcnJheSBvZiBhcnJheXMgb2YgdGhlIHN0ZXAgZnVuY3Rpb25zIHJ1biB0aHVzIGZhci4gVHJhY2sgc3RhcnQgYW5kIGZpbmlzaCB0aW1lcy4KCQkpOwoKCQkvLyBSZXN0b3JlLXNwZWNpZmljIGRlZmF1bHQgb3B0aW9ucy4KCQlpZiAoICdyZXN0b3JlJyA9PSAkdHlwZSApIHsKCQkJJHRoaXMtPl9zdGF0ZVsnc2tpcFVuemlwJ10gPSBmYWxzZTsKCQkJJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVzJ10gPSB0cnVlOwoJCQkkdGhpcy0+X3N0YXRlWydyZXN0b3JlRGF0YWJhc2UnXSA9IHRydWU7CgkJCSR0aGlzLT5fc3RhdGVbJ21pZ3JhdGVIdGFjY2VzcyddID0gdHJ1ZTsKCQkJJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvdGVtcF8nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLyc7CgkJfSBlbHNlaWYgKCAncm9sbGJhY2snID09ICR0eXBlICkgewoJCQkkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJHRoaXMtPl9zdGF0ZVsndHlwZSddIC4gJ18nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnLyc7CgkJfQoJCQoJCQoJCWlmICggaXNfYXJyYXkoICRleGlzdGluZ1N0YXRlICkgKSB7IC8vIFVzZXIgcGFzc2VkIGFsb25nIGFuIGV4aXN0aW5nIHN0YXRlIHRvIHJlc3VtZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgcHJvdmlkZWQgcmVzdG9yZSBzdGF0ZSBkYXRhLicgKTsKCQkJJHRoaXMtPl9zdGF0ZSA9ICR0aGlzLT5fYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoICR0aGlzLT5fc3RhdGUsICRleGlzdGluZ1N0YXRlICk7CgkJfQoKCQkvLyBBbGxvdyBhYmlsaXR5IHRvIEZvcmNlIERCIG92ZXIgU1NMCgkJaWYgKCAhIGVtcHR5KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RiX2ZvcmNlX3NzbCddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NldHRpbmcgZmxhZyB0byBjb25uZWN0IHRvIE15U1FMIHZpYSBTU0wuJyApOwoJCQlkZWZpbmUoICdNWVNRTF9DTElFTlRfRkxBR1MnLCBNWVNRTF9DTElFTlRfU1NMICk7CgkJfQoJCQoJCS8vIENoZWNrIGlmIGEgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZSBleGlzdHMuICBVc2VkIGJ5IGF1dG9tYXRlZCByZXN0b3JpbmcuCgkJLyoKCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSA+IDAgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMgZXhpc3QuIEFwcGx5IHRoZW0uCgkJCSR0aGlzLT5fc3RhdGUgPSBhcnJheV9tZXJnZSggJHRoaXMtPl9zdGF0ZSwgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddICk7CgkJfQoJCSovCgkJCgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdG9yZSBjbGFzcyBjb25zdHJ1Y3RlZCBpbiBgJyAuICR0eXBlIC4gJ2AgbW9kZS4nICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOyAvLyBKdXN0IGFsd2F5cyBhc3N1bWUgd2UgbmVlZCB0aGlzIGR1cmluZyByZXN0b3Jlcy9yb2xsYmFjay4uLgoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCQoJCgkKCS8qIHN0YXJ0KCkKCSAqCgkgKiBST0xMQkFDSywgUkVTVE9SRQoJICogUmV0dXJucyBmYWxzZSBvbiBmYWlsdXJlLiBVc2UgZ2V0RXJyb3JzKCkgdG8gZ2V0IGFuIGFycmF5IG9mIGVycm9ycyBlbmNvdW50ZXJlZCBpZiBhbnkuCgkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIG9uIHN1Y2Nlc3MuCgkgKiBHcmFiIHRoZSByb2xsYmFjayBzdGF0ZSBkYXRhIHdpdGggZ2V0U3RhdGUoKS4KCSAqCgkgKiBAcmV0dXJuCWJvb2wJCXRydWUgb24gc3VjY2VzcywgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0KCAkYmFja3VwRmlsZSwgJHNraXBVbnppcCA9IGZhbHNlICkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQlpZiAoICEgZmlsZV9leGlzdHMoICRiYWNrdXBGaWxlICkgKSB7CgkJCXJldHVybiAkdGhpcy0+X2Vycm9yKCAnVW5hYmxlIHRvIGFjY2VzcyBiYWNrdXAgZmlsZSBgJyAuICRiYWNrdXBGaWxlIC4gJ2AuIFZlcmlmeSBpdCBzdGlsbCBleGlzdHMgYW5kIGhhcyBwcm9wZXIgcmVhZCBwZXJtaXNzaW9ucy4nICk7CgkJfQoJCQoJCSR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSA9ICRiYWNrdXBGaWxlOwoJCSRzZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggYmFzZW5hbWUoICRiYWNrdXBGaWxlICkgKTsKCQkkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSA9ICRzZXJpYWw7CgkJdW5zZXQoICRiYWNrdXBGaWxlICk7CgkJdW5zZXQoICRzZXJpYWwgKTsKCQkKCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmICggdHJ1ZSA9PT0gUEJfU1RBTkRBTE9ORSApICkgewoJCQkkbXlzcWxfOTAxMF9sb2cgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L215c3FsXzkwMTBfbG9nLScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJG15c3FsXzkwMTBfbG9nICkgKSB7CgkJCQlAdW5saW5rKCAkbXlzcWxfOTAxMF9sb2cgKTsKCQkJfQoJCX0KCQkKCQlpZiAoIHRydWUgIT09ICRza2lwVW56aXAgKSB7CgkJCS8vIEdldCB6aXAgbWV0YSBpbmZvcm1hdGlvbi4KCQkJJGN1c3RvbVRpdGxlID0gJ0JhY2t1cCBEZXRhaWxzJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQXR0ZW1wdGluZyB0byByZXRyaWV2ZSB6aXAgbWV0YSBkYXRhIGZyb20gY29tbWVudC4nICk7CgkJCWlmICggZmFsc2UgIT09ICggJG1ldGFJbmZvID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0WmlwTWV0YSggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvdW5kIHppcCBtZXRhIGRhdGEuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGlkIG5vdCBmaW5kIHppcCBtZXRhIGRhdGEuJyApOwoJCQl9CgkJCQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyB6aXBidWRkeS4nICk7CgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgkJCQoJCQkkemlwYnVkZHkgPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIGRpcm5hbWUoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSApICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcGJ1ZGR5IGxvYWRlZC4nICk7CgkJfQoJCSR6aXBfZGlyX3ByZWZpeCA9IHN0cl9yZXBsYWNlKCAnLnppcCcsICcnLCBiYXNlbmFtZSggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddICkgKSAuICcvd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddOwoJCQoJCS8vIEZpbmQgREFUIGZpbGUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2FsY3VsYXRpbmcgcG9zc2libGUgREFUIGZpbGUgbG9jYXRpb25zLicgKTsKCQkkZGV0ZWN0ZWREYXRMb2NhdGlvbiA9ICcnOwoJCSRwb3NzaWJsZURhdExvY2F0aW9ucyA9IGFycmF5KCk7CgkJaWYgKCBpc3NldCggJG1ldGFJbmZvWydkYXRfcGF0aCddICkgKSB7CgkJCSRwb3NzaWJsZURhdExvY2F0aW9uc1tdID0gJG1ldGFJbmZvWydkYXRfcGF0aCddWzFdOyAvLyBEQVQgZmlsZSBsb2NhdGlvbiBlbmNvZGVkIGluIG1ldGEgaW5mby4gU2hvdWxkIGFsd2F5cyBiZSB2YWxpZC4KCQl9CgkJCgkJCgkJLy8gUG9zc2libGUgREFUIGZpbGUgbG9jYXRpb25zLgoJCSRwb3NzaWJsZURhdExvY2F0aW9uc1tdID0gJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycgLiAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSAuICcvYmFja3VwYnVkZHlfZGF0LnBocCc7IC8vIEZ1bGwgYmFja3VwLgoJCSRwb3NzaWJsZURhdExvY2F0aW9uc1tdID0gJ2JhY2t1cGJ1ZGR5X2RhdC5waHAnOyAvLyBEQiBiYWNrdXAuIChsb29rIGZvciB0aGlzIHNlY29uZCBpbiBjYXNlIHVzZXIgbGVmdCBhbiBvbGQgZGF0IGZpbGUgaW4gcm9vdCkuCgkJJHBvc3NpYmxlRGF0TG9jYXRpb25zW10gPSAkemlwX2Rpcl9wcmVmaXggLiAnL2JhY2t1cGJ1ZGR5X2RhdC5waHAnOyAvLyBGdWxsIGJhY2t1cCBidXQgaW5zaWRlIGEgc3ViZGlyZWN0b3J5LiBDb21tb24gaWYgdXNlciByZS16aXBwZWQgdGhlIGRpcmVjdG9yeSBhZnRlciB1bnppcHBpbmcuCgkJCgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUG9zc2libGUgREFUIGZpbGUgbG9jYXRpb25zOiBgJyAuIGltcGxvZGUoICc7JywgJHBvc3NpYmxlRGF0TG9jYXRpb25zICkgLiAnYC4nICk7CgkJJHBvc3NpYmxlRGF0TG9jYXRpb25zID0gYXJyYXlfdW5pcXVlKCAkcG9zc2libGVEYXRMb2NhdGlvbnMgKTsKCQlpZiAoIHRydWUgPT09ICRza2lwVW56aXAgKSB7IC8vIE9ubHkgbG9vayBmb3IgREFUIGZpbGUgaW4gZmlsZXN5c3RlbS4gWmlwIHNob3VsZCBiZSBwcmUtZXh0cmFjdGVkLCBlZyBieSB0aGUgdXNlciBtYW51YWxseS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9va2luZyBmb3IgREFUIGZpbGUgaW4gbG9jYWwgZmlsZXN5c3RlbSAoaW5zdGVhZCBvZiBpbiB6aXApIHNpbmNlIGFkdmFuY2VkIHNraXAgdW56aXAgb3B0aW9uIHNldC4nICk7CgkJCWZvcmVhY2goICRwb3NzaWJsZURhdExvY2F0aW9ucyBhcyAkcG9zc2libGVEYXRMb2NhdGlvbiApIHsgLy8gTG9vayBmb3IgREFUIGZpbGUgaW4gZmlsZXN5c3RlbS4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RvZXMgYCcgLiBBQlNQQVRIIC4gJHBvc3NpYmxlRGF0TG9jYXRpb24gLiAnYCBleGlzdD8nICk7CgkJCQlpZiAoIHRydWUgPT09IGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJHBvc3NpYmxlRGF0TG9jYXRpb24gKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdZZXMsIGV4aXN0cy4nICk7CgkJCQkJJGRldGVjdGVkRGF0TG9jYXRpb24gPSAkcG9zc2libGVEYXRMb2NhdGlvbjsKCQkJCQlicmVhazsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8sIGRvZXMgbm90IGV4aXN0LicgKTsKCQkJCX0KCQkJfQoJCQlpZiAoICcnID09ICRkZXRlY3RlZERhdExvY2F0aW9uICkgewoJCQkJJG1lc3NhZ2UgPSAnVW5hYmxlIHRvIGZpbmQgdGhlIERBVCBmaWxlIGZvciB0aGlzIGJhY2t1cCBhcmNoaXZlIHByZS1leHRyYWN0ZWQgaW4gdGhlIGZpbGVzeXN0ZW0uIE1ha2Ugc3VyZSB5b3UgaGF2ZSBhbHJlYWR5IHVuemlwcGVkIHRoaXMgYmFja3VwIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGltcG9ydGJ1ZGR5LnBocC4nOwoJCQkJcmV0dXJuICR0aGlzLT5fZXJyb3IoICRtZXNzYWdlICk7CgkJCX0KCQl9IGVsc2UgeyAvLyBMb29rIGZvciBEQVQgZmlsZSBpbnNpZGUgb2YgemlwIGFyY2hpdmUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvb2tpbmcgZm9yIERBVCBmaWxlIGluIHppcCBhcmNoaXZlIGl0c2VsZi4nICk7CgkJCWZvcmVhY2goICRwb3NzaWJsZURhdExvY2F0aW9ucyBhcyAkcG9zc2libGVEYXRMb2NhdGlvbiApIHsgLy8gTG9vayBmb3IgREFUIGZpbGUgaW4gemlwLgoJCQkJaWYgKCB0cnVlID09PSAkemlwYnVkZHktPmZpbGVfZXhpc3RzKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10sICRwb3NzaWJsZURhdExvY2F0aW9uLCAkbGVhdmVfb3BlbiA9IHRydWUgKSApIHsKCQkJCQkkZGV0ZWN0ZWREYXRMb2NhdGlvbiA9ICRwb3NzaWJsZURhdExvY2F0aW9uOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9IC8vIGVuZCBmb3JlYWNoLgoJCX0KCQlpZiAoICcnID09ICRkZXRlY3RlZERhdExvY2F0aW9uICkgewoJCQlyZXR1cm4gJHRoaXMtPl9lcnJvciggJ1VuYWJsZSB0byBkZXRlcm1pbmUgREFUIGZpbGUgbG9jYXRpb24uIEl0IG1heSBiZSBtaXNzaW5nIE9SIHRoZSBiYWNrdXAgemlwIGZpbGUgbWF5IGJlIGluY29tcGxldGUgb3IgY29ycnVwdGVkLiBWZXJpZnkgdGhlIGJhY2t1cCB6aXAgaGFzIGZ1bGx5IHVwbG9hZGVkIG9yIHJlLXVwbG9hZCBpdC4gWW91IGNhbiB0cnkgbWFudWFsbHkgdW56aXBwaW5nIHRoZW4gc2VsZWN0aW5nIHRoZSBhZHZhbmNlZCBvcHRpb24gdG8gc2tpcCB1bnppcC4nICk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvbmZpcm1lZCBEQVQgZmlsZSBsb2NhdGlvbjogYCcgLiAkZGV0ZWN0ZWREYXRMb2NhdGlvbiAuICdgLicgKTsKCQkkdGhpcy0+X3N0YXRlWydkYXRMb2NhdGlvbiddID0gJGRldGVjdGVkRGF0TG9jYXRpb247CgkJCgkJaWYgKCAkemlwX2Rpcl9wcmVmaXggPT0gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydkYXRMb2NhdGlvbiddLCAwLCBzdHJsZW4oICR6aXBfZGlyX3ByZWZpeCApICkgKSB7CgkJCXJldHVybiAkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzQ4Mzk0Mzg5NDogREFUIGZpbGUgd2FzIGRldGVjdGVkIGJ1dCBpbiBhbiBpbnZhbGlkIGxvY2F0aW9uLiBJdCBhcHBlYXJzIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBzdWJkaXJlY3RvcnkgbWF0Y2hpbmcgdGhlIHppcCBmaWxlbmFtZS4gSWYgeW91IHVuemlwcGVkIHRoZW4gcmUtemlwcGVkIHRoaXMgY291bGQgaGF2ZSBjYXVzZWQgdGhlIGNvbnRlbnRzIHRvIGJlIGNvbnRhaW5lZCBpbiBhIHN1YmRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSByb290IGFzIGV4cGVjdGVkLiBUbyBhdm9pZCB0aGlzIHppcCB0aGUgZmlsZXMgYW5kIE5PVCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGVzLicgKTsKCQl9CgkJCgkJdW5zZXQoICRtZXRhSW5mbyApOyAvLyBObyBsb25nZXIgbmVlZCBhbnl0aGluZyBmcm9tIHRoZSBtZXRhIGluZm9ybWF0aW9uLgoJCQoJCWlmICggdHJ1ZSAhPT0gJHNraXBVbnppcCApIHsKCQkJZnVuY3Rpb24gbWtkaXJfcmVjdXJzaXZlKCAkcGF0aCApIHsKCQkJCWlmICggZW1wdHkoICRwYXRoICkgKSB7IC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCBvbiBiYWQgcGF0aAoJCQkJCXJldHVybjsKCQkJCX0KCQkJCWlzX2RpciggZGlybmFtZSggJHBhdGggKSApIHx8IG1rZGlyX3JlY3Vyc2l2ZSggZGlybmFtZSggJHBhdGggKSApOwoJCQkJcmV0dXJuIGlzX2RpciggJHBhdGggKSB8fCBta2RpciggJHBhdGggKTsKCQkJfQoJCQkKCQkJLy8gTG9hZCBEQVQgZmlsZSBjb250ZW50cy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgdGVtcG9yYXJ5IGZpbGUgZGlyZWN0b3J5IGAnIC4gJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSAuICdgLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddICk7IC8vIFJlbW92ZSBpZiBhbHJlYWR5IGV4aXN0cy4KCQkJbWtkaXJfcmVjdXJzaXZlKCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddICk7IC8vIE1ha2UgZW1wdHkgZGlyZWN0b3J5LgoJCQkKCQkJLy8gUmVzdG9yZSBEQVQgZmlsZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXh0cmFjdGluZyBEQVQgZmlsZS4nICk7CgkJCSRmaWxlcyA9IGFycmF5KCAkZGV0ZWN0ZWREYXRMb2NhdGlvbiA9PiAnYmFja3VwYnVkZHlfZGF0LnBocCcgKTsKCQkJcmVxdWlyZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvX3Jlc3RvcmVGaWxlcy5waHAnICk7CgkJCSRyZXN1bHQgPSBiYWNrdXBidWRkeV9yZXN0b3JlX2ZpbGVzOjpyZXN0b3JlKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10sICRmaWxlcywgJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSwgJHppcGJ1ZGR5ICk7CgkJCWVjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5qUXVlcnkoIiNwYl9iYWNrdXBidWRkeV93b3JraW5nIikuaGlkZSgpOzwvc2NyaXB0Pic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJJHRoaXMtPl9lcnJvciggJ0Vycm9yICM4NTQ4NDogVW5hYmxlIHRvIHJldHJpZXZlIERBVCBmaWxlLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3IuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQkkZGF0RmlsZSA9ICR0aGlzLT5fc3RhdGVbJ3RlbXBQYXRoJ10gLiAnYmFja3VwYnVkZHlfZGF0LnBocCc7CgkJfSBlbHNlIHsKCQkJJGRhdEZpbGUgPSAkdGhpcy0+X3N0YXRlWydkYXRMb2NhdGlvbiddOwoJCX0KCQkKCQlpZiAoIGZhbHNlID09PSAoICRkYXREYXRhID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X2RhdF9maWxlX2FycmF5KCAkZGF0RmlsZSApICkgKSB7CgkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjNDgzOTQ4NDogVW5hYmxlIHRvIHJldHJpZXZlIERBVCBmaWxlLiBUaGUgYmFja3VwIG1heSBoYXZlIGZhaWxlZCBvcGVuaW5nIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgcGVybWlzc2lvbnMgaXNzdWVzLCBvciBvdGhlciByZWFzb24uIFVzZSBJbXBvcnRCdWRkeSB0byByZXN0b3JlIG9yIGNoZWNrIHRoZSBBZHZhbmNlZCBMb2cgYWJvdmUgZm9yIGRldGFpbHMuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlzLT5fc3RhdGVbJ2RhdCddID0gJGRhdERhdGE7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnREFUIGZpbGUgZXh0cmFjdGVkLicgKTsKCQkKCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmICggdHJ1ZSA9PT0gUEJfU1RBTkRBTE9ORSApICkgewoJCQkkc2ltcGxlVmVyc2lvbiA9IHN1YnN0ciggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sIDAsIHN0cnBvcyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sICcgJyApICk7CgkJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBidWRkeV92ZXJzaW9uJ10gKSAmJiAoIHZlcnNpb25fY29tcGFyZSggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2JhY2t1cGJ1ZGR5X3ZlcnNpb24nXSwgJHNpbXBsZVZlcnNpb24sICc+JyApICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnV2FybmluZzogWW91IGFyZSBhdHRlbXB0aW5nIHRvIHJlc3RvcmUgYW4gYXJjaGl2ZSB3aGljaCB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBCYWNrdXBCdWRkeSAoJyAuICR0aGlzLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBidWRkeV92ZXJzaW9uJ10gLiAnKSB0aGFuIHRoaXMgSW1wb3J0QnVkZHkgKCcgLiAkc2ltcGxlVmVyc2lvbiAuICcpLiBGb3IgYmVzdCByZXN1bHRzIHVzZSBhbiBJbXBvcnRCdWRkeSB0aGF0IGlzIGFzIGxlYXN0IGFzIHVwIHRvIGRhdGUgYXMgdGhlIEJhY2t1cEJ1ZGR5IHdoaWNoIGNyZWF0ZWQgdGhlIGFyY2hpdmUuJyApOwoJCQl9CgkJfQoJCQoJCWlmICggJ3JvbGxiYWNrJyA9PSAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gKSB7CgkJCSR0aGlzX3NpdGV1cmwgPSBzdHJfcmVwbGFjZSggJ2h0dHBzOi8vJywgJ2h0dHA6Ly8nLCBzaXRlX3VybCgpICk7CgkJCSR0aGlzX3NpdGV1cmxkYXQgPSBzdHJfcmVwbGFjZSggJ2h0dHBzOi8vJywgJ2h0dHA6Ly8nLCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnc2l0ZXVybCddICk7CgkJCWlmICggJHRoaXNfc2l0ZXVybCAhPSAkdGhpc19zaXRldXJsZGF0ICkgewoJCQkJJHRoaXMtPl9lcnJvciggX18oICdFcnJvciAjNTg0OTg0MzogU2l0ZSBVUkwgZG9lcyBub3QgbWF0Y2guIEN1cnJlbnQgU2l0ZSBVUkw6IGAnIC4gc2l0ZV91cmwoKSAuICdgLiBTaXRlIFVSTCBpbiBiYWNrdXA6IGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3NpdGV1cmwnXSAuICdgLiBZb3UgY2Fubm90IHJvbGwgYmFjayB0aGUgZGF0YWJhc2UgaWYgdGhlIFVSTCBoYXMgY2hhbmdlZCBvciBmb3IgYmFja3VwcyBvciBhbm90aGVyIHNpdGUuIFVzZSBpbXBvcnRidWRkeS5waHAgdG8gcmVzdG9yZSBvciBtaWdyYXRlIGluc3RlYWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJZ2xvYmFsICR3cGRiOwoJCQlpZiAoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl9wcmVmaXgnXSAhPSAkd3BkYi0+cHJlZml4ICkgewoJCQkJJHRoaXMtPl9lcnJvciggX18oICdFcnJvciAjMjM4OTM5NDogRGF0YWJhc2UgcHJlZml4IGRvZXMgbm90IG1hdGNoLiBZb3UgY2Fubm90IHJvbGwgYmFjayB0aGUgZGF0YWJhc2UgaWYgdGhlIGRhdGFiYXNlIHByZWZpeCBoYXMgY2hhbmdlZCBvciBmb3IgYmFja3VwcyBvciBhbm90aGVyIHNpdGUuIFVzZSBpbXBvcnRidWRkeS5waHAgdG8gcmVzdG9yZSBvciBtaWdyYXRlIGluc3RlYWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyb2xsYmFja19jbGVhbnVwcyddWyAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSBdID0gdGltZSgpOwoJCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQkKCQkJLy8gR2VuZXJhdGUgVU5ETyBzY3JpcHQuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dlbmVyYXRpbmcgdW5kbyBzY3JpcHQuJyApOwoJCQkkdGhpcy0+X3N0YXRlWyd1bmRvRmlsZSddID0gJ2JhY2t1cGJ1ZGR5X3JvbGxiYWNrX3VuZG8tJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy5waHAnOwoJCQkkdW5kb1VSTCA9IHJ0cmltKCBzaXRlX3VybCgpLCAnL1xcJyApIC4gJy8nIC4gJHRoaXMtPl9zdGF0ZVsndW5kb0ZpbGUnXTsKCQkJJHVuZG9fc291cmNlID0gZGlybmFtZSggX19GSUxFX18gKSAuICcvX3JvbGxiYWNrX3VuZG8ucGhwJzsKCQkJJHVuZG9fZGVzdCA9IEFCU1BBVEggLiAkdGhpcy0+X3N0YXRlWyd1bmRvRmlsZSddOwoJCQlpZiAoIGZhbHNlID09PSBjb3B5KCAkdW5kb19zb3VyY2UsICR1bmRvX2Rlc3QgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdXYXJuaW5nOiBVbmFibGUgdG8gY3JlYXRlIHVuZG8gc2NyaXB0IGluIHNpdGUgcm9vdC4gWW91IHdpbGwgbm90IGJlIGFibGUgdG8gYXV0b21hdGVkIHVuZG9pbmcgdGhlIHJvbGxiYWNrIGlmIHNvbWV0aGluZyBmYWlscyBzbyBCYWNrdXBCdWRkeSB3aWxsIG5vdCBjb250aW51ZS4gVHJpZWQgdG8gY29weSBmaWxlIGAnIC4gJHVuZG9fc291cmNlIC4gJ2AgdG8gYCcgLiAkdW5kb19kZXN0IC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCSR0aGlzLT5fc3RhdGVbJ3VuZG9VUkwnXSA9ICR1bmRvVVJMOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBzdGFydGluZyBmdW5jdGlvbi4nICk7CgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBzdGFydCgpLgoJCgkKCQoJLyogZXh0cmFjdERhdGFiYXNlKCkKCSAqCgkgKiBST0xMQkFDSywgUkVTVE9SRQoJICogRXh0cmFjdHMgZGF0YWJhc2UgZmlsZShzKSBpbnRvIHRlbXAgZGlyLgoJICoKCSAqIEBwYXJhbQlib29sCQl0cnVlIG9uIHN1Y2Nlc3MsIGVsc2UgZmFsc2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBleHRyYWN0RGF0YWJhc2UoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWRpZSggJyBFUlJPUiAjMzQ4NDM3ODQzNzg0OiBERVBSRUNBVEVEIEZVTkNUSU9OIENBTEwhICcgKTsKCQkKCQkKCQkkdGhpcy0+X3ByaW9yUm9sbGJhY2tDbGVhbnVwKCk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyB6aXBidWRkeS4nICk7CgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQkkemlwYnVkZHkgPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIGRpcm5hbWUoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSApICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwYnVkZHkgbG9hZGVkLicgKTsKCQkKCQkvLyBGaW5kIFNRTCBmaWxlIGxvY2F0aW9uIGluIGFyY2hpdmUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2FsY3VsYXRpbmcgcG9zc2libGUgU1FMIGZpbGUgbG9jYXRpb25zLicgKTsKCQkkZGV0ZWN0ZWRTUUxMb2NhdGlvbiA9ICcnOwoJCSRwb3NzaWJsZVNRTExvY2F0aW9ucyA9IGFycmF5KCk7CgkJCgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zW10gPSB0cmltKCBydHJpbSggc3RyX3JlcGxhY2UoICdiYWNrdXBidWRkeV9kYXQucGhwJywgJycsICR0aGlzLT5fc3RhdGVbJ2RhdExvY2F0aW9uJ10gKSwgJ1xcLycgKSAuICcvZGJfMS5zcWwnLCAnXFwvJyApOyAvLyBTUUwgZmlsZSBtb3N0IGxpa2VseSBpcyBpbiB0aGUgc2FtZSBzcG90IHRoZSBkYXQgZmlsZSB3YXMuCgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zW10gPSAnZGJfMS5zcWwnOyAvLyBEQiBiYWNrdXAuIHYyLngrCgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zW10gPSAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy9kYl8xLnNxbCc7IC8vIEZ1bGwgYmFja3VwLgoJCQoJCSRwb3NzaWJsZVNRTExvY2F0aW9uc1tdID0gJ2RiLnNxbCc7IC8vIERCIGJhY2t1cC4gdjEueAoJCSRwb3NzaWJsZVNRTExvY2F0aW9uc1tdID0gJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycgLiAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSAuICcvZGIuc3FsJzsgLy8gRnVsbCBiYWNrdXAgdjEueC4KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQb3NzaWJsZSBTUUwgZmlsZSBsb2NhdGlvbnM6IGAnIC4gaW1wbG9kZSggJzsnLCAkcG9zc2libGVTUUxMb2NhdGlvbnMgKSAuICdgLicgKTsKCQkkcG9zc2libGVTUUxMb2NhdGlvbnMgPSBhcnJheV91bmlxdWUoICRwb3NzaWJsZVNRTExvY2F0aW9ucyApOwoJCWZvcmVhY2goICRwb3NzaWJsZVNRTExvY2F0aW9ucyBhcyAkcG9zc2libGVTUUxMb2NhdGlvbiApIHsKCQkJaWYgKCB0cnVlID09PSAkemlwYnVkZHktPmZpbGVfZXhpc3RzKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10sICRwb3NzaWJsZVNRTExvY2F0aW9uLCAkbGVhdmVfb3BlbiA9IHRydWUgKSApIHsKCQkJCSRkZXRlY3RlZFNRTExvY2F0aW9uID0gJHBvc3NpYmxlU1FMTG9jYXRpb247CgkJCQlicmVhazsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgkJCgkJaWYgKCAnJyA9PSAkZGV0ZWN0ZWRTUUxMb2NhdGlvbiApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0Vycm9yICM4NDgzNzgzOiBVbmFibGUgdG8gZmluZCBTUUwgZmlsZShzKSBsb2NhdGlvbi4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29uZmlybWVkIFNRTCBmaWxlIGxvY2F0aW9uOiBgJyAuICRkZXRlY3RlZFNRTExvY2F0aW9uIC4gJ2AuJyApOwoJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZSddID0gJGRldGVjdGVkU1FMTG9jYXRpb247CgkJCgkJLy8gR2V0IFNRTCBmaWxlLgoJCSRmaWxlcyA9IGFycmF5KCAkZGV0ZWN0ZWRTUUxMb2NhdGlvbiA9PiAnZGJfMS5zcWwnICk7CgkJcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddICk7IC8vIFJlbW92ZSBpZiBhbHJlYWR5IGV4aXN0cy4KCQlta2RpciggJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSApOyAvLyBNYWtlIGVtcHR5IGRpcmVjdG9yeS4KCQlyZXF1aXJlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9fcmVzdG9yZUZpbGVzLnBocCcgKTsKCQkKCQkvLyBFeHRyYWN0IFNRTCBmaWxlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4dHJhY3RpbmcgU1FMIGZpbGUocykuJyApOwoJCWlmICggZmFsc2UgPT09IGJhY2t1cGJ1ZGR5X3Jlc3RvcmVfZmlsZXM6OnJlc3RvcmUoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSwgJGZpbGVzLCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddLCAkemlwYnVkZHkgKSApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0Vycm9yICM4NTM4NDogVW5hYmxlIHRvIHJlc3RvcmUgb25lIG9yIG1vcmUgZGF0YWJhc2UgZmlsZXMuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGRhdGFiYXNlIGV4dHJhY3Rpb24gZnVuY3Rpb24uJyApOwoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgZXh0cmFjdERhdGFiYXNlKCkuCgkKCQoJCglwdWJsaWMgZnVuY3Rpb24gZGV0ZXJtaW5lRGF0YWJhc2VGaWxlcygpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJLy8gVHJ5IHRvIGZpbmQgU1FMIGZpbGUgc2luY2UgaXQgaGFzIG5vdCBiZWVuIGZvdW5kIHlldC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXRlcm1pbmluZyBTUUwgZmlsZSBsb2NhdGlvbi4uLicgKTsKCQkKCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzTG9jYXRpb24nXSA9ICcnOwoJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXSA9IGFycmF5KCk7CgkJCgkJJHBvc3NpYmxlX3NxbF9maWxlX3BhdGhzID0gYXJyYXkoIC8vIFBvc3NpYmxlIGxvY2F0aW9ucyBvZiAuU1FMIGZpbGUuIExvb2sgZm9yIFNRTCBmaWxlcyBpbiByb290IExBU1QgaW4gY2FzZSB1c2VyIGxlZnQgZmlsZXMgdGhlcmUuCgkJCSR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlUm9vdCddIC4gJ3dwLWNvbnRlbnQvdXBsb2Fkcy90ZW1wXycgLiAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSAuICcvJywJCQkJLy8gRnVsbCBiYWNrdXAgPCB2Mi4wLgoJCQkkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnLycsCS8vIEZ1bGwgYmFja3VwID49IHYyLjAuCgkJCSR0aGlzLT5fc3RhdGVbJ3RlbXBQYXRoJ10sCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gRGV0ZXJtaW5lZCBmcm9tIGRldGVjdGluZyBEQVQgZmlsZS4gU2hvdWxkIGFsd2F5cyBiZSB0aGUgbG9jYXRpb24gcmVhbGx5Li4uIEFzIG9mIHY0LjEuCgkJCSR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlUm9vdCddLAkJCQkJCQkJCQkJCQkJCQkJCQkvLyBEYXRhYmFzZSBiYWNrdXAgPCB2Mi4wLgoJCQlBQlNQQVRIIC4gJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycgLiAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSAuICcvJywJCQkJCQkJCQkJCQkvLyBNYW51YWxseSBleHRyYWN0ZWQgYmFja3VwLgoJCSk7CgkJJGZvdW5kU1FMID0gZmFsc2U7CgkJCgkJZm9yZWFjaCggJHBvc3NpYmxlX3NxbF9maWxlX3BhdGhzIGFzICRwb3NzaWJsZV9zcWxfZmlsZV9wYXRoICkgeyAvLyBDaGVjayBlYWNoIGZpbGUgbG9jYXRpb24gdG8gc2VlIHdoaWNoIGhpdHMuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvb2tpbmcgZm9yIFNRTCBmaWxlcyBpbiBgJyAuICRwb3NzaWJsZV9zcWxfZmlsZV9wYXRoIC4gJ2AuJyApOwoJCQkkcG9zc2libGVfc3FsX2ZpbGVzID0gZ2xvYiggJHBvc3NpYmxlX3NxbF9maWxlX3BhdGggLiAnKi5zcWwnICk7CgkJCWlmICggISBpc19hcnJheSggJHBvc3NpYmxlX3NxbF9maWxlcyApIHx8ICggMCA9PSBjb3VudCggJHBvc3NpYmxlX3NxbF9maWxlcyApICkgKSB7IC8vIE5vIFNRTCBmaWxlcyBoZXJlLgoJCQkJY29udGludWU7CgkJCX0KCQkJCgkJCS8vIEZvdW5kIGRpcmVjdG9yeSB3aXRoIFNRTCBmaWxlcyBpbiBpdC4KCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlc0xvY2F0aW9uJ10gPSAkcG9zc2libGVfc3FsX2ZpbGVfcGF0aDsKCQkJCgkJCS8vIFJlbW92ZSBwYXRoIGluZm9ybWF0aW9uLgoJCQkkcG9zc2libGVfc3FsX2ZpbGVzID0gYXJyYXlfbWFwKCAnYmFzZW5hbWUnLCAkcG9zc2libGVfc3FsX2ZpbGVzICk7CgkJCQoJCQkvLyBUYWtlIFNRTCBmaWxlcyBvdXQgb2YgbGlzdCB0aGF0IGJlZ2luIHdpdGggdW5kZXJzY29yZSAoQmFja3VwQnVkZHkgU3Rhc2ggTGl2ZSB0aW1lc3RhbXBlZCBmaWxlcykgdG8gcHV0IHRoZW0gYXQgZW5kIG9mIHRoZSBhcnJheSB0byBwbGF5IGJhY2sgYXQgdGhlIGVuZC4KCQkJJGxpdmVfc3FsX2ZpbGVzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCggJHBvc3NpYmxlX3NxbF9maWxlcyBhcyAkaW5kZXggPT4gJHNxbF9maWxlICkgewoJCQkJaWYgKCAnXycgPT0gc3Vic3RyKCAkc3FsX2ZpbGUsIDAsIDEgKSApIHsKCQkJCQkkbGl2ZV9zcWxfZmlsZXNbXSA9ICRzcWxfZmlsZTsgLy8gQ29weSBpbnRvIG5ldyBhcnJheS4KCQkJCQl1bnNldCggJHBvc3NpYmxlX3NxbF9maWxlc1sgJGluZGV4IF0gKTsgLy8gUmVtb3ZlIGZyb20gb3JpZ2luYWwgYXJyYXkuCgkJCQl9CgkJCX0KCQkJCgkJCS8vIEZpeCBtaXNzaW5nIGluZGV4ZXMgb2YgcmVtb3ZlZCBpdGVtcy4KCQkJJHBvc3NpYmxlX3NxbF9maWxlcyA9IGFycmF5X2ZpbHRlciggJHBvc3NpYmxlX3NxbF9maWxlcyApOwoJCQkKCQkJLy8gQXBwZW5kIExJVkUgU1FMIGZpbGVzIHRvIGVuZCBvZiBub3JtYWwgU1FMIGZpbGVzIGxpc3QuCgkJCSRwb3NzaWJsZV9zcWxfZmlsZXMgPSBhcnJheV9tZXJnZSggJHBvc3NpYmxlX3NxbF9maWxlcywgJGxpdmVfc3FsX2ZpbGVzICk7CgkJCQoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gPSAkcG9zc2libGVfc3FsX2ZpbGVzOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCAnIC4gY291bnQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXSApIC4gJyBTUUwgZmlsZXMgaW4gYCcgLiAkcG9zc2libGVfc3FsX2ZpbGVfcGF0aCAuICdgLicgKTsKCQkJYnJlYWs7CgkJCQoJCX0gLy8gRW5kIGZvcmVhY2goKS4KCQl1bnNldCggJHBvc3NpYmxlX3NxbF9maWxlX3BhdGhzICk7CgkJCgkJaWYgKCBmYWxzZSAhPT0gJHRoaXMtPl9zdGF0ZVsncmVzdG9yZURhdGFiYXNlJ10gKSB7CgkJCWlmICggY291bnQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXSApID09IDAgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGZpbmQgZGJfMS5zcWwgb3Igb3RoZXIgZXhwZWN0ZWQgZGF0YWJhc2UgZmlsZSBpbiB0aGUgZXh0cmFjdGVkIGZpbGVzIGluIHRoZSBleHBlY3RlZCBsb2NhdGlvbi4gTWFrZSBzdXJlIHlvdSBkaWQgbm90IHJlbmFtZSB5b3VyIGJhY2t1cCBaSVAgZmlsZS4gWW91IG1heSBtYW51YWxseSByZXN0b3JlIHlvdXIgU1FMIGZpbGUgaWYgeW91IGNhbiBmaW5kIGl0IHZpYSBwaHBteWFkbWluIG9yIHNpbWlsYXIgdG9vbCB0aGVuIG9uIFN0ZXAgMSBvZiBJbXBvcnRCdWRkeSBzZWxlY3QgdGhlIGFkdmFuY2VkIG9wdGlvbiB0byBza2lwIGRhdGFiYXNlIGltcG9ydC4gVGhpcyB3aWxsIGFsbG93IHlvdSB0byBwcm9jZWVkLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NRTCBmaWxlcyBmb3VuZC4gRmluaXNoZWQgZGV0ZXJtaW5pbmcgZGF0YWJhc2UgZmlsZXMuJyApOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9Cgl9IC8vIEVuZCBkZXRlcm1pbmVEYXRhYmFzZUZpbGVzKCkuCgkKCQoJCgkvKiByZXN0b3JlRGF0YWJhc2UoKQoJICoKCSAqIFJPTExCQUNLLCBSRVNUT1JFCgkgKiBSZW5hbWVzIGV4aXN0aW5nIHRhYmxlcyB0aGVuIGltcG9ydHMgdGhlIGRhdGFiYXNlIFNRTCBkYXRhIGludG8gbXlzcWwuIFR1cm5zIG9uIG1haW50ZW5hbmNlIG1vZGUgZHVyaW5nIHRoaXMuCgkgKgoJIDggQHBhcmFtCXN0cmluZwkJJG92ZXJyaWRlUHJlZml4CQlJZiBub3QgZW1wdHkgc3RyaW5nIHRoZW4gdXNlIHRoaXMgZGIgcHJlZml4IGluc2VhZCBvZiB0aGUgb25lIHNldCBpbiB0aGUgc3RhdGUgZGF0YS4KCSAqIEByZXR1cm4JYm9vbHxhcnJheQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZSwgT1IgYXJyYXkgaWYgY2h1bmtpbmcgbmVlZGVkIGZvciBEQiBjb250aW51YXRpb24uIGNodW5rcyBtaWQtZGIgdGFibGUgaW1wb3J0IGFuZC9vciBmb3IgZWFjaCBpbmRpdmlkdWFsIC5zcWwgZmlsZS4gZGVwZW5kcyBvbiBtZXRob2QsIHJ1bnRpbWUgbGVmdCwgZXRjLiBzZWUgbXlzcWxidWRkeSBmb3IgY2h1bmtpbmcgZGV0YWlscy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlc3RvcmVEYXRhYmFzZSggJG92ZXJyaWRlUHJlZml4ID0gJycgKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCWdsb2JhbCAkd3BkYjsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXN0b3JpbmcgZGF0YWJhc2UgdGFibGVzLicgKTsKCQkKCQlpZiAoICFpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlc0xvY2F0aW9uJ10gKSB8fCAoICcnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXNMb2NhdGlvbiddICkgKSB7CgkJCSR0aGlzLT5kZXRlcm1pbmVEYXRhYmFzZUZpbGVzKCk7CgkJfQoJCQoJCWlmICggJ3JvbGxiYWNrJyA9PSAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gKSB7CgkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc2VydmVyJ10gPSBEQl9IT1NUOwoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlJ10gPSBEQl9OQU1FOwoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3VzZXJuYW1lJ10gPSBEQl9VU0VSOwoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10gPSBEQl9QQVNTV09SRDsKCQkJCgkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10gPSAnYmJuZXctJyAuIHN1YnN0ciggJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10sIDAsIDQgKSAuICdfJzsKCQkJCgkJCSRmb3JjZU15c3FsTWV0aG9kcyA9IGFycmF5KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RhdGFiYXNlX21ldGhvZF9zdHJhdGVneSddICk7CgkJfQoJCQoJCQoJCS8vIEFsbG93IG92ZXJyaWRpbmcgcHJlZml4IGluIHBhcmFtZXRlcnMuCgkJaWYgKCAnJyA9PSAkb3ZlcnJpZGVQcmVmaXggKSB7CgkJCSRpbXBvcnRQcmVmaXggPSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddOwoJCX0gZWxzZSB7CgkJCSRpbXBvcnRQcmVmaXggPSAkb3ZlcnJpZGVQcmVmaXg7CgkJfQoJCQoJCQoJCS8vIERldGVybWluZSBkYXRhYmFzZSBzdHJhdGVneS4KCQlpZiAoICdwaHAnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2VNZXRob2RTdHJhdGVneSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtZXRob2Qgc2V0IHRvIFBIUCBvbmx5LicgKTsKCQkJJGZvcmNlTXlzcWxNZXRob2RzID0gYXJyYXkoICdwaHAnICk7CgkJfSBlbHNlaWYgKCAnY29tbWFuZGxpbmUnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2VNZXRob2RTdHJhdGVneSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtZXRob2Qgc2V0IHRvIGNvbW1hbmQgbGluZSBvbmx5LicgKTsKCQkJJGZvcmNlTXlzcWxNZXRob2RzID0gYXJyYXkoICdjb21tYW5kbGluZScgKTsKCQl9IGVsc2VpZiAoICdhbGwnID09ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2VNZXRob2RTdHJhdGVneSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtZXRob2Qgc2V0IHRvIGFsbCAtLSB1c2luZyBpbiBwcmVmZXJyZWQgb3JkZXI6IHBocCwgY29tbWFuZGxpbmUuJyApOwoJCQkkZm9yY2VNeXNxbE1ldGhvZHMgPSBhcnJheSggJ3BocCcsICdjb21tYW5kbGluZScgKTsKCQl9IGVsc2UgeyAvLyBOb3QgcGFzc2VkIGZvciBzb21lIG9kZCByZWFzb24/IFNldCBkZWZhdWx0LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdEYXRhYmFzZSBtZXRob2Qgbm90IHBhc3NlZCB0aG91Z2ggZXhwZWN0ZWQuIFVzaW5nIGRlZmF1bHQgb2YgUEhQIG9ubHkuJyApOwoJCQkkZm9yY2VNeXNxbE1ldGhvZHMgPSBhcnJheSggJ3BocCcgKTsKCQl9CgkJCgkJCgkJLy8gSW5pdGlhbGl6ZSBteXNxbGJ1ZGR5LgoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9teXNxbGJ1ZGR5L215c3FsYnVkZHkucGhwJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X215c3FsYnVkZHkoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc2VydmVyJ10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2UnXSwgJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddLCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10sICRpbXBvcnRQcmVmaXgsICRmb3JjZU15c3FsTWV0aG9kcywgJHRoaXMtPl9zdGF0ZVsnbWF4RXhlY3V0aW9uVGltZSddICk7IC8vICRkYXRhYmFzZV9ob3N0LCAkZGF0YWJhc2VfbmFtZSwgJGRhdGFiYXNlX3VzZXIsICRkYXRhYmFzZV9wYXNzLCAkb2xkX3ByZWZpeCwgJGZvcmNlX21ldGhvZCA9IGFycmF5KCkKCQlpZiAoIGlzc2V0KCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnZGJfdmVyc2lvbiddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddLT5zZXRfaW5jb21pbmdfc3FsX3ZlcnNpb24oICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl92ZXJzaW9uJ10gKTsgLy8gVGVsbCBteXNxbGJ1ZGR5IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbmNvbWluZyBTUUwgZmlsZSdzIG15c3FsLgoJCX0KCQkKCQkvLyBSZXN0b3JlIGVhY2ggU1FMIGZpbGUgYXMgaXRzIG93biBwYWdlIGxvYWQuCgkJaWYgKCAhaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lRmlsZXMnXSApICkgeyAvLyBGaXJzdCBwYXNzIHNvIHBvcHVsYXRlIGxpc3Qgb2YgU1FMIGZpbGVzIG5lZWRpbmcgaW1wb3J0ZWQuCgkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lRmlsZXMnXSA9ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXMnXTsKCQl9CgkJJGZpbGVzUmVtYWluaW5nID0gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVGaWxlcyddOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NRTCBmaWxlcyB0byBpbXBvcnQ6ICcgLiBjb3VudCggJGZpbGVzUmVtYWluaW5nICkgKTsKCQlmb3JlYWNoKCAkZmlsZXNSZW1haW5pbmcgYXMgJHNxbF9maWxlICkgewoJCQkkZnVsbF9maWxlID0gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlc0xvY2F0aW9uJ10gLiAkc3FsX2ZpbGU7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ltcG9ydGluZyBTUUwgZmlsZSBgJyAuIGJhc2VuYW1lKCAkc3FsX2ZpbGUgKSAuICdgIChzaXplOiAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggQGZpbGVzaXplKCAkZnVsbF9maWxlICkgKSAuICcpLicgKTsKCQkJLy8gVGVsbCBteXNxbGJ1ZGR5IHRvIElNUE9SVCB0aGUgU1FMIGZpbGUuCgkJCSRpbXBvcnRfcmVzdWx0ID0gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydteXNxbGJ1ZGR5J10tPmltcG9ydCggJGZ1bGxfZmlsZSwgJG9sZFByZWZpeCA9ICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl9wcmVmaXgnXSwgJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddLCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2lnbm9yZVNxbEVycm9ycyddICk7CgkJCQoJCQlpZiAoIEZBTFNFID09PSAkaW1wb3J0X3Jlc3VsdCApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjOTUzODM0OiBQcm9ibGVtIGltcG9ydGluZyBkYXRhYmFzZS4gU2VlIHN0YXR1cyBsb2cgYWJvdmUgZm9yIGRldGFpbHMuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9IGVsc2VpZiAoIFRSVUUgPT09ICRpbXBvcnRfcmVzdWx0ICkgeyAvLyBTdWNjZXNzIG9uIHRoaXMgU1FMIGZpbGUuCgkJCQlpZiAoICcnICE9ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSApIHsgLy8gQ2h1bmtpbmcgd2FzIHVzZWQuIEdpdmUgc29tZSBzdGF0cy4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaHVua2luZyBpbXBvcnRlZCBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVSb3dzJ10gLiAnYCByb3dzIGluIGAnIC4gcm91bmQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVUaW1lJ10sIDMgKSAuICdgIHNlY29uZHMuIGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRlZFJlc3VtZUZhaWxzJ10gLiAnYCBTUUwgcXVlcnkgZmFpbHVyZXMuJyApOwoJCQkJfQoJCQkJCgkJCQlhcnJheV9zaGlmdCggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVGaWxlcyddICk7IC8vIEZpbmlzaGVkIHRoaXMgdGFibGUgc28gdGFrZSBpdCBvZmYgdGhlIHN0YWNrLgoJCQkJCgkJCQkvLyBSZXNldCBjaHVua2luZyBkYXRhIHNpbmNlIHRoaXMgZmlsZSBpcyBmaW5pc2hlZC4KCQkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSA9ICcnOwoJCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRlZFJlc3VtZVJvd3MnXSA9IDA7CgkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lRmFpbHMnXSA9IDA7CgkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lVGltZSddID0gMDsKCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgaW1wb3J0aW5nIFNRTCBmaWxlIGAnIC4gYmFzZW5hbWUoICRzcWxfZmlsZSApIC4gJ2AuIERhdGFiYXNlIGZpbGVzIHJlbWFpbmluZzogJyAuIGNvdW50KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gKSApOwoJCQkJLy8gTk9URTogQXMgb2Ygdjcgbm8gbG9uZ2VyIGNodW5raW5nIHBlciBTUUwgZmlsZSB0byBtYWtlIGJldHRlciB1c2Ugb2YgdGltZSBmb3IgbmV3IExpdmUgc21hbGwgc3FsIGZpbGVzLiBXQVM6IHJldHVybiBhcnJheSgpOyAvLyBBbnkgYXJyYXkgcmV0dXJuZWQgaGVyZSByZXN1bHRzIGluIHJlc3VtaW5nIHVzaW5nIHRoZSBsYXRlc3Qgc3RhdGUgZGF0YS4gc3FsRmlsZXNSZW1hbmluZyBpcyB3aGF0IHdlIGNhcmUgYWJvdXQga2VlcGluZyB1cCB0byBkYXRlIG9uIHdoaWNoIGZpbGUgdG8gZG8uCgkJCX0gZWxzZSB7IC8vIFJlc3VtZWQgY2h1bmtpbmcgbmVlZGVkLgoJCQkJaWYgKCAhIGlzX2FycmF5KCAkaW1wb3J0X3Jlc3VsdCApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTM0ODQ6IEV4cGVjdGVkIGFycmF5LiBHb3Q6IGAnIC4gJGltcG9ydF9yZXN1bHQgLiAnYC4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZVBvaW50J10gPSAkaW1wb3J0X3Jlc3VsdFswXTsKCQkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lUm93cyddICs9ICRpbXBvcnRfcmVzdWx0WzFdOwoJCQkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVGYWlscyddICs9ICRpbXBvcnRfcmVzdWx0WzJdOwoJCQkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVUaW1lJ10gKz0gJGltcG9ydF9yZXN1bHRbM107CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgaW1wb3J0IG5vdCB5ZXQgZmluaXNoZWQuIFJlc3VtZSBuZXh0IGF0IGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddIC4gJ2AuJyApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NvIGZhciBpbXBvcnRlZCBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVSb3dzJ10gLiAnYCByb3dzIGluIGAnIC4gcm91bmQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVUaW1lJ10sIDMgKSAuICdgIHNlY29uZHMuIGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRlZFJlc3VtZUZhaWxzJ10gLiAnYCBTUUwgcXVlcnkgZmFpbHVyZXMuJyApOwoJCQkJCXJldHVybiAkaW1wb3J0X3Jlc3VsdDsKCQkJCX0KCQkJfQoJCQkKCQl9IC8vIGVuZCBmb3JlYWNoLgoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIHJlc3RvcmUgZmluaXNoZWQgaW1wb3J0aW5nIGFsbCBTUUwgZmlsZXMuJyApOwoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgcmVzdG9yZURhdGFiYXNlKCkuCgkKCQoJCgkvKioKCSAqIENvcGllcyBCVUIgc2V0dGluZ3MgZnJvbSBvbGQgb3B0aW9ucyB0YWJsZSBvdmVyIHRvIG5ldyBvcHRpb25zIHRhYmxlCgkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjdXJyZW50bHkgY2FsbGVkIGlmIHRoZSBvcHRpb25zIHRhYmxlIHdhcyBub3QgaW5jbHVkZWQgaW4gdGhlIGJhY2t1cAoJICogTk9URTogQWxzbyBoYW5kbGVzIHN3YXBwaW5nIGlUaGVtZXMgTGljZW5zaW5nICYgU3luYyBhdXRoZW50aWNhdGlvbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN3YXBEYXRhYmFzZUJCU2V0dGluZ3MoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWlmICggJ2RlcGxveScgIT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgewoJCQlyZXR1cm4gJHRoaXMtPl9lcnJvciggJ1RoaXMgcmVzdG9yZSB0eXBlIGAnIC4gJHRoaXMtPl9zdGF0ZVsndHlwZSddIC4gJ2AgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbi4nICk7CgkJfQoJCQoJCS8vIENhbGN1bGF0ZSB0ZW1wb3JhcnkgdGFibGUgcHJlZml4ZXMuCgkJJG5ld1ByZWZpeCA9ICdiYm5ldy0nIC4gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApIC4gJ18nIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsgLy8gSW5jb21pbmcgc2l0ZS4KCQkkb2xkUHJlZml4ID0gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsgLy8gQ3VycmVudCBsaXZlIHNpdGUgcHJlZml4LgoJCWdsb2JhbCAkd3BkYjsKCQkKCQkkb3B0aW9uc190b19rZWVwID0gYXJyYXkoCgkJCSdwYl9iYWNrdXBidWRkeScsCgkJCSdpdGhlbWVzLXVwZGF0ZXIta2V5cycsCgkJCSdpdGhlbWVzLXN5bmMtY2FjaGUnLAoJCQknaXRoZW1lcy1zeW5jLWFkbWluX21lbnUnLAoJCQknaXRoZW1lcy1zeW5jLWF1dGhlbnRpY2F0ZWQnLAoJCQknaXRzZWNfaGlkZV9iYWNrZW5kJywgLy8gUHJldmVudHMgY3VzdG9tIGxvZ2luIFVSTCBmcm9tIHRyYW5zZmVycmluZy4KCQkpOwoJCQoJCWZvcmVhY2goICRvcHRpb25zX3RvX2tlZXAgYXMgJG9wdGlvbiApIHsKCQkJLy8gR2V0IGN1cnJlbnQgaVRoZW1lcyBMaWNlbnNpbmcgZm9yIGN1cnJlbnQgc2l0ZSAoaWYgYW55KS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29weWluZyBkYXRhIGZyb20gb3B0aW9ucyB0YWJsZSBmb3Igb3B0aW9uIGAnIC4gJG9wdGlvbiAuICdgLCBmcm9tIHRhYmxlIHByZWZpeGVkIHdpdGggYCcgLiAkb2xkUHJlZml4IC4gJ2AgdG8gYCcgLiAkbmV3UHJlZml4IC4gJ2AgdG8gcmV0YWluIGFuZCBub3QgZ2V0IG92ZXJ3cml0dGVuIGJ5IGluY29taW5nIHNpdGUgZGF0YS4nICk7CgkJCSRzcWwgPSAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JG9sZFByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0neyRvcHRpb259JyBMSU1JVCAxOyI7CgkJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJCWlmICggY291bnQoICRyZXN1bHRzICkgPiAwICkgewoJCQkJLy8gRGVsZXRlIGFueSBleGlzdGluZyBzZXR0aW5ncy4KCQkJCSR3cGRiLT5xdWVyeSggIkRFTEVURSBGUk9NIGB7JG5ld1ByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0neyRvcHRpb259JyBMSU1JVCAxOyIgKTsKCQkJCS8vIE92ZXJ3cml0ZSBpbmNvbWluZyBzaXRlIEJhY2t1cEJ1ZGR5IHNldHRpbmdzIGluIGl0cyB0ZW1wIHRhYmxlLgoJCQkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAiSU5TRVJUIElOVE8gYHskbmV3UHJlZml4fW9wdGlvbnNgICggb3B0aW9uX25hbWUsIG9wdGlvbl92YWx1ZSApIFZBTFVFUyggJyIgLiAkb3B0aW9uIC4gIicsICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRzWzBdWydvcHRpb25fdmFsdWUnXSApIC4gIicgKSIgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzIzNzkzMzI6IFVuYWJsZSB0byBjb3B5IG92ZXIgZGF0YSBmcm9tIGxpdmUgc2l0ZSB0byBpbmNvbWluZyBkYXRhYmFzZSBpbiB0ZW1wIHRhYmxlLiBEZXRhaWxzOiBgJyAuICR3cGRiLT5sYXN0X2Vycm9yIC4gJ2AuIE9wdGlvbiBuYW1lOiBgJyAuICRvcHRpb24gLiAnYC4nICk7CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01haW50YWluZWQgZGF0YSBieSBjb3B5aW5nIGl0IG92ZXIgaW5jb21pbmcgZGF0YWJhc2UuIE9wdGlvbnMgbmFtZTogYCcgLiAkb3B0aW9uIC4gJ2AuJyApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3B0aW9uIHdpdGggbmFtZSBgJyAuICRvcHRpb24gLiAnYCBub3QgZm91bmQuIFNraXBwaW5nLicgKTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gdHJ1ZTsKCQkKCX0gLy8gRW5kIHN3YXBEYXRhYmFzZUJCU2V0dGluZ3MoKS4KCQoJCgkvKiBzd2FwRGF0YWJhc2VzKCkKCSAqCgkgKiBST0xMQkFDSwoJICogU3dhcCBvdXQgdGhlIHJlY2VudGx5IGltcG9ydGVkIGRhdGFiYXNlIHRhYmxlcyB3aXRoIHRlbXAgcHJlZml4IGZvciB0aGUgbGl2ZSBkYXRhYmFzZS4KCSAqIFNldHMgbWFpbnRlbmFuY2UgbW9kZSBkdXJpbmcgdGhlIHN3YXAsIGFsdGhvdWdoIGl0IHNob3VsZCBiZSB2ZXJ5IGJyaWVmLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN3YXBEYXRhYmFzZXMoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWlmICggKCAncm9sbGJhY2snICE9ICR0aGlzLT5fc3RhdGVbJ3R5cGUnXSApICYmICggJ2RlcGxveScgIT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgKSB7IC8vIFJlc3RvcmUgbW9kZSB1c2VkIGZvciByZXN0b3J5aW5nIGR1cmluZyBkZXBsb3ltZW50LgoJCQkkdGhpcy0+X2Vycm9yKCAnVGhpcyByZXN0b3JlIHR5cGUgYCcgLiAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gLiAnYCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBUdXJuIG9uIG1haW50ZW5hbmNlIG1vZGUuCgkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPm1haW50ZW5hbmNlT24oKSApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0NvdWxkIG5vdCBlbmFibGUgbWFpbnRlbmFuY2UgbW9kZS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJZ2xvYmFsICR3cGRiOwoJCQoJCS8vIENhbGN1bGF0ZSB0ZW1wb3JhcnkgdGFibGUgcHJlZml4ZXMuCgkJJG5ld1ByZWZpeCA9ICdiYm5ldy0nIC4gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApIC4gJ18nOyAvLyBUZW1wIHByZWZpeCBmb3IgaG9sZGluZyB0aGUgTkVXbHkgaW1wb3J0ZWQgZGF0YS4KCQkkb2xkUHJlZml4ID0gJ2Jib2xkLScgLiBzdWJzdHIoICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddLCAwLCA0ICkgLiAnXyc7IC8vIFRlbXAgcHJlZml4IGZvciBob2xkaW5nIHRoZSBPTEQgKGN1cnJlbnRseSBsaXZlKSBkYXRhLgoJCQoJCS8vIEdldCBuZXdseSBpbXBvcnRlZCB0YWJsZXMgd2l0aCB0aGUgdGVtcCBwcmVmaXguCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hlY2tpbmcgZm9yIG5ld2x5IGltcG9ydGVkIHJvbGxiYWNrIHRhYmxlcyB3aXRoIHRlbXAgcHJlZml4IGAnIC4gJG5ld1ByZWZpeCAuICdgLicgKTsKCQkkc3FsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJyIgLiBzdHJfcmVwbGFjZSggJ18nLCAnXF8nLCAkbmV3UHJlZml4ICkgLiAiJScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiOwoJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm91bmQgJyAuIGNvdW50KCAkcmVzdWx0cyApIC4gJyBtYXRjaGluZyB0YWJsZXMuJyApOwoJCWlmICggMCA9PSBjb3VudCggJHJlc3VsdHMgKSApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0Vycm9yIGdldHRpbmcgdGFibGVzIG9yIG5vbmUgZm91bmQuIFNRTCBRdWVyeTogJyAuIGh0bWxlbnRpdGllcyggJHNxbCApICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gUmVuYW1lIG5ld2x5IGltcG9ydGVkIHRhYmxlcyB3aXRoIHRlbXAgcHJlZml4LCByZW5hbWluZyB0aGUgZXhpc3RpbmcgbGl2ZSB0YWJsZSBmaXJzdC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW5hbWUgYWxsIGV4aXN0aW5nIHRhYmxlcyB3aXRoIHRoaXMgdGVtcCBwcmVmaXggdG8gcHJlZml4IGAnIC4gJHdwZGItPnByZWZpeCAuICdgLicgKTsKCQlmb3JlYWNoKCAkcmVzdWx0cyBhcyAkcmVzdWx0ICkgewoJCQkKCQkJJG5ld1RhYmxlTmFtZSA9IHN0cl9yZXBsYWNlKCAkbmV3UHJlZml4LCAnJywgJHdwZGItPnByZWZpeCAuICRyZXN1bHRbJ3RhYmxlX25hbWUnXSApOyAvLyB0aGUgdGFyZ2V0IG5ldyB0YWJsZSBuYW1lIHdlIGFyZSBpbXBvcnRpbmcuCgkJCSRvbGRUYWJsZU5hbWUgPSAkb2xkUHJlZml4IC4gJG5ld1RhYmxlTmFtZTsgLy8gdGhlIHRhcmdldCBuYW1lIGZvciB0aGUgb2xkIHRhYmxlIHdoZXJlIHdlIGhvbGQgaXQgaW4gY2FzZSBpdCBuZWVkcyB1bmRvaW5nLgoJCQkKCQkJLy8gQ2hlY2sgaWYgZXhpc3Rpbmcgc2l0ZSBhbHJlYWR5IGhhZCB0aGlzIHRhYmxlLiBJZiBzbyB0aGVuIHdlIHdpbGwgbmVlZCB0byByZW5hbWUgaXQgdG8gYSB0ZW1wIHRhYmxlIG5hbWUgdG8gYWxsb3cgZm9yIHVuZG9pbmcuCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkbmV3VGFibGVOYW1lICkgLiAiJzsiOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTUUw6IGAnIC4gJHNxbCAuICdgLicgKTsKCQkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRzcWwsIEFSUkFZX0EgKTsKCQkJaWYgKCBjb3VudCggJHJlc3VsdHMgKSA+IDAgKSB7IC8vIFRoaXMgdGFibGUgZXhpc3RlZCBpbiB0aGUgZXhpc3Rpbmcgc2l0ZSBzbyBpdCBuZWVkcyB0byBiZSByZW5hbWVkLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVuYW1pbmcgdGFibGUgYCcgLiAkbmV3VGFibGVOYW1lIC4gJ2AgKGFscmVhZHkgZXhpc3RzIGluIHRoaXMgc2l0ZSkgdG8gYCcgLiAkb2xkVGFibGVOYW1lIC4gJ2AuJyApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAiUkVOQU1FIFRBQkxFIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRuZXdUYWJsZU5hbWUgKSAuICJgIFRPIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRvbGRUYWJsZU5hbWUgKSAuICJgOyIgKSApIHsKCQkJCQkkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzg0NDM4OWE6IFVuYWJsZSB0byByZW5hbWUgdGFibGUgYCcgLiAkbmV3VGFibGVOYW1lIC4gJ2AgdG8gYCcgLiAkb2xkVGFibGVOYW1lIC4gJ2AuIERldGFpbHM6IGAnIC4gJHdwZGItPmxhc3RfZXJyb3IgLiAnYC4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGUgYCcgLiAkbmV3VGFibGVOYW1lIC4gJ2AgZGlkIG5vdCBhbHJlYWR5IGV4aXN0IHNvIE5PVCByZW5hbWluZyB0byBgJyAuICRvbGRUYWJsZU5hbWUgLiAnYC4nICk7CgkJCX0KCQkJCgkJCS8vIFJlbmFtZSBpbXBvcnRlZCB0YWJsZSB0byBsaXZlIHByZWZpeC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVuYW1pbmcgaW5jb21pbmcgdGFibGUgYCcgLiAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gLiAnYCB0byBgJyAuICRuZXdUYWJsZU5hbWUgLiAnYC4nICk7CgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggIlJFTkFNRSBUQUJMRSBgIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKSAuICJgIFRPIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRuZXdUYWJsZU5hbWUgKSAuICJgOyIgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODQ0Mzg5YjogVW5hYmxlIHRvIHJlbmFtZSB0YWJsZSBgJyAuICRyZXN1bHRbJ3RhYmxlX25hbWUnXSAuICdgIHRvIGAnIC4gJG5ld1RhYmxlTmFtZSAuICdgLiBEZXRhaWxzOiBgJyAuICR3cGRiLT5sYXN0X2Vycm9yIC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCX0gLy8gZW5kIGZvcmVhY2guCgkJCgkJLy8gVHVybiBvZmYgbWFpbnRlbmFuY2UgbW9kZS4KCQkkdGhpcy0+bWFpbnRlbmFuY2VPZmYoKTsKCQkKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kCgkKCQoJCgkvKiBmaW5hbGl6ZVJvbGxiYWNrKCkKCSAqCgkgKiBST0xMQkFDSwoJICogRmluYWxpemUgdGhlIHJvbGxiYWNrLCBkZWxldGluZyBvcmlnaW5hbCB0YWJsZXMgJiBjbGVhbmluZyB1cCB0ZW1wIGZpbGVzLgoJICoKCSAqIEByZXR1cm4gdHJ1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZmluYWxpemVSb2xsYmFjaygpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJZ2xvYmFsICR3cGRiOwoJCSRzcWwgPSAiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX25hbWUgTElLRSAnYmJvbGQtIiAuIHN1YnN0ciggJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10sIDAsIDQgKSAuICJcXyUnIEFORCB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIjsKCQkvL2VjaG8gJHNxbDsKCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvdW5kICcgLiBjb3VudCggJHJlc3VsdHMgKSAuICcgdGFibGVzIHRvIGRyb3AuJyApOwoJCWZvcmVhY2goICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggIkRST1AgVEFCTEUgYCIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHJlc3VsdFsndGFibGVfbmFtZSddICkgLiAiYCIgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdVbmFibGUgdG8gZGVsZXRlIG9sZCB0YWJsZSBgJyAuICRyZXN1bHRbJ3RhYmxlX25hbWUnXSAuICdgLicgKTsKCQkJfQoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZWxldGluZyB1bmRvIGZpbGUuJyApOwoJCUB1bmxpbmsoIEFCU1BBVEggLiAkdGhpcy0+X3N0YXRlWyd1bmRvRmlsZSddICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVsZXRpbmcgdGVtcCBmaWxlcy4nICk7CgkJcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgZmluYWxpemUgZnVuY3Rpb24uJyApOwoJCXJldHVybiB0cnVlOwoJfSAvLyBlbmQgZmluYWxpemVSb2xsYmFjaygpLgoJCgkKCQoJcHVibGljIGZ1bmN0aW9uIHJlc3RvcmVGaWxlcygpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJLy8gWmlwICYgVW56aXAgbGlicmFyeSBzZXR1cC4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10sIGFycmF5KCksICd1bnppcCcgKTsKCQkKCQlpZiAoICEgZmlsZV9leGlzdHMoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGZpbmQgc3BlY2lmaWVkIGJhY2t1cCBhcmNoaXZlIGAnIC4gICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSAuICdgJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1VuemlwcGluZyBhcmNoaXZlIGAnIC4gJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddIC4gJ2AgaW50byBgJyAuICR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlUm9vdCddIC4gJ2AnICk7CgkJCgkJLy8gU2V0IGNvbXBhdGliaWxpdHkgbW9kZSBpZiBkZWZpbmVkIGluIGFkdmFuY2VkIG9wdGlvbnMuCgkJaWYgKCAnYWxsJyA9PSAkdGhpcy0+X3N0YXRlWyd6aXBNZXRob2RTdHJhdGVneSddICkgewoJCQkkY29tcGF0aWJpbGl0eU1vZGUgPSBmYWxzZTsKCQl9IGVsc2UgewoJCQkkY29tcGF0aWJpbGl0eU1vZGUgPSAkdGhpcy0+X3N0YXRlWyd6aXBNZXRob2RTdHJhdGVneSddOwoJCX0KCQkKCQkvLyBFeHRyYWN0IHppcCBmaWxlICYgdmVyaWZ5IGl0IHdvcmtlZC4KCQlpZiAoIHRydWUgIT09ICggJHJlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXS0+dW56aXAoICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSwgJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10sICRjb21wYXRpYmlsaXR5TW9kZSApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdGYWlsdXJlIGV4dHJhY3RpbmcgYmFja3VwIGFyY2hpdmUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3VjY2VzcyBleHRyYWN0aW5nIGJhY2t1cCBhcmNoaXZlLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCQoJfSAvLyBFbmQgcmVzdG9yZUZpbGVzKCkuCgkKCQoJCgkvKiBfcHJpb3JSb2xsYmFja0NsZWFudXAoKQoJICoKCSAqIFJPTExCQUNLCgkgKiBDbGVhbnMgdXAgYW55IGV4aXN0aW5nIHRlbXAgZGF0YWJhc2UgdGFibGVzIHRoYXQgZXhpc3QgZnJvbSBhIHByaW9yIGZhaWxlZC9pbmNvbXBsZXRlIHJvbGxiYWNrIHRoYXQgbmVlZCByZW1vdmVkLgoJICoKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfcHJpb3JSb2xsYmFja0NsZWFudXAoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoZWNraW5nIGZvciBhbnkgcHJpb3IgZmFpbGVkIHJvbGxiYWNrIGRhdGEgdG8gY2xlYW4gdXAuJyApOwoJCWdsb2JhbCAkd3BkYjsKCQkKCQkkc2hvcnRTZXJpYWwgPSBzdWJzdHIoICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddLCAwLCA0ICk7CgkJCgkJLy8gTkVXIHByZWZpeAoJCSRzcWwgPSAiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX25hbWUgTElLRSAnYmJuZXctIiAuICRzaG9ydFNlcmlhbCAuICJcXyUnIEFORCB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIjsKCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvdW5kICcgLiBjb3VudCggJHJlc3VsdHMgKSAuICcgdGFibGVzIHRvIGRyb3Agd2l0aCB0aGUgcHJlZml4IGBiYm5ldy0nIC4gJHNob3J0U2VyaWFsIC4gJ19gLicgKTsKCQkkZHJvcENvdW50ID0gMDsKCQlmb3JlYWNoKCAkcmVzdWx0cyBhcyAkcmVzdWx0ICkgewoJCQlpZiAoIGZhbHNlID09PSAkd3BkYi0+cXVlcnkoICJEUk9QIFRBQkxFIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRbJ3RhYmxlX25hbWUnXSApIC4gImAiICkgKSB7CgkJCQkkdGhpcy0+X2Vycm9yKCAnVW5hYmxlIHRvIGRlbGV0ZSB0YWJsZSBgJyAuICRyZXN1bHRbJ3RhYmxlX25hbWUnXSAuICdgLicgKTsKCQkJfSBlbHNlIHsKCQkJCSRkcm9wQ291bnQrKzsKCQkJfQoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEcm9wcGVkIGAnIC4gJGRyb3BDb3VudCAuICdgIG5ldyB0YWJsZXMuJyApOwoJCQoJCS8vIE9MRCBwcmVmaXgKCQkkc3FsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJ2Jib2xkLSIgLiAkc2hvcnRTZXJpYWwgLiAiXF8lJyBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSI7CgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRzcWwsIEFSUkFZX0EgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCAnIC4gY291bnQoICRyZXN1bHRzICkgLiAnIHRhYmxlcyB0byBkcm9wIHdpdGggdGhlIHByZWZpeCBgYmJvbGQtJyAuICRzaG9ydFNlcmlhbCAuICdfYC4nICk7CgkJJGRyb3BDb3VudCA9IDA7CgkJZm9yZWFjaCggJHJlc3VsdHMgYXMgJHJlc3VsdCApIHsKCQkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAiRFJPUCBUQUJMRSBgIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKSAuICJgIiApICkgewoJCQkJJHRoaXMtPl9lcnJvciggJ1VuYWJsZSB0byBkZWxldGUgdGFibGUgYCcgLiAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQkkZHJvcENvdW50Kys7CgkJCX0KCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBlZCBgJyAuICRkcm9wQ291bnQgLiAnYCBvbGQgdGFibGVzLicgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBwcmlvciByb2xsYmFjayBjbGVhbnVwLicgKTsKCX0gLy8gZW5kLgoJCgkKCQoJLyogbWFpbnRlbmFuY2VPbigpCgkgKgoJICogVHVybiBPTiBXb3JkUHJlc3MgbWFpbnRlbmFuY2UgbW9kZS4KCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtYWludGVuYW5jZU9uKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQkvLyBUdXJuIG9uIG1haW50ZW5hbmNlIG1vZGUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVHVybmluZyBvbiBtYWludGVuYW5jZSBtb2RlIG9uLicgKTsKCQlpZiAoICEgZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLm1haW50ZW5hbmNlJyApICkgewoJCQkkbWFpbnRlbmFuY2VfcmVzdWx0ID0gQGZpbGVfcHV0X2NvbnRlbnRzKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScsICI8P3BocCBpZiAoIGVtcHR5KCBcJF9SRVFVRVNUWydhY3Rpb24nXSApIHx8ICdwYl9iYWNrdXBidWRkeV9iYWNrdXBidWRkeScgIT0gXCRfUkVRVUVTVFsnYWN0aW9uJ10gKSB7IGhlYWRlcignSFRUUC8xLjEgNTAzIFNlcnZpY2UgVGVtcG9yYXJpbHkgVW5hdmFpbGFibGUnKTsgaGVhZGVyKCdTdGF0dXM6IDUwMyBTZXJ2aWNlIFRlbXBvcmFyaWx5IFVuYXZhaWxhYmxlJyk7IGhlYWRlcignUmV0cnktQWZ0ZXI6IDM2MDAnKTsgZGllKCAnU2l0ZSB1bmRlcmdvaW5nIG1haW50ZW5hbmNlLicgKTsgfSIgKTsKCQkJaWYgKCBmYWxzZSA9PT0gJG1haW50ZW5hbmNlX3Jlc3VsdCApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICcubWFpbnRlbmFuY2UgZmlsZSB1bmFibGUgdG8gYmUgZ2VuZXJhdGVkIHRvIHByZXZlbnQgdmlld2luZy4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICcubWFpbnRlbmFuY2UgZmlsZSBnZW5lcmF0ZWQgdG8gcHJldmVudCB2aWV3aW5nIHBhcnRpYWxseSBtaWdyYXRlZCBzaXRlLicgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGFscmVhZHkgZXhpc3RzLiBTa2lwcGluZyBjcmVhdGlvbi4nICk7CgkJfQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgbWFpbnRlbmFuY2VPbigpLgoJCgkKCQoJLyogbWFpbnRlbmFuY2VPZmYoKQoJICoKCSAqIFR1cm4gT0ZGIFdvcmRQcmVzcyBtYWludGVuYW5jZSBtb2RlLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG1haW50ZW5hbmNlT2ZmKCAkb25seURlbGV0ZU91ckZpbGUgPSBmYWxzZSApIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVHVybiBvZmYgbWFpbnRlbmFuY2UgbW9kZSBvZmYgaWYgb24uJyApOwoJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLm1haW50ZW5hbmNlJyApICkgewoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJG9ubHlEZWxldGVPdXJGaWxlICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnLm1haW50ZW5hbmNlIGZpbGUgZXhpc3RzLiBEZWxldGluZyB3aGV0aGVyIGltcG9ydGJ1ZGR5LWNyZWF0ZWQgb3Igbm90Li4uJyApOwoJCQkJaWYgKCBmYWxzZSA9PT0gQHVubGluayggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBkZWxldGUgdGVtcG9yYXJ5IC5tYWludGVuYW5jZSBmaWxlLiAgVGhpcyBpcyBsaWtlbHkgZHVlIHRvIHBlcm1pc3Npb25zLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgZGVsZXRlIGl0IHRvIHZpZXcgeW91ciBzaXRlLicgKTsKCQkJCQkkdGhpcy0+X2Vycm9yKCAnVW5hYmxlIHRvIGRlbGV0ZSAubWFpbnRlbmFuY2UgZmlsZS4nICk7CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGRlbGV0ZWQgd2hldGhlciBpbXBvcnRidWRkeS1jcmVhdGVkIG9yIG5vdC4nICk7CgkJCQl9CgkJCX0gZWxzZSB7IC8vIFNlZSBpZiBJbXBvcnRCdWRkeSBjcmVhdGVkIGl0IGJlZm9yZSBkZWxldGluZy4KCgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnLm1haW50ZW5hbmNlIGZpbGUgZXhpc3RzLiBDaGVja2luZyB0byBzZWUgaWYgSW1wb3J0QnVkZHkgZ2VuZXJhdGVkIGl0LicgKTsKCQkJCSRtYWludGVuYW5jZV9jb250ZW50cyA9IEBmaWxlX2dldF9jb250ZW50cyggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICk7CgkJCQlpZiAoIGZhbHNlID09PSAkbWFpbnRlbmFuY2VfY29udGVudHMgKSB7IC8vIENhbm5vdCByZWFkLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICcubWFpbnRlbmFuY2UgZmlsZSB1bnJlYWRhYmxlLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgZGVsZXRlIGl0IHRvIHZpZXcgeW91ciBzaXRlLicgKTsKCQkJCX0gZWxzZSB7IC8vIFJlYWQgZmlsZSBzdWNjZWVkZWQuCgkJCQkJaWYgKCB0cmltKCAkbWFpbnRlbmFuY2VfY29udGVudHMgKSA9PSAiPD9waHAgaWYgKCBlbXB0eSggXCRfUkVRVUVTVFsnYWN0aW9uJ10gKSB8fCAncGJfYmFja3VwYnVkZHlfYmFja3VwYnVkZHknICE9IFwkX1JFUVVFU1RbJ2FjdGlvbiddICkgeyBoZWFkZXIoJ0hUVFAvMS4xIDUwMyBTZXJ2aWNlIFRlbXBvcmFyaWx5IFVuYXZhaWxhYmxlJyk7IGhlYWRlcignU3RhdHVzOiA1MDMgU2VydmljZSBUZW1wb3JhcmlseSBVbmF2YWlsYWJsZScpOyBoZWFkZXIoJ1JldHJ5LUFmdGVyOiAzNjAwJyk7IGRpZSggJ1NpdGUgdW5kZXJnb2luZyBtYWludGVuYW5jZS4nICk7IH0iICkgeyAvLyBPdXIgZmlsZS4gRGVsZXRlIGl0IQoJCQkJCQkkbWFpbnRlbmFuY2VfdW5saW5rID0gQHVubGluayggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICk7CgkJCQkJCWlmICggdHJ1ZSA9PT0gJG1haW50ZW5hbmNlX3VubGluayApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZSBjcmVhdGVkIGJ5IEltcG9ydEJ1ZGR5IHN1Y2Nlc3NmdWxseSBkZWxldGVkLicgKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZS4gIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBwZXJtaXNzaW9ucy4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSBpdCB0byB2aWV3IHlvdXIgc2l0ZS4nICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgeyAvLyBOb3Qgb3VyIGZpbGUuIExlYXZlIGFsb25lLiBXZSB3aWxsIHdhcm4gYWJvdXQgdGhpcyBsYXRlciB0aG91Z2guCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIG5vdCBnZW5lcmF0ZWQgYnkgSW1wb3J0QnVkZHkuIExlYXZpbmcgYXMgaXMuIFlvdSBtYXkgbmVlZCB0byBkZWxldGUgaXQgdG8gdmlldyB5b3VyIHNpdGUuJyApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJCgkJCX0KCQkJCgkJCQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGRvZXMgbm90IGV4aXN0LicgKTsKCQl9Cgl9IC8vIEVuZCBtYWludGVuYW5jZU9mZigpLgoKCgoJLyoqCgkgKgltaWdyYXRlV3BDb25maWcoKQoJICoKCSAqCUByZXR1cm4JCXRydWUgb24gc3VjY2VzcywgbmV3IHdwIGNvbmZpZyBmaWxlIGNvbnRlbnQgb24gZmFpbHVyZS4KCSAqLwoJZnVuY3Rpb24gbWlncmF0ZVdwQ29uZmlnKCkgewoJCWlmICggJ2RlcGxveScgPT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTa2lwcGluZyB3cC1jb25maWcucGhwIG1pZ3JhdGlvbiBkdWUgdG8gYmVpbmcgRGVwbG95bWVudC4nICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlpZiAoIGlzc2V0KCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnd3AtY29uZmlnX2luX3BhcmVudCddICkgKSB7CgkJCWlmICggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3dwLWNvbmZpZ19pbl9wYXJlbnQnXSA9PT0gdHJ1ZSApIHsgLy8gd3AtY29uZmlnLnBocCB1c2VkIHRvIGJlIGluIHBhcmVudC4gTXVzdCBjb3B5IGZyb20gdGVtcCBkaXIgdG8gcm9vdC4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RBVCBmaWxlIGluZGljYXRlcyB3cC1jb25maWcucGhwIHdhcyBwcmV2aW91c2x5IGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiBDb3B5aW5nIGludG8gc2l0ZSByb290LicgKTsKCgkJCQkkY29uZmlnX3NvdXJjZSA9IEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy93cC1jb25maWcucGhwJzsKCQkJCSRyZXN1bHQgPSBjb3B5KCAkY29uZmlnX3NvdXJjZSwgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApOwoJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3dwLWNvbmZpZy5waHAgZmlsZSB3YXMgcmVzdG9yZWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHNpdGUgYCcgLiBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHBgLiBJdCB3YXMgcHJldmlvdXNseSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIHNpdGUuIFlvdSBtYXkgbW92ZSBpdCBtYW51YWxseSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeS4nICk7CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gbW92ZSB3cC1jb25maWcucGhwIGZpbGUgZnJvbSB0ZW1wb3JhcnkgbG9jYXRpb24gYCcgLiAkY29uZmlnX3NvdXJjZSAuICdgIHRvIHJvb3QuJyApOwoJCQkJfQoKCQkJfSBlbHNlIHsgLy8gd3AtY29uZmlnLnBocCB3YXMgaW4gbm9ybWFsIGxvY2F0aW9uIG9uIHNvdXJjZSBzaXRlLiBOb3RoaW5nIHRvIGRvLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnREFUIGZpbGUgaW5kaWNhdGVzIHdwLWNvbmZpZy5waHAgd2FzIHByZXZpb3VzbHkgaW4gdGhlIG5vcm1hbCBsb2NhdGlvbi4nICk7CgkJCX0KCQl9IGVsc2UgeyAvLyBQcmUgMy4wIGJhY2t1cAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCYWNrdXAgcHJlLXYzLjAgc28gd3AtY29uZmlnLnBocCBtdXN0IGJlIGluIG5vcm1hbCBsb2NhdGlvbi4nICk7CgkJfQoKCQlpZiAoICdmaWxlcycgPT0gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2JhY2t1cF90eXBlJ10gKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwaW5nIHVwZGF0ZSBvZiBEYXRhYmFzZSBTZXR0aW5ncyBhbmQgVVJMcyBpbiB3cC1jb25maWcucGhwIGFzIHRoaXMgaXMgYSBGaWxlcyBPbmx5IEJhY2t1cC4nICk7CgkJCSRtaWdyYXRlUmVzdWx0ID0gdHJ1ZTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdVcGRhdGluZyBEYXRhYmFzZSBTZXR0aW5ncyBhbmQgVVJMcyBpbiB3cC1jb25maWcucGhwIGFzIHRoaXMgaXMgbm90IGEgRmlsZXMgT25seSBCYWNrdXAuJyApOwoJCQkkbWlncmF0ZVJlc3VsdCA9ICR0aGlzLT5fbWlncmF0ZVdwQ29uZmlnR3J1bnR3b3JrKCk7CgkJfQoJCXJldHVybiAkbWlncmF0ZVJlc3VsdDsKCX0gLy8gRW5kIG1pZ3JhdGVXcENvbmZpZygpLgoKCgoJLyoqCgkgKglfbWlncmF0ZVdwQ29uZmlnR3J1bnR3b3JrKCkKCSAqCgkgKglNaWdyYXRlcyBhbmQgdXBkYXRlcyB0aGUgd3AtY29uZmlnLnBocCBmaWxlIGNvbnRlbnRzIGFzIG5lZWRlZC4KCSAqCgkgKglAcmV0dXJuCQkJdHJ1ZXxzdHJpbmcJCQlUcnVlIG9uIHN1Y2Nlc3MuIE9uIGZhbHNlIHJldHVybnMgdGhlIG5ldyB3cC1jb25maWcgZmlsZSBjb250ZW50LgoJICovCglmdW5jdGlvbiBfbWlncmF0ZVdwQ29uZmlnR3J1bnR3b3JrKCkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1N0YXJ0aW5nIG1pZ3JhdGlvbiBvZiB3cC1jb25maWcucGhwIGZpbGUuLi4nICk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoKCQkkY29uZmlnRmlsZSA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29uZmlnIGZpbGU6IGAnIC4gJGNvbmZpZ0ZpbGUgLiAnYC4nICk7CgoJCWlmICggZmlsZV9leGlzdHMoICRjb25maWdGaWxlICkgKSB7CgkJCS8vIFVzZWZ1bCBSRUdFWCBzaXRlOiBodHRwOi8vZ3NraW5uZXIuY29tL1JlZ0V4ci8KCgkJCSR1cGRhdGVkX2hvbWVfdXJsID0gZmFsc2U7CgkJCSR3cF9jb25maWcgPSBhcnJheSgpOwoJCQkkbGluZXMgPSBmaWxlKCAkY29uZmlnRmlsZSApOwoKCQkJJHBhdHRlcm5zID0gYXJyYXkoKTsKCQkJJHJlcGxhY2VtZW50cyA9IGFycmF5KCk7CgoJCQkvKgoJCQlVcGRhdGUgV1BfU0lURVVSTCwgV1BfSE9NRSBpZiB0aGV5IGV4aXN0LgoJCQlVcGRhdGUgZGF0YWJhc2UgREJfTkFNRSwgREJfVVNFUiwgREJfUEFTU1dPUkQsIGFuZCBEQl9IT1NULgoJCQlSZWdFeHA6IC9kZWZpbmVcKFtcc10qKCd8IilXUF9TSVRFVVJMKCd8IiksW1xzXSooJ3wiKSguKSooJ3wiKVtcc10qXCk7L2dpCgkJCXBhdHRlcm46IGRlZmluZVwoW1xzXSooJ3wiKVdQX1NJVEVVUkwoJ3wiKSxbXHNdKignfCIpKC4pKignfCIpW1xzXSpcKTsKCQkJKi8KCQkJJHBhdHRlcm5bMF0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilXUF9TSVRFVVJMKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVswXSA9ICJkZWZpbmUoICdXUF9TSVRFVVJMJywgJyIgLiB0cmltKCAkdGhpcy0+X3N0YXRlWydzaXRldXJsJ10sICcvJyApIC4gIicgKTsiOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwOiBTZXR0aW5nIFdQX1NJVEVVUkwgKGlmIGFwcGxpY2FibGUpIHRvIGAnIC4gdHJpbSggJHRoaXMtPl9zdGF0ZVsnc2l0ZXVybCddLCAnLycgKSAuICdgLicgKTsKCQkJJHBhdHRlcm5bMV0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilXUF9IT01FKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVsxXSA9ICJkZWZpbmUoICdXUF9IT01FJywgJyIgLiB0cmltKCAkdGhpcy0+X3N0YXRlWydob21ldXJsJ10sICcvJyApIC4gIicgKTsiOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwOiBTZXR0aW5nIFdQX0hPTUUgKGlmIGFwcGxpY2FibGUpIHRvIGAnIC4gdHJpbSggJHRoaXMtPl9zdGF0ZVsnaG9tZXVybCddLCAnLycgKSAuICdgLicgKTsKCgkJCSRwYXR0ZXJuWzJdID0gJy9kZWZpbmVcKFtcc10qKFwnfCIpREJfTkFNRShcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJJHJlcGxhY2VbMl0gPSAiZGVmaW5lKCAnREJfTkFNRScsICciIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydkYXRhYmFzZSddIC4gIicgKTsiOwoJCQkkcGF0dGVyblszXSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX1VTRVIoXCd8IiksW1xzXSooXCd8IikoLikqKFwnfCIpW1xzXSpcKTsvaSc7CgkJCSRyZXBsYWNlWzNdID0gImRlZmluZSggJ0RCX1VTRVInLCAnIiAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndXNlcm5hbWUnXSAuICInICk7IjsKCQkJJHBhdHRlcm5bNF0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9QQVNTV09SRChcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJJHJlcGxhY2VbNF0gPSAiZGVmaW5lKCAnREJfUEFTU1dPUkQnLCAnIiAuICR0aGlzLT5fcHJlZ19lc2NhcGVfYmFjayggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwYXNzd29yZCddICkgLiAiJyApOyI7CgkJCSRwYXR0ZXJuWzVdID0gJy9kZWZpbmVcKFtcc10qKFwnfCIpREJfSE9TVChcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJJHJlcGxhY2VbNV0gPSAiZGVmaW5lKCAnREJfSE9TVCcsICciIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzZXJ2ZXInXSAuICInICk7IjsKCQkJCgkJCS8vIElmIG11bHRpc2l0ZSwgdXBkYXRlIGRvbWFpbi4KCQkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkb21haW4nXSApICYmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkb21haW4nXSAhPSAnJyApICkgewoJCQkJJHBhdHRlcm5bNl0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilET01BSU5fQ1VSUkVOVF9TSVRFKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkJJHJlcGxhY2VbNl0gPSAiZGVmaW5lKCAnRE9NQUlOX0NVUlJFTlRfU0lURScsICciIC4gJHRoaXMtPl9zdGF0ZVsnZGVmYXVsdERvbWFpbiddIC4gIicgKTsiOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnd3AtY29uZmlnLnBocDogU2V0dGluZyBET01BSU5fQ1VSUkVOVF9TSVRFIChpZiBhcHBsaWNhYmxlKSB0byBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGVmYXVsdERvbWFpbiddIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnd3AtY29uZmlnLnBocCBkaWQgbm90IHVwZGF0ZSBET01BSU5fQ1VSUkVOVF9TSVRFIGFzIGl0IHdhcyBibGFuay4nICk7CgkJCX0KCQkJLyoKCQkJVXBkYXRlIHRhYmxlIHByZWZpeC4KCQkJUmVnRXhwOiAvXCR0YWJsZV9wcmVmaXhbXHNdKj1bXHNdKignfCIpKC4pKignfCIpOy9naQoJCQlwYXR0ZXJuOiBcJHRhYmxlX3ByZWZpeFtcc10qPVtcc10qKCd8IikoLikqKCd8Iik7CgkJCSovCgkJCSRwYXR0ZXJuWzddID0gJy9cJHRhYmxlX3ByZWZpeFtcc10qPVtcc10qKFwnfCIpKC4pKihcJ3wiKTsvaSc7CgkJCSRyZXBsYWNlWzddID0gJyR0YWJsZV9wcmVmaXggPSBcJycgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddIC4gJ1wnOyc7CgkJCQoJCQlpZiAoIGlzc2V0KCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnd3BfY29udGVudF91cmwnXSApICkgewoJCQkJJG5ld19jb250ZW50X3VybCA9IHN0cl9yZXBsYWNlKCB0cmltKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnc2l0ZXVybCddLCAnXFwvJyApLCB0cmltKCAkdGhpcy0+X3N0YXRlWydzaXRldXJsJ10sICcvJyApLCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnd3BfY29udGVudF91cmwnXSApOwoJCQkJJHBhdHRlcm5bOF0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilXUF9DT05URU5UX1VSTChcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJCSRyZXBsYWNlWzhdID0gImRlZmluZSggJ1dQX0NPTlRFTlRfVVJMJywgJyIgLiAkbmV3X2NvbnRlbnRfdXJsIC4gIicgKTsiOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnd3AtY29uZmlnLnBocDogU2V0dGluZyBXUF9DT05URU5UX1VSTCAoaWYgYXBwbGljYWJsZSkgdG8gYCcgLiAkbmV3X2NvbnRlbnRfdXJsIC4gJ2AuJyApOwoJCQl9CgkJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWyd3cF9jb250ZW50X2RpciddICkgKSB7CgkJCQkkbmV3X2NvbnRlbnRfZGlyID0gc3RyX3JlcGxhY2UoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydhYnNwYXRoJ10sIEFCU1BBVEgsICR0aGlzLT5fc3RhdGVbJ2RhdCddWyd3cF9jb250ZW50X2RpciddICk7CgkJCQkkcGF0dGVybls5XSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKVdQX0NPTlRFTlRfRElSKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkJJHJlcGxhY2VbOV0gPSAiZGVmaW5lKCAnV1BfQ09OVEVOVF9ESVInLCAnIiAuICRuZXdfY29udGVudF9kaXIgLiAiJyApOyI7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwOiBTZXR0aW5nIFdQX0NPTlRFTlRfRElSIChpZiBhcHBsaWNhYmxlKSB0byBgJyAuICRuZXdfY29udGVudF9kaXIgLiAnYC4nICk7CgkJCX0KCgkJCS8vIFBlcmZvcm0gdGhlIGFjdHVhbCByZXBsYWNlbWVudC4KCQkJJGxpbmVzID0gcHJlZ19yZXBsYWNlKCAkcGF0dGVybiwgJHJlcGxhY2UsICRsaW5lcyApOwoKCQkJLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gdGhpcyBmaWxlLgoJCQlpZiAoICEgaXNfd3JpdGFibGUoICRjb25maWdGaWxlICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdXYXJuaW5nICMyODU3Mjogd3AtY29uZmlnLnBocCBzaG93cyB0byBiZSB1bndyaXRhYmxlLiBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIHBlcm1pc3Npb25zIHRlbXBvcmFyaWx5LicgKTsKCQkJCSRvbGRQZXJtcyA9ICggZmlsZXBlcm1zKCAkY29uZmlnRmlsZSApICYgMDc3NyApOwoJCQkJQGNobW9kKCAkY29uZmlnRmlsZSwgMDY0NCApOyAvLyBUcnkgdG8gbWFrZSB3cml0YWJsZS4KCQkJfQoKCQkJLy8gV3JpdGUgY2hhbmdlcyB0byBjb25maWcgZmlsZS4KCQkJaWYgKCBmYWxzZSA9PT0gKCBmaWxlX3B1dF9jb250ZW50cyggJGNvbmZpZ0ZpbGUsICRsaW5lcyApICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFUlJPUiAjODQ5Mjg6IFVuYWJsZSB0byBzYXZlIGNoYW5nZXMgdG8gd3AtY29uZmlnLnBocC4gVmVyaWZ5IHRoaXMgZmlsZSBoYXMgcHJvcGVyIHdyaXRlIHBlcm1pc3Npb25zLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgZWRpdCBpdC4nLCB0cnVlLCAnOTAyMCcgKTsKCQkJCXJldHVybiBpbXBsb2RlKCAiXG4iLCAkbGluZXMgKTsKCQkJfQoKCQkJLy8gUmVzdG9yZSBwcmlvciBwZXJtaXNzaW9ucyBpZiBhcHBsaWNhYmxlLgoJCQlpZiAoIGlzc2V0KCAkb2xkUGVybXMgKSApIHsKCQkJCUBjaG1vZCggJGNvbmZpZ0ZpbGUsICRvbGRQZXJtcyApOwoJCQl9CgoJCQl1bnNldCggJGxpbmVzICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnV2FybmluZzogd3AtY29uZmlnLnBocCBmaWxlIG5vdCBmb3VuZC4nICk7CgkJCS8vcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnTm90ZTogd3AtY29uZmlnLnBocCBmaWxlIG5vdCBmb3VuZC4gVGhpcyBpcyBub3JtYWwgZm9yIGEgZGF0YWJhc2Ugb25seSBiYWNrdXAuJyApOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTWlncmF0aW9uIG9mIHdwLWNvbmZpZy5waHAgY29tcGxldGUuJyApOwoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIF9taWdyYXRlV3BDb25maWdHcnVudHdvcmsoKS4KCQoJCgkKCS8qCV9wcmVnX2VzY2FwZV9iYWNrKCkKCSAqCQoJICoJRXNjYXBlIGJhY2tyZWZlcmVuY2VzIGZyb20gc3RyaW5nIGZvciB1c2Ugd2l0aCByZWdleC4gVXNlZCBieSBtaWdyYXRlX3dwX2NvbmZpZygpLgoJICoJQHNlZSBtaWdyYXRlX3dwX2NvbmZpZygpCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc3RyaW5nCQlTdHJpbmcgdG8gZXNjYXBlLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlFc2NhcGVkIHN0cmluZy4KCSAqLwoJZnVuY3Rpb24gX3ByZWdfZXNjYXBlX2JhY2soJHN0cmluZykgewoJCS8vIFJlcGxhY2UgJCB3aXRoIFwkLCBcIHdpdGggXFwsIGFuZCAnIHdpdGggXCcKCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcjKD88IVxcXFwpKFxcJHxcXFxcKSMnLCAnXFxcXCQxJywgJHN0cmluZyk7CgkJJHN0cmluZyA9IHN0cl9yZXBsYWNlKCAiJyIsICJcJyIsICRzdHJpbmcgKTsKCQlyZXR1cm4gJHN0cmluZzsKCX0gLy8gRW5kIF9wcmVnX2VzY2FwZV9iYWNrKCkuCgkKCQoJCgkvKiB0cm91YmxlU2NhbigpCgkgKgoJICogU2NhbnMgZm9yIHBvdGVudGlhbCBwcm9ibGVtcyBhbmQgcHJvdmlkZWQgaW5mb3JtYXRpdmUgd2FybmluZ3MuCgkgKgoJICogQHJldHVybiBhcnJheSBBcnJheSBvZiB0ZXh0IHdhcm5pbmdzIHRvIGRpc3BsYXkgdG8gdXNlci4KCSAqCgkgKi8KCWZ1bmN0aW9uIHRyb3VibGVTY2FuKCkgewoJCSR0cm91YmxlID0gYXJyYXkoKTsKCgkJLy8gLm1haW50ZW5hbmNlCgkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICkgKSB7CgkJCSR0cm91YmxlW10gPSAnLm1haW50ZW5hbmNlIGZpbGUgZm91bmQgaW4gV29yZFByZXNzIHJvb3QuIFRoZSBzaXRlIG1heSBub3QgYmUgYWNjZXNzaWJsZSB1bmxlc3MgdGhpcyBmaWxlIGlzIGRlbGV0ZWQuJzsKCQl9CgoJCS8vIGluZGV4Lmh0bQoJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnaW5kZXguaHRtJyApICkgewoJCQkkdHJvdWJsZVtdID0gJ2luZGV4Lmh0bSBmaWxlIGZvdW5kIGluIFdvcmRQcmVzcyByb290LiBUaGlzIG1heSBwcmV2ZW50IFdvcmRQcmVzcyBmcm9tIGxvYWRpbmcgb24gc29tZSBzZXJ2ZXJzLiBTb2x1dGlvbjogRGVsZXRlIHRoZSBmaWxlLic7CgkJfQoKCQkvLyBpbmRleC5odG1sCgkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdpbmRleC5odG1sJyApICkgewoJCQkkdHJvdWJsZVtdID0gJ2luZGV4Lmh0bWwgZmlsZSBmb3VuZCBpbiBXb3JkUHJlc3Mgcm9vdC4gVGhpcyBtYXkgcHJldmVudCBXb3JkUHJlc3MgZnJvbSBsb2FkaW5nIG9uIHNvbWUgc2VydmVycy4gU29sdXRpb246IERlbGV0ZSB0aGUgZmlsZS4nOwoJCX0KCgkJLy8gd3AtY29uZmlnLnBocAoJCWlmICggISBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApICkgewoJCQkkdHJvdWJsZVtdID0gJ1dhcm5pbmcgb25seTogd3AtY29uZmlnLnBocCBmaWxlIG5vdCBmb3VuZCBXb3JkUHJlc3Mgcm9vdC4gPGk+SWYgdGhpcyBpcyBhIGRhdGFiYXNlLW9ubHkgcmVzdG9yZSB5b3Ugc2hvdWxkIHJlc3RvcmUgYSBmdWxsIGJhY2t1cC48L2k+JzsKCQl9IGVsc2UgeyAvLyB3cC1jb25maWcucGhwIGV4aXN0cyBzbyBjaGVjayBmb3IgdW5jaGFuZ2VkIFVSTHMgbm90IHVwZGF0ZWQgZHVlIHRvIHByb3ZlbmFuY2UgdW5rbm93bi4KCgkJCWlmICggJ2ZpbGVzJyA9PSAkdGhpcy0+X3N0YXRlWydkYXQnXVsnYmFja3VwX3R5cGUnXSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwaW5nIFVSTCBzY2FuIGZvciB3cC1jb25maWcucGhwIGFzIHRoaXMgaXMgYSBGaWxlcyBPbmx5IHJlc3RvcmUuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hlY2tpbmcgd3AtY29uZmlnLnBocCBmaWxlIGZvciB1bmNoYW5nZWQgVVJMcy4nICk7CgkJCQkkY29uZmlnX2NvbnRlbnRzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnICk7CgkJCQlpZiAoIGZhbHNlID09PSAkY29uZmlnX2NvbnRlbnRzICkgeyAvLyBVbmFibGUgdG8gb3Blbi4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIG9wZW4gd3AtY29uZmlnLnBocCBmb3IgY2hlY2tpbmcgdGhvdWdoIGl0IGV4aXN0cy4gVmVyaWZ5IHBlcm1pc3Npb25zLicgKTsKCQkJCX0gZWxzZSB7IC8vIEFibGUgdG8gb3Blbi4KCQkJCQkkbmV3X2NvbnRlbnRfdXJsID0gJyc7CgkJCQkJaWYgKCBpc3NldCggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3dwX2NvbnRlbnRfdXJsJ10gKSApIHsKCQkJCQkJJG5ld19jb250ZW50X3VybCA9IHN0cl9yZXBsYWNlKCB0cmltKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnc2l0ZXVybCddLCAnXFwvJyApLCB0cmltKCAkdGhpcy0+X3N0YXRlWydzaXRldXJsJ10sICcvJyApLCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnd3BfY29udGVudF91cmwnXSApOwoJCQkJCX0KCQkJCQkKCQkJCQlwcmVnX21hdGNoX2FsbCggJyNcYmh0dHBzPzovL1teXHMoKTw+XSsoPzpcKFtcd1xkXStcKXwoW15bOnB1bmN0Ol1cc118LykpIycsICRjb25maWdfY29udGVudHMsICRtYXRjaGVzICk7CgkJCQkJJG1hdGNoZXMgPSAkbWF0Y2hlc1swXTsKCQkJCQlmb3JlYWNoKCAkbWF0Y2hlcyBhcyAkbWF0Y2ggKSB7CgkJCQkJCWlmICggZmFsc2UgIT09IHN0cmlzdHIoICRtYXRjaCwgJ2FwaS53b3JkcHJlc3Mub3JnJyApICkgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJaWYgKCBmYWxzZSAhPT0gc3RyaXN0ciggJG1hdGNoLCAnY29kZXgud29yZHByZXNzLm9yZycgKSApIHsKCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQl9CgkJCQkJCWlmICggJG1hdGNoID09ICRuZXdfY29udGVudF91cmwgKSB7IC8vIElnbm9yZSBuZXcgV1BfQ09OVEVOVF9VUkwgZGVmaW5lIHRoYXQgd2FzIHVwZGF0ZWQuCgkJCQkJCQljb250aW51ZTsKCQkJCQkJfQoJCQkJCQkkdHJvdWJsZVtdID0gJ0EgVVJMIGZvdW5kIGluIG9uZSBvciBtb3JlIGxvY2F0aW9ucyBpbiB3cC1jb25maWcucGhwIHdhcyBub3QgbWlncmF0ZWQgYXMgaXQgd2FzIGVpdGhlciBub3QgcmVjb2duaXplZCBvciBpbiBhbiB1bnJlY29nbml6ZWQgbG9jYXRpb24gaW4gdGhlIGZpbGU6ICInIC4gaHRtbGVudGl0aWVzKCAkbWF0Y2ggKSAuICciICh0aGlzIG1heSBub3QgYmUgYSBwcm9ibGVtISkuJzsKCQkJCQl9CgoJCQkJCWlmICggZmFsc2UgIT09IHN0cmlzdHIoICRjb25maWdfY29udGVudHMsICdDT09LSUVfRE9NQUlOJyApICkgeyAvLyBGb3VuZCBjb29raWUgZG9tYWluLgoJCQkJCQkkdHJvdWJsZVtdID0gJ0Nvb2tpZSBkb21haW4gc2V0IGluIHdwLWNvbmZpZy5waHAgZmlsZSBhbmQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQuIFlvdSBtYXkgbmVlZCB0byBtYW51YWx5IHVwZGF0ZSB0aGlzLic7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkvLyAuaHRhY2Nlc3MKCQlpZiAoICEgZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApICkgewoJCQkkdHJvdWJsZVtdID0gJ1dhcm5pbmcgb25seTogLmh0YWNjZXNzIGZpbGUgbm90IGZvdW5kIGluIFdvcmRQcmVzcyByb290LiBUaGlzIGlzIHVzZWQgZm9yIHBlcm1hbGlua3Mgb24gc2VydmVycyB3aGljaCBzdXBwb3J0IGl0LiBJZiBuZWVkZWQgb3IgVVJMcyByZXN1bHQgaW4gYSA0MDQgeW91IG1heSByZWdlbmVyYXRlIHRoaXMgZmlsZSBieSBsb2dnaW5nIGludG8gdGhlIHdwLWFkbWluICYgbmF2aWdhdGluZyB0byBTZXR0aW5nczogUGVybWFsaW5rcyBhbmQgY2xpY2tpbmcgIlNhdmUiLic7CgkJfSBlbHNlIHsgLy8gRXhpc3RzLCBjaGVjayBpZiBBZGRIYW5kbGVyIGluc2lkZS4KCQkJJGNvbnRlbnRzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKTsKCQkJaWYgKCBzdHJzdHIoICRjb250ZW50cywgJ0FkZEhhbmRsZXInICkgKSB7CgkJCQkkdHJvdWJsZVtdID0gJ1dhcm5pbmc6IEFuIEFkZEhhbmRsZXIgZGlyZWN0aXZlIGhhcyBiZWVuIGZvdW5kIGluIHlvdXIgLmh0YWNjZXNzIGZpbGUuIFRoaXMgY291bGQgcmVzdWx0IGluIFdvcmRQcmVzcyBhbmQgUEhQIG5vdCBydW5uaW5nIHByb3Blcmx5IGlmIGNvbmZpZ3VyZWQgaW1wcm9wZXJseSwgZXNwZWNpYWxseSB3aGVuIG1pZ3JhdGluZyB0byBhIG5ldyBzZXJ2ZXIuIElmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgc3VjaCBhcyBhbiBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3Igb3IgRXJyb3IgNTAwLCB0cnkgcmVtb3ZpbmcgdGhpcyBsaW5lIGZyb20geW91ciAuaHRhY2Nlc3MgZmlsZS4gU29sdXRpb246IERlbGV0ZSB0aGlzIEFkZEhhbmRsZXIgbGluZSBmcm9tIHRoZSAuaHRhY2Nlc3MgZmlsZS4gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9jb2RleC9wYWdlL0JhY2t1cEJ1ZGR5Ol9GcmVxdWVudF9TdXBwb3J0X0lzc3VlcyMuaHRhY2Nlc3NfNDA0Xy4yRl9BZGRoYW5kbGVyX1dhcm5pbmciPkNsaWNrIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gJiBoZWxwLjwvYT4nOwoJCQl9CgkJfQoKCQkvLyBwaHAuaW5pCgkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdwaHAuaW5pJyApICkgewoJCQkkdHJvdWJsZVtdID0gJ0EgcGhwLmluaSBmaWxlIHdhcyByZXN0b3JlZCBpbiB0aGUgaW1wb3J0IHByb2Nlc3MgaW4gdGhlIHNpdGUgcm9vdC4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aCBzaXRlIGZ1bmN0aW9uYWxpdHkgaWYgaW1wb3J0ZWQgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGFzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvZnRlbiBkaWZmZXIgYmV0d2VlbiBzZXJ2ZXJzLCBwb3NzaWJseSByZXN1bHRpbmcgaW4gZGVncmFkZWQgcGVyZm9ybWFuY2Ugb3IgdW5leHBlY3RlZCBiZWhhdmlvci4nOwoJCX0KCgkJaWYgKCBjb3VudCggJHRyb3VibGUgKSA+IDAgKSB7CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnUG90ZW50aWFsIHByb2JsZW1zIHRoYXQgbWF5IG5lZWQgeW91ciBhdHRlbnRpb246ICcgLiBpbXBsb2RlKCAnOyAnLCAkdHJvdWJsZSApICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8gcG90ZW50aWFsIHByb2JsZW1zIGRldGVjdGVkLicgKTsKCQl9CgoJCXJldHVybiAkdHJvdWJsZTsKCgl9IC8vIEVuZCB0cm91YmxlU2NhbigpLgoJCgkKCQoJLyogc2NydWJJbmRleEZpbGVzKCkKCSAqCgkgKiBEZWxldGVzIGluZGV4Lmh0bSBmaWxlIGlmIGl0IGFwcGVhcnMgdG8gaGF2ZSB0aGUgY29udGVudHMgdGhhdCBJbXBvcnRCdWRkeSBjcmVhdGVkIGl0IHdpdGguCgkgKiBOb24taW1wb3J0YnVkZHkgY3JlYXRlZCBpbmRleC5odG0gZmlsZXMgYXJlIGxlZnQgaW4gcGxhY2UgdG8gYmUgd2FybmVkIGFib3V0IGxhdGVyIGFzIHRoZSB1c2VyIG1heSB3YW50IGl0IHRoZXJlLgoJICoKCSAqLwoJZnVuY3Rpb24gc2NydWJJbmRleEZpbGVzKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQkkaW5kZXhGaWxlcyA9IGFycmF5KCAnaW5kZXguaHRtJywgJ2luZGV4Lmh0bWwnICk7CgkJZm9yZWFjaCggJGluZGV4RmlsZXMgYXMgJGluZGV4RmlsZSApIHsKCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICRpbmRleEZpbGUgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJGluZGV4RmlsZSAuICcgZmlsZSBleGlzdHMuIENoZWNraW5nIHRvIHNlZSBpZiBJbXBvcnRCdWRkeSBnZW5lcmF0ZWQgaXQgb3IgaXQgaXMgZW1wdHkuJyApOwoJCQkJJGluZGV4X2NvbnRlbnRzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCBBQlNQQVRIIC4gJGluZGV4RmlsZSApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJGluZGV4X2NvbnRlbnRzICkgeyAvLyBDYW5ub3QgcmVhZC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkaW5kZXhGaWxlIC4gJyBmaWxlIHVucmVhZGFibGUuIFlvdSBtYXkgbmVlZCB0byBtYW51YWxseSBkZWxldGUgaXQgdG8gdmlldyB5b3VyIHNpdGUuJyApOwoJCQkJfSBlbHNlIHsgLy8gUmVhZCBmaWxlIHN1Y2NlZWRlZC4KCQkJCQkkaW5kZXhfY29udGVudHMgPSB0cmltKCAkaW5kZXhfY29udGVudHMgKTsKCQkJCQlpZiAoICggJGluZGV4X2NvbnRlbnRzID09ICc8aHRtbD48L2h0bWw+JyApIHx8ICggJycgPT0gJGluZGV4X2NvbnRlbnRzICkgKSB7IC8vIE91ciBmaWxlLiBEZWxldGUgaXQhCgkJCQkJCSRpbmRleF91bmxpbmsgPSBAdW5saW5rKCBBQlNQQVRIIC4gJGluZGV4RmlsZSApOwoJCQkJCQlpZiAoIHRydWUgPT09ICRpbmRleF91bmxpbmsgKSB7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRpbmRleEZpbGUgLiAnIGZpbGUgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuJyApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBkZWxldGUgJyAuICRpbmRleEZpbGUgLiAnIGZpbGUuICBUaGlzIGlzIGxpa2VseSBkdWUgdG8gcGVybWlzc2lvbnMuIFlvdSBtYXkgbmVlZCB0byBtYW51YWxseSBkZWxldGUgaXQgdG8gdmlldyB5b3VyIHNpdGUuJyApOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsgLy8gTm90IG91ciBmaWxlLiBMZWF2ZSBhbG9uZS4gV2Ugd2lsbCB3YXJuIGFib3V0IHRoaXMgbGF0ZXIgdGhvdWdoLgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRpbmRleEZpbGUgLiAnIGZpbGUgbm90IGdlbmVyYXRlZCBieSBJbXBvcnRCdWRkeSBhbmQgbm90IGVtcHR5LiBMZWF2aW5nIGFzIGlzLiBZb3UgbWF5IG5lZWQgdG8gZGVsZXRlIGl0IHRvIHZpZXcgeW91ciBzaXRlLicgKTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7IC8vIE5vIGluZGV4Lmh0bSBmaWxlLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkaW5kZXhGaWxlIC4gJyBmaWxlIG5vdCBmb3VuZC4gU2tpcHBpbmcgZGVsZXRpb24uJyApOwoJCQl9CgkJfQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgc2NydWJJbmRleEZpbGVzKCkuCgkKCQoJCgkvKglyZW5hbWVIdGFjY2Vzc1RlbXAoKQoJICoJCgkgKglSZW5hbWVzIC5odGFjY2VzcyB0byAuaHRhY2Nlc3MuYmJfdGVtcCB1bnRpbCBsYXN0IEltcG9ydEJ1ZGR5IHN0ZXAgdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4KCSAqCQoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiByZW5hbWVIdGFjY2Vzc1RlbXAoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWlmICggIWZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8gLmh0YWNjZXNzIGZpbGUgZm91bmQuIFNraXBwaW5nIHRlbXBvcmFyeSBmaWxlIHJlbmFtZS4nICk7CgkJfQoJCQoJCSRyZXN1bHQgPSBAcmVuYW1lKCBBQlNQQVRIIC4gJy5odGFjY2VzcycsIEFCU1BBVEggLiAnLmh0YWNjZXNzLmJiX3RlbXAnICk7CgkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBSZW5hbWUgc3VjY2VlZGVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZW5hbWVkIGAuaHRhY2Nlc3NgIGZpbGUgdG8gYC5odGFjY2Vzcy5iYl90ZW1wYCB1bnRpbCBmaW5hbCBJbXBvcnRCdWRkeSBzdGVwLicgKTsKCQl9IGVsc2UgeyAvLyBSZW5hbWUgZmFpbGVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdVbmFibGUgdG8gcmVuYW1lIGAuaHRhY2Nlc3NgIGZpbGUgdG8gYC5odGFjY2Vzcy5iYl90ZW1wYC4gWW91ciBmaWxlIHBlcm1pc3Npb25zIG1heSBiZSB0b28gc3RyaWN0LiBZb3UgbWF5IHdpc2ggdG8gbWFudWFsbHkgcmVuYW1lIHRoaXMgZmlsZSBhbmQvb3IgY2hlY2sgcGVybWlzc2lvbnMgYmVmb3JlIHByb2NlZWRpbmcuJyApOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCQkKCX0gLy8gRW5kIHJlbmFtZUh0YWNjZXNzVGVtcCgpLgoKCgoJLyoJcmVuYW1lSHRhY2Nlc3NUZW1wQmFjaygpCgkgKgkKCSAqCVJlbmFtZXMgLmh0YWNjZXNzIHRvIC5odGFjY2Vzcy5iYl90ZW1wIHVudGlsIGxhc3QgSW1wb3J0QnVkZHkgc3RlcCB0byBhdm9pZCBjb21wbGljYXRpb25zLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIHJlbmFtZUh0YWNjZXNzVGVtcEJhY2soKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCSR0ZW1wRmlsZSA9IEFCU1BBVEggLiAnLmh0YWNjZXNzLmJiX3RlbXAnOwoJCSRmaW5hbEZpbGUgPSBBQlNQQVRIIC4gJy5odGFjY2Vzcyc7CgkJCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkdGVtcEZpbGUgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm8gYC5odGFjY2Vzcy5iYl90ZW1wYCBmaWxlIGZvdW5kLiBTa2lwcGluZyB0ZW1wb3JhcnkgZmlsZSByZW5hbWUuJyApOwoJCQlyZXR1cm47CgkJfQoKCQkkcmVzdWx0ID0gQHJlbmFtZSggJHRlbXBGaWxlLCAkZmluYWxGaWxlICk7CgkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBSZW5hbWUgc3VjY2VlZGVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZW5hbWVkIGAuaHRhY2Nlc3MuYmJfdGVtcGAgZmlsZSB0byBgLmh0YWNjZXNzYCB1bnRpbCBmaW5hbCBJbXBvcnRCdWRkeSBzdGVwLicgKTsKCQl9IGVsc2UgeyAvLyBSZW5hbWUgZmFpbGVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJlbmFtZSBgLmh0YWNjZXNzLmJiX3RlbXBgIGZpbGUgdG8gYC5odGFjY2Vzc2AuIFlvdXIgZmlsZSBwZXJtaXNzaW9ucyBtYXkgYmUgdG9vIHN0cmljdC4gWW91IG1heSB3aXNoIHRvIG1hbnVhbGx5IHJlbmFtZSAuaHRhY2Nlc3MuYmJfdGVtcCBhdCBgJyAuICR0ZW1wRmlsZSAuICdgIHRvIC5odGFjY2Vzcy4nICk7CgkJfQoJCQoJCXJldHVybjsKCX0gLy8gRW5kIHJlbmFtZUh0YWNjZXNzVGVtcEJhY2soKS4KCQoJCgkKCS8qKgoJICoJbWlncmF0ZUh0YWNjZXNzKCkKCSAqCgkgKglNaWdyYXRlcyAuaHRhY2Nlc3MuYmJfdGVtcCBmaWxlIGlmIGl0IGV4aXN0cy4KCSAqCgkgKglAcmV0dXJuCQlib29sZWFuCQlGYWxzZSBvbmx5IGlmIGZpbGUgaXMgdW53cml0YWJsZS4gVHJ1ZSBpZiB3cml0ZSBzdWNjZXNzOyB0cnVlIGlmIGZpbGUgZG9lcyBub3QgZXZlbiBleGlzdC4KCSAqCgkgKi8KCWZ1bmN0aW9uIG1pZ3JhdGVIdGFjY2VzcygpIHsKCgkJJGh0YWNjZXNzRmlsZSA9IEFCU1BBVEggLiAnLmh0YWNjZXNzLmJiX3RlbXAnOwoKCQkvLyBJZiBubyAuaHRhY2Nlc3MuYmJfdGVtcCBmaWxlIGV4aXN0cyB0aGVuIGNyZWF0ZSBhIGJhc2ljIGRlZmF1bHQgb25lIHRoZW4gbWlncmF0ZSB0aGF0IGFzIG5lZWRlZC4gQHNpbmNlIDIuMi4zMi4KCQlpZiAoICEgZmlsZV9leGlzdHMoICRodGFjY2Vzc0ZpbGUgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTm8gYCcgLiBiYXNlbmFtZSggJGh0YWNjZXNzRmlsZSApIC4gJ2AgZmlsZSBmb3VuZC4gQ3JlYXRpbmcgYmFzaWMgZGVmYXVsdCAuaHRhY2Nlc3MuYmJfdGVtcCBmaWxlICh0byBiZSBsYXRlciByZW5hbWVkIHRvIC5odGFjY2VzcykuJyApOwoKCQkJLy8gRGVmYXVsdCAuaHRhY2Nlc3MgZmlsZS4KCQkJJGh0YWNjZXNzX2NvbnRlbnRzID0KCQkJCSIjIEJFR0lOIFdvcmRQcmVzc1xuCgkJCQk8SWZNb2R1bGUgbW9kX3Jld3JpdGUuYz5cbgoJCQkJUmV3cml0ZUVuZ2luZSBPblxuCgkJCQlSZXdyaXRlQmFzZSAvXG4KCQkJCVJld3JpdGVSdWxlIF5pbmRleFxcLnBocCQgLSBbTF1cbgoJCQkJUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWZcbgoJCQkJUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWRcbgoJCQkJUmV3cml0ZVJ1bGUgLiAvaW5kZXgucGhwIFtMXVxuCgkJCQk8L0lmTW9kdWxlPlxuCgkJCQkjIEVORCBXb3JkUHJlc3NcbiI7CgkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkaHRhY2Nlc3NGaWxlLCAkaHRhY2Nlc3NfY29udGVudHMgKTsKCQkJdW5zZXQoICRodGFjY2Vzc19jb250ZW50cyApOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTWlncmF0aW5nIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuLi4nICk7CgoJCSRvbGR1cmwgPSBzdHJ0b2xvd2VyKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnc2l0ZXVybCddICk7CgkJJG9sZHVybCA9IHN0cl9yZXBsYWNlKCAnLycsICdcXCcsICRvbGR1cmwgKTsKCQkkb2xkdXJsID0gc3RyX3JlcGxhY2UoICdodHRwOlxcJywgJycsICRvbGR1cmwgKTsKCQkkb2xkdXJsID0gdHJpbSggJG9sZHVybCwgJ1xcJyApOwoJCSRvbGR1cmwgPSBleHBsb2RlKCAnXFwnLCAkb2xkdXJsICk7CgkJJG9sZHVybFswXSA9ICcnOwoKCQkkb2xkX3BhdGggPSBpbXBsb2RlKCAnLycsICRvbGR1cmwgKTsKCgkJJG5ld3VybCA9IHN0cnRvbG93ZXIoICR0aGlzLT5fc3RhdGVbJ3NpdGV1cmwnXSApOwoJCSRuZXd1cmwgPSBzdHJfcmVwbGFjZSggJy8nLCAnXFwnLCAkbmV3dXJsICk7CgkJJG5ld3VybCA9IHN0cl9yZXBsYWNlKCAnaHR0cDpcXCcsICcnLCAkbmV3dXJsICk7CgkJJG5ld3VybCA9IHRyaW0oICRuZXd1cmwsICdcXCcgKTsKCQkkbmV3dXJsID0gZXhwbG9kZSggJ1xcJywgJG5ld3VybCApOwoJCSRuZXd1cmxbMF0gPSAnJzsKCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQ2hlY2tpbmcgYCcgLiBiYXNlbmFtZSggJGh0YWNjZXNzRmlsZSApIC4gJ2AgZmlsZS4nICk7CgkJaWYgKCAkbmV3dXJsICE9PSAkb2xkdXJsICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdVUkwgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkLiBVcGRhdGluZyBmcm9tIGAnIC4gaW1wbG9kZSggJy8nLCAkb2xkdXJsICkgLiAnYCB0byBgJyAuIGltcGxvZGUoICcvJywgJG5ld3VybCApIC4gJ2AuJyApOwoJCX0KCQkKCQkkcmV3cml0ZV9saW5lcyA9IGFycmF5KCk7CgkJJGdvdF9yZXdyaXRlID0gZmFsc2U7CgkJJHJld3JpdGVfcGF0aCA9IGltcGxvZGUoICcvJywgJG5ld3VybCApOwoJCSRmaWxlX2FycmF5ID0gZmlsZSggJGh0YWNjZXNzRmlsZSApOwoJCSRodGFjY2Vzc05lZWRzVXBkYXRpbmcgPSBmYWxzZTsKCQkKCQkvLyBMb29wIHRocm91Z2ggLmh0YWNjZXNzIGxpbmVzLCB1cGRhdGluZyBhcyBuZWVkZWQuCgkJZm9yZWFjaCAoIChhcnJheSkkZmlsZV9hcnJheSBhcyAkbGluZV9udW1iZXIgPT4gJGxpbmUpIHsKCQkJaWYgKCAkZ290X3Jld3JpdGUgPT0gdHJ1ZSApIHsgLy8gSW4gYSBXb3JkUHJlc3Mgc2VjdGlvbi4KCQkJCWlmICggc3Ryc3RyKCAkbGluZSwgJ0VORCBXb3JkUHJlc3MnICkgKSB7IC8vIEVuZCBvZiBhIFdvcmRQcmVzcyBibG9jayBzbyBzdG9wIHJlcGxhY2luZy4KCQkJCQkkZ290X3Jld3JpdGUgPSBmYWxzZTsKCQkJCQkkcmV3cml0ZV9saW5lc1tdID0gICRsaW5lOyAvLyBDYXB0dXJlcyBlbmQgb2YgV29yZFByZXNzIGJsb2NrLgoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQlpZiAoICRuZXd1cmwgIT09ICRvbGR1cmwgKSB7CgkJCQkJCWlmICggc3Ryc3RyKCAkbGluZSwgJ1Jld3JpdGVCYXNlJyApICkgeyAvLyBSZXdyaXRlQmFzZQoJCQkJCQkJJHJld3JpdGVfbGluZXNbXSA9ICdSZXdyaXRlQmFzZSAnIC4gJHJld3JpdGVfcGF0aCAuICcvJyAuICJcbiI7CgkJCQkJCQkkaHRhY2Nlc3NOZWVkc1VwZGF0aW5nID0gdHJ1ZTsKCQkJCQkJfSBlbHNlaWYgKCBzdHJzdHIoICRsaW5lLCAnUmV3cml0ZVJ1bGUnICkgKSB7IC8vIFJld3JpdGVSdWxlCgkJCQkJCQlpZiAoIHN0cnN0ciggJGxpbmUsICdeaW5kZXhcLnBocCQnICkgKSB7IC8vIEhhbmRsZSBuZXcgc3RyYW5nZSByZXdyaXRlcnVsZS4gTGVhdmUgYXMgaXMuCgkJCQkJCQkJJHJld3JpdGVfbGluZXNbXSA9ICRsaW5lOwoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5odGFjY2VzcyBeaW5kZXhcLnBocCQgZGV0ZWN0ZWQuIExlYXZpbmcgYXMgaXMuJyApOwoJCQkJCQkJfSBlbHNlaWYgKCAhIHN0cnN0ciggJGxpbmUsICdSZXdyaXRlUnVsZSAuICcpICkgewoJCQkJCQkJCS8vIEhhbmRsZSB3aGF0IGlzIHByb2JhYmx5IGEgdXNlciBnZW5lcmF0ZWQgcnVsZSAtIGJldHRlciBkZXRlY3Rpb24gbmVlZGVkLgoJCQkJCQkJCSRuZXdfbGluZSA9IHN0cl9yZXBsYWNlKCAkb2xkX3BhdGgsICRyZXdyaXRlX3BhdGgsICRsaW5lICk7CgkJCQkJCQkJJHJld3JpdGVfbGluZXNbXSA9ICRuZXdfbGluZTsKCQkJCQkJCQkkaHRhY2Nlc3NOZWVkc1VwZGF0aW5nID0gdHJ1ZTsKCQkJCQkJCQlpZiAoICRuZXdfbGluZSAhPSAkbGluZSApIHsKCQkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnLmh0YWNjZXNzIGxpbmUgY2hhbmdlZCBmcm9tIGAnIC4gdHJpbSggJGxpbmUgKSAuICdgIHRvIGAnIC4gdHJpbSggJG5ld19saW5lICkgLiAnYC4nICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIHsgLy8gTm9ybWFsIHNwb3QuCgkJCQkJCQkJJHJld3JpdGVfbGluZXNbXSA9ICdSZXdyaXRlUnVsZSAuICcgLiAkcmV3cml0ZV9wYXRoIC4gJy9pbmRleC5waHAnIC4gIlxuIjsKCQkJCQkJCQkkaHRhY2Nlc3NOZWVkc1VwZGF0aW5nID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJfSBlbHNlIHsgLy8gVXNlciBjdXN0b20gcmV3cml0ZXJ1bGUgd2UgZGlkIG5vdCB1cGRhdGUuCgkJCQkJCQkKCQkJCQkJCSRyZXdyaXRlX2xpbmVzW10gPSAgJGxpbmU7IC8vIENhcHR1cmVzIGV2ZXJ5dGhpbmcgaW5zaWRlIFdvcmRQcmVzcyBibG9jayB3ZSBhcmVudCBtb2RpZnlpbmcuCgkJCQkJCQlpZiAoIGZhbHNlICE9PSBzdHJzdHIoICRsaW5lLCAnUmV3cml0ZVJ1bGUgLiAnKSApIHsgLy8gUmV3cml0ZVJ1bGUsIHdhcm4gdXNlciBwb3RlbnRpYWxseSBpZiBwYXRoIG1heSBuZWVkIGNoYW5nZWQuCgkJCQkJCQkJaWYgKCAkb2xkX3BhdGggIT09ICRyZXdyaXRlX3BhdGggKSB7CgkJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1VzZXItZGVmaW5lZCBSZXdyaXRlUnVsZSBmb3VuZCBhbmQgV29yZFByZXNzIHBhdGggaGFzIGNoYW5nZWQgc28gdGhpcyBydWxlIE1BWSBuZWVkIG1hbnVhbGx5IHVwZGF0ZWQgYnkgeW91IHRvIGZ1bmN0aW9uIHByb3Blcmx5LiAgTGluZTogIicgLiAkbGluZSAuICciLicgKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJfQoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCX0KCQkJfSBlbHNlIHsgLy8gT3V0c2lkZSBhIFdvcmRQcmVzcyBzZWN0aW9uLgoJCQkJaWYgKCBzdHJzdHIoICRsaW5lLCAnQkVHSU4gV29yZFByZXNzJyApICkgewoJCQkJCSRnb3RfcmV3cml0ZSA9IHRydWU7IC8vIEJlZ2lubmluZyBvZiBhIFdvcmRQcmVzcyBibG9jayBzbyBzdGFydCByZXBsYWNpbmcuCgkJCQl9CgkJCQlpZiAoIHN0cnN0ciggJGxpbmUsICdBZGRIYW5kbGVyJyApICkgeyAvLyBIYXMgQWRkSGFuZGxlci4gU2tpcCBrZWVwaW5nIHRoaXMgbGluZSAtLSBpZiBpbXBvcnRidWRkeSBpcyBydW5uaW5nIG5vdyB0aGVuIHdlIGRvIG5vdCBuZWVkIHRoaXMgbW9zdCBsaWtlbHkuCgkJCQkJJG1lc3NhZ2UgPSAnQW4gQWRkSGFuZGxlciBkaXJlY3RpdmUgaGFzIGJlZW4gZm91bmQgaW4geW91ciAuaHRhY2Nlc3MgZmlsZS4gVGhpcyBjb3VsZCByZXN1bHQgaW4gV29yZFByZXNzIGFuZCBQSFAgbm90IHJ1bm5pbmcgcHJvcGVybHkgaWYgY29uZmlndXJlZCBpbXByb3Blcmx5LCBlc3BlY2lhbGx5IHdoZW4gbWlncmF0aW5nIHRvIGEgbmV3IHNlcnZlci4gSWYgeW91IGVuY291bnRlciBwcm9ibGVtcyBzdWNoIGFzIGFuIEludGVybmFsIFNlcnZlciBFcnJvciBvciBFcnJvciA1MDAsIHRyeSByZW1vdmluZyB0aGlzIGxpbmUgZnJvbSB5b3VyIC5odGFjY2VzcyBmaWxlLiAgTGluZTogIicgLiAkbGluZSAuICciLic7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAkbWVzc2FnZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UgKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHJld3JpdGVfbGluZXNbXSA9ICAkbGluZTsgLy8gQ2FwdHVyZXMgZXZlcnl0aGluZyBvdXRzaWRlIG9mIFdvcmRQcmVzcyBibG9jayAoZXhjZXB0IGFkZGhhbmRsZXIgc3R1ZmYpLgoJCQkJfQoJCQl9CgkJfSAvLyBlbmQgZm9yZWFjaC4KCQkKCQkvLyBJZiB0aGUgVVJMIChkb21haW4gYW5kL29yIFVSTCBzdWJkaXJlY3RvcnkgKSBoYXMgY2hhbmdlZCwgdGhlbiBuZWVkIHRvIHVwZGF0ZSAuaHRhY2Nlc3MuYmJfdGVtcCBmaWxlLgoJCQoJCQoJCQoJCWlmICggdHJ1ZSA9PT0gJGh0YWNjZXNzTmVlZHNVcGRhdGluZyApIHsKCQkJLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gdGhpcyBmaWxlIChpZiBpdCBhbHJlYWR5IGV4aXN0cykuCgkJCWlmICggZmlsZV9leGlzdHMoICRodGFjY2Vzc0ZpbGUgKSAmJiAoICEgaXNfd3JpdGFibGUoICRodGFjY2Vzc0ZpbGUgKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjMjg1NzM6IFRlbXAgYCcgLiBiYXNlbmFtZSggJGh0YWNjZXNzRmlsZSApIC4gJ2AgZmlsZSBzaG93cyB0byBiZSB1bndyaXRhYmxlLiBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIHBlcm1pc3Npb25zIHRlbXBvcmFyaWx5LicgKTsKCQkJCSRvbGRQZXJtcyA9ICggZmlsZXBlcm1zKCAkaHRhY2Nlc3NGaWxlICkgJiAwNzc3ICk7CgkJCQlAY2htb2QoICRodGFjY2Vzc0ZpbGUsIDA2NDQgKTsgLy8gVHJ5IHRvIG1ha2Ugd3JpdGFibGUuCgkJCQkvLyBDaGVjayBpZiBzdGlsbCBub3Qgd3JpdGFibGUuLi4KCQkJCWlmICggISBpc193cml0YWJsZSggJGh0YWNjZXNzRmlsZSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAyMDogVW5hYmxlIHRvIHdyaXRlIHRvIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuIFZlcmlmeSBwZXJtaXNzaW9ucy4nICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnV2FybmluZzogVW5hYmxlIHRvIHdyaXRlIHRvIHRlbXBvcmFyeSAuaHRhY2Nlc3MgZmlsZS4gVmVyaWZ5IHRoaXMgZmlsZSBoYXMgcHJvcGVyIHdyaXRlIHBlcm1pc3Npb25zLiBZb3UgbWF5IHJlY2VpdmUgNDA0IE5vdCBGb3VuZCBlcnJvcnMgb24geW91ciBzaXRlIGlmIHRoaXMgaXMgbm90IGNvcnJlY3RlZC4gVG8gZml4IGFmdGVyIG1pZ3JhdGlvbiBjb21wbGV0ZXM6IExvZyBpbiB0byB5b3VyIFdvcmRQcmVzcyBhZG1pbiBhbmQgc2VsZWN0IFNldHRpbmdzOiBQZXJtYWxpbmtzIGZyb20gdGhlIGxlZnQgbWVudSB0aGVuIHNhdmUuIFRvIG1hbnVhbGx5IHVwZGF0ZSwgY29weS9wYXN0ZSB0aGUgZm9sbG93aW5nIGludG8geW91ciAuaHRhY2Nlc3MgZmlsZTogPHRleHRhcmVhPicgLiBpbXBsb2RlKCAkcmV3cml0ZV9saW5lcyApIC4gJzwvdGV4dGFyZWE+JywgJzkwMjAnICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkkaGFuZGxpbmcgPSBmb3BlbiggJGh0YWNjZXNzRmlsZSwgJ3cnKTsKCQkJZndyaXRlKCAkaGFuZGxpbmcsIGltcGxvZGUoICRyZXdyaXRlX2xpbmVzICkgKTsKCQkJZmNsb3NlKCAkaGFuZGxpbmcgKTsKCQkJdW5zZXQoICRoYW5kbGluZyApOwoKCQkJLy8gUmVzdG9yZSBwcmlvciBwZXJtaXNzaW9ucyBpZiBhcHBsaWNhYmxlLgoJCQlpZiAoIGlzc2V0KCAkb2xkUGVybXMgKSApIHsKCQkJCUBjaG1vZCggJGh0YWNjZXNzRmlsZSwgJG9sZFBlcm1zICk7CgkJCX0KCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ01pZ3JhdGVkIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuIEl0IHdpbGwgYmUgcmVuYW1lZCBiYWNrIHRvIGAuaHRhY2Nlc3NgIG9uIHRoZSBmaW5hbCBzdGVwLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdObyBjaGFuZ2VzIG5lZWRlZCBmb3IgYCcgLiBiYXNlbmFtZSggJGh0YWNjZXNzRmlsZSApIC4gJ2AgZmlsZS4nICk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1pZ3JhdGVIdGFjY2VzcygpLgoJCgkKCQoJZnVuY3Rpb24gZ2V0RGVmYXVsdFVybCgpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJLy8gR2V0IHRoZSBjdXJyZW50IFVSTCBvZiB3aGVyZSB0aGUgaW1wb3J0YnVkZHkgdG9vbCBpcyBydW5uaW5nLgoJCSR1cmwgPSBzdHJfcmVwbGFjZSggJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddLCAnJywgJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gKTsKCQkkdXJsID0gc3RyX3JlcGxhY2UoIGJhc2VuYW1lKCAkdXJsICkgLCAnJywgJHVybCApOwoJCSR1cmwgPSBwcmVnX3JlcGxhY2UoICd8LyokfCcsICcnLCAkdXJsICk7ICAvLyBzdHJpcHMgdHJhaWxpbmcgc2xhc2goZXMpLgoJCQoJCWlmICggKCBpc3NldCggJF9TRVJWRVJbJ0hUVFBTJ10gKSAmJiAoICRfU0VSVkVSWydIVFRQUyddICE9PSAnb2ZmJykgKSB8fCAgKCBpc3NldCggJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gKSAmJiAoICRfU0VSVkVSWydTRVJWRVJfUE9SVCddID09IDQ0MyApICkgKSB7IC8vIFNTTC4KCQkJJHVybF9wcmVmaXggPSAnaHR0cHM6Ly8nOwoJCX0gZWxzZSB7CgkJCSR1cmxfcHJlZml4ID0gJ2h0dHA6Ly8nOwoJCX0KCQkKCQkkdXJsID0gJHVybF9wcmVmaXggLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkdXJsOwoJCQoJCXJldHVybiAkdXJsOwoJfSAvLyBFbmQgZ2V0RGVmYXVsdFVybCgpLgoJCgkKCQoJZnVuY3Rpb24gZ2V0RGVmYXVsdERvbWFpbigpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJcHJlZ19tYXRjaCgiL14oaHR0cDpcL1wvKT8oW15cL10rKS9pIiwgJHRoaXMtPmdldERlZmF1bHRVcmwoKSwgJGRvbWFpbiApOwoJCXJldHVybiAkZG9tYWluWzJdOwoJfSAvLyBFbmQgZ2V0RGVmYXVsdERvbWFpbigpLgoJCgkKCQoJLyoqCgkgKgljb25uZWN0RGF0YWJhc2UoKQoJICoKCSAqCUluaXRpYWxpemVzIGEgY29ubmVjdGlvbiB0byB0aGUgbXlzcWwgZGF0YWJhc2UuCgkgKglSRVFVSVJFUzogZGF0YWJhc2VTZXR0aW5ncyBwb3J0aW9uIG9mIHN0YXRlIHRvIGJlIHNldC4KCSAqCgkgKglAcmV0dXJuCQlib29sZWFuCQlUcnVlIG9uIHN1Y2Nlc3M7IGVsc2UgZmFsc2UuIFN1Y2Nlc3MgdGVzdGluZyBpcyB2ZXJ5IGxvb3NlLgoJICovCglmdW5jdGlvbiBjb25uZWN0RGF0YWJhc2UoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPl9kYkNvbm5lY3RlZCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWxyZWFkeSBjb25uZWN0ZWQgdG8gZGF0YWJhc2UgZnJvbSBwcmlvciBjb25uZWN0RGF0YWJhc2UoKSBjYWxsLiBTa2lwcGluZy4nICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCQlnbG9iYWwgJHdwZGI7CgkJJHdwZGIgPSBuZXcgd3BkYiggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddLCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2UnXSwkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddICk7CgkJCgkJLy8gU2VlIGlmIHdlIGhhdmUgYSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNldCBhbmQgY29sbGF0aW9uIHRvIHVzZSBmcm9tIHRoZSBzb3VyY2Ugc2l0ZS4KCQkkY2hhcnNldCA9IG51bGw7CgkJJGNvbGxhdGUgPSBudWxsOwoJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl9jaGFyc2V0J10gKSApIHsKCQkJJGNoYXJzZXQgPSAkdGhpcy0+X3N0YXRlWydkYXQnXVsnZGJfY2hhcnNldCddOwoJCX0KCQlpZiAoIGlzc2V0KCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnZGJfY29sbGF0ZSddICkgKSB7CgkJCSRjb2xsYXRlID0gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ2RiX2NvbGxhdGUnXTsKCQl9CgkJaWYgKCAoIG51bGwgIT09ICRjaGFyc2V0ICkgfHwgKCBudWxsICE9PSAkY29sbGF0ZSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTZXR0aW5nIGNoYXJzZXQgdG8gYCcgLiAkY2hhcnNldCAuICdgIGFuZCBjb2xsYXRlIHRvIGAnIC4gJGNvbGxhdGUgLiAnYCBiYXNlZCBvbiBzb3VyY2Ugc2l0ZS4nICk7CgkJCSR3cGRiLT5zZXRfY2hhcnNldCggJHdwZGItPmRiaCwgJGNoYXJzZXQsICRjb2xsYXRlICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hhcnNldCBub3IgY29sbGF0ZSBhcmUgaW4gREFUIGZpbGUuIFVzaW5nIGRlZmF1bHRzIGZvciBkYXRhYmFzZSBjb25uZWN0aW9uLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hhcnNldCBpbiB3cGRiOiAnIC4gJHdwZGItPmNoYXJzZXQgKTsKCQl9CgkJCgkJLy8gV2FybiBpZiBteXNxbCB2ZXJzaW9ucyBhcmUgaW5jb21wYXRpYmxlOyBlZyBpbXBvcnRpbmcgYSBteXNxbCA8IDUuMSB2ZXJzaW9uIGludG8gYSBzZXJ2ZXIgcnVubmluZyA1LjErLgoJCWdsb2JhbCAkd3BkYjsKCQkkdGhpc1ZlcnNpb24gPSAkd3BkYi0+ZGJfdmVyc2lvbigpOwoJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl92ZXJzaW9uJ10gKSApIHsKCQkJJGluY29taW5nVmVyc2lvbiA9ICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl92ZXJzaW9uJ107CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0luY29taW5nIG15c3FsIHZlcnNpb246IGAnIC4gJGluY29taW5nVmVyc2lvbiAuICdgLiBUaGlzIHNlcnZlclwncyBteXNxbCB2ZXJzaW9uOiBgJyAuICR0aGlzVmVyc2lvbiAuICdgLicgKTsKCQkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICRpbmNvbWluZ1ZlcnNpb24sICc1LjEuMCcsICc8JyApICYmIHZlcnNpb25fY29tcGFyZSggJHRoaXNWZXJzaW9uLCAnNS4xLjAnLCAnPj0nICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdFcnJvciAjNzAwMTogVGhpcyBzZXJ2ZXJcJ3MgbXlzcWwgdmVyc2lvbiwgYCcgLiAkdGhpc1ZlcnNpb24gLiAnYCBtYXkgaGF2ZSBTUUwgcXVlcnkgaW5jb21wYXRpYmlsaXRpZXMgd2l0aCB0aGUgYmFja3VwIG15c3FsIHZlcnNpb24gYCcgLiAkaW5jb21pbmdWZXJzaW9uIC4gJ2AuIFRoaXMgbWF5IHJlc3VsdCBpbiAjOTAxMCBlcnJvcnMgZHVlIHRvIHN5bnRheCBvZiBUWVBFPSBjaGFuZ2luZyB0byBFTkdJTkU9LiBJZiBub25lIG9jY3VyIHlvdSBtYXkgaWdub3JlIHRoaXMgZXJyb3IuJyApOwoJCQl9CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnSW5jb21pbmcgbXlzcWwgdmVyc2lvbjogYFVua25vd25gLiBUaGlzIHNlcnZlclwncyBteXNxbCB2ZXJzaW9uOiBgJyAuICR0aGlzVmVyc2lvbiAuICdgLicgKTsKCQl9CgkJCgkJJHRoaXMtPl9kYkNvbm5lY3RlZCA9IHRydWU7CgkJCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBjb25uZWN0RGF0YWJhc2UoKS4KCQoJCgkKCWZ1bmN0aW9uIGdldEJsb2dQdWJsaWNTZXR0aW5nKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQlpZiAoIHRydWUgIT09IHNlbGY6OmNvbm5lY3REYXRhYmFzZSgpICkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NoZWNraW5nIGN1cnJlbnQgYmxvZ19wdWJsaWMgb3B0aW9uIHNldHRpbmcuJyApOwoJCQoJCWdsb2JhbCAkd3BkYjsKCQkKCQkvLyBORVcgcHJlZml4CgkJJHNxbCA9ICJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gYCIgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddIC4gIm9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSdibG9nX3B1YmxpYyc7IjsKCQkkcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHNxbCwgQVJSQVlfQSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvdW5kICcgLiBjb3VudCggJHJlc3VsdHMgKSAuICcgcmVzdWx0cyBzZWVraW5nIGJsb2dfcHVibGljIG9wdGlvbi4nICk7CgkJCgkJcmV0dXJuICRyZXN1bHRzWzBdWydvcHRpb25fdmFsdWUnXTsKCX0gLy8gRW5kIGdldEJsb2dQdWJsaWNTZXR0aW5nKCkuCgkKCQoJCgkvLyB0cnVlIG9uIHN1Y2Nlc3MsIGVsc2UgZmFsc2UKCWZ1bmN0aW9uIHNldEJsb2dQdWJsaWMoICRzZXR0aW5nICkgewoJCWlmICggJycgPT09ICRzZXR0aW5nICkgeyAvLyBObyBjaGFuZ2UuCgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJaWYgKCB0cnVlICE9PSBzZWxmOjpjb25uZWN0RGF0YWJhc2UoKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlpZiAoIHRydWUgPT09ICRzZXR0aW5nICkgewoJCQkkc2V0dGluZyA9ICcxJzsKCQl9IGVsc2VpZiAoIGZhbHNlID09PSAkc2V0dGluZyApIHsKCQkJJHNldHRpbmcgPSAnMCc7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0ODM3NDczNDogVW5leHBlY3RlZCBpbnZhbGlkIHNldEJsb2dQdWJsaWMoKSB2YWx1ZSBgJyAuICRzZXR0aW5nIC4gJ2AuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NldHRpbmcgbmV3IGJsb2dfcHVibGljIHNlYXJjaCBlbmdpbmUgdmlzaWJpbGl0eSBzZXR0aW5nIHRvIGAnIC4gJHNldHRpbmcgLiAnYC4nICk7CgkJCgkJZ2xvYmFsICR3cGRiOwoJCQoJCS8vIE5FVyBwcmVmaXgKCQkkc3FsID0gIlVQREFURSBgIiAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10gLiAib3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkc2V0dGluZyApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J2Jsb2dfcHVibGljJyBMSU1JVCAxOyI7CgkJJHdwZGItPnF1ZXJ5KCAkc3FsICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuICR3cGRiLT5yb3dzX2FmZmVjdGVkIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgYmxvZ19wdWJsaWMuJyApOwoJCWlmICggISBlbXB0eSggJHdwZGItPmxhc3RfZXJyb3IgKSApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gJHdwZGItPmxhc3RfZXJyb3IgKTsgfQoJCQoJCXJldHVybiB0cnVlOwoJfQoJCgkKCQoJLyogX2Vycm9yKCkKCSAqCgkgKiBMb2dzIGVycm9yIG1lc3NhZ2VzIGZvciByZXRyaWV2YWwgd2l0aCBnZXRFcnJvcnMoKS4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQkkbWVzc2FnZQlFcnJvciBtZXNzYWdlIHRvIGxvZy4KCSAqIEByZXR1cm4JbnVsbAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9lcnJvciggJG1lc3NhZ2UgKSB7CgkJJHRoaXMtPl9lcnJvcnNbXSA9ICRtZXNzYWdlOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkKCQoJLyogZ2V0RXJyb3JzKCkKCSAqCgkgKiBHZXQgYW55IGVycm9ycyB3aGljaCBtYXkgaGF2ZSBvY2N1cnJlZC4KCSAqCgkgKiBAcmV0dXJuCWFycmF5IAkJUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmcgZXJyb3IgbWVzc2FnZXMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKSB7CgkJcmV0dXJuICR0aGlzLT5fZXJyb3JzOwoJfSAvLyBFbmQgZ2V0RXJyb3JzKCk7CgkKCQoJCgkvKiBnZXRTdGF0ZSgpCgkgKgoJICogR2V0IHN0YXRlIGFycmF5IGRhdGEgZm9yIHBhc3NpbmcgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciBzdWJzZXF1ZW50IGNhbGxzLgoJICoKCSAqIEByZXR1cm4JYXJyYXkgCQlSZXR1cm5zIGFuIGFycmF5IG9mIHN0YXRlIGRhdGEuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0ZSgpIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdHZXR0aW5nIHJvbGxiYWNrIHN0YXRlLicgKTsKCQlyZXR1cm4gJHRoaXMtPl9zdGF0ZTsKCX0gLy8gRW5kIGdldFN0YXRlKCkuCgkKCQoJCgkvKiBzZXRTdGF0ZSgpCgkgKgoJICogUmVwbGFjZSBjdXJyZW50IHN0YXRlIGFycmF5IHdpdGggcHJvdmlkZWQgb25lLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldFN0YXRlKCAkc3RhdGVEYXRhICkgewoJCSR0aGlzLT5fc3RhdGUgPSAkc3RhdGVEYXRhOwoJfSAvLyBFbmQgc2V0U3RhdGUoKS4KCQoJCgkKCS8qIF9iZWZvcmUoKQoJICoKCSAqIFJ1bnMgYmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIHRvIGtlZXAgdHJhY2sgb2YgcmFuIGZ1bmN0aW9ucyBpbiB0aGUgc3RhdGUgZGF0YSBmb3IgZGVidWdnaW5nLgoJICoKCSAqIEByZXR1cm4JbnVsbAoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9iZWZvcmUoICRmdW5jdGlvbk5hbWUgKSB7CgkJJHRoaXMtPl9zdGF0ZVsnc3RlcEhpc3RvcnknXVtdID0gYXJyYXkoICdmdW5jdGlvbicgPT4gJGZ1bmN0aW9uTmFtZSwgJ3N0YXJ0JyA9PiB0aW1lKCkgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBmdW5jdGlvbiBgJyAuICRmdW5jdGlvbk5hbWUgLiAnYC4nICk7CgkJcmV0dXJuOwoJfSAvLyBFbmQgX2JlZm9yZSgpLgoJCgkKCQoJLyoJc2h1dGRvd25fZnVuY3Rpb24oKQoJICoJCgkgKglVc2VkIGZvciBjYXRjaGluZyBmYXRhbCBQSFAgZXJyb3JzIGR1cmluZyBiYWNrdXAgdG8gd3JpdGUgdG8gbG9nIGZvciBkZWJ1Z2dpbmcuCgkgKgkKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNodXRkb3duX2Z1bmN0aW9uKCkgewoJCQoJCS8vIEdldCBlcnJvciBtZXNzYWdlLgoJCS8vIEVycm9yIHR5cGVzOiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZXJyb3JmdW5jLmNvbnN0YW50cy5waHAKCQkkZSA9IGVycm9yX2dldF9sYXN0KCk7CgkJaWYgKCAkZSA9PT0gTlVMTCApIHsgLy8gTm8gZXJyb3Igb2YgYW55IGtpbmQuCgkJCXJldHVybjsKCQl9IGVsc2UgeyAvLyBTb21lIHR5cGUgb2YgZXJyb3IuCgkJCWlmICggIWlzX2FycmF5KCAkZSApIHx8ICggJGVbJ3R5cGUnXSAhPSBFX0VSUk9SICkgJiYgKCAkZVsndHlwZSddICE9IEVfVVNFUl9FUlJPUiApICkgeyAvLyBSZXR1cm4gaWYgbm90IGEgZmF0YWwgZXJyb3IuCgkJCQlyZXR1cm47CgkJCX0KCQl9CgkJCgkJJGVfc3RyaW5nID0gJyc7CgkJZm9yZWFjaCggKGFycmF5KSRlIGFzICRlX2xpbmVfdGl0bGUgPT4gJGVfbGluZSApIHsKCQkJJGVfc3RyaW5nIC49ICRlX2xpbmVfdGl0bGUgLiAnID0+ICcgLiAkZV9saW5lIC4gIlxuIjsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0ZBVEFMIFBIUCBFUlJPUjogJyAuICRlX3N0cmluZyApOwoJCQoJfSAvLyBFbmQgc2h1dGRvd25fZnVuY3Rpb24uCgkKCQoJCglmdW5jdGlvbiBfYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJGFycmF5LCAkYXJyYXkxKSB7CgkJZnVuY3Rpb24gYmJfcmVjdXJzZSgkYXJyYXksICRhcnJheTEpCgkJewoJCSAgZm9yZWFjaCAoJGFycmF5MSBhcyAka2V5ID0+ICR2YWx1ZSkKCQkgIHsKCQkgICAgLy8gY3JlYXRlIG5ldyBrZXkgaW4gJGFycmF5LCBpZiBpdCBpcyBlbXB0eSBvciBub3QgYW4gYXJyYXkKCQkgICAgaWYgKCFpc3NldCgkYXJyYXlbJGtleV0pIHx8IChpc3NldCgkYXJyYXlbJGtleV0pICYmICFpc19hcnJheSgkYXJyYXlbJGtleV0pKSkKCQkgICAgewoJCSAgICAgICRhcnJheVska2V5XSA9IGFycmF5KCk7CgkJICAgIH0KCgkJICAgIC8vIG92ZXJ3cml0ZSB0aGUgdmFsdWUgaW4gdGhlIGJhc2UgYXJyYXkKCQkgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpCgkJICAgIHsKCQkgICAgICAkdmFsdWUgPSBiYl9yZWN1cnNlKCRhcnJheVska2V5XSwgJHZhbHVlKTsKCQkgICAgfQoJCSAgICAkYXJyYXlbJGtleV0gPSAkdmFsdWU7CgkJICB9CgkJICByZXR1cm4gJGFycmF5OwoJCX0KCgkJLy8gaGFuZGxlIHRoZSBhcmd1bWVudHMsIG1lcmdlIG9uZSBieSBvbmUKCQkkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKCQkkYXJyYXkgPSAkYXJnc1swXTsKCQlpZiAoIWlzX2FycmF5KCRhcnJheSkpCgkJewoJCSAgcmV0dXJuICRhcnJheTsKCQl9CgkJZm9yICgkaSA9IDE7ICRpIDwgY291bnQoJGFyZ3MpOyAkaSsrKQoJCXsKCQkgIGlmIChpc19hcnJheSgkYXJnc1skaV0pKQoJCSAgewoJCSAgICAkYXJyYXkgPSBiYl9yZWN1cnNlKCRhcnJheSwgJGFyZ3NbJGldKTsKCQkgIH0KCQl9CgkJcmV0dXJuICRhcnJheTsKCX0KCQoJCgkKfSAvLyBlbmQgY2xhc3MuCgo= ###PACKDATA,FILE_END,/classes/restore.php,importbuddy/classes/restore.php ###PACKDATA,FILE_START,/classes/_restoreFiles.php,importbuddy/classes/_restoreFiles.php PD9waHAKY2xhc3MgYmFja3VwYnVkZHlfcmVzdG9yZV9maWxlcyB7CgoJLyogcmVzdG9yZSgpCgkgKgoJICogUmVzdG9yZSBvbmUgb3IgbW9yZSBmaWxlcyB0byBhIHBhdGguCgkgKgoJICogQHBhcmFtCSRhcmNoaXZlX2ZpbGUJQmFja3VwIHppcCBhcmNoaXZlIGZpbGUgdG8gcmVzdG9yZSBmaWxlcyBmcm9tLgoJICogQHBhcmFtCSRmaWxlcwkJCUFycmF5IG9mIGZpbGVzIHRvIHJlc3RvcmUuIEVhY2gga2V5IGFuZCB2YWx1ZSBtdXN0IGJlIHRoZSBzYW1lLiBGb3JtYXQ6IGFycmF5KCAnZmlsZW5hbWUudHh0JyA9PiAnZmlsZW5hbWUudHh0JyApOwoJICogQHBhcmFtCSRmaW5hbFBhdGgJCURlc3RpbmF0aW9uIHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJICogQHJldHVybglib29sCQkJVHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0b3JlKCAkYXJjaGl2ZV9maWxlLCAkZmlsZXMsICRmaW5hbFBhdGgsICYkemlwYnVkZHkgPSBudWxsICkgewoJCWlmICggIWRlZmluZWQoICdQQl9TVEFOREFMT05FJyApIHx8IFBCX1NUQU5EQUxPTkUgPT09IGZhbHNlICkgewoJCQlpZiAoICEgY3VycmVudF91c2VyX2NhbiggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyb2xlX2FjY2VzcyddICkgKSB7CgkJCQlkaWUoICdFcnJvciAjNDczNjIzLiBBY2Nlc3MgRGVuaWVkLicgKTsKCQkJfQoJCX0KCQkKCQkkc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRhcmNoaXZlX2ZpbGUgKTsgLy8gc2VyaWFsIG9mIGFyY2hpdmUuCgkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkKCQlmb3JlYWNoKCAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCSRmaWxlID0gc3RyX3JlcGxhY2UoICcqJywgJycsICRmaWxlICk7IC8vIFJlbW92ZSBhbnkgd2lsZGNhcmQuCgkJCWlmICggZmlsZV9leGlzdHMoICRmaW5hbFBhdGggLiAkZmlsZSApICYmIGlzX2RpciggJGZpbmFsUGF0aCAuICRmaWxlICkgKSB7CgkJCQlpZiAoICggJGZpbGVfY291bnQgPSBAc2NhbmRpciggJGZpbmFsUGF0aCAuICRmaWxlICkgKSAmJiAoIGNvdW50KCAkZmlsZV9jb3VudCApID4gMiApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsIF9fKCAnRXJyb3IgIzkwMzYuIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYmVpbmcgcmVzdG9yZWQgYWxyZWFkeSBleGlzdHMgYW5kIGlzIE5PVCBlbXB0eS4gVGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSByZXN0b3JlZCB0byBwcmV2ZW50IGluYWR2ZXJ0ZW50bHkgbG9zaW5nIGZpbGVzIHdpdGhpbiB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LiBEZWxldGUgZXhpc3RpbmcgZGlyZWN0b3J5IGZpcnN0IGlmIHlvdSB3aXNoIHRvIHByb2NlZWQgb3IgcmVzdG9yZSBpbmRpdmlkdWFsIGZpbGVzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBFeGlzdGluZyBkaXJlY3Rvcnk6IGAnIC4gJGZpbmFsUGF0aCAuICRmaWxlIC4gJ2AuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQlpZiAoIG51bGwgPT09ICR6aXBidWRkeSApIHsKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQkJJHppcGJ1ZGR5ID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApOwoJCX0KCQkKCQkKCQkvLyBDYWxjdWxhdGUgdGVtcCBkaXJlY3RvcnkgJiBsb2NrIGl0IGRvd24uCgkJJHRlbXBfZGlyID0gZ2V0X3RlbXBfZGlyKCk7CgkJJGRlc3RpbmF0aW9uID0gJHRlbXBfZGlyIC4gJ2JhY2t1cGJ1ZGR5LScgLiAkc2VyaWFsOwoJCWlmICggKCAoICEgZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbiApICkgJiYgKCBmYWxzZSA9PT0gbWtkaXIoICRkZXN0aW5hdGlvbiwgMDc3NywgdHJ1ZSApICkgKSApIHsKCQkJJGVycm9yID0gJ0Vycm9yICM0NTg0ODU5NDU6IFVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGAnIC4gJGRlc3RpbmF0aW9uIC4gJ2AuIENoZWNrIHBlcm1pc3Npb25zLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCS8vIElmIHRlbXAgZGlyZWN0b3J5IGlzIHdpdGhpbiB3ZWJyb290IHRoZW4gbG9jayBpdCBkb3duLgoJCSR0ZW1wX2RpciA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsICR0ZW1wX2RpciApOyAvLyBOb3JtYWxpemUgZm9yIFdpbmRvd3MuCgkJJHRlbXBfZGlyID0gcnRyaW0oICR0ZW1wX2RpciwgJy9cXCcgKSAuICcvJzsgLy8gRW5mb3JjZSBzaW5nbGUgdHJhaWxpbmcgc2xhc2guCgkJaWYgKCBGQUxTRSAhPT0gc3RyaXN0ciggJHRlbXBfZGlyLCBBQlNQQVRIICkgKSB7IC8vIFRlbXAgZGlyIGlzIHdpdGhpbiB3ZWJyb290LgoJCQlwYl9iYWNrdXBidWRkeTo6YW50aV9kaXJlY3RvcnlfYnJvd3NpbmcoICRkZXN0aW5hdGlvbiApOwoJCX0KCQl1bnNldCggJHRlbXBfZGlyICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXh0cmFjdGluZyBpbnRvIHRlbXBvcmFyeSBkaXJlY3RvcnkgIicgLiAkZGVzdGluYXRpb24gLiAnIi4nICk7CgkJCgkJJHByZXR0eUZpbGVzTGlzdCA9IGFycmF5KCk7CgkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlU291cmNlID0+ICRmaWxlRGVzdGluYXRpb24gKSB7CgkJCSRwcmV0dHlGaWxlc0xpc3RbXSA9ICRmaWxlU291cmNlIC4gJyA9PiAnIC4gJGZpbGVEZXN0aW5hdGlvbjsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZXMgdG8gZXh0cmFjdDogYCcgLiBodG1sZW50aXRpZXMoIGltcGxvZGUoICcsICcsICRwcmV0dHlGaWxlc0xpc3QgKSApIC4gJ2AuJyApOwoJCXVuc2V0KCAkcHJldHR5RmlsZXNMaXN0ICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgkJCgkJLy8gRG8gdGhlIGFjdHVhbCBleHRyYWN0aW9uLgoJCSRleHRyYWN0X3N1Y2Nlc3MgPSB0cnVlOwoJCWlmICggZmFsc2UgPT09ICR6aXBidWRkeS0+ZXh0cmFjdCggJGFyY2hpdmVfZmlsZSwgJGRlc3RpbmF0aW9uLCAkZmlsZXMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM1ODQ5ODQ0NThiLiBVbmFibGUgdG8gZXh0cmFjdC4nICk7CgkJCSRleHRyYWN0X3N1Y2Nlc3MgPSBmYWxzZTsKCQl9CgkJCgkJaWYgKCB0cnVlID09PSAkZXh0cmFjdF9zdWNjZXNzICkgewoJCQkKCQkJLy8gVmVyaWZ5IGFsbCBmaWxlcy9kaXJlY3RvcmllcyB0byBiZSBleHRyYWN0ZWQgZXhpc3QgaW4gdGVtcCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIElmIGFueSBtaXNzaW5nIHRoZW4gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kIGJhaWwgb3V0LgoJCQlmb3JlYWNoKCAkZmlsZXMgYXMgJiRmaWxlICkgewoJCQkJJGZpbGUgPSBzdHJfcmVwbGFjZSggJyonLCAnJywgJGZpbGUgKTsgLy8gUmVtb3ZlIGFueSB3aWxkY2FyZC4KCQkJCWlmICggISBmaWxlX2V4aXN0cyggJGRlc3RpbmF0aW9uIC4gJy8nIC4gJGZpbGUgKSApIHsKCQkJCQkvLyBDbGVhbnVwLgoJCQkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCQkJQHRyaWdnZXJfZXJyb3IoICcnICk7IC8vIENsZWFyIG91dCBsYXN0IGVycm9yLgoJCQkJCQlAdW5saW5rKCAkZGVzdGluYXRpb24gLiAnLycgLiAkZmlsZSk7CgkJCQkJCSRsYXN0X2Vycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKCQkJCQkJaWYgKCBpc19hcnJheSggJGxhc3RfZXJyb3IgKSApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRsYXN0X2Vycm9yWydtZXNzYWdlJ10gLiAnIEZpbGU6IGAnIC4gJGxhc3RfZXJyb3JbJ2ZpbGUnXSAuICdgLiBMaW5lOiBgJyAuICRsYXN0X2Vycm9yWydsaW5lJ10gLiAnYC4nICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NTQ3ODM0NzQuIE9uZSBvciBtb3JlIGV4cGVjdGVkIGZpbGVzIC8gZGlyZWN0b3JpZXMgbWlzc2luZy4nICk7CgkJCQkJCgkJCQkJJGV4dHJhY3Rfc3VjY2VzcyA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCXVuc2V0KCAkZmlsZSApOwoJCQkKCQkJLy8gTWFkZSBpdCB0aGlzIGZhciBzbyBmaWxlcyBhbGwgZXhpc3QuIE1vdmUgdGhlbSBhbGwuCgkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCUB0cmlnZ2VyX2Vycm9yKCAnJyApOyAvLyBDbGVhciBvdXQgbGFzdCBlcnJvci4KCQkJCWlmICggZmFsc2UgPT09IHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+cmVjdXJzaXZlX2NvcHkoICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlLCAkZmluYWxQYXRoIC4gJGZpbGUgKSApIHsKCQkJCQkkbGFzdF9lcnJvciA9IGVycm9yX2dldF9sYXN0KCk7CgkJCQkJaWYgKCBpc19hcnJheSggJGxhc3RfZXJyb3IgKSApIHsKCQkJCQkJLy9wcmludF9yKCAkbGFzdF9lcnJvciApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbGFzdF9lcnJvclsnbWVzc2FnZSddIC4gJyBGaWxlOiBgJyAuICRsYXN0X2Vycm9yWydmaWxlJ10gLiAnYC4gTGluZTogYCcgLiAkbGFzdF9lcnJvclsnbGluZSddIC4gJ2AuJyApOwoJCQkJCX0KCQkJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMzUuIFVuYWJsZSB0byBjb3B5cmVzdG9yZWQgZmlsZSBgJyAuICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlIC4gJ2AgdG8gYCcgLiAkZmluYWxQYXRoIC4gJGZpbGUgLiAnYC4gVmVyaWZ5IHBlcm1pc3Npb25zIG9uIGRlc3RpbmF0aW9uIGxvY2F0aW9uICYgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5L2ZpbGUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4nOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQkJfSBlbHNlIHsKCQkJCQkkZGV0YWlscyA9ICdSZWN1cnNpdmVseSBtb3ZlZCBgJyAuICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlIC4gJ2AgdG8gYCcgLiAkZmluYWxQYXRoIC4gJGZpbGUgLiAnYC48YnI+JzsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRkZXRhaWxzICk7CgkJCQkJJHN1Y2Nlc3MgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCQoJCX0gLy8gZW5kIGV4dHJhY3Qgc3VjY2Vzcy4KCQkKCQkKCQkvLyBUcnkgdG8gY2xlYW51cC4KCQlpZiAoIGZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb24gKSApIHsKCQkJaWYgKCBmYWxzZSA9PT0gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkZGVzdGluYXRpb24gKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VuYWJsZSB0byBkZWxldGUgdGVtcG9yYXJ5IGhvbGRpbmcgZGlyZWN0b3J5IGAnIC4gJGRlc3RpbmF0aW9uIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2xlYW5lZCB1cCB0ZW1wb3JhcnkgZmlsZXMuJyApOwoJCQl9CgkJfQoJCQoJCQoJCWlmICggdHJ1ZSA9PT0gJHN1Y2Nlc3MgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0ZpbGUgcmV0cmlldmFsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJfSAvLyBFbmQgZnVuY3Rpb24gcmVzdG9yZSgpLgoKfSAvLyBFbmQgY2xhc3Mu ###PACKDATA,FILE_END,/classes/_restoreFiles.php,importbuddy/classes/_restoreFiles.php ###PACKDATA,FILE_START,/classes/remote_api.php,importbuddy/classes/remote_api.php PD9waHAKcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9jb3JlLnBocCcgKTsKCgpjbGFzcyBiYWNrdXBidWRkeV9yZW1vdGVfYXBpIHsKCQoJcHJpdmF0ZSBzdGF0aWMgJF9lcnJvcnMgPSBhcnJheSgpOwkJLy8gSG9sZCBlcnJvciBzdHJpbmdzIHRvIHJldHJpZXZlIHdpdGggZ2V0RXJyb3JzKCkuCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9jYWxDYWxsKCAkc2VjdXJlID0gZmFsc2UsICRpbXBvcnRidWRkeSA9IGZhbHNlICkgewoJCWlmICggdHJ1ZSAhPT0gJHNlY3VyZSApIHsKCQkJZGllKCAnPGh0bWw+NDAzIEFjY2VzcyBEZW5pZWQ8L2h0bWw+JyApOwoJCX0KCQkKCQlpZiAoIHRydWUgIT09IHNlbGY6OmlzX2NhbGxfdmFsaWQoKSApIHsKCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzgwMDI6IEVycm9yIHZhbGlkYXRpbmcgQVBJIGNhbGwgYXV0aGVudGljaXR5LiBWZXJpZnkgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBhY3RpdmUgQVBJIGtleS4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCX0KCQkKCQkvLyBJZiBoZXJlIHRoZW4gdmFsaWRhdGlvbiB3YXMgYWxsIGdvb2QuIEFQSSBjYWxsIGlzIGF1dGhvcml6ZWQuCgkJCgkJaWYgKCB0cnVlICE9PSAkaW1wb3J0YnVkZHkgKSB7CgkJCSRmdW5jdGlvbk5hbWUgPSAnX3ZlcmJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ZlcmInICk7CgkJfSBlbHNlIHsKCQkJJGZ1bmN0aW9uTmFtZSA9ICdfdmVyYl9pbXBvcnRidWRkeV8nIC4gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAndmVyYicgKTsKCQl9CgkJCgkJLy8gRG9lcyB2ZXJiIGV4aXN0PwoJCWlmICggZmFsc2UgPT09IG1ldGhvZF9leGlzdHMoICdiYWNrdXBidWRkeV9yZW1vdGVfYXBpJywgJGZ1bmN0aW9uTmFtZSApICkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjODQzNDg5OTc0OiBVbmtub3duIHZlcmIgYCcgLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd2ZXJiJyApIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQl9IGVsc2UgewoJCQljYWxsX3VzZXJfZnVuY19hcnJheSggJ2JhY2t1cGJ1ZGR5X3JlbW90ZV9hcGk6OicgLiAkZnVuY3Rpb25OYW1lLCBhcnJheSgpICk7CgkJfQoJCQoJCS8vIGZ1bmN0aW9uOiB2ZXJiX1tWRVJCSEVSRV0KCX0KCQoJCgkKCS8qIHJlbW90ZUNhbGwoKQoJICoKCSAqIFNlbmQgYW4gQVBJIGNhbGwgdG8gYSByZW1vdGUgc2VydmVyLgoJICogQHBhcmFtCWFycmF5IAkkcmVtb3RlQVBJCQlSZW1vdGUgQVBJIHN0YXRlIGFycmF5IGluY2x1ZGluZyBVUkwsIGV0Yy4gU3RvcmVkIGluIGRlc3RpbmF0aW9uIHNldHRpbmdzLgoJICogQHBhcmFtCXN0cmluZwkkdmVyYgkJCUFQSSB2ZXJiIHRvIGNhbGwgb24gcmVtb3RlIHNlcnZlci4KCSAqIEBwYXJhbQlhcnJheSAJJG1vcmVQYXJhbXMJCU9wdGlvbmFsOiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gYXBwZW5kIHRvIHRob3NlIHNlbnQuICBJZiBuZWVkaW5nIHRvIHNlbmQgYSBub24tc3RyaW5nIHRoaXMgc2hvdWxkIGJlIGVuY29kZWQgaW4gc29tZSBtYW5uZXIgYW5kIGRlY29kZWQgb24gcmVtb3RlLgoJICogQHBhcmFtCWludAkJJHRpbWVvdXQJCU9wdGlvbmFsOiBIb3cgbG9uZyB3ZSBleHBlY3QgdGhpcyBjYW4gbGFzdCBiZWZvcmUgYSBzZXJ2ZXIgdGltZXMgb3V0LiAgVHlwaWNhbGx5IHRoZSBtaW5pbXVtIG9mIHRoZSBsb2NhbCBhbmQgcmVtb3RlIHRpbWVvdXRzLgoJICogQHBhcmFtCXN0cmluZwkkZmlsZQkJCU9wdGlvbmFsOiBGaWxlIHdlIGFyZSBzZW5kaW5nLiBUaGlzIGlzIHBhc3NlZCBzbyB0aGF0IHZhcmlvdXMgQ1JDIGRhdGEgY2FuIGJlIGNhbGN1bGF0ZWQuCgkgKiBAcGFyYW0Jc3RyaW5nCSRmaWxlRGF0YQkJT3B0aW9uYWw6IFJhdyBmaWxlIGNvbnRlbnRzIHRvIHNlbmQgKGZvciB0aGlzIGNodW5rIGlmIHVzaW5nIGNodW5raW5nKS4KCSAqIEBwYXJhbQlpbnQJCSRzZWVrVG8JCQlPcHRpb25hbDogTG9jYXRpb24gdG8gZnNlZWsgdG8gaW4gdGhlIGZpbGUgZm9yIHdyaXRpbmcuCgkgKiBAcGFyYW0JYm9vbAkkaXNGaWxlVGVzdAkJT3B0aW9uYWw6IFdoZW4gdHJ1ZSB0aGUgZGVzdGluYXRpb24gd2lsbCBhdXRvLWRlbGV0ZSB0aGUgZmlsZSBhZnRlciB0ZXN0aW5nLgoJICogQHBhcmFtCWJvb2wJJGlzRmlsZURvbmUJCU9wdGlvbmFsOiBQYXNzIHRydWUgd2hlbiB0aGUgbGFzdCBjaHVuayAob3Igb25seSBjaHVuaykgb2YgdGhlIGZpbGUgaXMgYmVpbmcgc2VudCBzbyBkZXN0aW5hdGlvbiBrbm93cyBub3QgdG8gZXhwZWN0IGFueSBvdGhlciBwaWVjZXMuCgkgKiBAcGFyYW0JaW50CQkkZmlsZVNpemUJCU9wdGlvbmFsOiBTaXplIG9mIHRoZSBmaWxlIHNlbmRpbmcuCgkgKiBAcGFyYW0Jc3RyaW5nCSRmaWxlUGF0aAkJT3B0aW9uYWw6IFJlbW90ZSBmaWxlIHBhdGggaW4gcmVsYXRpb24gdG8gdGhlIHJvb3QgbG9jYXRpb24gd2hlcmUgdGhlIGZpbGUgaXMgYmVpbmcgc3RvcmVkLCBiYXNlZCBvbiBmaWxlIHR5cGUgKGJhc2VkIG9uIHZlcmIpLgoJICogQHBhcmFtCWJvb2wJJHJldHVyblJhdwkJV2hlbiB0cnVlIHJldHVybnMgYm9keSByYXcgdGV4dC9kYXRhIHJhdGhlciB0aGFuIGRlY29kaW5nIGVuY29kZWQgZGF0YSBmaXJzdC4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVtb3RlQ2FsbCggJHJlbW90ZUFQSSwgJHZlcmIsICRtb3JlUGFyYW1zID0gYXJyYXkoKSwgJHRpbWVvdXQsICRmaWxlID0gJycsICRmaWxlRGF0YSA9ICcnLCAkc2Vla1RvID0gJycsICRpc0ZpbGVUZXN0ID0gJycsICRpc0ZpbGVEb25lID0gZmFsc2UsICRmaWxlU2l6ZSA9ICcnLCAkZmlsZVBhdGggPSAnJywgJHJldHVyblJhdyA9IGZhbHNlICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ByZXBhcmluZyByZW1vdGUgQVBJIGNhbGwgdmVyYiBgJyAuICR2ZXJiIC4gJ2AuJyApOwoJCSRub3cgPSB0aW1lKCk7CgkJCgkJJGJvZHkgPSBhcnJheSgKCQkJJ2JhY2t1cGJ1ZGR5X2FwaV9rZXknID0+ICRyZW1vdGVBUElbJ2tleV9wdWJsaWMnXSwKCQkJJ2JhY2t1cGJ1ZGR5X3ZlcnNpb24nID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksCgkJCSd2ZXJiJyA9PiAkdmVyYiwKCQkJJ25vdycgPT4gJG5vdywKCQkpOwoJCQoJCWlmICggISBpc19udW1lcmljKCAkdGltZW91dCApICkgewoJCQkkdGltZW91dCA9IGJhY2t1cGJ1ZGR5X2NvbnN0YW50czo6REVQTE9ZTUVOVF9SRU1PVEVfQVBJX0RFRkFVTFRfVElNRU9VVDsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAncmVtb3RlQ2FsbCgpIEhUVFAgd2FpdCB0aW1lb3V0OiBgJyAuICR0aW1lb3V0IC4gJ2Agc2Vjb25kcy4nICk7CgkJCgkJJGZpbGVjcmMgPSAnJzsKCQlpZiAoICcnICE9ICRmaWxlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW1vdGUgQVBJIHNlbmRpbmcgZmlsZSBgJyAuICRmaWxlIC4gJ2AuJyApOwoJCQkkZmlsZURhdGEgPSBiYXNlNjRfZW5jb2RlKCAkZmlsZURhdGEgKTsgLy8gU2FkbHkgd2UgY2Fubm90IHNhZmVseSB0cmFuc21pdCBiaW5hcnkgZGF0YSBvdmVyIGN1cmwgd2l0aG91dCB1c2luZyBhbiBhY3R1YWwgZmlsZS4gYmFzZTY0IGVuY29kaW5nIGFkZHMgMzclIHNpemUgb3ZlcmhlYWQuCgkJCSRmaWxlY3JjID0gc3ByaW50ZiAoICIldSIsIGNyYzMyKCAkZmlsZURhdGEgKSApOwoJCQkkYm9keVsnZmlsZW5hbWUnXSA9IGJhc2VuYW1lKCAkZmlsZSApOwoJCQlpZiAoICcnICE9ICRmaWxlUGF0aCApIHsKCQkJCSRib2R5WydmaWxlcGF0aCddID0gJGZpbGVQYXRoOwoJCQl9CgkJCSRib2R5WydmaWxlZGF0YSddID0gJGZpbGVEYXRhOwoJCQkkYm9keVsnZmlsZWRhdGFsZW4nXSA9IHN0cmxlbiggJGZpbGVEYXRhICk7CgkJCSRib2R5WydmaWxlY3JjJ10gPSAkZmlsZWNyYzsKCQkJaWYgKCB0cnVlID09PSAkaXNGaWxlVGVzdCApIHsKCQkJCSRib2R5WydmaWxldGVzdCddID0gJzEnOwoJCQl9IGVsc2UgewoJCQkJJGJvZHlbJ2ZpbGV0ZXN0J10gPSAnMCc7CgkJCX0KCQkJaWYgKCB0cnVlID09PSAkaXNGaWxlRG9uZSApIHsKCQkJCSRib2R5WydmaWxlZG9uZSddID0gJzEnOwoJCQl9IGVsc2UgewoJCQkJJGJvZHlbJ2ZpbGVkb25lJ10gPSAnMCc7CgkJCX0KCQkJJGJvZHlbJ3NlZWt0byddID0gJHNlZWtUbzsgLy8gTG9jYXRpb24gdG8gc2VlayB0byBiZWZvcmUgd3JpdGluZyB0aGlzIHBhcnQuCgkJCWlmICggJycgIT0gJGZpbGVTaXplICkgewoJCQkJJGJvZHlbJ2ZpbGV0b3RhbHNpemUnXSA9ICRmaWxlU2l6ZTsKCQkJfQoJCX0KCQlpZiAoICEgaXNfYXJyYXkoICRtb3JlUGFyYW1zICkgKSB7CgkJCWVycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5IEVycm9yICM0ODkzNzgzNDQ3IHJlbW90ZV9hcGkucGhwOyAkbW9yZVBhcmFtcyBtdXN0IGJlIHBhc3NlZCBhcyBhcnJheS4nICk7CgkJfQoJCSRib2R5ID0gYXJyYXlfbWVyZ2UoICRib2R5LCAkbW9yZVBhcmFtcyApOwoJCQoJCS8vcHJpbnRfciggJGFwaUtleSApOwoJCSRib2R5WydzaWduYXR1cmUnXSA9IG1kNSggJG5vdyAuICR2ZXJiIC4gJHJlbW90ZUFQSVsna2V5X3B1YmxpYyddIC4gJHJlbW90ZUFQSVsna2V5X3NlY3JldCddIC4gJGZpbGVjcmMgKTsKCQkKCQlpZiAoIGRlZmluZWQoICdCQUNLVVBCVUREWV9ERVYnICkgJiYgKCB0cnVlID09PSBCQUNLVVBCVUREWV9ERVYgKSApIHsKCQkJZXJyb3JfbG9nKCAnQkFDS1VQQlVERFlfREVWLXJlbW90ZSBhcGkgaHR0cCBib2R5IFNFTkQtICcgLiBwcmludF9yKCAkYm9keSwgdHJ1ZSApICk7CgkJfQoJCS8vZXJyb3JfbG9nKCAnY29ubmVjdFRvOiAnIC4gJHJlbW90ZUFQSVsnc2l0ZXVybCddICk7CgkJJHJlc3BvbnNlID0gd3BfcmVtb3RlX3Bvc3QoICRyZW1vdGVBUElbJ3NpdGV1cmwnXSwgYXJyYXkoCgkJCQknbWV0aG9kJyA9PiAnUE9TVCcsCgkJCQkndGltZW91dCcgPT4gKCAkdGltZW91dCAtIDIgKSwKCQkJCSdyZWRpcmVjdGlvbicgPT4gNSwKCQkJCSdodHRwdmVyc2lvbicgPT4gJzEuMCcsCgkJCQknYmxvY2tpbmcnID0+IHRydWUsCgkJCQknaGVhZGVycycgPT4gYXJyYXkoICdSZWZlcmVyJyA9PiAkcmVtb3RlQVBJWydzaXRldXJsJ10gKSwgLy8gU2VuZGluZyByZWZlcmVyIGhlYWRlciBoZWxwcyBwcmV2ZW50IHNlY3VyaXR5IGJsb2Nrcy4KCQkJCSdib2R5JyA9PiAkYm9keSwKCQkJCSdjb29raWVzJyA9PiBhcnJheSgpCgkJCSkKCQkpOwoJCQoJCWlmICggaXNfd3BfZXJyb3IoICRyZXNwb25zZSApICkgewoJCQlyZXR1cm4gc2VsZjo6X2Vycm9yKCAnRXJyb3IgIzkwMzc6IFVuYWJsZSB0byBjb25uZWN0IHRvIHJlbW90ZSBzZXJ2ZXIgb3IgdW5leHBlY3RlZCByZXNwb25zZS4gRGV0YWlsczogYCcgLiAkcmVzcG9uc2UtPmdldF9lcnJvcl9tZXNzYWdlKCkgLiAnYCAtIFVSTDogYCcgLiAkcmVtb3RlQVBJWydzaXRldXJsJ10gLiAnYC4nICk7CgkJfSBlbHNlIHsKCQkJaWYgKCB0cnVlID09PSAkcmV0dXJuUmF3ICkgewoJCQkJcmV0dXJuICRyZXNwb25zZVsnYm9keSddOwoJCQl9CgkJCS8vZXJyb3JfbG9nKCAnMzMzM1Jlc3BvbnNlOiAnIC4gJHJlc3BvbnNlWydib2R5J10gKTsKCQkJaWYgKCBudWxsID09PSAoICRyZXR1cm4gPSBqc29uX2RlY29kZSggJHJlc3BvbnNlWydib2R5J10sIHRydWUgKSApICkgewoJCQkJJHNhbmlib2R5ID0gaHRtbGVudGl0aWVzKCBzdHJpcHNsYXNoZXNfZGVlcCggJHJlc3BvbnNlWydib2R5J10gKSApOwoJCQkJaWYgKCBmYWxzZSAhPT0gc3RyaXBvcyggJHNhbmlib2R5LCAnUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlJyApICkgewoJCQkJCXJldHVybiBzZWxmOjpfZXJyb3IoICdFcnJvciAjODAwMWI6IFJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZS4gVGhlIGRlc3RpbmF0aW9uIHNlcnZlciBzYXlzIHdlIHNlbnQgdG9vIG11Y2ggZGF0YS4gRWl0aGVyIGNoYW5nZSB0aGUgRGVwbG95bWVudCBBZHZhbmNlZCBTZXR0aW5nICJNYXggQ2h1bmsgU2l6ZSIgdG8gYSBsb3dlciB2YWx1ZSBvciBjaGFuZ2UgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIHRvIGFjY2VwdCBhIGxhcmdlciB2YWx1ZS4gU2VlIHRoZSBmb2xsb3dpbmcgd2VicGFnZSBmb3IgdGhlIHNlcnZlciBzb2x1dGlvbiBmb3IgQXBhY2hlLCBuZ2lueCwgb3IgSUlTOiBodHRwczovL2NyYWZ0Y21zLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8yMzI4LzQxMy1yZXF1ZXN0LWVudGl0eS10b28tbGFyZ2UtZXJyb3Itd2l0aC11cGxvYWRpbmctYS1maWxlICAuLi4gUmV0dXJuIGRhdGE6IGAnIC4gJHNhbmlib2R5IC4gJ2AuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gc2VsZjo6X2Vycm9yKCAnRXJyb3IgIzgwMDE6IFVuYWJsZSB0byBkZWNvZGUganNvbiByZXNwb25zZS4gVmVyaWZ5IHJlbW90ZSBzaXRlIEFQSSBVUkwgYCcgLiAkcmVtb3RlQVBJWydzaXRldXJsJ10gLiAnYCwgQVBJIGtleSwgYW5kIHRoYXQgdGhlIHJlbW90ZSBzaXRlIGhhcyB0aGUgQVBJIGVuYWJsZWQgaW4gaXRzIHdwLWNvbmZpZy5waHAgYnkgYWRkaW5nIDxpPmRlZmluZSggXCdCQUNLVVBCVUREWV9BUElfRU5BQkxFXCcsIHRydWUgKTs8L2k+IHNvbWV3aGVyZSBBQk9WRSB0aGUgbGluZSAiVGhhdFwncyBhbGwsIHN0b3AgZWRpdGluZyEiLiBSZXR1cm4gZGF0YTogYCcgLiAkc2FuaWJvZHkgLiAnYC4nICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAoICEgaXNzZXQoICRyZXR1cm5bJ3N1Y2Nlc3MnXSApIHx8ICggdHJ1ZSAhPT0gJHJldHVyblsnc3VjY2VzcyddICkgKSB7IC8vIEZhaWwuCgkJCQkJJGVycm9yID0gJyc7CgkJCQkJaWYgKCBpc3NldCggJHJldHVyblsnZXJyb3InXSApICkgewoJCQkJCQkkZXJyb3IgPSAkcmV0dXJuWydlcnJvciddOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRlcnJvciA9ICdFcnJvciAjODM4NDM4NzM0OiBObyBlcnJvciBnaXZlbi4gRnVsbCByZXNwb25zZTogIicgLiAkcmV0dXJuIC4gJyIuJzsKCQkJCQl9CgkJCQkJcmV0dXJuIHNlbGY6Ol9lcnJvciggJ0Vycm9yICMzMjg5Mzc5OiBBUEkgZGlkIG5vdCByZXBvcnQgc3VjY2Vzcy4gRXJyb3IgZGV0YWlsczogYCcgLiAkZXJyb3IgLiAnYC4nICk7CgkJCQl9IGVsc2UgeyAvLyBTdWNjZXNzLgoJCQkJCWlmICggaXNzZXQoICRyZXR1cm5bJ21lc3NhZ2UnXSApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXNwb25zZSBtZXNzYWdlIGZyb20gQVBJOiAnIC4gJHJldHVyblsnbWVzc2FnZSddIC4gJyIuJyApOwoJCQkJCX0KCQkJCQlyZXR1cm4gJHJldHVybjsKCQkJCX0KCQkJfQoJCX0KCX0gLy8gRW5kIHJlbW90ZUNhbGwoKS4KCQoJCgkKCS8qIF92ZXJiX3J1bkJhY2t1cCgpCgkgKgoJICogUnVuIGEgYmFja3VwIHdpdGggYSBzcGVjaWZpZWQgY3VzdG9tIHByb2ZpbGU7IGVnIGEgZGIgYmFja3VwIGZvciBwdWxsaW5nIGRlcGxveW1lbnQuCgkgKiBQYXJhbXM6IFBPU1QgInByb2ZpbGUiIC0gQmFzZTY0IGVuY29kZWQganNvbiBlbmNvZGVkIHByb2ZpbGUgYXJyYXkuCgkgKgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9ydW5CYWNrdXAoKSB7CgkJJGJhY2t1cFNlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMCApOwoJCSRwcm9maWxlQXJyYXkgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwcm9maWxlJyApOwoJCWlmICggZmFsc2UgPT09ICggJHByb2ZpbGVBcnJheSA9IGJhc2U2NF9kZWNvZGUoICRwcm9maWxlQXJyYXkgKSApICkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjODM0MzcyODogVW5hYmxlIHRvIGJhc2U2NCBkZWNvZGUgcHJvZmlsZSBkYXRhLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlLCAkYmFja3VwU2VyaWFsICk7CgkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCWlmICggTlVMTCA9PT0gKCAkcHJvZmlsZUFycmF5ID0ganNvbl9kZWNvZGUoICRwcm9maWxlQXJyYXksIHRydWUgKSApICkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjMzI3MjM4MzogVW5hYmxlIHRvIGpzb24gZGVjb2RlIHByb2ZpbGUgZGF0YS4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSwgJGJhY2t1cFNlcmlhbCApOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCX0KCQkKCQkvLyBBcHBlbmRzIHNlc3Npb24gdG9rZW5zIGZyb20gdGhlIHB1bGxpbmcgc2l0ZSBzbyB0aGV5IHdvbnQgZ2V0IGxvZ2dlZCBvdXQgd2hlbiB0aGlzIGRhdGFiYXNlIGlzIHJlc3RvcmVkIHRoZXJlLgoJCWlmICggaXNzZXQoICRwcm9maWxlQXJyYXlbJ3Nlc3Npb25Ub2tlbnMnXSApICYmICggaXNfYXJyYXkoICRwcm9maWxlQXJyYXlbJ3Nlc3Npb25Ub2tlbnMnXSApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlbW90ZSBzZXNzaW9uIHRva2VucyBuZWVkIHVwZGF0ZWQuJywgJGJhY2t1cFNlcmlhbCApOwoJCQkvL2Vycm9yX2xvZyggJ25lZWR0b2tlbicgKTsKCQkJCgkJCWlmICggISBpc19udW1lcmljKCAkcHJvZmlsZUFycmF5WydzZXNzaW9uSUQnXSApICkgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzMyODk4OTg5My4gSW52YWxpZCBzZXNzaW9uIElELiBNdXN0IGJlIG51bWVyaWMuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCQl9CgkJCQoJCQkvLyBHZXQgY3VycmVudCBzZXNzaW9uIHRva2Vucy4KCQkJZ2xvYmFsICR3cGRiOwoJCQkkc3FsID0gIlNFTEVDVCBtZXRhX3ZhbHVlIEZST00gYCIgLiBEQl9OQU1FIC4gImAuYCIgLiAkd3BkYi0+cHJlZml4IC4gInVzZXJtZXRhYCBXSEVSRSBgdXNlcl9pZGAgPSAnIiAuICRwcm9maWxlQXJyYXlbJ3Nlc3Npb25JRCddIC4gIicgQU5EIGBtZXRhX2tleWAgPSAnc2Vzc2lvbl90b2tlbnMnOyI7CgkJCSRyZXN1bHRzID0gJHdwZGItPmdldF92YXIoICRzcWwgKTsKCQkJJG9sZFNlc3Npb25Ub2tlbnMgPSBAdW5zZXJpYWxpemUoICRyZXN1bHRzICk7CgkJCQoJCQkvLyBBZGQgcmVtb3RlIHRva2Vucy4KCQkJaWYgKCAhIGlzX2FycmF5KCAkb2xkU2Vzc2lvblRva2VucyApICkgewoJCQkJJG9sZFNlc3Npb25Ub2tlbnMgPSBhcnJheSgpOwoJCQl9CgkJCSRuZXdTZXNzaW9uVG9rZW5zID0gYXJyYXlfbWVyZ2UoICRvbGRTZXNzaW9uVG9rZW5zLCAkcHJvZmlsZUFycmF5WydzZXNzaW9uVG9rZW5zJ10gKTsKCQkJCgkJCS8vIFJlLXNlcmlhbGl6ZS4KCQkJJG5ld1Nlc3Npb25Ub2tlbnMgPSBzZXJpYWxpemUoICRuZXdTZXNzaW9uVG9rZW5zICk7CgkJCQoJCQkvLyBTYXZlIG1lcmdlZCB0b2tlbnMgaGVyZS4KCQkJJHNxbCA9ICJVUERBVEUgYCIgLiBEQl9OQU1FIC4gImAuYCIgLiAkd3BkYi0+cHJlZml4IC4gInVzZXJtZXRhYCBTRVQgbWV0YV92YWx1ZT0gJXMgV0hFUkUgYHVzZXJfaWRgID0gJyIgLiAkcHJvZmlsZUFycmF5WydzZXNzaW9uSUQnXSAuICInIEFORCBgbWV0YV9rZXlgID0gJ3Nlc3Npb25fdG9rZW5zJzsiOwoJCQkkc3RyaW5nZWRTZXNzaW9uVG9rZW5zID0gc2VyaWFsaXplKCAkcHJvZmlsZUFycmF5WydzZXNzaW9uVG9rZW5zJ10gKTsKCQkJCgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggJHdwZGItPnByZXBhcmUoICRzcWwsICRzdHJpbmdlZFNlc3Npb25Ub2tlbnMgKSApICkgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzQzNzM0Nzg0OiBVbmFibGUgdG8gdXBkYXRlIHJlbW90ZSBzZXNzaW9uIHRva2VuLic7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSwgJGJhY2t1cFNlcmlhbCApOwoJCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQkJfQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXBkYXRlZCByZW1vdGUgc2Vzc2lvbiB0b2tlbnMuJywgJGJhY2t1cFNlcmlhbCApOwoJCX0KCQkKCQlpZiAoIHRydWUgIT09ICggJG1heWJlTWVzc2FnZSA9IGJhY2t1cGJ1ZGR5X2FwaTo6cnVuQmFja3VwKCAkcHJvZmlsZUFycmF5LCAkdHJpZ2dlclRpdGxlID0gJ2RlcGxveW1lbnRfcHVsbGluZycsICRiYWNrdXBNb2RlID0gJycsICRiYWNrdXBTZXJpYWwgKSApICkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDgzOTQ4NzM6IFVuYWJsZSB0byBsYXVuY2ggYmFja3VwIGF0IHNvdXJjZS4gRGV0YWlsczogYCcgLiAkbWF5YmVNZXNzYWdlIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UsICRiYWNrdXBTZXJpYWwgKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQl9IGVsc2UgewoJCQkkYXJjaGl2ZUZpbGVuYW1lID0gYmFzZW5hbWUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmNhbGN1bGF0ZUFyY2hpdmVGaWxlbmFtZSggJGJhY2t1cFNlcmlhbCwgJHByb2ZpbGVBcnJheVsndHlwZSddLCAkcHJvZmlsZUFycmF5ICkgKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiB0cnVlLCAnYmFja3VwU2VyaWFsJyA9PiAkYmFja3VwU2VyaWFsLCAnYmFja3VwRmlsZScgPT4gJGFyY2hpdmVGaWxlbmFtZSApICkgKTsKCQl9Cgl9IC8vIEVuZCBfdmVyYl9ydW5CYWNrdXAoKS4KCQoJCgkKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX2dldEJhY2t1cFN0YXR1cygpIHsKCQkkYmFja3VwU2VyaWFsID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2VyaWFsJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJyoqKiBFbmQgUmVtb3RlIEJhY2t1cCBMb2cgc2VjdGlvbicsICRiYWNrdXBTZXJpYWwgKTsgLy8gUGxhY2UgYXQgZW5kIG9mIGxvZy4KCQliYWNrdXBidWRkeV9hcGk6OmdldEJhY2t1cFN0YXR1cyggJGJhY2t1cFNlcmlhbCApOyAvLyBlY2hvcyBvdXQuIFVzZSAkcmV0dXJuUmF3ID0gdHJ1ZSBmb3IgcmVtb3RlX2FwaSBjYWxsIGZvciB0aGlzIHNwZWNpYWwgdmVyYiB0aGF0IGRvZXMgbm90IHJldHVybiBqc29uLgoJCQoJCS8vIEZpeCBtaXNzaW5nIFdQIGNyb24gY29uc3RhbnQuCgkJaWYgKCAhZGVmaW5lZCggJ1dQX0NST05fTE9DS19USU1FT1VUJyApICkgewoJCQlkZWZpbmUoJ1dQX0NST05fTE9DS19USU1FT1VUJywgNjApOyAgLy8gSW4gc2Vjb25kcwoJCX0KCQkKCQlpZiAoICcxJyAhPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3NraXBfc3Bhd25fY3Jvbl9jYWxsJ10gKSB7CgkJCXVwZGF0ZV9vcHRpb24oICdfdHJhbnNpZW50X2RvaW5nX2Nyb24nLCAwICk7IC8vIFByZXZlbnQgY3Jvbi1ibG9ja2luZyBmb3IgbmV4dCBpdGVtLgoJCQlzcGF3bl9jcm9uKCB0aW1lKCkgKyAxNTAgKTsgLy8gQWRkcyA+IDYwIHNlY29uZHMgdG8gZ2V0IGFyb3VuZCBvbmNlIHBlciBtaW51dGUgY3JvbiBydW5uaW5nIGxpbWl0LgoJCX0KCX0gLy8gZW5kIF92ZXJiX2dldEJhY2t1cFN0YXR1cygpLgoJCgkKCQoJLyogX3ZlcmJfY29uZmlybURlcGxveW1lbnQoKQoJICoKCSAqIFVzZXIgY29uZmlybWVkIHRoZSBkZXBsb3ltZW50IHNvIGNsZWFudXAgYW55IHJlbWFpbmluZyB0ZW1wb3Jhcnkgc3R1ZmYgc3VjaCBhcyB0ZW1wIGRiIHRhYmxlcy4gTm90ZTogaW1wb3J0YnVkZHksIGJhY2t1cCBmaWxlcywgZXRjIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBjbGVhbmVkIHVwIGJ5IGltcG9ydGJ1ZGR5IGl0c2VsZiBhdCB0aGlzIHBvaW50LgoJICoKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfY29uZmlybURlcGxveW1lbnQoKSB7CgkJCgkJJHNlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3NlcmlhbCcgKTsKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2hvdXNla2VlcGluZy5waHAnICk7CgkJYmFja3VwYnVkZHlfaG91c2VrZWVwaW5nOjpyZW1vdmVfdGVtcF90YWJsZXMoICRzZXJpYWwgKTsKCQkKCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IHRydWUgKSApICk7CgkJCgl9IC8vIEVuZCBfdmVyYl9jb25maXJtRGVwbG95bWVudCgpLgoJCgkKCS8vIFJlY2VpdmUgYmFja3VwIGFyY2hpdmUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV9iYWNrdXAoKSB7CgkJc2VsZjo6X3NlbmRGaWxlKCAnYmFja3VwJyApOwoJfSAvLyBFbmQgX3ZlcmJfc2VuZEZpbGVfYmFja3VwKCkuCgkKCQoJLy8gUmVjZWl2ZSB0aGVtZSBmaWxlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfc2VuZEZpbGVfdGhlbWUoKSB7CgkJc2VsZjo6X3NlbmRGaWxlKCAndGhlbWUnICk7Cgl9IC8vIEVuZCBfdmVyYl9zZW5kRmlsZV90aGVtZSgpLgoJCgkvLyBSZWNlaXZlIGNoaWxkIHRoZW1lIGZpbGUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV9jaGlsZFRoZW1lKCkgewoJCXNlbGY6Ol9zZW5kRmlsZSggJ2NoaWxkVGhlbWUnICk7Cgl9IC8vIEVuZCBfdmVyYl9zZW5kRmlsZV9jaGlsZHRoZW1lKCkuCgkKCS8vIFJlY2VpdmUgcGx1Z2luIGZpbGUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV9wbHVnaW4oKSB7CgkJc2VsZjo6X3NlbmRGaWxlKCAncGx1Z2luJyApOwoJfSAvLyBFbmQgX3ZlcmJfc2VuZEZpbGVfcGx1Z2luKCkuCgkKCS8vIFJlY2VpdmUgYmFja3VwIGFyY2hpdmUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV9tZWRpYSgpIHsKCQlzZWxmOjpfc2VuZEZpbGUoICdtZWRpYScgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX21lZGlhKCkuCgkKCS8vIFRlc3RpbmcgZmlsZSBzZW5kIGFiaWxpdHkuIEZpbGUgaXMgdHJhbnNpZW50OyBzdG9yZWQgaW4gdGVtcCBkaXIgbW9tZW50YXJpbHkuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV90ZXN0KCkgewoJCXNlbGY6Ol9zZW5kRmlsZSggJ3Rlc3QnICk7Cgl9IC8vIEVuZCBfdmVyYl9zZW5kRmlsZV90ZXN0KCkuCgkKCQoJCgkvLyBHZXQgYmFja3VwIGFyY2hpdmUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9nZXRGaWxlX2JhY2t1cCgpIHsKCQlzZWxmOjpfZ2V0RmlsZSggJ2JhY2t1cCcgKTsKCX0gLy8gRW5kIF92ZXJiX2dldEZpbGVfYmFja3VwKCkuCgkKCS8vIEdldCB0aGVtZSBmaWxlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfZ2V0RmlsZV90aGVtZSgpIHsKCQlzZWxmOjpfZ2V0RmlsZSggJ3RoZW1lJyApOwoJfSAvLyBFbmQgX3ZlcmJfZ2V0RmlsZV90aGVtZSgpLgoJCgkvLyBHZXQgY2hpbGQgdGhlbWUgZmlsZS4KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX2dldEZpbGVfY2hpbGRUaGVtZSgpIHsKCQlzZWxmOjpfZ2V0RmlsZSggJ2NoaWxkVGhlbWUnICk7Cgl9IC8vIEVuZCBfdmVyYl9nZXRGaWxlX2NoaWxkVGVtZSgpLgoJCgkvLyBHZXQgcGx1Z2luIGZpbGUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9nZXRGaWxlX3BsdWdpbigpIHsKCQlzZWxmOjpfZ2V0RmlsZSggJ3BsdWdpbicgKTsKCX0gLy8gRW5kIF92ZXJiX2dldEZpbGVfcGx1Z2luKCkuCgkKCS8vIEdldCBiYWNrdXAgYXJjaGl2ZS4KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX2dldEZpbGVfbWVkaWEoKSB7CgkJc2VsZjo6X2dldEZpbGUoICdtZWRpYScgKTsKCX0gLy8gRW5kIF92ZXJiX2dldEZpbGVfbWVkaWEoKS4KCQoJCgkKCS8qIF9nZXRGaWxlUGF0aEJ5VHlwZSgpCgkgKgoJICogQ2FsY3VsYXRlcyByb290IGRpcmVjdG9yeSB0byBzdG9yZSB0aGUgc3BlY2lmaWVkIHR5cGUgaW4uIENvbnRhaW5zIHRyYWlsaW5nIHNsYXNoLiBEaWVzIGlmIHVua25vd24gZmlsZSB0eXBlIHNwZWNpZmllZCBpbiBwYXJhbXMuCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJHR5cGUJCUZpbGUgdHlwZS9sb2NhdGlvbiBuYW1lIHRvIHN0b3JlIGluLiBWYWxpZCB2YWx1ZXM6IGJhY2t1cCwgbWVkaWEsIHBsdWdpbiwgdGhlbWUuCgkgKgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZ2V0RmlsZVBhdGhCeVR5cGUoICR0eXBlICkgewoJCWlmICggJ2JhY2t1cCcgPT0gJHR5cGUgKSB7CgkJCSRyb290RGlyID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCk7IC8vIEluY2x1ZGUgdHJhaWxpbmcgc2xhc2guCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJHJvb3REaXIsICRkaWUgPSBmYWxzZSApOwoJCX0gZWxzZWlmICggJ21lZGlhJyA9PSAkdHlwZSApIHsKCQkJJHdwX3VwbG9hZF9kaXIgPSB3cF91cGxvYWRfZGlyKCk7CgkJCSRyb290RGlyID0gJHdwX3VwbG9hZF9kaXJbJ2Jhc2VkaXInXSAuICcvJzsKCQkJdW5zZXQoICR3cF91cGxvYWRfZGlyICk7CgkJfSBlbHNlaWYgKCAncGx1Z2luJyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSB3cF9ub3JtYWxpemVfcGF0aCggV1BfUExVR0lOX0RJUiApIC4gJy8nOwoJCX0gZWxzZWlmICggJ3RoZW1lJyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgLiAnLyc7CgkJfSBlbHNlaWYgKCAnY2hpbGRUaGVtZScgPT0gJHR5cGUgKSB7CgkJCSRyb290RGlyID0gZ2V0X3N0eWxlc2hlZXRfZGlyZWN0b3J5KCkgLiAnLyc7CgkJfSBlbHNlaWYoICd0ZXN0JyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCk7CgkJfSBlbHNlIHsKCQkJJGVycm9yID0gJ0Vycm9yICM4NDkzNDk4NC4gWW91IG11c3Qgc3BlY2lmeSBhIHNlbmRmaWxlIHR5cGU6IFVua25vd24gZmlsZSB0eXBlIGAnIC4gaHRtbGVudGl0aWVzKCAkdHlwZSApIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCWVycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5IEFQSSBlcnJvcjogJyAuICRlcnJvciApOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCX0KCQlyZXR1cm4gJHJvb3REaXI7Cgl9IC8vIEVuZCBfZ2V0RmlsZVBhdGhCeVR5cGUoKS4KCQoJCgkvKiBfZ2V0RmlsZSgpCgkgKgoJICogQ2FsbGluZyBzaXRlIGlzIHdhbnRpbmcgdG8gZ2V0IGEgZmlsZSBGUk9NIHRoaXMgc2l0ZS4KCSAqCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9nZXRGaWxlKCAkdHlwZSApIHsKCQkkcm9vdERpciA9IHNlbGY6Ol9nZXRGaWxlUGF0aEJ5VHlwZSggJHR5cGUgKTsgLy8gY29udGFpbnMgdHJhaWxpbmcgc2xhc2guCgkJJGZpbGVQYXRoID0gc3RyaXBzbGFzaGVzX2RlZXAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVuYW1lJyApICk7CgkJJGZ1bGxGaWxlbmFtZSA9ICRyb290RGlyIC4gJGZpbGVQYXRoOwoJCQoJCSRzZWVrVG8gPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdzZWVrdG8nICk7CgkJaWYgKCAhIGlzX251bWVyaWMoICRzZWVrVG8gKSApIHsKCQkJJHNlZWtUbyA9IDA7CgkJfQoJCQoJCSRtYXhQYXlsb2FkID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWF4UGF5bG9hZCcgKTsgLy8gTWF4IHBheWxvYWQgaW4gYnl0ZXMuCgkJJG1heFBheWxvYWRCeXRlcyA9ICRtYXhQYXlsb2FkICogMTAyNCAqIDEwMjQ7CgkJJGVuY29kZVJlZHVjZWRQYXlsb2FkID0gZmxvb3IoICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWF4UGF5bG9hZCcgKSAtICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWF4UGF5bG9hZCcgKSAqIDAuMzcgKSApICogMTAyNCAqIDEwMjQgKTsgLy8gVGFrZSBpbnRvIGFjY291bnQgMzclIGJhc2U2NCBlbmNvZGluZyBvdmVyaGVhZC4gQ29udmVydCB0byBieXRlcy4gUmVtb3ZlIGFueSBkZWNpbWFscyBkb3duIHZpYSBmbG9vci4KCQkKCQkvLyBGaWxlIGV4aXN0PyAobm90ZTogaWYgdXRmOCB0aGVuIHRoaXMgZmlyc3QgY2hlY2sgd2lsbCBmYWlsIGFuZCBpbnNpZGUgd2Ugd2lsbCBjaGVjayBmb3IgdGhlIGZpbGUgYWZ0ZXIgdXRmOCBkZWNvZGluZy4pCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZnVsbEZpbGVuYW1lICkgKSB7CgkJCS8vIENoZWNrIGlmIHV0ZjggZGVjb2RpbmcgdGhlIGZpbGVuYW1lIGhlbHBzIHVzIGZpbmQgaXQuCgkJCSR1dGZfZGVjb2RlZF9maWxlbmFtZSA9IHV0ZjhfZGVjb2RlKCAkZmlsZVBhdGggKTsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJHJvb3REaXIgLiAkdXRmX2RlY29kZWRfZmlsZW5hbWUgKSApIHsKCQkJCSRmdWxsRmlsZW5hbWUgPSAkcm9vdERpciAuICR1dGZfZGVjb2RlZF9maWxlbmFtZTsKCQkJfSBlbHNlIHsKCQkJCSRtZXNzYWdlID0gJ0Vycm9yICM4MzkyOTgzODogUmVxdWVzdGVkIGAnIC4gJHR5cGUgLiAnYCBmaWxlIHdpdGggZnVsbCBwYXRoIGAnIC4gJGZ1bGxGaWxlbmFtZSAuICdgIGRvZXMgbm90IGV4aXN0LiBXYXMgaXQganVzdCBkZWxldGVkPyBTZWUgbG9nIGZvciBkZXRhaWxzLic7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQkJfQoJCX0KCQkKCQkkc2l6ZSA9IGZpbGVzaXplKCAkZnVsbEZpbGVuYW1lICk7CgkJJGVuY29kZWRTaXplID0gKCAkc2l6ZSAqIDAuMzcgKSArICRzaXplOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGUgc2l6ZSBvZiBmaWxlIHRvIGdldDogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRzaXplICkgLiAnLiBBZnRlciBlbmNvZGluZyBvdmVyaGVhZDogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRlbmNvZGVkU2l6ZSApICk7CgkJCgkJaWYgKCAkZW5jb2RlZFNpemUgPiAkbWF4UGF5bG9hZEJ5dGVzICkgewoJCQkkY2h1bmtzVG90YWwgPSBjZWlsKCAkZW5jb2RlZFNpemUgLyAkbWF4UGF5bG9hZEJ5dGVzICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RoaXMgZmlsZSArIGVuY29kaW5nIGV4Y2VlZHMgdGhlIG1heGltdW0gcGVyLWNodW5rIHBheWxvYWQgc2l6ZSBzbyB3aWxsIGJlIHJlYWQgaW4gYW5kIHNlbnQgaW4gY2h1bmtzIG9mICcgLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdtYXhQYXlsb2FkJyApIC4gJ01CICgnIC4gJG1heFBheWxvYWRCeXRlcyAuICcgYnl0ZXMpIHRvdGFsaW5nIGFwcHJveGltYXRlbHkgJyAuICRjaHVua3NUb3RhbCAuICcgY2h1bmtzLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUaGlzIGZpbGUgKyBlbmNvZGluZyBkb2VzIG5vdCBleGNlZWQgcGVyLWNodW5rIHBheWxvYWQgc2l6ZSBvZiAnIC4gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWF4UGF5bG9hZCcgKSAuICdNQiAoJyAuICRtYXhQYXlsb2FkQnl0ZXMgLiAnIGJ5dGVzKSBzbyBzZW5kaW5nIGluIG9uZSBwYXNzLicgKTsKCQl9CgkJJHByZXZQb2ludGVyID0gMDsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZWFkaW5nIGluIGAnIC4gJGVuY29kZVJlZHVjZWRQYXlsb2FkIC4gJ2AgYnl0ZXMgYXQgYSB0aW1lLicgKTsKCQkKCQkvLyBPcGVuIGZvciByZWFkaW5nLgoJCS8vZXJyb3JfbG9nKCAnZm9wZW5pbmcgdGhlIGZpbGU6ICcgLiAkZnVsbEZpbGVuYW1lIC4gJyB0byBzZWVrIHRvIGAnIC4gJHNlZWtUbyAuICdgIHdpdGggcmVkdWNlZCBwYXlsb2FkIGAnIC4gJGVuY29kZVJlZHVjZWRQYXlsb2FkIC4gJ2AuJyApOwoJCWlmICggZmFsc2UgPT09ICggJGZzID0gZm9wZW4oICRmdWxsRmlsZW5hbWUsICdyYicgKSApKSB7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICMyMzU1MzI6IFVuYWJsZSB0byBmb3BlbiBmaWxlIGAnIC4gJGZ1bGxGaWxlbmFtZSAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCQoJCS8vIFNlZWsgdG8gcG9zaXRpb24gKGlmIGFwcGxpY2FibGUpLgoJCWlmICggMCAhPSAkc2Vla1RvICkgewoJCQlpZiAoIDAgIT0gZnNlZWsoICRmcywgJHNlZWtUbyApICkgewoJCQkJQGZjbG9zZSggJGZzICk7CgkJCQkkbWVzc2FnZSA9ICdFcnJvciAjNjQ2NDUzNDIyOTogVW5hYmxlIHRvIGZzZWVrIGZpbGUuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCQl9CgkJfQoJCQoJCSRyZXN1bWVQb2ludCA9IDA7CgkJJGZpbGVEb25lID0gJzAnOwoJCSRmaWxlRGF0YSA9IGZyZWFkKCAkZnMsICRlbmNvZGVSZWR1Y2VkUGF5bG9hZCApOwoJCWlmICggZmVvZiggJGZzICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlYWQgdG8gZW5kIG9mIGZpbGUgKGZlb2YgdHJ1ZSkuIE5vIG1vcmUgY2h1bmtzIGxlZnQgYWZ0ZXIgdGhpcy4nICk7CgkJCSRmaWxlRG9uZSA9ICcxJzsKCQl9IGVsc2UgewoJCQlpZiAoIEZBTFNFID09PSAoICRyZXN1bWVQb2ludCA9IGZ0ZWxsKCAkZnMgKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0MjM1MzIxMjogVW5hYmxlIHRvIGdldCBmdGVsbCBwb2ludGVyIG9mIGZpbGUgaGFuZGxlLicgKTsKCQkJCUBmY2xvc2UoICRmcyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZSBwb2ludGVyIHJlc3VtZSBwb2ludDogYCcgLiAkcmVzdW1lUG9pbnQgLiAnYC4nICk7CgkJCX0KCQl9CgkJQGZjbG9zZSggJGZzICk7CgkJCgkJJGZpbGVEYXRhID0gYmFzZTY0X2VuY29kZSggJGZpbGVEYXRhICk7IC8vIFNhZGx5IHdlIGNhbm5vdCBzYWZlbHkgdHJhbnNtaXQgYmluYXJ5IGRhdGEgb3ZlciBjdXJsIHdpdGhvdXQgdXNpbmcgYW4gYWN0dWFsIGZpbGUuIGJhc2U2NCBlbmNvZGluZyBhZGRzIDM3JSBzaXplIG92ZXJoZWFkLgoJCSRmaWxlY3JjID0gc3ByaW50ZiAoICIldSIsIGNyYzMyKCAkZmlsZURhdGEgKSApOwoJCQoJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KAoJCQknc3VjY2VzcycJCT0+IHRydWUsCgkJCSdmaWxlZGF0YScJCT0+ICRmaWxlRGF0YSwKCQkJJ2ZpbGVkYXRhbGVuJwk9PiBzdHJsZW4oICRmaWxlRGF0YSApLAoJCQknZmlsZWNyYycJCT0+ICRmaWxlY3JjLAoJCQknZmlsZWRvbmUnCQk9PiAkZmlsZURvbmUsCgkJCSdmaWxlc2l6ZScJCT0+ICRzaXplLAoJCQkncmVzdW1lcG9pbnQnCT0+ICRyZXN1bWVQb2ludCwKCQkJJ2VuY29kZWQnICAgICAgID0+IGlzc2V0KCAkdXRmX2RlY29kZWRfZmlsZW5hbWUgKSwJCS8vIG9ubHkgaXNzZXQgaWYgdXRmOCB3YXMgbmVlZGVkIHRvIGZpbmQgdGhpcyBmaWxlLgoJCSkgKSApOwoJCQoJfSAvLyBFbmQgX2dldEZpbGUoKS4KCQoJCgkKCS8qIF9zZW5kRmlsZSgpCgkgKgoJICogQ2FsbGluZyBzaXRlIGlzIHdhbnRpbmcgdG8gc2VuZCBhIGZpbGUgVE8gdGhpcyBzaXRlLiBDYWxsZWQgYnkgdmFyaW91cyB2ZXJicyB0aGF0IHBhc3MgdGhlIGFwcHJvcHJpYXRlICR0eXBlIHRoYXQgZGV0ZXJtaW5lcyByb290IHBhdGguIFZhbGlkIHR5cGVzOiBiYWNrdXAsIHRoZW1lLCBwbHVnaW4sIG1lZGlhCgkgKgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfc2VuZEZpbGUoICR0eXBlID0gJycgKSB7CgkJJHJvb3REaXIgPSBzZWxmOjpfZ2V0RmlsZVBhdGhCeVR5cGUoICR0eXBlICk7IC8vIGNvbnRhaW5zIHRyYWlsaW5nIHNsYXNoLgoJCQoJCS8vZXJyb3JfbG9nKCAnQVBJIHNhdmluZyBmaWxlIHRvIGRpcjogYCcgLiAkcm9vdERpciAuICdgLicgKTsKCQkKCQkkY2xlYW5GaWxlID0gc3RyX3JlcGxhY2UoIGFycmF5KCAnXFwnLCAnLycgKSwgJycsIHN0cmlwc2xhc2hlc19kZWVwKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlbmFtZScgKSApICk7CgkJJGZpbGVQYXRoID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZXBhdGgnICk7CgkJaWYgKCAnJyAhPSAkZmlsZVBhdGggKSB7IC8vIEZpbGVwYXRoIHNwZWNpZmllZCBzbyBnb2VzIGluIGEgc3ViZGlyZWN0b3J5IHVuZGVyIHRoZSByb290RGlyLgoJCQlpZiAoICRjbGVhbkZpbGUgIT0gYmFzZW5hbWUoICRmaWxlUGF0aCApICkgewoJCQkJLy8gQ2hlY2sgaWYgdXRmOCBkZWNvZGluZyB0aGUgZmlsZW5hbWUgaGVscHMgbWF0Y2ggY29ycmVjdGx5CgkJCQkkdXRmX2RlY29kZWRfZmlsZVBhdGggPSB1dGY4X2RlY29kZSggJGZpbGVQYXRoICk7CgkJCQlpZiAoICRjbGVhbkZpbGUgPT0gYmFzZW5hbWUoICR1dGZfZGVjb2RlZF9maWxlUGF0aCApICkgewoJCQkJCSRmaWxlUGF0aCA9ICRzdWJGaWxlUGF0aCA9ICR1dGZfZGVjb2RlZF9maWxlUGF0aDsKCQkJCX0gZWxzZSB7CgkJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzQ5Mzg0NDogVGhlIHNwZWNpZmllZCBmaWxlbmFtZSB3aXRoaW4gdGhlIGZpbGVwYXRoIHBhcmFtZXRlciBkb2VzIG5vdCBtYXRjaCB0aGUgc3VwcGxpZWQgZmlsZW5hbWUgcGFyYW1ldGVyLiB8IGNsZWFuZmlsZTogJyAuICRjbGVhbkZpbGUgLiAnIHwgZmlsZVBhdGg6IHwgJyAuICRmaWxlUGF0aDsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJCQl9CgkJCX0gZWxzZSB7IC8vIEZpbGVuYW1lIHdpdGggcGF0aC4KCQkJCSRzdWJGaWxlUGF0aCA9ICRmaWxlUGF0aDsKCQkJfQoJCX0gZWxzZSB7IC8vIEp1c3QgdGhlIGZpbGVuYW1lLiBObyBwYXRoLgoJCQkkc3ViRmlsZVBhdGggPSAkY2xlYW5GaWxlOwoJCX0KCQkkc2F2ZUZpbGUgPSAkcm9vdERpciAuICRzdWJGaWxlUGF0aDsKCQkKCQkvLyBDYWxjdWxhdGUgc2VlayBwb3NpdGlvbi4KCQkkc2Vla1RvID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2Vla3RvJyApOwoJCWlmICggISBpc19udW1lcmljKCAkc2Vla1RvICkgKSB7CgkJCSRzZWVrVG8gPSAwOwoJCX0KCQkKCQkvLyBDaGVjayBpZiBkaXJlY3RvcnkgZXhpc3RzICYgY3JlYXRlIGlmIG5lZWRlZC4KCQkkc2F2ZURpciA9IGRpcm5hbWUoICRzYXZlRmlsZSApOwoJCQoJCQoJCS8vIERlbGV0ZSBleGlzdGluZyBkaXJlY3RvcnkgZm9yIHNvbWUgdHlwZXMgb2YgdHJhbnNmZXJzLgoJCQoJCWlmICggKCAwID09ICRzZWVrVG8gKSAmJiAoIGZpbGVfZXhpc3RzKCAkc2F2ZUZpbGUgKSApICkgeyAvLyBOZXcgZmlsZSB0cmFuc2ZlciBvbmx5LiBEbyBub3QgZGVsZXRlIGV4aXN0aW5nIGZpbGUgaWYgY2h1bmtpbmcuCgkJCWlmICggdHJ1ZSAhPT0gQHVubGluayggJHNhdmVGaWxlICkgKSB7CgkJCQkkbWVzc2FnZSA9ICdFcnJvciAjMjM4NzIyOiBVbmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nIGZpbGUgYCcgLiAkc2F2ZUZpbGUgLiAnYC4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJCX0KCQl9CgkJCgkJaWYgKCAhIGlzX2RpciggJHNhdmVEaXIgKSApIHsKCQkJaWYgKCB0cnVlICE9PSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPm1rZGlyKCAkc2F2ZURpciApICkgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzMyNzgzMjogVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgYCcgLiAkc2F2ZURpciAuICdgLiBDaGVjayBwZXJtaXNzaW9ucyBvciBtYW51YWxseSBjcmVhdGUuIEhhbHRpbmcgdG8gcHJlc2VydmUgZGVwbG95bWVudCBpbnRlZ3JpdHknOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJCX0KCQl9CgkJCgkJLy8gT3Blbi9jcmVhdGUgZmlsZSBmb3Igd3JpdGUvYXBwZW5kLgoJCWlmICggZmFsc2UgPT09ICggJGZzID0gZm9wZW4oICRzYXZlRmlsZSwgJ2EnICkgKSkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDg5MzM5ODQ4OiBVbmFibGUgdG8gZm9wZW4gZmlsZSBgJyAuICRzYXZlRmlsZSAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCQoJCS8vIFNlZWsgdG8gcG9zaXRpb24gKGlmIGFwcGxpY2FibGUpLgoJCWlmICggMCAhPSBmc2VlayggJGZzLCAkc2Vla1RvICkgKSB7CgkJCUBmY2xvc2UoICRmcyApOwoJCQkkbWVzc2FnZSA9ICdFcnJvciAjODU4NDg4NDogVW5hYmxlIHRvIGZzZWVrIGZpbGUuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQl9CgkJCgkJLy8gQ2hlY2sgZGF0YSBsZW5ndGguCgkJJGdvdExlbmd0aCA9IHN0cmxlbiggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZWRhdGEnICkgKTsKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVkYXRhbGVuJyApICE9ICRnb3RMZW5ndGggKSB7CgkJCUBmY2xvc2UoICRmcyApOwoJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDM1NTQ0NTogUmVjZWl2ZWQgZGF0YSBvZiBsZW5ndGggYCcgLiAkZ290TGVuZ3RoIC4gJ2AgZGlkIG5vdCBtYXRjaCBzZW50IGxlbmd0aCBvZiBgJyAuIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVkYXRhbGVuJyApIC4gJ2AuIERhdGEgbWF5IGhhdmUgYmVlbiB0cnVuY2F0ZWQuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQl9CgkJCgkJLy8gQ2hlY2sgaGFzaC4KCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVjcmMnICkgIT0gc3ByaW50ZiAoICIldSIsIGNyYzMyKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlZGF0YScgKSApICkgKSB7CgkJCUBmY2xvc2UoICRmcyApOwoJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDczNDcyOiBDUkMgb2YgcmVjZWl2ZWQgZGF0YSBkaWQgbm90IG1hdGNoIHNvdXJjZSBDUkMuIERhdGEgY29ycnVwdGVkIGluIHRyYW5zZmVyPyBTZW50IGxlbmd0aDogYCcgLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlZGF0YWxlbicgKSAuICdgLiBSZWNlaXZlZCBsZW5ndGg6IGAnIC4gJGdvdExlbmd0aCAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCQoJCS8vIFdyaXRlIHRvIGZpbGUuCgkJaWYgKCBmYWxzZSA9PT0gKCAkYnl0ZXNXcml0dGVuID0gZndyaXRlKCAkZnMsIGJhc2U2NF9kZWNvZGUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVkYXRhJyApICkgKSApICkgewoJCQlAZmNsb3NlKCAkZnMgKTsKCQkJQHVubGluayggJHNhdmVGaWxlICk7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICMzOTg0Mzk0OiBFcnJvciB3cml0aW5nIHRvIGZpbGUgYCcgLiAkc2F2ZUZpbGUgLiAnYC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCX0gZWxzZSB7CgkJCUBmY2xvc2UoICRmcyApOwoJCQkKCQkJJG1lc3NhZ2UgPSAnV3JvdGUgYCcgLiAkYnl0ZXNXcml0dGVuIC4gJ2AgYnl0ZXMgdG8gYCcgLiAkc2F2ZUZpbGUgLiAnYC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRtZXNzYWdlICk7CgkJCQoJCQlpZiAoICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGV0ZXN0JyApICkgfHwgKCAndGVzdCcgPT0gJHR5cGUgKSApIHsKCQkJCUB1bmxpbmsoICRzYXZlRmlsZSApOwoJCQl9IGVsc2UgewoJCQkJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZWRvbmUnICkgKSB7CgkJCQkJJGRlc3RGaWxlID0gQUJTUEFUSCAuIGJhc2VuYW1lKCAkc2F2ZUZpbGUgKTsKCQkJCQkvKgoJCQkJCWlmICggZmFsc2UgPT09IEBjb3B5KCAkc2F2ZUZpbGUsICRkZXN0RmlsZSApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzk0ODQ1NDogVW5hYmxlIHRvIGNvcHkgdGVtcG9yYXJ5IGZpbGUgYCcgLiAkc2F2ZUZpbGUgLiAnYCB0byBgJyAuICRkZXN0RmlsZSAuICdgLicgKTsKCQkJCQl9CgkJCQkJQHVubGluayggJHNhdmVGaWxlICk7CgkJCQkJKi8KCQkJCQkKCQkJCQkvLyBNZWRpYSBmaWxlcyBuZWVkIHRoZWlyIHRodW1ibmFpbHMgcmVnZW5lcmF0ZWQgc28gZ2V0IGF0dGFjaG1lbnQgSUQuCgkJCQkJLyogQ0FOTk9UIERPIFRISVMgSEVSRSAuLi4gYmVjYXVzZSBpdGVtIG1heSBub3QgYmUgaW4gdGhlIERCIHlldC4gbmVlZCB0byB0cmFuc2ZlciB0aHVtYm5haWxzPwoJCQkJCWlmICggJ21lZGlhJyA9PSAkdHlwZSApIHsKCQkJCQkJZ2xvYmFsICR3cGRiOwoJCQkJCQkkc3FsID0gIlNFTEVDVCBwb3N0X2lkIEZST00gYCIgLiBEQl9OQU1FIC4gImAuYCIgLiAkd3BkYi0+cHJlZml4IC4gInBvc3RtZXRhYCBXSEVSRSBgbWV0YV92YWx1ZWAgPSAlcyBBTkQgYG1ldGFfa2V5YCA9ICdfd3BfYXR0YWNoZWRfZmlsZSciOwoJCQkJCQkkc3FsID0gJHdwZGItPnByZXBhcmUoICRzcWwsICRmaWxlUGF0aCApOwoJCQkJCQllcnJvcl9sb2coICRzcWwgKTsKCQkJCQkJJGF0dGFjaG1lbnRfaWQgPSAkd3BkYi0+Z2V0X3ZhciggJHNxbCApOwoJCQkJCQllcnJvcl9sb2coICdJRDogJyAuICRhdHRhY2htZW50X2lkICk7CgkJCQkJCWVycm9yX2xvZyggJ3NhdmVmaWxlOiAnIC4gJHNhdmVGaWxlICk7CgkJCQkJCXJlcXVpcmUgKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2ltYWdlLnBocCcgKTsKCQkJCQkJJGF0dGFjaF9kYXRhID0gd3BfZ2VuZXJhdGVfYXR0YWNobWVudF9tZXRhZGF0YSggJGF0dGFjaG1lbnRfaWQsICRzYXZlRmlsZSApOwoJCQkJCQl3cF91cGRhdGVfYXR0YWNobWVudF9tZXRhZGF0YSggJGF0dGFjaG1lbnRfaWQsICAkYXR0YWNoX2RhdGEgKTsKCQkJCQl9CgkJCQkJKi8KCQkJCQkKCQkJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IHRydWUsICdtZXNzYWdlJyA9PiAkbWVzc2FnZSApICkgKTsKCQkJCX0KCQkJfQoJCQkKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiB0cnVlLCAnbWVzc2FnZScgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCQoJfSAvLyBFbmQgX3NlbmRGaWxlKCkuCgkKCQoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9nZXRQcmVEZXBsb3lJbmZvKCkgewoJCSRzaGExID0gZmFsc2U7CgkJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2hhMScgKSApIHsKCQkJJHNoYTEgPSB0cnVlOwoJCX0KCQkKCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IHRydWUsICdkYXRhJyA9PiBiYWNrdXBidWRkeV9hcGk6OmdldFByZURlcGxveUluZm8oICRzaGExICkgKSApICk7Cgl9IC8vIEVuZCBfdmVyYl9nZXRQcmVEZXBsb3lJbmZvKCkuCgkKCQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfcmVuZGVySW1wb3J0QnVkZHkoKSB7CgkJCgkJJGJhY2t1cEZpbGUgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdiYWNrdXBGaWxlJyApOwoJCSRwYXNzd29yZCA9IG1kNSggbWQ1KCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdiYWNrdXBidWRkeV9hcGlfa2V5JyApICkgKTsKCQkkbWF4X2V4ZWN1dGlvbl90aW1lID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApOwoJCSRkb0ltcG9ydENsZWFudXAgPSB0cnVlOwoJCWlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2RvSW1wb3J0Q2xlYW51cCcgKSApIHsKCQkJJGRvSW1wb3J0Q2xlYW51cCA9IHRydWU7CgkJfSBlbHNlaWYgKCAnZmFsc2UnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2RvSW1wb3J0Q2xlYW51cCcgKSApIHsKCQkJJGRvSW1wb3J0Q2xlYW51cCA9IGZhbHNlOwoJCX0KCQkKCQkvLyBTdG9yZSB0aGlzIHNlcmlhbCBpbiBzZXR0aW5ncyB0byBjbGVhbnVwIGFueSB0ZW1wIGRiIHRhYmxlcyBpbiB0aGUgZnV0dXJlIHdpdGggdGhpcyBzZXJpYWwgd2l0aCBwZXJpb2RpYyBjbGVhbnVwLgoJCSRiYWNrdXBTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGJhY2t1cEZpbGUgKTsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JvbGxiYWNrX2NsZWFudXBzJ11bICRiYWNrdXBTZXJpYWwgXSA9IHRpbWUoKTsKCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQoJCSRhZGRpdGlvbmFsU3RhdGVJbmZvID0gYXJyYXkoKTsKCQlpZiAoIGlzX251bWVyaWMoICRtYXhfZXhlY3V0aW9uX3RpbWUgKSApIHsKCQkJJGFkZGl0aW9uYWxTdGF0ZUluZm9bJ21heEV4ZWN1dGlvblRpbWUnXSA9ICRtYXhfZXhlY3V0aW9uX3RpbWU7CgkJfQoJCQoJCSRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6ZGVwbG95bWVudEltcG9ydEJ1ZGR5KCAkcGFzc3dvcmQsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJGJhY2t1cEZpbGUsICRhZGRpdGlvbmFsU3RhdGVJbmZvLCAkZG9JbXBvcnRDbGVhbnVwICk7CgkJaWYgKCBpc19hcnJheSggJGltcG9ydEZpbGVTZXJpYWwgKSApIHsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkaW1wb3J0RmlsZVNlcmlhbFsxXSApICkgKTsKCQl9IGVsc2UgewoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IHRydWUsICdpbXBvcnRGaWxlU2VyaWFsJyA9PiAkaW1wb3J0RmlsZVNlcmlhbCApICkgKTsKCQl9CgkJCgl9IC8vIEVuZCBfdmVyYl9yZW5kZXJJbXBvcnRCdWRkeSgpLgoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfY2FsbF92YWxpZCgpIHsKCQkka2V5X3B1YmxpYyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCgnYmFja3VwYnVkZHlfYXBpX2tleScpOwoJCSR2ZXJiID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCd2ZXJiJyk7CgkJJHRpbWUgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoJ25vdycpOwoJCSRmaWxlY3JjID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCdmaWxlY3JjJyk7CgkJJHNpZ25hdHVyZSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCgnc2lnbmF0dXJlJyk7CgkJCgkJJG1heEFnZSA9IDYwKjYwOyAvLyBUaW1lIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggYSBzaWduZWQgcmVxdWVzdCBpcyBkZWVtZWQgdG9vIG9sZC4gSGVscCBwcmV2ZW50IHJlcGxheXMuIDFoci4KCQlmb3JlYWNoKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9hcGknXVsna2V5cyddIGFzICRrZXkgKSB7CgkJCSRrZXlBcnIgPSBzZWxmOjprZXlfdG9fYXJyYXkoICRrZXkgKTsKCQkJaWYgKCAka2V5X3B1YmxpYyA9PSAka2V5QXJyWydrZXlfcHVibGljJ10gKSB7IC8vIEluY29taW5nIHB1YmxpYyBrZXkgbWF0Y2hlcyBhIHN0b3JlZCBwdWJsaWMga2V5LgoJCQkJLy8gSGFzIGNhbGwgZXhwaXJlZD8KCQkJCWlmICggKCAhIGlzX251bWVyaWMoICR0aW1lICkgKSB8fCAoICggdGltZSgpIC0gJHRpbWUgKSA+ICRtYXhBZ2UgKSApIHsKCQkJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDg0NTk4NTogQVBJIGNhbGwgdGltZXN0YW1wIGlzIHRvbyBvbGQuIFZlcmlmeSB0aGUgcmVhbHRpbWUgY2xvY2sgb24gZWFjaCBzZXJ2ZXIgaXMgcmVsYXRpdmVseSBpbiBzeW5jLic7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCQkJfQoJCQkJLy8gVmVyaWZ5IHNpZ25hdHVyZS4KCQkJCSRjYWxjdWxhdGVkU2lnbmF0dXJlID0gbWQ1KCAkdGltZSAuICR2ZXJiIC4gJGtleV9wdWJsaWMgLiAka2V5QXJyWydrZXlfc2VjcmV0J10gLiAkZmlsZWNyYyApOwoJCQkJaWYgKCAkY2FsY3VsYXRlZFNpZ25hdHVyZSAhPSAkc2lnbmF0dXJlICkgeyAvLyBLZXkgbWF0Y2hlZCBidXQgc2lnbmF0dXJlIGZhaWxlZC4gRGF0YSBoYXMgYmVlbiB0ZW1wZXJlZCB3aXRoIG9yIGRhbWFnZWQgaW4gdHJhbnNpdC4KCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBrZXlfdG9fYXJyYXkoICRrZXkgKSB7CgkJJGtleSA9IHRyaW0oICRrZXkgKTsKCQkka2V5ID0gYmFzZTY0X2RlY29kZSggJGtleSApOwoJCSRrZXkgPSBqc29uX2RlY29kZSggJGtleSwgdHJ1ZSApOwoJCXJldHVybiAka2V5OwoJfQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVfYXBpX2tleSggJGtleSApIHsKCQlpZiAoICEgZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0FQSV9FTkFCTEUnICkgfHwgKCBUUlVFICE9IEJBQ0tVUEJVRERZX0FQSV9FTkFCTEUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkvKgoJCWlmICggISBkZWZpbmVkKCAnQkFDS1VQQlVERFlfQVBJX1NBTFQnICkgfHwgKCAnQ0hBTkdFTUUnID09IEJBQ0tVUEJVRERZX0FQSV9TQUxUICkgfHwgKCBzdHJsZW4oIEJBQ0tVUEJVRERZX0FQSV9TQUxUICkgPCA1ICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJKi8KCQlpZiAoICcnID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYXBpX2tleSddICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCSRrZXkgPSBzZWxmOjprZXlfdG9fYXJyYXkoICRrZXkgKTsKCQlpZiAoICRrZXkgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhcGlfa2V5J10gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgl9IC8vIEVuZCB2YWxpZGF0ZV9hcGlfa2V5KCkuCgkKCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZV9rZXkoKSB7CgkJaWYgKCAhIGRlZmluZWQoICdCQUNLVVBCVUREWV9BUElfRU5BQkxFJyApIHx8ICggVFJVRSAhPSBCQUNLVVBCVUREWV9BUElfRU5BQkxFICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJLyoKCQlpZiAoICEgZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0FQSV9TQUxUJyApIHx8ICggJ0NIQU5HRU1FJyA9PSBCQUNLVVBCVUREWV9BUElfU0FMVCApIHx8ICggc3RybGVuKCBCQUNLVVBCVUREWV9BUElfU0FMVCApIDwgNSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSovCgkJCgkJJHNpdGV1cmwgPSBzaXRlX3VybCgpOwoJCSRob21ldXJsID0gaG9tZV91cmwoKTsKCQkkcmFuZCA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApOwoJCSRyYW5kMiA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApOwoJCQoJCSRrZXkgPSBhcnJheSgKCQkJJ2tleV92ZXJzaW9uJyA9PiAxLAoJCQkna2V5X3B1YmxpYycgPT4gbWQ1KCAkcmFuZCAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJHNpdGV1cmwgLiAkaG9tZXVybCAuIHRpbWUoKSApLAoJCQkna2V5X3NlY3JldCcgPT4gbWQ1KCAkcmFuZDIgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICRzaXRldXJsIC4gJGhvbWV1cmwgLiB0aW1lKCkgKSwKCQkJJ2tleV9jcmVhdGVkJyA9PiB0aW1lKCksCgkJCSdzaXRldXJsJyA9PiAkc2l0ZXVybCwKCQkJJ2hvbWV1cmwnID0+ICRob21ldXJsLAoJCSk7CgkJCgkJCgkJcmV0dXJuIGJhc2U2NF9lbmNvZGUoIGpzb25fZW5jb2RlKCAka2V5ICkgKTsKCQkKCX0gLy8gRW5kIGdlbmVyYXRlX2FwaV9rZXkoKS4KCQoJCgkvKiBfZXJyb3IoKQoJICoKCSAqIExvZ3MgZXJyb3IgbWVzc2FnZXMgZm9yIHJldHJpZXZhbCB3aXRoIGdldEVycm9ycygpLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRtZXNzYWdlCUVycm9yIG1lc3NhZ2UgdG8gbG9nLgoJICogQHJldHVybgludWxsCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9lcnJvciggJG1lc3NhZ2UgKSB7CgkJLy9lcnJvcl9sb2coICRtZXNzYWdlICk7CgkJc2VsZjo6JF9lcnJvcnNbXSA9ICRtZXNzYWdlOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkKCQoJLyogZ2V0RXJyb3JzKCkKCSAqCgkgKiBHZXQgYW55IGVycm9ycyB3aGljaCBtYXkgaGF2ZSBvY2N1cnJlZC4KCSAqCgkgKiBAcmV0dXJuCWFycmF5IAkJUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmcgZXJyb3IgbWVzc2FnZXMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCkgewoJCXJldHVybiBzZWxmOjokX2Vycm9yczsKCX0gLy8gRW5kIGdldEVycm9ycygpOwoJCgkKCQp9IC8vIEVuZCBjbGFzcy4K ###PACKDATA,FILE_END,/classes/remote_api.php,importbuddy/classes/remote_api.php ###PACKDATA,FILE_START,/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js KGZ1bmN0aW9uKCQpewogCiAgICAkLmZuLmV4dGVuZCh7IAogICAgICAgICAKICAgICAgICBsZWFuTW9kYWw6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKIAkJCQogCQkJdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CiAJCQkKICAgICAgICAgICAgdmFyIGRlZmF1bHRzID0gewogICAgICAgICAgICAgICAgdG9wOiAxMDAsCiAgICAgICAgICAgICAgICBvdmVybGF5OiAwLjUsCiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSAkKCI8ZGl2IGlkPSdsZWFuX292ZXJsYXknPjwvZGl2PiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZChvdmVybGF5KTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgb3B0aW9ucyA9ICAkLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgCXZhciBtb2RhbF9pZCA9ICQodGhpcykuYXR0cigiaHJlZiIpOwoKCQkJCSQoIiNsZWFuX292ZXJsYXkiKS5jbGljayhmdW5jdGlvbigpIHsgCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlX21vZGFsKG1vZGFsX2lkKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoby5jbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24oKSB7IAogICAgICAgICAgICAgICAgICAgICBjbG9zZV9tb2RhbChtb2RhbF9pZCk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgIAl2YXIgbW9kYWxfaGVpZ2h0ID0gJChtb2RhbF9pZCkub3V0ZXJIZWlnaHQoZmFsc2UpOwogICAgICAgIAkgIAl2YXIgbW9kYWxfd2lkdGggPSAkKG1vZGFsX2lkKS5vdXRlcldpZHRoKGZhbHNlKTsKCiAgICAgICAgCQkkKCcjbGVhbl9vdmVybGF5JykuY3NzKHsgJ2Rpc3BsYXknIDogJ2Jsb2NrJywgb3BhY2l0eSA6IDAgfSk7CgogICAgICAgIAkJJCgnI2xlYW5fb3ZlcmxheScpLmZhZGVUbygyMDAsby5vdmVybGF5KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5jc3MoeyAKICAgICAgICAJCQogICAgICAgIAkJCSdkaXNwbGF5JyA6ICdibG9jaycsCiAgICAgICAgCQkJJ3Bvc2l0aW9uJyA6ICdmaXhlZCcsCiAgICAgICAgCQkJJ29wYWNpdHknIDogMCwKICAgICAgICAJCQknei1pbmRleCc6IDExMDAwLAogICAgICAgIAkJCSdsZWZ0JyA6IDUwICsgJyUnLAogICAgICAgIAkJCSdtYXJnaW4tbGVmdCcgOiAtKG1vZGFsX3dpZHRoLzIpICsgInB4IiwKICAgICAgICAJCQkndG9wJyA6IG8udG9wICsgInB4IgogICAgICAgIAkJCiAgICAgICAgCQl9KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5mYWRlVG8oMjAwLDEpOwoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIAl9KTsKICAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCgkJCWZ1bmN0aW9uIGNsb3NlX21vZGFsKG1vZGFsX2lkKXsKCiAgICAgICAgCQkkKCIjbGVhbl9vdmVybGF5IikuZmFkZU91dCgyMDApOwoKICAgICAgICAJCSQobW9kYWxfaWQpLmNzcyh7ICdkaXNwbGF5JyA6ICdub25lJyB9KTsKCQkJCgkJCX0KICAgIAogICAgICAgIH0KICAgIH0pOwogICAgIAp9KShqUXVlcnkpOw== ###PACKDATA,FILE_END,/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js ###PACKDATA,FILE_START,/css/animate.css,importbuddy/css/animate.css QGNoYXJzZXQgIlVURi04IjsKCi8qIQogKiBhbmltYXRlLmNzcyAtaHR0cDovL2RhbmVkZW4ubWUvYW5pbWF0ZQogKiBWZXJzaW9uIC0gMy41LjEKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIC0gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTYgRGFuaWVsIEVkZW4KICovCgouYW5pbWF0ZWR7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MXM7YW5pbWF0aW9uLWR1cmF0aW9uOjFzOy13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTpib3RoO2FuaW1hdGlvbi1maWxsLW1vZGU6Ym90aH0uYW5pbWF0ZWQuaW5maW5pdGV7LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9LmFuaW1hdGVkLmhpbmdley13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjJzO2FuaW1hdGlvbi1kdXJhdGlvbjoyc30uYW5pbWF0ZWQuYm91bmNlSW4sLmFuaW1hdGVkLmJvdW5jZU91dCwuYW5pbWF0ZWQuZmxpcE91dFgsLmFuaW1hdGVkLmZsaXBPdXRZey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi43NXM7YW5pbWF0aW9uLWR1cmF0aW9uOi43NXN9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZXswJSwyMCUsNTMlLDgwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfTQwJSw0MyV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKX00MCUsNDMlLDcwJXstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC43NTUsLjA1LC44NTUsLjA2KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNzU1LC4wNSwuODU1LC4wNil9NzAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNHB4LDApfX1Aa2V5ZnJhbWVzIGJvdW5jZXswJSwyMCUsNTMlLDgwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfTQwJSw0MyV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzBweCwwKX00MCUsNDMlLDcwJXstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC43NTUsLjA1LC44NTUsLjA2KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNzU1LC4wNSwuODU1LC4wNil9NzAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1cHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNHB4LDApfX0uYm91bmNley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlO2FuaW1hdGlvbi1uYW1lOmJvdW5jZTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b219QC13ZWJraXQta2V5ZnJhbWVzIGZsYXNoezAlLDUwJSx0b3tvcGFjaXR5OjF9MjUlLDc1JXtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgZmxhc2h7MCUsNTAlLHRve29wYWNpdHk6MX0yNSUsNzUle29wYWNpdHk6MH19LmZsYXNoey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Zmxhc2g7YW5pbWF0aW9uLW5hbWU6Zmxhc2h9QC13ZWJraXQta2V5ZnJhbWVzIHB1bHNlezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LDEuMDUsMS4wNSl9dG97LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgcHVsc2V7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwxLjA1LDEuMDUpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19LnB1bHNley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cHVsc2U7YW5pbWF0aW9uLW5hbWU6cHVsc2V9QC13ZWJraXQta2V5ZnJhbWVzIHJ1YmJlckJhbmR7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9MzAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjc1LDEuMjUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjc1LDEuMjUsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSl9NjUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSl9NzUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSl9dG97LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgcnViYmVyQmFuZHswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKX02NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19LnJ1YmJlckJhbmR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpydWJiZXJCYW5kO2FuaW1hdGlvbi1uYW1lOnJ1YmJlckJhbmR9QC13ZWJraXQta2V5ZnJhbWVzIHNoYWtlezAlLHRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9MTAlLDMwJSw1MCUsNzAlLDkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApfTIwJSw0MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX19QGtleWZyYW1lcyBzaGFrZXswJSx0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfTEwJSwzMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX0yMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCl9fS5zaGFrZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNoYWtlO2FuaW1hdGlvbi1uYW1lOnNoYWtlfUAtd2Via2l0LWtleWZyYW1lcyBoZWFkU2hha2V7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX02LjUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTZweCkgcm90YXRlWSgtOWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTZweCkgcm90YXRlWSgtOWRlZyl9MTguNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCg1cHgpIHJvdGF0ZVkoN2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNXB4KSByb3RhdGVZKDdkZWcpfTMxLjUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTNweCkgcm90YXRlWSgtNWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTNweCkgcm90YXRlWSgtNWRlZyl9NDMuNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgycHgpIHJvdGF0ZVkoM2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMnB4KSByb3RhdGVZKDNkZWcpfTUwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX1Aa2V5ZnJhbWVzIGhlYWRTaGFrZXswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTYuNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNnB4KSByb3RhdGVZKC05ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNnB4KSByb3RhdGVZKC05ZGVnKX0xOC41JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDVweCkgcm90YXRlWSg3ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCg1cHgpIHJvdGF0ZVkoN2RlZyl9MzEuNSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtM3B4KSByb3RhdGVZKC01ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtM3B4KSByb3RhdGVZKC01ZGVnKX00My41JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDJweCkgcm90YXRlWSgzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgycHgpIHJvdGF0ZVkoM2RlZyl9NTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fS5oZWFkU2hha2V7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpoZWFkU2hha2U7YW5pbWF0aW9uLW5hbWU6aGVhZFNoYWtlfUAtd2Via2l0LWtleWZyYW1lcyBzd2luZ3syMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDE1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDE1ZGVnKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtMTBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC01ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX19QGtleWZyYW1lcyBzd2luZ3syMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDE1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDE1ZGVnKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtMTBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC01ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX19LnN3aW5ney13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nO2FuaW1hdGlvbi1uYW1lOnN3aW5nfUAtd2Via2l0LWtleWZyYW1lcyB0YWRhezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKX0zMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKDNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUoM2RlZyl9NDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19QGtleWZyYW1lcyB0YWRhezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlKC0zZGVnKX0zMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKDNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUoM2RlZyl9NDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlKC0zZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19LnRhZGF7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp0YWRhO2FuaW1hdGlvbi1uYW1lOnRhZGF9QC13ZWJraXQta2V5ZnJhbWVzIHdvYmJsZXswJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTE1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlKC01ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI1JSwwLDApIHJvdGF0ZSgtNWRlZyl9MzAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwJSwwLDApIHJvdGF0ZSgzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlKDNkZWcpfTQ1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUlLDAsMCkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTE1JSwwLDApIHJvdGF0ZSgtM2RlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwJSwwLDApIHJvdGF0ZSgyZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAlLDAsMCkgcm90YXRlKDJkZWcpfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUoLTFkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUoLTFkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgd29iYmxlezAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9MTUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNSUsMCwwKSByb3RhdGUoLTVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlKC01ZGVnKX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlKDNkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMCUsMCwwKSByb3RhdGUoM2RlZyl9NDUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUoLTNkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUlLDAsMCkgcm90YXRlKC0zZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAlLDAsMCkgcm90YXRlKDJkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMCUsMCwwKSByb3RhdGUoMmRlZyl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01JSwwLDApIHJvdGF0ZSgtMWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01JSwwLDApIHJvdGF0ZSgtMWRlZyl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LndvYmJsZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOndvYmJsZTthbmltYXRpb24tbmFtZTp3b2JibGV9QC13ZWJraXQta2V5ZnJhbWVzIGplbGxvezAlLDExLjElLHRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9MjIuMiV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKTt0cmFuc2Zvcm06c2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKX0zMy4zJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyl9NDQuNCV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtMy4xMjVkZWcpIHNrZXdZKC0zLjEyNWRlZyl9NTUuNSV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpO3RyYW5zZm9ybTpza2V3WCgxLjU2MjVkZWcpIHNrZXdZKDEuNTYyNWRlZyl9NjYuNiV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLS43ODEyNWRlZykgc2tld1koLS43ODEyNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0uNzgxMjVkZWcpIHNrZXdZKC0uNzgxMjVkZWcpfTc3Ljcley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC4zOTA2MjVkZWcpIHNrZXdZKC4zOTA2MjVkZWcpO3RyYW5zZm9ybTpza2V3WCguMzkwNjI1ZGVnKSBza2V3WSguMzkwNjI1ZGVnKX04OC44JXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgtLjE5NTMxMjVkZWcpIHNrZXdZKC0uMTk1MzEyNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0uMTk1MzEyNWRlZykgc2tld1koLS4xOTUzMTI1ZGVnKX19QGtleWZyYW1lcyBqZWxsb3swJSwxMS4xJSx0b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTIyLjIley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyl9MzMuMyV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyk7dHJhbnNmb3JtOnNrZXdYKDYuMjVkZWcpIHNrZXdZKDYuMjVkZWcpfTQ0LjQley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0zLjEyNWRlZykgc2tld1koLTMuMTI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpfTU1LjUley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpfTY2LjYley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC0uNzgxMjVkZWcpIHNrZXdZKC0uNzgxMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtLjc4MTI1ZGVnKSBza2V3WSgtLjc4MTI1ZGVnKX03Ny43JXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCguMzkwNjI1ZGVnKSBza2V3WSguMzkwNjI1ZGVnKTt0cmFuc2Zvcm06c2tld1goLjM5MDYyNWRlZykgc2tld1koLjM5MDYyNWRlZyl9ODguOCV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goLS4xOTUzMTI1ZGVnKSBza2V3WSgtLjE5NTMxMjVkZWcpO3RyYW5zZm9ybTpza2V3WCgtLjE5NTMxMjVkZWcpIHNrZXdZKC0uMTk1MzEyNWRlZyl9fS5qZWxsb3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmplbGxvO2FuaW1hdGlvbi1uYW1lOmplbGxvOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluezAlLDIwJSw0MCUsNjAlLDgwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyk7dHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19QGtleWZyYW1lcyBib3VuY2VJbnswJSwyMCUsNDAlLDYwJSw4MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpO3RyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKX0yMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjAzLDEuMDMsMS4wMyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpO3RyYW5zZm9ybTpzY2FsZTNkKC45NywuOTcsLjk3KX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fS5ib3VuY2VJbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluO2FuaW1hdGlvbi1uYW1lOmJvdW5jZUlufUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJbkRvd257MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTMwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzAwMHB4LDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluRG93bnswJSw2MCUsNzUlLDkwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJbkRvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJbkRvd247YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJbkxlZnR7MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0zMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCg1cHgsMCwwKX10b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluTGVmdHswJSw2MCUsNzUlLDkwJSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDI1cHgsMCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblJpZ2h0ezAlLDYwJSw3NSUsOTAlLHRvey13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBib3VuY2VJblJpZ2h0ezAlLDYwJSw3NSUsOTAlLHRvey13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmJvdW5jZUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJblJpZ2h0O2FuaW1hdGlvbi1uYW1lOmJvdW5jZUluUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluVXB7MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfX1Aa2V5ZnJhbWVzIGJvdW5jZUluVXB7MCUsNjAlLDc1JSw5MCUsdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfX0uYm91bmNlSW5VcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluVXA7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0ezIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NTAlLDU1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9fUBrZXlmcmFtZXMgYm91bmNlT3V0ezIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NTAlLDU1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9fS5ib3VuY2VPdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VPdXQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXREb3duezIwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX00MCUsNDUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApfX0uYm91bmNlT3V0RG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dERvd247YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0RG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0TGVmdHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19QGtleWZyYW1lcyBib3VuY2VPdXRMZWZ0ezIwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMHB4LDAsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX0uYm91bmNlT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dExlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9fS5ib3VuY2VPdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFJpZ2h0O2FuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXRVcHsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX00MCUsNDUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjBweCwwKX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApfX0uYm91bmNlT3V0VXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VPdXRVcDthbmltYXRpb24tbmFtZTpib3VuY2VPdXRVcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fUBrZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fS5mYWRlSW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW47YW5pbWF0aW9uLW5hbWU6ZmFkZUlufUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5mYWRlSW5Eb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluRG93bjthbmltYXRpb24tbmFtZTpmYWRlSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5Eb3duQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmYWRlSW5Eb3duQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkRvd25CaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5Eb3duQmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVJbkRvd25CaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5MZWZ0O2FuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluTGVmdEJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluTGVmdEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHQ7YW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblJpZ2h0QmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluUmlnaHRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX10b3tvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmYWRlSW5VcHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5mYWRlSW5VcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblVwO2FuaW1hdGlvbi1uYW1lOmZhZGVJblVwfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5VcEJpZ3swJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblVwQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5mYWRlSW5VcEJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblVwQmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVJblVwQmlnfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0ezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjB9fUBrZXlmcmFtZXMgZmFkZU91dHswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowfX0uZmFkZU91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dERvd257MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX19QGtleWZyYW1lcyBmYWRlT3V0RG93bnswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfX0uZmFkZU91dERvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0RG93bjthbmltYXRpb24tbmFtZTpmYWRlT3V0RG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dERvd25CaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dERvd25CaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fS5mYWRlT3V0RG93bkJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXREb3duQmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXREb3duQmlnfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0TGVmdHswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dExlZnR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX0uZmFkZU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdDthbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dExlZnRCaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19QGtleWZyYW1lcyBmYWRlT3V0TGVmdEJpZ3swJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX0uZmFkZU91dExlZnRCaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdEJpZzthbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFJpZ2h0ezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFJpZ2h0ezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fS5mYWRlT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0UmlnaHQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0UmlnaHRCaWd7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFJpZ2h0QmlnezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX0uZmFkZU91dFJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dFJpZ2h0QmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXRSaWdodEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFVwezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19QGtleWZyYW1lcyBmYWRlT3V0VXB7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX0uZmFkZU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dFVwO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXRVcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFVwQmlnezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFVwQmlnezAle29wYWNpdHk6MX10b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fS5mYWRlT3V0VXBCaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0VXBCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dFVwQmlnfUAtd2Via2l0LWtleWZyYW1lcyBmbGlwezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xdHVybik7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xdHVybil9MCUsNDAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0fTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlWigxNTBweCkgcm90YXRlWSgtMTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZVooMTUwcHgpIHJvdGF0ZVkoLTE5MGRlZyl9NTAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGVaKDE1MHB4KSByb3RhdGVZKC0xNzBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlWigxNTBweCkgcm90YXRlWSgtMTcwZGVnKX01MCUsODAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHNjYWxlM2QoLjk1LC45NSwuOTUpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSl9dG97LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufX1Aa2V5ZnJhbWVzIGZsaXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTF0dXJuKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTF0dXJuKX0wJSw0MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXR9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGVaKDE1MHB4KSByb3RhdGVZKC0xOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlWigxNTBweCkgcm90YXRlWSgtMTkwZGVnKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZVooMTUwcHgpIHJvdGF0ZVkoLTE3MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGVaKDE1MHB4KSByb3RhdGVZKC0xNzBkZWcpfTUwJSw4MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSBzY2FsZTNkKC45NSwuOTUsLjk1KX10b3std2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59fS5hbmltYXRlZC5mbGlwey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlO2JhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZTstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXA7YW5pbWF0aW9uLW5hbWU6ZmxpcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcEluWHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCg5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDkwZGVnKTtvcGFjaXR5OjB9MCUsNDAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoMTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgtNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX19QGtleWZyYW1lcyBmbGlwSW5YezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoOTBkZWcpO29wYWNpdHk6MH0wJSw0MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgtMjBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCgxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDEwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC01ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTVkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfX0uZmxpcEluWHstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBJblg7YW5pbWF0aW9uLW5hbWU6ZmxpcEluWH1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcEluWXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSg5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDkwZGVnKTtvcGFjaXR5OjB9MCUsNDAley13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTIwZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoMTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgtNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX19QGtleWZyYW1lcyBmbGlwSW5ZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoOTBkZWcpO29wYWNpdHk6MH0wJSw0MCV7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgtMjBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSgxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDEwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC01ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTVkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfX0uZmxpcEluWXstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBJblk7YW5pbWF0aW9uLW5hbWU6ZmxpcEluWX1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcE91dFh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9MzAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC0yMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKC0yMGRlZyk7b3BhY2l0eToxfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVYKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGlwT3V0WHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoLTIwZGVnKTtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVgoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWCg5MGRlZyk7b3BhY2l0eTowfX0uZmxpcE91dFh7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwT3V0WDthbmltYXRpb24tbmFtZTpmbGlwT3V0WDstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudH1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcE91dFl7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9MzAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKC0xNWRlZyk7b3BhY2l0eToxfXRvey13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGlwT3V0WXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTE1ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoLTE1ZGVnKTtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlWSg5MGRlZyk7b3BhY2l0eTowfX0uZmxpcE91dFl7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50O2JhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwT3V0WTthbmltYXRpb24tbmFtZTpmbGlwT3V0WX1ALXdlYmtpdC1rZXlmcmFtZXMgbGlnaHRTcGVlZEluezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgtMzBkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goLTMwZGVnKTtvcGFjaXR5OjB9NjAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKDIwZGVnKTt0cmFuc2Zvcm06c2tld1goMjBkZWcpfTYwJSw4MCV7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgtNWRlZyk7dHJhbnNmb3JtOnNrZXdYKC01ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19QGtleWZyYW1lcyBsaWdodFNwZWVkSW57MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKC0zMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgtMzBkZWcpO29wYWNpdHk6MH02MCV7LXdlYmtpdC10cmFuc2Zvcm06c2tld1goMjBkZWcpO3RyYW5zZm9ybTpza2V3WCgyMGRlZyl9NjAlLDgwJXtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC01ZGVnKTt0cmFuc2Zvcm06c2tld1goLTVkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ubGlnaHRTcGVlZEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZEluO2FuaW1hdGlvbi1uYW1lOmxpZ2h0U3BlZWRJbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH1ALXdlYmtpdC1rZXlmcmFtZXMgbGlnaHRTcGVlZE91dHswJXtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgbGlnaHRTcGVlZE91dHswJXtvcGFjaXR5OjF9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKDMwZGVnKTtvcGFjaXR5OjB9fS5saWdodFNwZWVkT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZE91dDthbmltYXRpb24tbmFtZTpsaWdodFNwZWVkT3V0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlSW57MCV7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0yMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTIwMGRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9dG97dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW57MCV7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0yMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTIwMGRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9dG97dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fS5yb3RhdGVJbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZUluO2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUlufUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJbkRvd25MZWZ0ezAle3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19QGtleWZyYW1lcyByb3RhdGVJbkRvd25MZWZ0ezAle3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluRG93bkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25MZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUluRG93bkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluRG93blJpZ2h0ezAle3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5Eb3duUmlnaHR7MCV7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbX10b3t0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluRG93blJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5Eb3duUmlnaHQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlSW5Eb3duUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluVXBMZWZ0ezAle3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcExlZnR7MCV7dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO29wYWNpdHk6MH0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluVXBMZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5VcExlZnQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlSW5VcExlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluVXBSaWdodHswJXt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7b3BhY2l0eTowfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcFJpZ2h0ezAle3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTtvcGFjaXR5OjB9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbX10b3t0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluVXBSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBSaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVJblVwUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dHswJXt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn10b3t0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMjAwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDIwMGRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHJvdGF0ZU91dHswJXt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn10b3t0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMjAwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDIwMGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0RG93bkxlZnR7MCV7dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgcm90YXRlT3V0RG93bkxlZnR7MCV7dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtvcGFjaXR5OjB9fS5yb3RhdGVPdXREb3duTGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25MZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVPdXREb3duUmlnaHR7MCV7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXREb3duUmlnaHR7MCV7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTAlLHRvey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MH19LnJvdGF0ZU91dERvd25SaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25SaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVPdXREb3duUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dFVwTGVmdHswJXt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO29wYWNpdHk6MX0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHJvdGF0ZU91dFVwTGVmdHswJXt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO29wYWNpdHk6MX0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b219dG97dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0VXBMZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBMZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dFVwTGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0VXBSaWdodHswJXt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTtvcGFjaXR5OjF9MCUsdG97LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbX10b3t0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXRVcFJpZ2h0ezAle3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO29wYWNpdHk6MX0wJSx0b3std2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tfXRve3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0VXBSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dFVwUmlnaHQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgaGluZ2V7MCV7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdH0wJSwyMCUsNjAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dH0yMCUsNjAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg4MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg4MGRlZyk7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdH00MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg2MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7b3BhY2l0eToxfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGhpbmdlezAle3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnR9MCUsMjAlLDYwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXR9MjAlLDYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoODBkZWcpO3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnR9NDAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNjBkZWcpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O29wYWNpdHk6MX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO29wYWNpdHk6MH19Lmhpbmdley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6aGluZ2U7YW5pbWF0aW9uLW5hbWU6aGluZ2V9QC13ZWJraXQta2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUoLTEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCkgcm90YXRlKC0xMjBkZWcpfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUoLTEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCkgcm90YXRlKC0xMjBkZWcpfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0ucm9sbEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm9sbEluO2FuaW1hdGlvbi1uYW1lOnJvbGxJbn1ALXdlYmtpdC1rZXlmcmFtZXMgcm9sbE91dHswJXtvcGFjaXR5OjF9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUoMTIwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHJvdGF0ZSgxMjBkZWcpfX1Aa2V5ZnJhbWVzIHJvbGxPdXR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgcm90YXRlKDEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUoMTIwZGVnKX19LnJvbGxPdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb2xsT3V0O2FuaW1hdGlvbi1uYW1lOnJvbGxPdXR9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTUwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgem9vbUluezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9NTAle29wYWNpdHk6MX19Lnpvb21Jbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbjthbmltYXRpb24tbmFtZTp6b29tSW59QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21JbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX0uem9vbUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbkRvd247YW5pbWF0aW9uLW5hbWU6em9vbUluRG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fUBrZXlmcmFtZXMgem9vbUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fS56b29tSW5MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbUluTGVmdDthbmltYXRpb24tbmFtZTp6b29tSW5MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tSW5SaWdodHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMTAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fUBrZXlmcmFtZXMgem9vbUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgxMDAwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtMTBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX0uem9vbUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tSW5SaWdodDthbmltYXRpb24tbmFtZTp6b29tSW5SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluVXB7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMTAwMHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDEwMDBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLC02MHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLC02MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21JblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwxMDAwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKX19Lnpvb21JblVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbUluVXA7YW5pbWF0aW9uLW5hbWU6em9vbUluVXB9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21PdXR7MCV7b3BhY2l0eToxfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9NTAlLHRve29wYWNpdHk6MH19QGtleWZyYW1lcyB6b29tT3V0ezAle29wYWNpdHk6MX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTUwJSx0b3tvcGFjaXR5OjB9fS56b29tT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbU91dDthbmltYXRpb24tbmFtZTp6b29tT3V0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0RG93bns0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjU1LC4wNTUsLjY3NSwuMTkpfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21PdXREb3duezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSl9fS56b29tT3V0RG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXREb3duO2FuaW1hdGlvbi1uYW1lOnpvb21PdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0TGVmdHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoNDJweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyfX1Aa2V5ZnJhbWVzIHpvb21PdXRMZWZ0ezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoNDJweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCg0MnB4LDAsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBjZW50ZXJ9fS56b29tT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXRMZWZ0O2FuaW1hdGlvbi1uYW1lOnpvb21PdXRMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0UmlnaHR7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtNDJweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgtNDJweCwwLDApfXRve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfX1Aa2V5ZnJhbWVzIHpvb21PdXRSaWdodHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUoLjEpIHRyYW5zbGF0ZTNkKDIwMDBweCwwLDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBjZW50ZXJ9fS56b29tT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tT3V0UmlnaHQ7YW5pbWF0aW9uLW5hbWU6em9vbU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0VXB7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLDYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tT3V0VXB7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLDYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNTUsLjA1NSwuNjc1LC4xOSl9dG97b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKX19Lnpvb21PdXRVcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXRVcDthbmltYXRpb24tbmFtZTp6b29tT3V0VXB9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5Eb3duezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fUBrZXlmcmFtZXMgc2xpZGVJbkRvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt2aXNpYmlsaXR5OnZpc2libGV9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX19LnNsaWRlSW5Eb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJbkRvd247YW5pbWF0aW9uLW5hbWU6c2xpZGVJbkRvd259QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5MZWZ0ezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fUBrZXlmcmFtZXMgc2xpZGVJbkxlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt2aXNpYmlsaXR5OnZpc2libGV9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX19LnNsaWRlSW5MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt2aXNpYmlsaXR5OnZpc2libGV9dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX19QGtleWZyYW1lcyBzbGlkZUluUmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fS5zbGlkZUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZUluUmlnaHQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVJblJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZUluVXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dmlzaWJpbGl0eTp2aXNpYmxlfXRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9fUBrZXlmcmFtZXMgc2xpZGVJblVwezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3Zpc2liaWxpdHk6dmlzaWJsZX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfX0uc2xpZGVJblVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJblVwO2FuaW1hdGlvbi1uYW1lOnNsaWRlSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVPdXREb3duezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9dG97dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fUBrZXlmcmFtZXMgc2xpZGVPdXREb3duezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9dG97dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fS5zbGlkZU91dERvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dERvd247YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX10b3t2aXNpYmlsaXR5OmhpZGRlbjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1Aa2V5ZnJhbWVzIHNsaWRlT3V0TGVmdHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9fS5zbGlkZU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dExlZnQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dFJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9dG97dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUBrZXlmcmFtZXMgc2xpZGVPdXRSaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfX0uc2xpZGVPdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0UmlnaHQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVPdXRVcHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9fUBrZXlmcmFtZXMgc2xpZGVPdXRVcHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfXRve3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9fS5zbGlkZU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRVcDthbmltYXRpb24tbmFtZTpzbGlkZU91dFVwfQ== ###PACKDATA,FILE_END,/css/animate.css,importbuddy/css/animate.css ###PACKDATA,FILE_START,/images/working.gif,importbuddy/images/working.gif R0lGODlhKwALAPEAAPn5+SiKt5LC2CiKtyH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAKwALAAACMoSOCMuW2diD88UKG95W88uF4DaGWFmhZid93pq+pwxnLUnXh8ou+sSz+T64oCAyTBUAACH5BAkKAAAALAAAAAArAAsAAAI9xI4IyyAPYWOxmoTHrHzzmGHe94xkmJifyqFKQ0pwLLgHa82xrekkDrIBZRQab1jyfY7KTtPimixiUsevAAAh+QQJCgAAACwAAAAAKwALAAACPYSOCMswD2FjqZpqW9xv4g8KE7d54XmMpNSgqLoOpgvC60xjNonnyc7p+VKamKw1zDCMR8rp8pksYlKorgAAIfkECQoAAAAsAAAAACsACwAAAkCEjgjLltnYmJS6Bxt+sfq5ZUyoNJ9HHlEqdCfFrqn7DrE2m7Wdj/2y45FkQ13t5itKdshFExC8YCLOEBX6AhQAADs= ###PACKDATA,FILE_END,/images/working.gif,importbuddy/images/working.gif ###PACKDATA,FILE_START,/images/bullet_go.png,importbuddy/images/bullet_go.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEsSURBVDjLY/j//z8DJZhhmBuQvdj8a+p8w//xc3U5yTIgeb7h18bNUf/DZ2j8958qz0nQgPyltv9zF5v/TV9o/Ddxrv7fmvWh/1ednvi/ZLX/f9d+8b+23YI8eA0AOvn/hnPT/q89OwWsccXpCf8n7Cn5v/B41/+MpW7/TdvZ/+o2M/LjNADoZLDmvl35/zt3ZP9v3Zb2v2Fz4v+mren/Zxxq/h+zwOa/aj3DH5wGRM/W/L/y1IT/S0/0/l94rOv/vKMdQEOy/k8/1PQ/banHf8VahlfSlQwGOA0InK74z3Oi9D/nftF/1t38/+LmW/2fdrDhf9Jit//ytQzPJSsZtEiKBe1mxq/xC53/y1czPAFqVic5GoFO/ipXzfxftJJBkeyUKFzOwDm48wIAh5XH+g7drOwAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/images/bullet_go.png,importbuddy/images/bullet_go.png ###PACKDATA,FILE_START,/images/favicon.png,importbuddy/images/favicon.png iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACFdJREFUeNrkl21sleUZx3/383JeaE9L29Pa8iZ9se0E0SHoBDUUt+gkQxd0aqImW5aZuUzNsky36cZcBl+2D3OLLhr1wxKikQwN4CYdbBYNQoeg0hSspOXQck4tbc9L29Nz7ue+r304BwaCxg8mftidXHmS50nu+3dd93X9r+tRIsKXuRy+5PWlA3gHDhxARPA8j3g8TnV1NVVVVVgR1PQ0JpPBra5m6t1DhJsX1+R27Vo129fXWBwYCIVaWsLF48cDt7o68NvaZipvvLHfrYz1KtfBjcVQCxZgfZ+Q75PP5/F9n0KhwODgIFprlFJ4n0WnfB+3sjJeHBpaP/32W3ePP/N0hz09vojCLG4oRNDfjxuJYsfGmBkeJv+fgzNe4yWJ2E039UQvv3xLqLLyTRsEnx2Bi5+scB2nenZ4+JGxF164d7qnp410GtdxcJXCiUZpePJJIkuXAlAcGGD0sccIhhNzCsMnO6cPHOj0Wlp+MHfDhn9V33nnn5yKim2fG0CUwlHq66Nbt/7h46eeWmaTpwhFo7jhMK4CZ7aIN38B4dWrccPh0iZ1dah583AnJlCREFhBf/QRyU2butK793Qt+tUTf3VaWx9F6+SnJqGIoByHaCz22Knnn3998Bc/X6ZHR3Gjc1AolDEoY1EmoIBQPKd6rbUYgCBAjEVZixPyccJhMm/tpf+BB+4z/f3/9MPhlZ8se0cphYhgRaifP/93Ey+/vHngyd/6EhhsoUiQzZYsk0Gn0xTHx4nMm0ckFDq7Sdj38S9dzOzpcYLJNEE6U7JsDkSYPnqUvgcfvLyYSOzwIpFrrbUopUrW09NDJBKho7PzAWdk5C/7N9yByqSpbGigvmstflUML1ZJqC4OIvj1DUSXfxWvqek8T8zYGPlDh9BjY9hiEWsMs6lRdDbLx3t2kzkxRP3627jqueeGPjp+fM3kxMQJEYHdu3fz3gcfdIpI+uDDD8trNTWyq6FBUq+8Il/UOvXSS/J6bY281tQkqV27RES27ty5U7344os4+XyeS1taHi+MjlYPv/EG4ji49fXE16z5wsSmYe1avMYmZtNphl57FWBDY1PTN+bNm4fX3Nz8lao5c24f3bePqWSSynCY7GyBd/7+D2oWL+bCKoFLlyylsmbuee+nJic50deHKufYuak2fuxD0tkcbjjM2LuHCaam6Fyy5KF9e/fu8rTW6xRUJN9/n8BYAsDJZuj97vcomAAXVZKG8mZFLEt++CPWP/3n8wD+vfE3HHnqj/g4+I4i4jhYAQO4rsMl1VUEIZ/JE0Pkx8eJLlp0fVVV1WKvpqZmBcBYIoHWmqIJEXEcOupq8ABXKVQZQAE6l8MdGb4gMnNOnGDFnCh+rKqsZQojQoCgBWasJbBCvjBNoDWeUtVLly692ovFYs0AudkC2hq0tSixiFK4gKdUSQfK9auDgJjnXtjVXIcZYwmCAJTCIhjAiqABLRAg5ApF8vlZaoDDhw/P90SkAsDGKpk2hpA1JV+VwkUwSuEASkApCKzFXmSGMFYoGoNYiyAICoNgbBkAwQhkxWLKDuRyuUpvenp6pra2lrrOTg5YS8xaLGBR+ICrQFGGALQxWKUuALCKEoAxiKJ0/yIEQCCgFRQKBfQljVTW1gIwMzMz46RSqQRA5/U3kI5ESReKaGspWEPBWgrGUDxj1hAAmfEJ8oViGRQKgWEqk0FTikLB2PKzZEVrMNYwVCxSt/xq5tbXEwQBSqmUNzQ0dHjlypUb5l3WRuet6+j721aWOQ6eAiPglqPgUEpGLxImtf8Az6y+nlhtLQJMT0wS7j9CLByhUI6gQbBl70VBRhtOAXfdfx/KcchMTuYSicRhb3Bw8PXx8fFf1tXVRe544nHe697F0VyWtnAIT8qHC7hlAK0UYQlwDvaiy+GPAH4oRN5RWBGsFUQpAgQBckY4ojXL132LlbffBkBfX19vMpk86l5zzTVJpdS17e3tHXMbG6mqjfPmju3MGENUlbLfihCIYBECsQQi4LrgOOA6iOuikdJdi6BFMCJosYxb4WgQ0HRZO4+8/BIVc+cyNTXF9u3bf6q17ne7urpIpVLHFy1adG9NTY3fsuJqouEI+3fvYdxaRM4kIoiU7twIBOckWCClw40IRkqtOQuMGMugWBa2d/CzbdtovKwNgO7u7j3Hjh37te/7xu3q6kJrPTIyMkJnZ+faSCRCxw3Xs6C9naP73yGRzZKRUv8PynlhylJrKdW7BorAlEAGSFrLSRGywNe+eSsPbdlCU0c7AAcPHpzcs2fPXZ7nJZVSuGvWrMF1XbLZ7NsnT55c0NraujwajbLwiitYfed3cEU4nUgwnMsxKUJGhLQIk2WbEOF02UYRRsuR6Vixkvs3beaezZuorKuDkvDM7Nix4x5r7duOU5qF1MaNG8/WcrFYDDU0NPx+3bp1P25razv7fmJkhN5tr3J0bw8f7ttP9vQYpqgJjEah8PwQoUiYxtY22m9YzVW33MJVN9+MckuCEwQBPT09qZ6enu9ba3e67v+U9DwAAK01oVDovuuuu27zqlWr5ldUVJz3PZ/LMTY4SDqZIjs2RigSIdZQT3zhQmrmz8c7Z1ICGB4epru7u3tgYOAnvu8fOeP5pwKcmfGCIGiNx+OPXnnlld9etmxZPB6Pf+7+HwQBiUSC3t7e9wcGBp6dnZ191vd9fdEB/GIAZ/XdGLTWrdXV1Xc3NjauX7hwYUtzc3M8FovheR6+75+BRWtNKpUKBgcHR5LJ5OFUKrUlCIKdnudNf9Lrzw1wLogxBqVUq+M4y4GGSCRSF41G640xs/l8/rTWOiMix6y1h5RSac/zUBfpGRcA/N//Hf93AHiGrdXcwqWjAAAAAElFTkSuQmCC ###PACKDATA,FILE_END,/images/favicon.png,importbuddy/images/favicon.png ###PACKDATA,FILE_START,/images/sort_down.png,importbuddy/images/sort_down.png iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHBJREFUeNqMkD0OABEQRmcmVChIqN3/WBJHoLVYxK7GK4TvZwIMIcANrC0xxpJSOkzOOXjvASvUBOdcOxzBoXeDRhO11p+QlBKEEKtNc2OMAcbYKxL1aTsrWE201u4lPB4zUUphzrn8r9HA2+95BBgA3YASwqCieowAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/images/sort_down.png,importbuddy/images/sort_down.png ###PACKDATA,FILE_START,/images/icon_menu_32x32.png,importbuddy/images/icon_menu_32x32.png iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAABtNJREFUeNrsl39sVeUZxz/ve85pL9iWUmxHKdCCLrK6pZAZsWQQfiwWxcAYGT+WuWyJcygz/jGW4bKYGHEi8Q9nwhK2JTOybBQWt5g5QJNFMRFRQKqGoUDpLVDoD25vb2/Lveec93n2x72ttLBh/Id/fJM359z3nPN+v+/3eZ/n/V6jqtzMZrnJ7UsC/p9bW6/74Gvbt2MNGMAag6FwjzLLGHN3MGfO1621FkBEJDp58piqvgdcUGNo27z58xH4Xw+cCGrAKJStWPFonEw+5DqTd0p2qMQA0YkTABhjUFWUAkNTMSkXzJ7dtqCjY+c7DQ1/uhEBs2v37msGH1y/np6LF8uG33jjqYFXXtkYtbdPNBg8AygMO8e81w+QmDYNgHhwkPeaF1Dm+yggxQVMmNs0OGnNmh2l8+c/U1NbmwUYj3ddBVI9Pau7d+x4qW/P3grPgGcsRhWsRVU5mxmkuQgO4JeX0+P5JJxDVRFV1BgGjhwtTx/7YMvURzb+NNXT83BVTc3f/m8IWhYtKikpKXm5fevWdanXXsMD1FpEY6wxOAcOZc76tdeQnv29NQzu2oVnDBhDLIIag4sjki/+dnKuv39vuq+vNQzDHx44eDC8JgT3LlxYVVpa+veuvXsXnX7uOVSVu3buJJg0iep77vlCOzzKZOg7dIgjGzcCcOf27UxZuvRgPp9f/frbb6fGpKHv+3skl1v08fPPMxxFVK5axbSWli8MDhBUVFDb0oLMncuVOKJt61YMLPJ9f8+YENy3ePGWIAiWnWltJT+UxYnyn6PHGHjqaa5XqGc0NTHvOyvHjH3wj1c519ZGMRlGvzPA2VNnmBxG5Hu6ufTWW9QuXrzsvsWLt+x7881tpquzc2oikegMgiD459p15I8fQ1RJi5JWJS+CBTxjsCgO+MrdzTx2YN8YAi+2LKfn8Luj4FLsgTVMtpbJxmKNoer++1nywgtEURTlcrmZvog87nleANDX2Ulp7DDGMBGlVBU8D6taKEpqiExh0vFtgrVM8yyBfkbAGUAUXxSxSuwclz79FADP8wIRedwX2GBMYcJsmMcTKQIaAsAXwahiixUxJ4U0u6amqzJRlNKiAk4VMaZwBaIoQo0h79xoARPY4Jf4ft0IAZlaS763Fx/wDCiFCaw1eArGQCzKcCrFcDrNxMpKAIbTabKpFBOdK4TAGJzIaBjEGGIUJxDUN4wSKPH9Ot96nq+qGGNoWLiQj48e5VbP4hmwWli1rwYHGFUiYOCjD/n5rTXEV+3k2sAnKLBGriKvQFxUods5lixcCICqYj3PN+eTSS0vK8NaS6anh199o4nbEBLGFGQHbJGMMWAwDKuSBaIicQ+lDJiAKSoAMo7IENBdXsFvPvqQIJFARBjMZrEDmUwoIgBU1NTw7cd+xqkwZlAcsSqxKqETQhFCJ0QieCKUqVCpyiQRylXxR94VIRIlUiUSJXSOfudoz8esevJJgkSC4gnKQCYT2svpdHtcrOEAK5/YwrzvrqY9Ei7FjpxzhCpEKkRFgFgEdQJS6CpC7ITQOUIR8sVrzjkuOqEjFpZseoRvPfiDUflj57icTrd7yx94IFEzZcq9QRBgrcVayzdXrSTMh7Qdepe0gtNCKBTFqeLMSJ6bQrqpEpvC7xglB/SJ0iVwxfNZv+1ZVvxi82fgcUw2m+XkmTPbzK7du8uqq6ouzm1sLCstLcXzPEay4uzRY7Ru+SXtR44BkAAmoASABwTFehcWieQx5DDkUQyGxmVLWfvM09TecccouHOOfD7P8RMnsr2pVO3IYbTuq/X1uxtmzGA8CYD299/nnb/8leP/2kemp6e41QqKFMqtGb2vmj6du1atpPn7G6hrbByd42rwjnPnOJVMrgdaR09Da+0fbps586H6ujpKSkrwfZ+i4xrTetvP0vXJJwx0d48ZnzJjOnWNjVTW1l7zjYgQxzFhGJK8cIEznZ1/FJGfjPEDIrLpVEeHH4bhjxqmTyeRSOD7/qgaI4pUz55F9exZNzwJVbVgTpwjimNyuRwd58+T7Op6Cdh0PUMSAj9OdnVd6Ovvf+L2+npbVVlJEAR4njeGyNWExgOOdOcczjmiKCKVTnM6mZShK1eeBX59Q08IzAV+V1lR0VxbXU11VdWoGnaEyPgVF0lIETiOY3pTKS729pLOZA4BjwLHP68rPj6/qWnB4ba25elM5uHTyeTKivJyr+KWW6goK2NiMTwjKqgqLo4ZyuXIZLNkhobIDA66KI5fBX4P7L+hLdcR339Vm9/UtB/Yf7itrfpyf//Sy/39zUAzcDtQNd7LAqeBQ8X+b6D3hrb8yz+nN5vAfwcArs2hchpwFZgAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/images/icon_menu_32x32.png,importbuddy/images/icon_menu_32x32.png ###PACKDATA,FILE_START,/lib/dbreplace/dbreplace.php,importbuddy/lib/dbreplace/dbreplace.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X2RicmVwbGFjZSBDbGFzcwogKgogKglIYW5kbGVzIHJlcGxhY2VtZW50IG9mIGRhdGEgaW4gYSB0YWJsZS9kYXRhYmFzZSwgdGV4dCBvciBzZXJpYWxpemVkLiBBIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlZm9yZSBpbnN0YW50aWF0aW9uLgogKgkKICoJQHNpbmNlIDEuMC4wCiAqCUBhdXRob3IgRHVzdGluIEJvbHRvbgogKgogKglAcGFyYW0JCSRzdGF0dXNfY2FsbGJhY2sJCW9iamVjdAkJT3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXR1cygpIGZ1bmN0aW9uIGZvciByZXBvcnRpbmcgYmFjayBpbmZvcm1hdGlvbi4KICoJQHJldHVybgkJbnVsbAogKgogKi8KaWYgKCFjbGFzc19leGlzdHMoInBsdWdpbmJ1ZGR5X2RicmVwbGFjZSIpKSB7CgljbGFzcyBwbHVnaW5idWRkeV9kYnJlcGxhY2UgewoJCXZhciAkX3ZlcnNpb24gPSAnMS4wJzsKCQkKCQl2YXIgJHN0YXJ0VGltZTsKCQl2YXIgJHRpbWVXaWdnbGVSb29tOwoJCXZhciAkbWF4RXhlY3V0aW9uVGltZTsKCQkKCQljb25zdCBNQVhfUk9XU19QRVJfU0VMRUNUID0gNTAwOwoJCQoJCQoJCS8qKgoJCSAqCV9fY29uc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLiBTZXRzIHVwIG9wdGlvbmFsIHN0YXR1cygpIGZ1bmN0aW9uIGNsYXNzIGlmIGFwcGxpY2FibGUuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRzdGF0dXNfY2FsbGJhY2sJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRzdGFydFRpbWUgPSAnJywgJHRpbWVXaWdnbGVSb29tID0gMSwgJG1heEV4ZWN1dGlvblRpbWUgPSAzMCApIHsKCQkJaWYgKCAnJyA9PSAkc3RhcnRUaW1lICkgewoJCQkJJHRoaXMtPnN0YXJ0VGltZSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPnN0YXJ0VGltZSA9ICRzdGFydFRpbWU7CgkJCX0KCQkJJHRoaXMtPnRpbWVXaWdnbGVSb29tID0gJHRpbWVXaWdnbGVSb29tOwoJCQkkdGhpcy0+bWF4RXhlY3V0aW9uVGltZSA9ICRtYXhFeGVjdXRpb25UaW1lOwoJCX0KCQkKCQkKCQkKCQkvKioKCQkgKgl0ZXh0KCkKCQkgKgkKCQkgKglSZXBsYWNlcyB0ZXh0IHdpdGhpbiBhIHRhYmxlIGJ5IHNwZWNpZnlpbmcgdGhlIHRhYmxlLCByb3dzIHRvIHJlcGxhY2Ugd2l0aGluIGFuZCB0aGUgb2xkIGFuZCBuZXcgdmFsdWUocykuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0YWJsZQkJVGFibGUgdG8gcmVwbGFjZSB0ZXh0IGluLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRvbGRzCQlPbGQgdmFsdWUocykgdG8gZmluZCBmb3IgcmVwbGFjZW1lbnQuIE1heSBiZSBhIHN0cmluZyBvciBhcnJheSBvZiB2YWx1ZXMuCgkJICoJQHBhcmFtCQltaXhlZAkJJG5ld3MJCU5ldyB2YWx1ZShzKSB0byBiZSByZXBsYWNlZCB3aXRoLiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkuIElmIGFycmF5IHRoZXJlIG11c3QgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIHZhbHVlcyBhcyAkb2xkcy4KCQkgKglAcGFyYW0JCW1peGVkCQkkcm93cwkJVGFibGUgcm93KHMpIHRvIHJlcGxhY2Ugd2l0aGluLiBNYXkgYmUgYW4gYXJyYXkgb2YgdGFibGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiB0ZXh0KCAkdGFibGUsICRvbGRzLCAkbmV3cywgJHJvd3MgKSB7CgkJCSRyb3dzX3NxbCA9IGFycmF5KCk7CgkJCQoJCQlpZiAoICFpc19hcnJheSggJG9sZHMgKSApIHsKCQkJCSRvbGRzID0gYXJyYXkoICRvbGRzICk7CgkJCX0KCQkJaWYgKCAhaXNfYXJyYXkoICRuZXdzICkgKSB7CgkJCQkkbmV3cyA9IGFycmF5KCAkbmV3cyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkcm93cyApICkgewoJCQkJJHJvd3MgPSBhcnJheSggJHJvd3MgKTsKCQkJfQoJCQkKCQkJLy8gUHJldmVudCB0cnlpbmcgdG8gcmVwbGFjZSBkYXRhIHdpdGggdGhlIHNhbWUgZGF0YSBmb3IgcGVyZm9ybWFuY2UuCgkJCSR0aGlzLT5yZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoICRvbGRzLCAkbmV3cyApOwoJCQkKCQkJZm9yZWFjaCAoICRyb3dzIGFzICRyb3cgKSB7CgkJCQkkaSA9IDA7CgkJCQlmb3JlYWNoICggJG9sZHMgYXMgJG9sZCApIHsKCQkJCQkkcm93c19zcWxbXSA9ICRyb3cgLiAiID0gcmVwbGFjZSggeyRyb3d9LCAneyRvbGR9JywgJ3skbmV3c1skaV19JykiOwoJCQkJCSRpKys7CgkJCQl9CgkJCX0KCQkJCgkJCWdsb2JhbCAkd3BkYjsKCQkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGB7JHRhYmxlfWAgU0VUICIgLiBpbXBsb2RlKCAnLCcsICRyb3dzX3NxbCApIC4gIjsiICk7CgkJCQoJCQlyZXR1cm4gdHJ1ZTsKCQkJCgkJfSAvLyBFbmQgdGV4dCgpLgoJCQoJCQoJCS8qKgoJCSAqCXNlcmlhbGl6ZWQoKQoJCSAqCQoJCSAqCVJlcGxhY2VzIHNlcmlhbGl6ZWQgdGV4dCB3aXRoaW4gYSB0YWJsZSBieSBzcGVjaWZ5aW5nIHRoZSB0YWJsZSwgcm93cyB0byByZXBsYWNlIHdpdGhpbiBhbmQgdGhlIG9sZCBhbmQgbmV3IHZhbHVlKHMpLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFibGUJCVRhYmxlIHRvIHJlcGxhY2UgdGV4dCBpbi4KCQkgKglAcGFyYW0JCW1peGVkCQkkb2xkcwkJT2xkIHZhbHVlKHMpIHRvIGZpbmQgZm9yIHJlcGxhY2VtZW50LiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkgb2YgdmFsdWVzLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRuZXdzCQlOZXcgdmFsdWUocykgdG8gYmUgcmVwbGFjZWQgd2l0aC4gTWF5IGJlIGEgc3RyaW5nIG9yIGFycmF5LiBJZiBhcnJheSB0aGVyZSBtdXN0IGJlIHRoZSBzYW1lIG51bWJlciBvZiB2YWx1ZXMgYXMgJG9sZHMuCgkJICoJQHBhcmFtCQltaXhlZAkJJHJvd3MJCVRhYmxlIHJvdyhzKSB0byByZXBsYWNlIHdpdGhpbi4gTWF5IGJlIGFuIGFycmF5IG9mIHRhYmxlcy4KCQkgKglAcGFyYW0JCWludAkJCSRyb3dzX3N0YXJ0CVJvdyB0byBzdGFydCBhdC4gVXNlZCBmb3IgcmVzdW1pbmcuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNlcmlhbGl6ZWQoICR0YWJsZSwgJG9sZHMsICRuZXdzLCAkcm93cywgJHJvd3Nfc3RhcnQgPSAnJyApIHsKCQkJaWYgKCAhaXNfYXJyYXkoICRvbGRzICkgKSB7CgkJCQkkb2xkcyA9IGFycmF5KCAkb2xkcyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkbmV3cyApICkgewoJCQkJJG5ld3MgPSBhcnJheSggJG5ld3MgKTsKCQkJfQoJCQlpZiAoICFpc19hcnJheSggJHJvd3MgKSApIHsKCQkJCSRyb3dzID0gYXJyYXkoICRyb3dzICk7CgkJCX0KCQkJCgkJCWdsb2JhbCAkd3BkYjsKCQkJCgkJCS8vIEdldCB0aGUgdG90YWwgcm93IGNvdW50IGZvciB0aGlzIHRhYmxlCgkJCSR0b3RhbF9yb3dzID0gMDsKCQkJJHRhYmxlc19zdGF0dXMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFIFNUQVRVUyIsIEFSUkFZX0EgKTsKCQkJCgkJCWZvcmVhY2ggKCAkdGFibGVzX3N0YXR1cyBhcyAkdGFibGVfc3RhdHVzICkgewoJCQkKCQkJCWlmICggJHRhYmxlID09PSAkdGFibGVfc3RhdHVzWyAnTmFtZScgXSApIHsKCQkJCQoJCQkJCS8vIEZpeCB1cCByb3cgY291bnQgYW5kIGF2ZXJhZ2Ugcm93IGxlbmd0aCBmb3IgSW5ub0RCIGVuZ2luZSB3aGljaCByZXR1cm5zIGluYWNjdXJhdGUKCQkJCQkvLyAoYW5kIGNoYW5naW5nKSB2YWx1ZXMgZm9yIHRoZXNlCgkJCQkJaWYgKCAnSW5ub0RCJyA9PT0gJHRhYmxlX3N0YXR1c1sgJ0VuZ2luZScgXSApIHsKCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkY291bnQgPSAkd3BkYi0+Z2V0X3ZhciggIlNFTEVDVCBDT1VOVCgxKSBGUk9NIGB7JHRhYmxlX3N0YXR1c1snTmFtZSddfWAiICkgKSApIHsKCQkJCQkJCSR0YWJsZV9zdGF0dXNbICdSb3dzJyBdID0gJGNvdW50OwoJCQkJCQl9CgkJCQkJfQoJCQkKCQkJCQkkdG90YWxfcm93cyA9ICR0YWJsZV9zdGF0dXNbICdSb3dzJyBdOwoJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBQcmV2ZW50IHRyeWluZyB0byByZXBsYWNlIGRhdGEgd2l0aCB0aGUgc2FtZSBkYXRhIGZvciBwZXJmb3JtYW5jZS4KCQkJJHRoaXMtPnJlbW92ZV9tYXRjaGluZ19hcnJheV9lbGVtZW50cyggJG9sZHMsICRuZXdzICk7CgkJCSRrZXlfcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgS0VZUyBGUk9NIGB7JHRhYmxlfWAgV0hFUkUgS2V5X25hbWU9J1BSSU1BUlknOyIsIEFSUkFZX0EgKTsKCQkJaWYgKCAka2V5X3Jlc3VsdHMgPT09IGZhbHNlICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGUgYCcgLiAkdGFibGUgLiAnYCBkb2VzIG5vdCBleGlzdDsgc2tpcHBpbmcgbWlncmF0aW9uIG9mIHRoaXMgdGFibGUuJyApOwoJCQkJcmV0dXJuOwoJCQl9CgkJCQoJCQkvLyBObyBwcmltYXJ5IGtleSBmb3VuZDsgdW5zYWZlIHRvIGVkaXQgdGhpcyB0YWJsZS4gQHNpbmNlIDIuMi4zMi4KCQkJaWYgKCBjb3VudCggJGtleV9yZXN1bHRzICkgPT0gMCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0Vycm9yICM5MDI5OiBXYXJuaW5nIG9ubHkhIFRhYmxlIGAnLiAgJHRhYmxlIC4nYCBkb2VzIG5vdCBjb250YWluIGEgcHJpbWFyeSBrZXk7IEJhY2t1cEJ1ZGR5IGNhbm5vdCBzYWZlbHkgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGlzIHRhYmxlLiBTa2lwcGluZyBtaWdyYXRpb24gb2YgdGhpcyB0YWJsZS4gKHNlcmlhbGl6ZWQoKSkuJyApOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJCgkJCSRwcmltYXJ5X2tleSA9ICRrZXlfcmVzdWx0c1swXVsnQ29sdW1uX25hbWUnXTsKCQkJdW5zZXQoICRrZXlfcmVzdWx0ICk7CgkJCQoJCQkkdXBkYXRlZCA9IGZhbHNlOyAvLyBXYXMgc29tZXRoaW5nIGluIERCIHVwZGF0ZWQ/CgkJCSRyb3dzX3JlbWFpbiA9IHRydWU7IC8vIE1vcmUgcm93cyByZW1haW5pbmcgLyBha2EgYW5vdGhlciBxdWVyeSBmb3IgbW9yZSByb3dzIG5lZWRlZC4KCQkJaWYgKCAnJyA9PSAkcm93c19zdGFydCApIHsKCQkJCSRyb3dzX3N0YXJ0ID0gMDsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5kaW5nIHJvd3MgaW4gdGFibGUgYCcgLiAkdGFibGUgLiAnYCB0byB1cGRhdGUuJyApOwoJCQl3aGlsZSAoIHRydWUgPT09ICRyb3dzX3JlbWFpbiApIHsgLy8gS2VlcCBsb29waW5nIHRocm91Z2ggcm93cyB1bnRpbCBub25lIHJlbWFpbi4gTG9vcGluZyB0aHJvdWdoIGxpa2UgdGhpcyB0byBsaW1pdCBtZW1vcnkgdXNhZ2UgYXMgd3BkYiBjbGFzc2VzIGxvYWRzIGFsbCByZXN1bHRzIGludG8gbWVtb3J5LgoJCQkJJHJvd3NSZXN1bHQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgYCIgLiBpbXBsb2RlKCAnYCxgJywgJHJvd3MgKSAuICJgLGB7JHByaW1hcnlfa2V5fWAgRlJPTSBgeyR0YWJsZX1gIExJTUlUICIgLiAkcm93c19zdGFydCAuICcsJyAuIHNlbGY6Ok1BWF9ST1dTX1BFUl9TRUxFQ1QgKTsKCQkJCSRyb3dzQ291bnQgPSBjb3VudCggJHJvd3NSZXN1bHQgKTsKCgkJCQkvLyBQcm92aWRlIGFuIHVwZGF0ZSBvbiBwcm9ncmVzcwoJCQkJaWYgKCAwID09PSAkcm93c0NvdW50ICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RhYmxlOiBgJy4gJHRhYmxlIC4gJ2AgLSBwcm9jZXNzaW5nICcgLiAkcm93c0NvdW50IC4gJyByb3dzICggb2YgJyAuICR0b3RhbF9yb3dzIC4gJyApJyApOwkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGU6IGAnLiAkdGFibGUgLiAnYCAtIHByb2Nlc3NpbmcgJyAuICRyb3dzQ291bnQgLiAnIHJvd3MgKCBSb3dzICcgLiAkcm93c19zdGFydCAuICctJyAuICggJHJvd3Nfc3RhcnQgKyAkcm93c0NvdW50IC0gMSApIC4gJyBvZiAnIC4gJHRvdGFsX3Jvd3MgLiAnICknICk7CQoJCQkJfQoJCQkJCgkJCQkkcm93c19zdGFydCArPSBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUOyAvLyBOZXh0IGxvb3Agd2Ugd2lsbCBiZWdpbiBhdCB0aGlzIG9mZnNldC4KCQkJCWlmICggKCAwID09ICRyb3dzQ291bnQgKSB8fCAoICRyb3dzQ291bnQgPCBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUICkgKSB7CgkJCQkJJHJvd3NfcmVtYWluID0gZmFsc2U7CgkJCQl9CgkJCQkKCQkJCWZvcmVhY2goICRyb3dzUmVzdWx0IGFzICRyb3cgKSB7CgkJCQkJJG5lZWRzX3VwZGF0ZSA9IGZhbHNlOwoJCQkJCSRzcWxfdXBkYXRlID0gYXJyYXkoKTsKCQkJCQkKCQkJCQlmb3JlYWNoKCAkcm93IGFzICRjb2x1bW4gPT4gJHZhbHVlICkgewoJCQkJCQlpZiAoICRjb2x1bW4gIT0gJHByaW1hcnlfa2V5ICkgewoJCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkZWRpdGVkX2RhdGEgPSAkdGhpcy0+cmVwbGFjZV9tYXliZV9zZXJpYWxpemVkKCAkdmFsdWUsICRvbGRzLCAkbmV3cyApICkgKSB7IC8vIERhdGEgY2hhbmdlZC4KCQkJCQkJCQkkbmVlZHNfdXBkYXRlID0gdHJ1ZTsKCQkJCQkJCQkkc3FsX3VwZGF0ZVtdID0gJGNvbHVtbiAuICI9ICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRlZGl0ZWRfZGF0YSApIC4gIiciOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHByaW1hcnlfa2V5X3ZhbHVlID0gJHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCWlmICggJG5lZWRzX3VwZGF0ZSA9PT0gdHJ1ZSApIHsKCQkJCQkJJHVwZGF0ZWQgPSB0cnVlOwoJCQkJCQkkd3BkYi0+cXVlcnkoICJVUERBVEUgYHskdGFibGV9YCBTRVQgIiAuIGltcGxvZGUoICcsJywgJHNxbF91cGRhdGUgKSAuICIgV0hFUkUgYHskcHJpbWFyeV9rZXl9YCA9ICd7JHByaW1hcnlfa2V5X3ZhbHVlfScgTElNSVQgMSIgKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCggJHJvd3NSZXN1bHQgKTsKCQkJCQoJCQkJLy8gU2VlIGhvdyB3ZSBhcmUgZG9pbmcgb24gdGltZS4gVHJpZ2dlciBjaHVua2luZyBpZiBuZWVkZWQuCgkJCQlpZiAoICggKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT5zdGFydFRpbWUgKSArICR0aGlzLT50aW1lV2lnZ2xlUm9vbSApID49ICR0aGlzLT5tYXhFeGVjdXRpb25UaW1lICkgewoJCQkJCXJldHVybiBhcnJheSggJHJvd3Nfc3RhcnQgKTsKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKCAkdXBkYXRlZCA9PT0gdHJ1ZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VwZGF0ZWQgc2VyaWFsaXplZCBkYXRhIGluIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm90aGluZyBmb3VuZCB0byB1cGRhdGUgaW4gdGFibGUgYCcgLiAkdGFibGUgLiAnYC4nICk7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSAvLyBFbmQgc2VyaWFsaXplZCgpLgoJCQoJCQoJCS8qKgoJCSAqCXJlcGxhY2VfbWF5YmVfc2VyaWFsaXplZCgpCgkJICoJCgkJICoJUmVwbGFjZXMgcG9zc2libHkgc2VyaWFsaXplZCAob3Igbm9uLXNlcmlhbGl6ZWQpIHRleHQgaWYgYSBjaGFuZ2UgaXMgbmVlZGVkLiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBubyBjaGFuZ2UuCgkJICogIE5vdGU6IEFzIG9mIEJCIHYzLjIueCBzdXBwb3J0cyBkb3VibGUgc2VyaWFsaXplZCBkYXRhLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFibGUJCVRleHQgKHBvc3NpYmx5IHNlcmlhbGl6ZWQpIHRvIHVwZGF0ZS4KCQkgKglAcGFyYW0JCW1peGVkCQkkb2xkcwkJVGV4dCB0byBzZWFyY2ggZm9yIHRvIHJlcGxhY2UuIE1heSBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHNlYXJjaCBmb3IuCgkJICoJQHBhcmFtCQltaXhlZAkJJG5ld3MJCU5ldyB2YWx1ZShzKSB0byBiZSByZXBsYWNlZCB3aXRoLiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkuIElmIGFycmF5IHRoZXJlIG11c3QgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIHZhbHVlcyBhcyAkb2xkcy4KCQkgKglAcmV0dXJuCQltaXhlZAkJCQkJUmV0dXJucyBtb2RpZmllZCBzdHJpbmcgZGF0YSBpZiBzZXJpYWxpemVkIGRhdGEgd2FzIHJlcGxhY2VkLiBGYWxzZSBpZiBubyBjaGFuZ2Ugd2FzIG1hZGUuCgkJICoKCQkgKi8KCQlmdW5jdGlvbiByZXBsYWNlX21heWJlX3NlcmlhbGl6ZWQoICRkYXRhLCAkb2xkcywgJG5ld3MgKSB7CgkJCWlmICggIWlzX2FycmF5KCAkb2xkcyApICkgewoJCQkJJG9sZHMgPSBhcnJheSggJG9sZHMgKTsKCQkJfQoJCQlpZiAoICFpc19hcnJheSggJG5ld3MgKSApIHsKCQkJCSRuZXdzID0gYXJyYXkoICRuZXdzICk7CgkJCX0KCQkJCgkJCSR0eXBlID0gJyc7CgkJCSR1bnNlcmlhbGl6ZWQgPSBmYWxzZTsgLy8gZmlyc3QgYXNzdW1lIG5vdCBzZXJpYWxpemVkIGRhdGEKCQkJaWYgKCBpc19zZXJpYWxpemVkKCAkZGF0YSApICkgeyAvLyBjaGVjayBpZiB0aGlzIGlzIHNlcmlhbGl6ZWQgZGF0YQoJCQkJJHVuc2VyaWFsaXplZCA9IEB1bnNlcmlhbGl6ZSggJGRhdGEgKTsgLy8gdW5zZXJpYWxpc2UgLSBpZiBmYWxzZSBpcyByZXR1cm5lZCB3ZSB3b24ndCB0cnkgdG8gcHJvY2VzcyBpdCBhcyBzZXJpYWxpc2VkLgoJCQl9CgkJCWlmICggJHVuc2VyaWFsaXplZCAhPT0gZmFsc2UgKSB7IC8vIFNlcmlhbGl6ZWQgZGF0YS4KCQkJCSR0eXBlID0gJ3NlcmlhbGl6ZWQnOwoJCQkJCgkJCQkkZG91YmxlX3NlcmlhbGl6ZWQgPSBmYWxzZTsKCQkJCWlmICggaXNfc2VyaWFsaXplZCggJHVuc2VyaWFsaXplZCApICkgeyAvLyBkb3VibGUtc2VyaWFsaXplZCBkYXRhIChvcHBvc2l0ZSBvZiBhIGRvdWJsZSByYWluYm93KS4gU29tZSBwbHVnaW5zIHNlZW0gdG8gZG91YmxlLXNlcmlhbGl6ZSBmb3Igc29tZSB1bmtub3duIHdhY2t5IHJlYXNvbi4uLgoJCQkJCSR1bnNlcmlhbGl6ZWQgPSBAdW5zZXJpYWxpemUoICR1bnNlcmlhbGl6ZWQgKTsgLy8gdW5zZXJpYWxpc2UgLSBpZiBmYWxzZSBpcyByZXR1cm5lZCB3ZSB3b24ndCB0cnkgdG8gcHJvY2VzcyBpdCBhcyBzZXJpYWxpc2VkLgoJCQkJCSRkb3VibGVfc2VyaWFsaXplZCA9IHRydWU7CgkJCQl9CgkJCQkKCQkJCSRpID0gMDsKCQkJCWZvcmVhY2ggKCAkb2xkcyBhcyAkb2xkICkgewoJCQkJCSR0aGlzLT5yZWN1cnNpdmVfYXJyYXlfcmVwbGFjZSggJG9sZCwgJG5ld3NbJGldLCAkdW5zZXJpYWxpemVkICk7CgkJCQkJJGkrKzsKCQkJCX0KCQkJCQoJCQkJJGVkaXRlZF9kYXRhID0gc2VyaWFsaXplKCAkdW5zZXJpYWxpemVkICk7CgkJCQlpZiAoIHRydWUgPT09ICRkb3VibGVfc2VyaWFsaXplZCApIHsKCQkJCQkkZWRpdGVkX2RhdGEgPSBzZXJpYWxpemUoICRlZGl0ZWRfZGF0YSApOwoJCQkJfQoJCQkJCgkJCX0JZWxzZSB7IC8vIE5vbi1zZXJpYWxpemVkIGRhdGEuCgkJCQkkdHlwZSA9ICd0ZXh0JzsKCQkJCSRlZGl0ZWRfZGF0YSA9ICRkYXRhOwoJCQkJJGkgPSAwOwoJCQkJZm9yZWFjaCAoICRvbGRzIGFzICRvbGQgKSB7CgkJCQkJJGVkaXRlZF9kYXRhID1zdHJfaXJlcGxhY2UoICRvbGQsICRuZXdzWyRpXSwgJGVkaXRlZF9kYXRhICk7CgkJCQkJJGkrKzsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gUmV0dXJuIHRoZSByZXN1bHRzLgoJCQlpZiAoICRkYXRhICE9ICRlZGl0ZWRfZGF0YSApIHsKCQkJCXJldHVybiAkZWRpdGVkX2RhdGE7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IC8vIEVuZCByZXBsYWNlX21heWJlX3NlcmlhbGl6ZWQoKS4KCQkKCQkKCQkvKioKCQkgKglicnV0ZWZvcmNlX3RhYmxlKCkKCQkgKgoJCSAqCSEhISBIQU5ETEVTIFNFUklBTElaRUQgREFUQSAhISEhCgkJICoJUmVwbGFjZXMgdGV4dCwgc2VyaWFsaXplZCBvciBub3QsIHdpdGhpbiB0aGUgZW50aXJlIHRhYmxlLiBCcnV0ZWZvcmNlIG1ldGhvZCBpdGVyYXRlcyB0aHJvdWdoIGV2ZXJ5IHJvdyAmIGNvbHVtbiBpbiB0aGUgZW50aXJlIHRhYmxlIGFuZCByZXBsYWNlcyBpZiBuZWVkZWQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0YWJsZQkJVGV4dCAocG9zc2libHkgc2VyaWFsaXplZCkgdG8gdXBkYXRlLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRvbGRzCQlUZXh0IHRvIHNlYXJjaCBmb3IgdG8gcmVwbGFjZS4gTWF5IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gc2VhcmNoIGZvci4KCQkgKglAcGFyYW0JCW1peGVkCQkkbmV3cwkJTmV3IHZhbHVlKHMpIHRvIGJlIHJlcGxhY2VkIHdpdGguIE1heSBiZSBhIHN0cmluZyBvciBhcnJheS4gSWYgYXJyYXkgdGhlcmUgbXVzdCBiZSB0aGUgc2FtZSBudW1iZXIgb2YgdmFsdWVzIGFzICRvbGRzLgoJCSAqCUByZXR1cm4JCWludAkJCQkJCU51bWJlciBvZiByb3dzIGNoYW5nZWQuCgkJICoKCQkgKi8KCQlmdW5jdGlvbiBicnV0ZWZvcmNlX3RhYmxlKCAkdGFibGUsICRvbGRzLCAkbmV3cywgJHJvd3Nfc3RhcnQgPSAnJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgYnJ1dGUgZm9yY2UgZGF0YSBtaWdyYXRpb24gZm9yIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuLi4nICk7CgkJCWlmICggIWlzX2FycmF5KCAkb2xkcyApICkgewoJCQkJJG9sZHMgPSBhcnJheSggJG9sZHMgKTsKCQkJfQoJCQlpZiAoICFpc19hcnJheSggJG5ld3MgKSApIHsKCQkJCSRuZXdzID0gYXJyYXkoICRuZXdzICk7CgkJCX0KCQkJCgkJCSRjb3VudF9pdGVtc19jaGVja2VkID0gMDsKCQkJJGNvdW50X2l0ZW1zX2NoYW5nZWQgPSAwOwoJCQkKCQkJZ2xvYmFsICR3cGRiOwoJCQkKCQkJLy8gR2V0IHRoZSB0b3RhbCByb3cgY291bnQgZm9yIHRoaXMgdGFibGUKCQkJJHRvdGFsX3Jvd3MgPSAwOwoJCQkkdGFibGVzX3N0YXR1cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgVEFCTEUgU1RBVFVTIiwgQVJSQVlfQSApOwoJCQkKCQkJZm9yZWFjaCAoICR0YWJsZXNfc3RhdHVzIGFzICR0YWJsZV9zdGF0dXMgKSB7CgkJCQoJCQkJaWYgKCAkdGFibGUgPT09ICR0YWJsZV9zdGF0dXNbICdOYW1lJyBdICkgewoJCQkJCgkJCQkJLy8gRml4IHVwIHJvdyBjb3VudCBhbmQgYXZlcmFnZSByb3cgbGVuZ3RoIGZvciBJbm5vREIgZW5naW5lIHdoaWNoIHJldHVybnMgaW5hY2N1cmF0ZQoJCQkJCS8vIChhbmQgY2hhbmdpbmcpIHZhbHVlcyBmb3IgdGhlc2UKCQkJCQlpZiAoICdJbm5vREInID09PSAkdGFibGVfc3RhdHVzWyAnRW5naW5lJyBdICkgewoJCQkJCQlpZiAoIGZhbHNlICE9PSAoICRjb3VudCA9ICR3cGRiLT5nZXRfdmFyKCAiU0VMRUNUIENPVU5UKDEpIEZST00gYHskdGFibGVfc3RhdHVzWydOYW1lJ119YCIgKSApICkgewoJCQkJCQkJJHRhYmxlX3N0YXR1c1sgJ1Jvd3MnIF0gPSAkY291bnQ7CgkJCQkJCX0KCQkJCQl9CgkJCQoJCQkJCSR0b3RhbF9yb3dzID0gJHRhYmxlX3N0YXR1c1sgJ1Jvd3MnIF07CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCSRmaWVsZHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJERVNDUklCRSBgeyR0YWJsZX1gIiwgQVJSQVlfQSApOwoJCQkkY29sdW1uX25hbWUgPSBhcnJheSgpOwoJCQkkdGFibGVfaW5kZXggPSBhcnJheSgpOwoJCQkkaSA9IDA7CgkJCQoJCQkkZm91bmRfcHJpbWFyeV9rZXkgPSBmYWxzZTsKCQkJCgkJCWZvcmVhY2goICRmaWVsZHMgYXMgJGZpZWxkICkgewoJCQkJJGNvbHVtbl9uYW1lWyRpKytdID0gJGZpZWxkWydGaWVsZCddOwoJCQkJaWYgKCAkZmllbGRbJ0tleSddID09ICdQUkknICkgewoJCQkJCSR0YWJsZV9pbmRleFskaV0gPSB0cnVlOwoJCQkJCSRmb3VuZF9wcmltYXJ5X2tleSA9IHRydWU7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFNraXBzIG1pZ3JhdGlvbiBvZiB0aGlzIHRhYmxlIGlmIHRoZXJlIGlzIG5vIHByaW1hcnkga2V5LiBNb2RpZnlpbmcgb24gYW55IG90aGVyIGtleSBpcyBub3Qgc2FmZS4gbXlzcWwgYXV0b21hdGljYWxseSByZXR1cm5zIGEgUFJJTUFSWSBpZiBhIFVOSVFVRSBub24tcHJpbWFyeSBpcyBmb3VuZCBhY2NvcmRpbmcgdG8gaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjEvZW4vY3JlYXRlLXRhYmxlLmh0bWwgIEBzaW5jZSAyLjIuMzIuCgkJCWlmICggJGZvdW5kX3ByaW1hcnlfa2V5ID09PSBmYWxzZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ0Vycm9yICM5MDI5YjogV2FybmluZyBvbmx5ISBUYWJsZSBgJyAuICR0YWJsZSAuICdgIGRvZXMgbm90IGNvbnRhaW4gYSBwcmltYXJ5IGtleTsgQmFja3VwQnVkZHkgY2Fubm90IHNhZmVseSBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFibGUuIFNraXBwaW5nIG1pZ3JhdGlvbiBvZiB0aGlzIHRhYmxlLiAoYnJ1dGVmb3JjZV90YWJsZSgpKS4nICk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQkKCQkJJHJvd19sb29wID0gMDsKCgkJCSRyb3dzX3JlbWFpbiA9IHRydWU7IC8vIE1vcmUgcm93cyByZW1haW5pbmcgLyBha2EgYW5vdGhlciBxdWVyeSBmb3IgbW9yZSByb3dzIG5lZWRlZC4KCQkJaWYgKCAnJyA9PSAkcm93c19zdGFydCApIHsKCQkJCSRyb3dzX3N0YXJ0ID0gMDsKCQkJfQoKCQkJd2hpbGUgKCB0cnVlID09PSAkcm93c19yZW1haW4gKSB7IC8vIEtlZXAgbG9vcGluZyB0aHJvdWdoIHJvd3MgdW50aWwgbm9uZSByZW1haW4uIExvb3BpbmcgdGhyb3VnaCBsaWtlIHRoaXMgdG8gbGltaXQgbWVtb3J5IHVzYWdlIGFzIHdwZGIgY2xhc3NlcyBsb2FkcyBhbGwgcmVzdWx0cyBpbnRvIG1lbW9yeS4KCgkJCQkkZGF0YSA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNFTEVDVCAqIEZST00gYHskdGFibGV9YCBMSU1JVCB7JHJvd3Nfc3RhcnR9LCIgLiBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNULCBBUlJBWV9BICk7CgkJCQlpZiAoIGZhbHNlID09PSAkZGF0YSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1IgIzQ0NTQ1MzQzIC4uLiBTUUwgRVJST1I6ICcgLiAkd3BkYi0+bGFzdF9lcnJvciApOwoJCQkJfQoJCQkJCgkJCQkvLyBQcm92aWRlIGFuIHVwZGF0ZSBvbiBwcm9ncmVzcwoJCQkJJHJvd3NDb3VudCA9IGNvdW50KCAkZGF0YSApOwoJCQkJaWYgKCAwID09PSAkcm93c0NvdW50ICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RhYmxlOiBgJy4gJHRhYmxlIC4gJ2AgLSBwcm9jZXNzaW5nICcgLiAkcm93c0NvdW50IC4gJyByb3dzICggb2YgJyAuICR0b3RhbF9yb3dzIC4gJyApJyApOwkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGU6IGAnLiAkdGFibGUgLiAnYCAtIHByb2Nlc3NpbmcgJyAuICRyb3dzQ291bnQgLiAnIHJvd3MgKCBSb3dzICcgLiAkcm93c19zdGFydCAuICctJyAuICggJHJvd3Nfc3RhcnQgKyAkcm93c0NvdW50IC0gMSApIC4gJyBvZiAnIC4gJHRvdGFsX3Jvd3MgLiAnICknICk7CQoJCQkJfQoJCQkJCgkJCQkkcm93c19zdGFydCArPSBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUOyAvLyBOZXh0IGxvb3Agd2Ugd2lsbCBiZWdpbiBhdCB0aGlzIG9mZnNldC4KCQkJCWlmICggKCAwID09ICRyb3dzQ291bnQgKSB8fCAoICRyb3dzQ291bnQgPCBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUICkgKSB7CgkJCQkJJHJvd3NfcmVtYWluID0gZmFsc2U7CgkJCQl9CgkJCgkJCQlmb3JlYWNoKCAkZGF0YSBhcyAkcm93ICkgewoJCQkJCSRuZWVkX3RvX3VwZGF0ZSA9IGZhbHNlOwoJCQkJCSRVUERBVEVfU1FMID0gJ1VQREFURSBgJyAuICR0YWJsZSAuICdgIFNFVCAnOwoJCQkJCSRXSEVSRV9TUUwgPSAnIFdIRVJFICc7CgkJCQkKCQkJCQkkaiA9IDA7CgkJCQkJZm9yZWFjaCAoICRjb2x1bW5fbmFtZSBhcyAkY3VycmVudF9jb2x1bW4gKSB7CgkJCQkJCSRqKys7CgkJCQkJCSRjb3VudF9pdGVtc19jaGVja2VkKys7CgkJCQkJCgkJCQkJCSRkYXRhX3RvX2ZpeCA9ICRyb3dbJGN1cnJlbnRfY29sdW1uXTsKCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkZWRpdGVkX2RhdGEgPSAkdGhpcy0+cmVwbGFjZV9tYXliZV9zZXJpYWxpemVkKCAkZGF0YV90b19maXgsICRvbGRzLCAkbmV3cyApICkgKSB7IC8vIG5vIGNoYW5nZSBuZWVkZWQKCQkJCQkJCSRjb3VudF9pdGVtc19jaGFuZ2VkKys7CgkJCQkJCQlpZiAoICRuZWVkX3RvX3VwZGF0ZSAhPSBmYWxzZSApIHsgLy8gSWYgdGhpcyBpc24ndCBvdXIgZmlyc3QgdGltZSBoZXJlLCB3ZSBuZWVkIHRvIGFkZCBhIGNvbW1hLgoJCQkJCQkJCSRVUERBVEVfU1FMID0gJFVQREFURV9TUUwgLiAnLCc7CgkJCQkJCQl9CgkJCQkJCQkkVVBEQVRFX1NRTCA9ICRVUERBVEVfU1FMIC4gJyAnIC4gJGN1cnJlbnRfY29sdW1uIC4gJyA9ICInIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRlZGl0ZWRfZGF0YSApIC4gJyInOwoJCQkJCQkJJG5lZWRfdG9fdXBkYXRlID0gdHJ1ZTsgLy8gT25seSBzZXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgLSBhdm9pZHMgd2FzdGVkIFVQREFURSBzdGF0ZW1lbnRzLgoJCQkJCQl9CgkJCQkJCgkJCQkJCWlmICggaXNzZXQoICR0YWJsZV9pbmRleFskal0gKSApIHsKCQkJCQkJCSRXSEVSRV9TUUwgPSAkV0hFUkVfU1FMIC4gJ2AnIC4gJGN1cnJlbnRfY29sdW1uIC4gJ2AgPSAiJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcm93WyRjdXJyZW50X2NvbHVtbl0gKSAuICciIEFORCAnOwoJCQkJCQl9CgkJCQkJfQoJCQkJCgkJCQkJaWYgKCAkbmVlZF90b191cGRhdGUgKSB7CgkJCQkJCSRXSEVSRV9TUUwgPSBzdWJzdHIoICRXSEVSRV9TUUwgLCAwLCAtNCApOyAvLyBTdHJpcCBvZmYgdGhlIGV4Y2VzcyBBTkQgLSB0aGUgZWFzaWVzdCB3YXkgdG8gY29kZSB0aGlzIHdpdGhvdXQgZXh0cmEgZmxhZ3MsIGV0Yy4KCQkJCQkJJFVQREFURV9TUUwgPSAkVVBEQVRFX1NRTCAuICRXSEVSRV9TUUw7CgkJCQkJCSRyZXN1bHQgPSAkd3BkYi0+cXVlcnkoICRVUERBVEVfU1FMICk7CgkJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCQlpZiAoICEgZW1wdHkoICR3cGRiLT51c2VfbXlzcWxpICkgKSB7CgkJCQkJCQkJJG15c3FsX2Vycm9yID0gbXlzcWxpX2Vycm9yKCAkd3BkYi0+ZGJoICk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCSRteXNxbF9lcnJvciA9IG15c3FsX2Vycm9yKCAkd3BkYi0+ZGJoICk7CgkJCQkJCQl9CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1I6IG15c3FsIGVycm9yIHVwZGF0aW5nIGRiOiAnIC4gJG15c3FsX2Vycm9yIC4gJy4gU1FMIFF1ZXJ5OiAnIC4gaHRtbGVudGl0aWVzKCAkVVBEQVRFX1NRTCApICk7CgkJCQkJCX0gCgkJCQkJfQoJCQkJCQoJCQkJfQoKCQkJCXVuc2V0KCAkZGF0YSApOwoKCQkJCS8vIFNlZSBob3cgd2UgYXJlIGRvaW5nIG9uIHRpbWUuIFRyaWdnZXIgY2h1bmtpbmcgaWYgbmVlZGVkLgoJCQkJaWYgKCAoICggbWljcm90aW1lKCB0cnVlICkgLSAkdGhpcy0+c3RhcnRUaW1lICkgKyAkdGhpcy0+dGltZVdpZ2dsZVJvb20gKSA+PSAkdGhpcy0+bWF4RXhlY3V0aW9uVGltZSApIHsKCQkJCQlyZXR1cm4gYXJyYXkoICRyb3dzX3N0YXJ0ICk7CgkJCQl9CgkJCX0KCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0JydXRlIGZvcmNlIGRhdGEgbWlncmF0aW9uIGZvciB0YWJsZSBgJyAuICR0YWJsZSAuICdgIGNvbXBsZXRlLiBDaGVja2VkICcgLiAkY291bnRfaXRlbXNfY2hlY2tlZCAuICcgaXRlbXM7ICcgLiAkY291bnRfaXRlbXNfY2hhbmdlZCAuICcgY2hhbmdlZC4nICk7CgkJCQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IC8vIEVuZCBicnV0ZWZvcmNlX3RhYmxlKCkuCgkJCgkJCgkJLyoqCgkJICoJcmVjdXJzaXZlX2FycmF5X3JlcGxhY2UoKQoJCSAqCQoJCSAqCVJlY3Vyc2l2ZWx5IHJlcGxhY2UgdGV4dCBpbiBhbiBhcnJheSwgc3RlcHBpbmcgdGhyb3VnaCBhcnJheXMvb2JqZWN0cyB3aXRoaW4gYXJyYXlzL29iamVjdHMgYXMgbmVlZGVkLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkZmluZAkJVGV4dCB0byBmaW5kLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZQlUZXh0IHRvIHJlcGxhY2UgZm91bmQgdGV4dCB3aXRoLgoJCSAqCUBwYXJhbQkJcmVmZXJlbmNlCSYkZGF0YQkJUGFzcyB0aGUgdmFyaWFibGUgdG8gY2hhbmdlIHRoZSBkYXRhIHdpdGhpbi4KCQkgKglAcmV0dXJuCQlib29sZWFuCQkJCQlBbHdheXMgdHJ1ZSBjdXJyZW50bHkuCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gcmVjdXJzaXZlX2FycmF5X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJiRkYXRhICkgewoJCQlpZiAoIGlzX2FycmF5KCAkZGF0YSApICkgewoJCQkJZm9yZWFjaCAoICRkYXRhIGFzICRrZXkgPT4gJHZhbHVlICkgewoJCQkJCS8vIEFSUkFZUwoJCQkJCWlmICggaXNfYXJyYXkoICR2YWx1ZSApICkgewoJCQkJCQkkdGhpcy0+cmVjdXJzaXZlX2FycmF5X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGFbJGtleV0gKTsKCQkJCQkJCgkJCQkJLy8gU1RSSU5HUwoJCQkJCX0gZWxzZWlmICggaXNfc3RyaW5nKCAkdmFsdWUgKSApIHsKCQkJCQkJJGRhdGFbJGtleV0gPSBzdHJfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkdmFsdWUgKTsKCQkJCQkKCQkJCQkvLyBPQkpFQ1RTCgkJCQkJfSBlbHNlaWYgKCBpc19vYmplY3QoICR2YWx1ZSApICkgewoJCQkJCQkvL2Vycm9yX2xvZyggdmFyX2V4cG9ydCggJGRhdGFbJGtleV0sIHRydWUgKSApOwoJCQkJCQkkdGhpcy0+cmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhWyRrZXldICk7CgkJCQkJCS8vZXJyb3JfbG9nKCB2YXJfZXhwb3J0KCAkZGF0YVska2V5XSwgdHJ1ZSApICk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2VpZiAoIGlzX3N0cmluZyggJGRhdGEgKSApIHsKCQkJCSRkYXRhID0gc3RyX3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGEgKTsKCQkJfSBlbHNlaWYgKCBpc19vYmplY3QoICRkYXRhICkgKSB7CgkJCQkkdGhpcy0+cmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhICk7CgkJCX0KCQl9CgkJCgkJCgkJLyoqCgkJICoJcmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCkKCQkgKgkKCQkgKglSZWN1cnNpdmVseSByZXBsYWNlIHRleHQgaW4gYW4gb2JqZWN0LCBzdGVwcGluZyB0aHJvdWdoIG9iamVjdHMvYXJyYXlzIHdpdGhpbiBvYmplY3RzL2FycmF5cyBhcyBuZWVkZWQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSRmaW5kCQlUZXh0IHRvIGZpbmQuCgkJICoJQHBhcmFtCQlzdHJpbmcJCSRyZXBsYWNlCVRleHQgdG8gcmVwbGFjZSBmb3VuZCB0ZXh0IHdpdGguCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRkYXRhCQlQYXNzIHRoZSB2YXJpYWJsZSB0byBjaGFuZ2UgdGhlIGRhdGEgd2l0aGluLgoJCSAqCUByZXR1cm4JCWJvb2xlYW4JCQkJCUFsd2F5cyB0cnVlIGN1cnJlbnRseS4KCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiByZWN1cnNpdmVfb2JqZWN0X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJiRkYXRhICkgewoJCQlpZiAoIGlzX29iamVjdCggJGRhdGEgKSApIHsKCQkJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCAkZGF0YSApOwoJCQkJZm9yZWFjaCggJHZhcnMgYXMgJGtleSA9PiAkdmFyICkgewoJCQkJCS8vIEFSUkFZUwoJCQkJCWlmICggaXNfYXJyYXkoICRkYXRhLT57JGtleX0gKSApIHsKCQkJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9hcnJheV9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhLT57JGtleX0gKTsKCQkJCQkvLyBPQkpFQ1RTCgkJCQkJfSBlbHNlaWYgKCBpc19vYmplY3QoICRkYXRhLT57JGtleX0gKSApIHsKCQkJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9vYmplY3RfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YS0+eyRrZXl9ICk7CgkJCQkJLy8gU1RSSU5HUwoJCQkJCX0gZWxzZWlmICggaXNfc3RyaW5nKCAkZGF0YS0+eyRrZXl9ICkgKSB7CgkJCQkJCSRkYXRhLT57JGtleX0gPSBzdHJfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YS0+eyRrZXl9ICk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2VpZiAoIGlzX3N0cmluZyggJGRhdGEgKSApIHsKCQkJCSRkYXRhID0gc3RyX3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGEgKTsKCQkJfSBlbHNlaWYgKCBpc19hcnJheSggJGRhdGEgKSApIHsKCQkJCSR0aGlzLT5yZWN1cnNpdmVfYXJyYXlfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YSApOwoJCQl9CgkJfSAvLyBFbmQgcmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCkuCgkJCgkJCgkJLyoqCgkJICogQ2hlY2sgdmFsdWUgdG8gZmluZCBpZiBpdCB3YXMgc2VyaWFsaXplZC4KCQkgKgoJCSAqIElmICRkYXRhIGlzIG5vdCBhbiBzdHJpbmcsIHRoZW4gcmV0dXJuZWQgdmFsdWUgd2lsbCBhbHdheXMgYmUgZmFsc2UuCgkJICogU2VyaWFsaXplZCBkYXRhIGlzIGFsd2F5cyBhIHN0cmluZy4KCQkgKgoJCSAqIENvdXJ0ZXN5IFdvcmRQcmVzczsgc2luY2UgV29yZFByZXNzIDIuMC41LgoJCSAqCgkJICogQHBhcmFtIG1peGVkICRkYXRhIFZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiB3YXMgc2VyaWFsaXplZC4KCQkgKiBAcmV0dXJuIGJvb2wgRmFsc2UgaWYgbm90IHNlcmlhbGl6ZWQgYW5kIHRydWUgaWYgaXQgd2FzLgoJCSAqLwoJCWZ1bmN0aW9uIGlzX3NlcmlhbGl6ZWQoICRkYXRhICkgewoJCQkvLyBpZiBpdCBpc24ndCBhIHN0cmluZywgaXQgaXNuJ3Qgc2VyaWFsaXplZAoJCQlpZiAoICEgaXNfc3RyaW5nKCAkZGF0YSApICkKCQkJCXJldHVybiBmYWxzZTsKCQkJJGRhdGEgPSB0cmltKCAkZGF0YSApOwoJCSAJaWYgKCAnTjsnID09ICRkYXRhICkKCQkJCXJldHVybiB0cnVlOwoJCQkkbGVuZ3RoID0gc3RybGVuKCAkZGF0YSApOwoJCQlpZiAoICRsZW5ndGggPCA0ICkKCQkJCXJldHVybiBmYWxzZTsKCQkJaWYgKCAnOicgIT09ICRkYXRhWzFdICkKCQkJCXJldHVybiBmYWxzZTsKCQkJJGxhc3RjID0gJGRhdGFbJGxlbmd0aC0xXTsKCQkJaWYgKCAnOycgIT09ICRsYXN0YyAmJiAnfScgIT09ICRsYXN0YyApCgkJCQlyZXR1cm4gZmFsc2U7CgkJCSR0b2tlbiA9ICRkYXRhWzBdOwoJCQlzd2l0Y2ggKCAkdG9rZW4gKSB7CgkJCQljYXNlICdzJyA6CgkJCQkJaWYgKCAnIicgIT09ICRkYXRhWyRsZW5ndGgtMl0gKQoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQljYXNlICdhJyA6CgkJCQljYXNlICdPJyA6CgkJCQkJcmV0dXJuIChib29sKSBwcmVnX21hdGNoKCAiL157JHRva2VufTpbMC05XSs6L3MiLCAkZGF0YSApOwoJCQkJY2FzZSAnYicgOgoJCQkJY2FzZSAnaScgOgoJCQkJY2FzZSAnZCcgOgoJCQkJCXJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCggIi9eeyR0b2tlbn06WzAtOS5FLV0rO1wkLyIsICRkYXRhICk7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkKCQkvKioKCQkgKglyZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoKQoJCSAqCQoJCSAqCVJlbW92ZXMgaWRlbnRpY2FsIGVsZW1lbnRzIChzYW1lIGluZGV4IGFuZCB2YWx1ZSkgZnJvbSBib3RoIGFycmF5cyB3aGVyZSB0aGV5IG1hdGNoLgoJCSAqCgkJICoJRXg6CgkJICoJCS8vIEJlZm9yZToKCQkgKgkJJGEgPSBhcnJheSggJ2FwcGxlJywgJ2JhbmFuYScsICdjYXJyb3QnICk7CgkJICoJCSRiID0gYXJyYXkoICdhcHBsZScsICdiZWVmJywgJ2N1Y3VtYmVyJyApOwoJCSAqCQlyZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoICRhLCAkYiApOwoJCSAqCQkvLyBBZnRlcjoKCQkgKgkJJGEgPSBhcnJheSggJ2JhbmFuYScsICdjYXJyb3QnICk7CgkJICoJCSRiID0gYXJyYXkoICdiZWVmJywgJ2N1Y3VtYmVyJyApOwoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJCSYkYQkJRmlyc3QgYXJyYXkgdG8gY29tcGFyZSB3aXRoIHNlY29uZC4gKHJlZmVyZW5jZSkKCQkgKglAcGFyYW0JCWFycmF5CQkmJGIJCVNlY29uZCBhcnJheSB0byBjb21wYXJlIHdpdGggZmlyc3QuIChyZWZlcmVuY2UpCgkJICoJQHJldHVybgkJbnVsbAkJCQlBcnJheXMgcGFzc2VkIGFyZSB1cGRhdGVkIGFzIHRoZXkgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCgkJICoKCQkgKi8KCQlmdW5jdGlvbiByZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoICYkYSwgJiRiICkgewoJCQkkc2l6ZW9mID0gc2l6ZW9mKCAkYSApOwoJCQlmb3IoICRpPTA7ICRpIDwgJHNpemVvZjsgJGkrKyApIHsKCQkJCWlmICggJGFbJGldID09ICRiWyRpXSApIHsKCQkJCQl1bnNldCggJGFbJGldICk7CgkJCQkJdW5zZXQoICRiWyRpXSApOwoJCQkJfQoJCQl9CgkJCQoJCQkkYSA9IGFycmF5X21lcmdlKCAkYSApOyAvLyBSZXNldCBudW1iZXJpbmcgb2Yga2V5cy4KCQkJJGIgPSBhcnJheV9tZXJnZSggJGIgKTsgLy8gUmVzZXQgbnVtYmVyaW5nIG9mIGtleXMuCgkJfQoJCQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfZGJyZXBsYWNlIGNsYXNzLgp9Cj8+Cg== ###PACKDATA,FILE_END,/lib/dbreplace/dbreplace.php,importbuddy/lib/dbreplace/dbreplace.php ###PACKDATA,FILE_START,/lib/dbreplace/history.txt,importbuddy/lib/dbreplace/history.txt MS4wLjAgLSAyMDExLTA4LTE4IC0gRHVzdGluIEJvbHRvbgoJQ3JlYXRlZCBkYnJlcGxhY2UgY2xhc3Mu ###PACKDATA,FILE_END,/lib/dbreplace/history.txt,importbuddy/lib/dbreplace/history.txt ###PACKDATA,FILE_START,/lib/dbreplace/index.htm,importbuddy/lib/dbreplace/index.htm PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/lib/dbreplace/index.htm,importbuddy/lib/dbreplace/index.htm ###PACKDATA,FILE_START,/lib/dbreplace/index.php,importbuddy/lib/dbreplace/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/lib/dbreplace/index.php,importbuddy/lib/dbreplace/index.php ###PACKDATA,FILE_START,/lib/commandbuddy/commandbuddy.php,importbuddy/lib/commandbuddy/commandbuddy.php PD9waHAKLy8gVE9ETzogRXZlbnR1YWxseSBwdWxsIG91dCBhbGwgY29tbWFuZCBsaW5lIGV4ZWN1dGlvbiB0byBydW4gdGhyb3VnaCB0aGlzIGxpYnJhcnkuCi8vCQlDdXJyZW50bHkgY29kZSBpcyBkdWNwbGljYXRlZCBiZXR3ZWVuIHRoZSBsaWJyYXJpZXMgdGhhdCBydW4gY29tbWFuZCBsaW5lIGNvbW1hbmRzLgoKY2xhc3MgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5IHsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJfQoJCgkvKglleGVjdXRlKCkKCSAqCQoJICoJRXhlY3V0ZSBhIGNvbW1hbmQgdmlhIHRoZSBjb21tYW5kIGxpbmUuCgkgKglFeGFtcGxlIHVzYWdlOgoJICoJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+ZXhlY3V0ZSggJ0NPTU1BTkRISEVSRScgKTsKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRjb21tYW5kCQlDb21tYW5kIGxpbmUgdG8gcnVuLgoJICoJQHJldHVybgkJYXJyYXkJCQkJCQlBc3NvY2lhdGl2ZSBhcnJheSBvZiB0aGUgcmVzcG9uc2Ugb3V0cHV0IGFuZCBleGlzdCBjb2RlLiBVc2Ugd2l0aCBsaXN0IHRvIGFzc2lnbiB2YXJpYWJsZXMuCgkgKgkJCQkJCQkJCQkJRm9ybWF0OiBhcnJheSggRVhFQ19PVVRQVVQsIEVYSVRfQ09ERSApOwoJICovCglwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSggJGNvbW1hbmQgKSB7CgkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsKCQkJLy8gV2luZG93czsgZG8gbm90aGluZy4KCQl9IGVsc2UgeyAvLyBMaW51eC9NYWMKCQkJaWYgKCAoIGluaV9nZXQoICdleGVjX2RpcicgKSAhPT0gZmFsc2UgKSAmJiAoIGluaV9nZXQoICdleGVjX2RpcicgKSAhPSAnJyApICkgeyAvLyBleGVjX2RpciBQSFAgcGF0Y2ggaW4gcGxhY2U6IGh0dHA6Ly93d3cua3liZXJkaWdpLmN6L3Byb2plY3RzL2V4ZWNkaXIvCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdleGVjX2RpciBkZXRlY3RlZC4gU2tpcHBpbmcgcGF0aCBhc3NpZ25tZW50LicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ2V4ZWNfZGlyIG5vdCBkZXRlY3RlZC4gUHJvY2VlZGluZyBub3JtYWxseS4nICk7CgkJCQkkY29tbWFuZCA9ICdQQVRIPSRQQVRIOi91c3IvYmluLzovdXNyL2xvY2FsL2Jpbi86dXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4vOi91c3Ivc2Jpbi86L3NiaW4vOi91c3IvOi9iaW4vJyAuICc7ICcgLiAkY29tbWFuZDsKCQkJfQoJCX0KCQkKCQkvLyBPdXRwdXQgY29tbWFuZCAoc3RyaXBzIG15c3FsZHVtcCBwYXNzd29yZHMpLgoJCWlmICggc3Ryc3RyKCAkY29tbWFuZCwgJy0tcGFzc3dvcmQ9JyApICkgewoJCQkkcGFzc3dvcmRfcG9ydGlvbl9iZWdpbiA9IHN0cnBvcyggJGNvbW1hbmQsICctLXBhc3N3b3JkPScgKTsKCQkJJHBhc3N3b3JkX3BvcnRpb25fZW5kID0gc3RycG9zKCAkY29tbWFuZCwgJyAnLCAkcGFzc3dvcmRfcG9ydGlvbl9iZWdpbiApOwoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3Bhc3Mgc3RhcnQ6IGAnIC4gJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4gLiAnYC4gcGFzcyBlbmQ6IGAnIC4gJHBhc3N3b3JkX3BvcnRpb25fZW5kIC4gJ2AnICk7CgkJCSRwYXNzd29yZF9wb3J0aW9uID0gc3Vic3RyKCAkY29tbWFuZCwgJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4sICggJHBhc3N3b3JkX3BvcnRpb25fZW5kIC0gJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4gKSApOwoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3Bhc3MgcG9ydGlvbjogYCcgLiAkcGFzc3dvcmRfcG9ydGlvbiAuICdgLicgKTsKCQkJJHVucGFzc3dvcmRlZF9jb21tYW5kID0gc3RyX3JlcGxhY2UoICRwYXNzd29yZF9wb3J0aW9uLCAnLS1wYXNzd29yZD0qSElEREVOKicsICRjb21tYW5kICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ2V4ZWMoKSBjb21tYW5kIChwYXNzd29yZCBoaWRkZW4pIGAnIC4gJHVucGFzc3dvcmRlZF9jb21tYW5kIC4gJ2AgKHdpdGggcGF0aCBkZWZpbml0aW9uKS4nICk7CgkJCXVuc2V0KCAkdW5wYXNzd29yZGVkX2NvbW1hbmQgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdleGVjKCkgY29tbWFuZCBgJyAuICRjb21tYW5kIC4gJ2AgKHdpdGggcGF0aCBkZWZpbml0aW9uKS4nICk7CgkJfQoJCQoJCSRleGVjX291dHB1dCA9IGFycmF5KCk7CgkJQGV4ZWMoICRjb21tYW5kLCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnZXhlYygpIGNvbW1hbmQgb3V0cHV0OiBgJyAuIGltcGxvZGUoICcsJywgJGV4ZWNfb3V0cHV0ICkgLiAnYDsgRXhpdCBjb2RlOiBgJyAuICRleGVjX2V4aXRfY29kZSAuICdgOyBFeGl0IGNvZGUgZGVzY3JpcHRpb246IGAnIC4gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT5leGl0X2NvZGVfbG9va3VwKCAkZXhlY19leGl0X2NvZGUgKSAuICdgJyApOwoJCQoJCXJldHVybiBhcnJheSggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKTsKCX0gLy8gRW5kIGV4ZWN1dGUoKS4KfQ== ###PACKDATA,FILE_END,/lib/commandbuddy/commandbuddy.php,importbuddy/lib/commandbuddy/commandbuddy.php ###PACKDATA,FILE_START,/lib/commandbuddy/index.php,importbuddy/lib/commandbuddy/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/lib/commandbuddy/index.php,importbuddy/lib/commandbuddy/index.php ###PACKDATA,FILE_START,/lib/zipbuddy/history.txt,importbuddy/lib/zipbuddy/history.txt Mi4wLjAgLSAyMDExLTEwLTA4IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgaGlzdG9yeS50eHQuCglBZGRlZCB1bnppcCBmdW5jdGlvbmFsaXR5Lg== ###PACKDATA,FILE_END,/lib/zipbuddy/history.txt,importbuddy/lib/zipbuddy/history.txt ###PACKDATA,FILE_START,/lib/zipbuddy/index.php,importbuddy/lib/zipbuddy/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/lib/zipbuddy/index.php,importbuddy/lib/zipbuddy/index.php ###PACKDATA,FILE_START,/lib/zipbuddy/legacy.zipbuddy.php,importbuddy/lib/zipbuddy/legacy.zipbuddy.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IENsYXNzCiAqCiAqCUhhbmRsZXMgemlwcGluZyBhbmQgdW56aXBwaW5nLCB1c2luZyB0aGUgYmVzdCBtZXRob2RzIGF2YWlsYWJsZSBhbmQgZmFsbGluZyBiYWNrIHRvIHdvcnNlIG1ldGhvZHMKICoJYXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5LiBBbGxvd3MgZm9yIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2Rlcy4KICoJCiAqCUBzaW5jZSAzLjAuMAogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICoKICoJJHRlbXBfZGlyCQlzdHJpbmcJCVRlbXBvcmFyeSBkaXJlY3RvcnkgYWJzb2x1dGUgcGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGUgc3RvcmFnZS4gTXVzdCBiZSB3cml0YWJsZSEKICoJJHppcF9tZXRob2RzCWFycmF5CQlPcHRpb25hbC4gQXJyYXkgb2YgYXZhaWxhYmxlIHppcCBtZXRob2RzIHRvIHVzZS4gVXNlZnVsIGZvciBub3QgaGF2aW5nIHRvIHJlLXRlc3QgZXZlcnkgdGltZS4KICoJCQkJCQkJCUlmIG9taXR0ZWQgdGhlbiBhIHRlc3Qgd2lsbCBiZSBwZXJmb3JtZWQgdG8gZmluZCB0aGUgbWV0aG9kcyB0aGF0IHdvcmsgb24gdGhpcyBob3N0LgogKgkkbW9kZQkJCXN0cmluZwkJRnV0dXJlIHVzZSB0byBhbGxvdyBmb3Igb3RoZXIgY29tcHJlc3Npb24gbWV0aG9kcyBvdGhlciB0aGFuIHppcC4gQ3VycmVudGx5IG5vdCBpbiB1c2UuCiAqCiAqLwoKCgovLyBUcnkgYW5kIGxvYWQgdGhlIGV4cGVyaW1lbnRhbCB2ZXJzaW9uIC0gaWYgc3VjY2Vzc2Z1bCB0aGVuIGNsYXNzIHdpbGwgZXhpc3QgYW5kIHJlbWFpbmluZyBjb2RlIHdpbGwgYmUgaWdub3JlZAppZiAoCgkJKCBkZWZpbmVkKCAnVVNFX0VYUEVSSU1FTlRBTF9aSVBCVUREWScgKSAmJiAoIHRydWUgPT09IFVTRV9FWFBFUklNRU5UQUxfWklQQlVERFkgKSApCgkJfHwKCQkoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcCddICkgJiYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhbHRlcm5hdGl2ZV96aXAnXSApICkKCSkgewoJCXJlcXVpcmVfb25jZSggZGlybmFtZSggX19GSUxFX18gKSAuICcveC16aXBidWRkeS5waHAnICk7Cn0KCgoKaWYgKCAhY2xhc3NfZXhpc3RzKCAicGx1Z2luYnVkZHlfemlwYnVkZHkiICkgKSB7CgljbGFzcyBwbHVnaW5idWRkeV96aXBidWRkeSB7CgkJCgkJCgkJLyoqKioqKioqKiogUHJvcGVydGllcyAqKioqKioqKioqLwoJCQoJCQoJCWNvbnN0IFpJUF9NRVRIT0RTX1RSQU5TSUVOVCA9ICdwYl9iYWNrdXBidWRkeV9hdmFpbF96aXBfbWV0aG9kc19jbGFzc2ljJzsKCQljb25zdCBaSVBfRVhFQ1BBVEhfVFJBTlNJRU5UID0gJ3BiX2JhY2t1cGJ1ZGR5X2V4ZWNfcGF0aF9jbGFzc2ljJzsKCQljb25zdCBaSVBfVFJBTlNJRU5UX0xJRkUgPSA2MDsKCQljb25zdCBOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgPSAnLyc7CgkJY29uc3QgRElSRUNUT1JZX1NFUEFSQVRPUlMgPSAnL1xcJzsKCQkKCQlwcml2YXRlICRfY29tbWFuZGJ1ZGR5OwoJCXB1YmxpYyAkX3ppcF9tZXRob2RzOwkJLy8gQXJyYXkgb2YgYXZhaWxhYmxlIHppcCBtZXRob2RzLgoJCQoJCQoJCS8qKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKi8KCQkKCQkKCQlmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHRlbXBfZGlyLCAkemlwX21ldGhvZHMgPSBhcnJheSgpLCAkbW9kZSA9ICd6aXAnICkgewoJCQkvLyR0aGlzLT5fc3RhdHVzID0gYXJyYXkoKTsKCQkJJHRoaXMtPl90ZW1wZGlyID0gJHRlbXBfZGlyOwoJCQkkdGhpcy0+X2V4ZWNwYXRoID0gJyc7CgkJCQoJCQkvLyBIYW5kbGVzIGNvbW1hbmQgbGluZSBleGVjdXRpb24uCgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jb21tYW5kYnVkZHkvY29tbWFuZGJ1ZGR5LnBocCcgKTsKCQkJJHRoaXMtPl9jb21tYW5kYnVkZHkgPSBuZXcgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5KCk7CgkJCQoJCQlpZiAoICFlbXB0eSggJHppcF9tZXRob2RzICkgJiYgKCBjb3VudCggJHppcF9tZXRob2RzICkgPiAwICkgKSB7CgkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHppcF9tZXRob2RzOwoJCQl9IGVsc2UgewoJCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdnZXRfdHJhbnNpZW50JyApICkgeyAvLyBJbnNpZGUgV29yZFByZXNzCgkJCQkJCgkJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FibGVfemlwbWV0aG9kX2NhY2hpbmcnXSA9PSAnMScgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcCBtZXRob2QgY2FjaGluZyBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nICk7CgkJCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGZhbHNlOwoJCQkJCQkkZXhlY19wYXRoID0gZmFsc2U7CgkJCQkJfSBlbHNlIHsgLy8gVXNlIGNhY2hpbmcuCgkJCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGdldF90cmFuc2llbnQoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCApOwoJCQkJCQkkZXhlY19wYXRoID0gZ2V0X3RyYW5zaWVudCggc2VsZjo6WklQX0VYRUNQQVRIX1RSQU5TSUVOVCApOwoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoICggJGF2YWlsYWJsZV9tZXRob2RzID09PSBmYWxzZSApIHx8ICggJGV4ZWNfcGF0aCA9PT0gZmFsc2UgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwIG1ldGhvZHMgb3IgZXhlYyBwYXRoIHdlcmUgbm90IGNhY2hlZDsgZGV0ZWN0aW5nLi4uJyApOwoJCQkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV96aXBfbWV0aG9kcyggZmFsc2UsICRtb2RlICk7CgkJCQkJCXNldF90cmFuc2llbnQoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCwgJHRoaXMtPl96aXBfbWV0aG9kcywgc2VsZjo6WklQX1RSQU5TSUVOVF9MSUZFICk7CgkJCQkJCXNldF90cmFuc2llbnQoIHNlbGY6OlpJUF9FWEVDUEFUSF9UUkFOU0lFTlQsICR0aGlzLT5fZXhlY3BhdGgsIHNlbGY6OlpJUF9UUkFOU0lFTlRfTElGRSApOyAvLyBDYWxjdWxhdGVkIGFuZCBzZXQgaW4gYXZhaWxhYmxlX3ppcF9tZXRob2RzKCkuCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhY2hpbmcgemlwYnVkZHkgY2xhc3NpYyBtZXRob2RzICYgZXhlYyBwYXRoIGZvciBgJyAuIHNlbGY6OlpJUF9UUkFOU0lFTlRfTElGRSAuICdgIHNlY29uZHMuJyApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VzaW5nIGNhY2hlZCB6aXBidWRkeSBjbGFzc2ljIG1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkYXZhaWxhYmxlX21ldGhvZHMgKSAuICdgLicgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgY2FjaGVkIHppcGJ1ZGR5IGNsYXNzaWMgZXhlYyBwYXRoOiBgJyAuICRleGVjX3BhdGggLiAnYC4nICk7CgkJCQkJCSR0aGlzLT5femlwX21ldGhvZHMgPSAkYXZhaWxhYmxlX21ldGhvZHM7CgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gT3V0c2lkZSBXb3JkUHJlc3MKCQkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV96aXBfbWV0aG9kcyggZmFsc2UsICRtb2RlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwYnVkZHkgY2xhc3NpYyBtZXRob2RzIG5vdCBjYWNoZWQgZHVlIHRvIGJlaW5nIG91dHNpZGUgV29yZFByZXNzLicgKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQkvLyBGdW5jdGlvbiB0byB0cmFuc2xhdGUgYSBaaXBBcmNoaXZlIGVycm9yIGNvZGUgaW50byBhbiBpbmZvcm1hdGl2ZSBzdHJpbmcgZGVzY3JpcHRpb24KCQlmdW5jdGlvbiB6aXBhcmNoaXZlX2Vycm9yX2luZm8oICRlcnJvciwgJGZ1bGwgPSB0cnVlICkgewoJCQoJCQkvLyBGb3Igc2FmZXR5IGxldCdzIGNoZWNrIHRoYXQgdGhlIGNsYXNzIGFjdHVhbGx5IGV4aXN0cy4uLgoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnLCBmYWxzZSApICkgewoJCQkKCQkJCS8vIFdlIGNhbiBjaGVjayB0aGUgc3ltYm9saWMgdmFsdWVzCgkJCQlzd2l0Y2goIChpbnQpICRlcnJvciApIHsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX09LOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUlJfT0siOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm8gZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX09QRU46CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX09QRU4iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2FuJ3Qgb3BlbiBmaWxlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9NRU1PUlk6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX01FTU9SWSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9FWElTVFM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9FWElTVFMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRmlsZSBhbHJlYWR5IGV4aXN0cyI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfSU5DT05TOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTkNPTlMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiWmlwIGFyY2hpdmUgaW5jb25zaXN0ZW50IjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9JTlZBTDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfSU5WQUwiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiSW52YWxpZCBhcmd1bWVudCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTk9FTlQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX05PRU5UIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk5vIHN1Y2ggZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTk9aSVA6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX05PWklQIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk5vdCBhIHppcCBhcmNoaXZlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRUFEOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRUFEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlJlYWQgZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1NFRUs6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1NFRUsiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiU2VlayBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTVVMVElESVNLOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9NVUxUSURJU0siOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfUkVOQU1FOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRU5BTUUiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUmVuYW1pbmcgdGVtcG9yYXJ5IGZpbGUgZmFpbGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DTE9TRToKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ0xPU0UiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2xvc2luZyB6aXAgYXJjaGl2ZSBmYWlsZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1dSSVRFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9XUklURSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJXcml0ZSBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfQ1JDOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DUkMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ1JDIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9aSVBDTE9TRUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1pJUENMT1NFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDb250YWluaW5nIHppcCBhcmNoaXZlIHdhcyBjbG9zZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1RNUE9QRU46CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1RNUE9QRU4iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1pMSUI6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1pMSUIiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiWmxpYiBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfQ0hBTkdFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ0hBTkdFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DT01QTk9UU1VQUDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ09NUE5PVFNVUFAiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ29tcHJlc3Npb24gbWV0aG9kIG5vdCBzdXBwb3J0ZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0VPRjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfRU9GIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlByZW1hdHVyZSBFT0YiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0lOVEVSTkFMOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTlRFUk5BTCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJJbnRlcm5hbCBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfUkVNT1ZFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRU1PVkUiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2FuJ3QgcmVtb3ZlIGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0RFTEVURUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0RFTEVURUQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRW50cnkgaGFzIGJlZW4gZGVsZXRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGRlZmF1bHQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9VTktOT1dOIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlVua21vd24gZXJyb3IiOwoJCQkJfQoJCQkJCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGVycm9yX25hbWUgLiAiKCIgLiAkZXJyb3IgLiAiKSA6ICIgLiAkZXJyb3JfZGVzY3JpcHRpb247CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIElmIHRoZSBaaXBBcmNoaXZlIGNsYXNzIGRvZXNuJ3QgZXhpc3RzIGp1c3QgcmV0dXJuIGEgZ2VuZXJpYwoJCQkJJGVycm9yX3N0cmluZyA9ICJaSVBBUkNISVZFOjpFUl9VTktOT1dOKCIgLiAkZXJyb3IgLiAiKSA6IFVua25vd24gZXJyb3IiOwoJCQkKCQkJfQoJCQkKCQkJLy8gT25lIHdheSBvciBhbm90aGVyIHdlIGhhdmUgYSBzdHJpbmcgdG8gcmV0dXJuCgkJCXJldHVybiAkZXJyb3Jfc3RyaW5nOwoJCQoJCX0KCQkKCQkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBaSVAuCgkJLy8gSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkvLyBOb3RlOiBsZWF2ZV9vcGVuIGZ1bmN0aW9uYWxpdHkgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZAoJCWZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZSAtIGlmIG5vdCB3ZSdsbCBqdXN0IGRyb3AgdGhyb3VnaAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UpICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIE5vdyB0cnkgYW5kIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaWxlCgkJCQkJCSRpbmRleCA9ICR6YS0+bG9jYXRlTmFtZSggJGxvY2F0ZV9maWxlICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhlIGFyY2hpdmUgKGxlYXZlX29wZW4gaWdub3JlZCBmb3Igbm93KQoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQkvLyBJZiB3ZSBnb3QgYW4gaW5kZXggd2UgZm91bmQgaXQgb3RoZXJ3aXNlIG5vdCBmb3VuZAoJCQkJCQlpZiAoICRpbmRleCAhPT0gZmFsc2UgKSB7CgkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBmb3VuZCAoemlwYXJjaGl2ZSknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAoemlwYXJjaGl2ZSknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkdGhpcy0+emlwYXJjaGl2ZV9lcnJvcl9pbmZvKCAkcmVzdWx0ICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0cyAobG9va2luZyBmb3IgJTEkcyBpbiAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlICwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgdG8gb3BlbiBmaWxlCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSApICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFBjbFppcCggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCBpdCBoYXMgY29udGVudAoJCQkJCWlmICggKCAkY29udGVudF9saXN0ID0gJHphLT5saXN0Q29udGVudCgpICkgIT09IDAgKSB7CgkJCQkJCgkJCQkJCS8vIEdldCBlYWNoIGZpbGUgaW4gc2VxdWVuY2UgYnkgaW5kZXggYW5kIGdldCB0aGUgcHJvcGVydGllcwoJCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgc2l6ZW9mKCAkY29udGVudF9saXN0ICk7ICRpKysgKSB7CgkJCQkJCQoJCQkJCQkJJHN0YXQgPSAkY29udGVudF9saXN0WyAkaSBdOwoJCQkJCQkJCgkJCQkJCQkvLyBBc3N1bWUgdGhlIGtleSBleGlzdHMgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQlpZiAoICRzdGF0WyAnZmlsZW5hbWUnIF0gPT0gJGxvY2F0ZV9maWxlICkgewoJCQkJCQkJCgkJCQkJCQkJLy8gRmlsZSBmb3VuZCBzbyB3ZSBjYW4ganVzdCByZXR1cm4KCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBPbmx5IGdldCBoZXJlIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAocGNsemlwKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0cyAobG9va2luZyBmb3IgJTEkcyBpbiAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlICwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gY2hlY2sgYmFja3VwIGNvbnRlbnQgd2FzIGF2YWlsYWJsZSBvciB3b3JrZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlLCAkemlwX2ZpbGUgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCQkKCQkKCQkKCQkvKglzZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHNldCBjb21tZW50IG9uLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJGNvbW1lbnQJCUNvbW1lbnQgdG8gYXBwbHkgdG8gYXJjaGl2ZS4KCQkgKglAcmV0dXJuCQlib29sZWFuL3N0cmluZwkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KCQkgKi8KCQlmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy9Vc2UgWmlwQXJjaGl2ZSBpZiBhdmFpbGFibGUKCQkJaWYgKCBpbl9hcnJheSggJ3ppcGFyY2hpdmUnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBkb3VibHkgc3VyZSBpdCBpcyBhdmFpbGFibGUKCQkJCWlmICggY2xhc3NfZXhpc3RzKCAnWmlwQXJjaGl2ZScsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJCS8vIFNldCB0aGUgY29tbWVudCAtIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoJCQkJCQkJJHJlc3VsdCA9ICR6YS0+c2V0QXJjaGl2ZUNvbW1lbnQoICRjb21tZW50ICk7CgkJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQkKCQkJCQkJCS8vIElmIHdlIGdvdCBiYWNrIHRydWUgdGhlbiBhbGwgaXMgd2VsbCB3aXRoIHRoZSB3b3JsZAoJCQkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJCQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQoJCQkJCQkJCS8vIElmIHdlIGZhaWxlZCB0byBzZXQgdGhlIGNvbW1uZW50IHRoZW4gbG9nIGl0ICg/KSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCQkJCQl9CgkJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHRoaXMtPnppcGFyY2hpdmVfZXJyb3JfaW5mbyggJHJlc3VsdCApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCQoJCQkJCX0KCQkJCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIHdlIGFkZGVkIHRoZSBjb21tZW50IG9rCgkJCQkJLy8gTm90ZTogdXNpbmcgZW1wdHkgYXJyYXkgYXMgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBhZGQgYW55IGZpbGVzCgkJCQkJaWYgKCAoICRsaXN0ID0gJHphLT5hZGQoIGFycmF5KCksIFBDTFpJUF9PUFRfQ09NTUVOVCwgJGNvbW1lbnQgKSApICE9PSAwICkgewoJCQkJCQoJCQkJCQkvLyBXZSBnb3QgYSBsaXN0IGJhY2sgc28gYWRkaW5nIGNvbW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBzdWNjZXNzZnVsCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgY29tbW5lbnQgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBXZSBjb3VsZG4ndCBzZXQgYSBjb21tZW50IGF0IGFsbCAtIGVpdGhlciBubyBhdmFpbGFibGUgbWV0aG9kIG9yIGFsbCBtZXRob2RzIGZhaWxlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQgb3IgYWxsIG1ldGhvZHMgZmFpbGVkIC0gbm90ZSBzdG9yZWQgaW50ZXJuYWxseSBvbmx5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkvLyBSZXR1cm4gbWVzc2FnZSBmb3IgZGlzcGxheSAtIG1heWJlIHNob3VsZCByZXR1cm4gZmFsc2UgYW5kIGhhdmUgY2FsbGVyIGRpc3BsYXkgaXQncyBvd24gbWVzc2FnZT8KCQkJJG1lc3NhZ2UgPSAiXG5cblVuYWJsZSB0byBzZXQgbm90ZSBpbiBmaWxlLlxuVGhlIG5vdGUgd2lsbCBvbmx5IGJlIHN0b3JlZCBpbnRlcm5hbGx5IGluIHlvdXIgc2V0dGluZ3MgYW5kIG5vdCBpbiB0aGUgemlwIGZpbGUgaXRzZWxmLiI7CgkJCXJldHVybiAkbWVzc2FnZTsKCQkJCgkJfSAvLyBFbmQgc2V0X2NvbW1lbnQoKS4KCQkKCQkKCQkKCQkvKglnZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJCVppcCBjb21tZW50LgoJCSAqLwoJCWZ1bmN0aW9uIGdldF9jb21tZW50KCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZQoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UgKSApIHsKCQkJCQoJCQkJCSR6YSA9IG5ldyBaaXBBcmNoaXZlKCk7CgkJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJLy8gR2V0IHRoZSBjb21tZW50IG9yIGZhbHNlIG9uIGZhaWx1cmUgZm9yIHNvbWUgcmVhc29uCgkJCQkJCSRjb21tZW50ID0gJHphLT5nZXRBcmNoaXZlQ29tbWVudCgpOwoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQkvLyBJZiB3ZSBoYXZlIGEgY29tbWVudCAoZXZlbiBpZiBlbXB0eSkgdGhlbiByZXR1cm4gaXQKCQkJCQkJaWYgKCAkY29tbWVudCAhPT0gZmFsc2UgKSB7CgkJCQkJCQoJCQkJCQkJLy8gTm90ZTogbmV3IGFyY2hpdmVzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGNvbW1lbnQgaWYgb25lIHdhcyBub3QgYWRkZWQgYXQgY3JlYXRpb24KCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCQkJCQkvLyBGb3JtYXQgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciBlbmNvZGluZyBhcyBodG1sZW10aXRpZXMgd2hlbiBzZXR0aW5nIGNvbW1lbnQKCQkJCQkJCS8vIEZvciBvbGRlciBiYWNrdXBzIG1heSBuZWVkIHRvIHJlbW92ZSBlbmNvZGluZyAtIGFjdGlvbiBfc2hvdWxkXyBiZSBudWxsIGlmIE4vQQoJCQkJCQkJLy8gT25seSBzcGFubmVyIHdvdWxkIGJlIGlmIHNvbWVvbmUgaGFkIHB1dCBhbiBlbnRpdHkgaW4gdGhlaXIgY29tbWVudCBidXQgdGhhdCBpcwoJCQkJCQkJLy8gcmVhbGx5IGFuIG91dHNpZGVyIGFuZCBpbiBhbnkgY2FzZSB0aGUgY29ycmVjdGlvbiBpcyBzaW1wbHkgdG8gZWRpdCBhbmQgcmVzYXZlCgkJCQkJCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIG5ldyBmb3JtYXQgaGFzIGJlZW4gaW4gdXNlIGZvciBzb21lIHRpbWUKCQkJCQkJCSRjb21tZW50ID0gaHRtbF9lbnRpdHlfZGVjb2RlKCAkY29tbWVudCApOwkJCQkKCgkJCQkJCQlyZXR1cm4gJGNvbW1lbnQ7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHRoaXMtPnppcGFyY2hpdmVfZXJyb3JfaW5mbyggJHJlc3VsdCApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBwcm9wZXJ0aWVzCgkJCQkJaWYgKCAoICRwcm9wZXJ0aWVzID0gJHphLT5wcm9wZXJ0aWVzKCkgKSAhPT0gMCApIHsKCQkJCQkKCQkJCQkJLy8gV2UgZ290IHByb3BlcnRpZXMgc28gc2hvdWxkIGhhdmUgYSBjb21tZW50IHRvIHJldHVybiwgZXZlbiBpZiBlbXB0eQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkJJGNvbW1lbnQgPSAkcHJvcGVydGllc1sgJ2NvbW1lbnQnIF07CgoJCQkJCQkvLyBGb3JtYXQgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciBlbmNvZGluZyBhcyBodG1sZW10aXRpZXMgd2hlbiBzZXR0aW5nIGNvbW1lbnQKCQkJCQkJLy8gRm9yIG9sZGVyIGJhY2t1cHMgbWF5IG5lZWQgdG8gcmVtb3ZlIGVuY29kaW5nIC0gYWN0aW9uIF9zaG91bGRfIGJlIG51bGwgaWYgTi9BCgkJCQkJCS8vIE9ubHkgc3Bhbm5lciB3b3VsZCBiZSBpZiBzb21lb25lIGhhZCBwdXQgYW4gZW50aXR5IGluIHRoZWlyIGNvbW1lbnQgYnV0IHRoYXQgaXMKCQkJCQkJLy8gcmVhbGx5IGFuIG91dHNpZGVyIGFuZCBpbiBhbnkgY2FzZSB0aGUgY29ycmVjdGlvbiBpcyBzaW1wbHkgdG8gZWRpdCBhbmQgcmVzYXZlCgkJCQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gbmV3IGZvcm1hdCBoYXMgYmVlbiBpbiB1c2UgZm9yIHNvbWUgdGltZQoJCQkJCQkkY29tbWVudCA9IGh0bWxfZW50aXR5X2RlY29kZSggJGNvbW1lbnQgKTsKCQkJCQkKCQkJCQkJcmV0dXJuICRjb21tZW50OwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIGZhaWxlZCB0byByZXRyaWV2ZSBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgY2xhc3MgUGNsWmlwIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gV2UgY291bGRuJ3QgZ2V0IGEgY29tbWVudCBhdCBhbGwgLSBlaXRoZXIgbm8gYXZhaWxhYmxlIG1ldGhvZCBvciBhbGwgbWV0aG9kcyBmYWlsZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVW5hYmxlIHRvIGdldCBjb21tZW50OiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0gLy8gRW5kIGdldF9jb21tZW50KCkuCgkJCgkJCgkJCgkJLy8gRk9SIEZVVFVSRSBVU0U7IE5PVCBZRVQgSU1QTEVNRU5URUQuIFVzZSB0byBjaGVjayAuc3FsIGZpbGUgaXMgbm9uLWVtcHR5LgoJCWZ1bmN0aW9uIGZpbGVfc3RhdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCSR0aGlzLT5femlwID0gbmV3IFppcEFyY2hpdmU7CgkJCQlpZiAoICR0aGlzLT5femlwLT5vcGVuKCAkemlwX2ZpbGUgKSA9PT0gdHJ1ZSApIHsKCQkJCQlpZiAoICggJHN0YXRzID0gJHRoaXMtPl96aXAtPnN0YXROYW1lKCAkbG9jYXRlX2ZpbGUgKSApID09PSBmYWxzZSApIHsgLy8gRmlsZSBub3QgZm91bmQgaW4gemlwLgoJCQkJCQkkdGhpcy0+X3ppcC0+Y2xvc2UoKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBub3QgZm91bmQgKHppcGFyY2hpdmUpIGZvciBzdGF0cycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJHRoaXMtPl96aXAtPmNsb3NlKCk7CgkJCQkJcmV0dXJuICRzdGF0czsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGNoZWNrIHN0YXRzIChsb29raW5nIGluICUxJHMpLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyIHRoZW4gemlwYXJjaGl2ZSBub3QgYXZhaWxhYmxlL2ZhaWxlZC4KCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCXJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJJHRoaXMtPl96aXAgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCWlmICggKCAkZmlsZV9saXN0ID0gJHRoaXMtPl96aXAtPmxpc3RDb250ZW50KCkgKSA9PSAwICkgeyAvLyBJZiB6ZXJvLCB6aXAgaXMgY29ycnVwdCBvciBlbXB0eS4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICR0aGlzLT5femlwLT5lcnJvckluZm8oIHRydWUgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlmb3JlYWNoKCAkZmlsZV9saXN0IGFzICRmaWxlICkgewoJCQkJCQlpZiAoICRmaWxlWydmaWxlbmFtZSddID09ICRsb2NhdGVfZmlsZSApIHsgLy8gRm91bmQgZmlsZS4KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdVbmFibGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHM6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJCgkJCgkJCgkJLyoJZ2V0X3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgdGhlIHppcCBtZXRob2RzLiBVc2VmdWwgZm9yIHRyYW5zaWVudCBjYWNoaW5nIGZvciBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQkJQXJyYXkgb2YgbWV0aG9kcy4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X3ppcF9tZXRob2RzKCkgewoJCQkkdGhpcy0+X3ppcF9tZXRob2RzOwoJCX0gLy8gRW5kIGdldF96aXBfbWV0aG9kcygpOwoJCQoJCQoJCQoJCS8qKgoJCSAqCWFkZF9kaXJlY3RvcnlfdG9femlwKCkKCQkgKgoJCSAqCUFkZHMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgb3IgZXhpc3RpbmcgKFRPRE86IG5vdCB5ZXQgYXZhaWxhYmxlKSBaSVAgZmlsZS4KCQkgKgoJCSAqCSR6aXBfZmlsZQkJCQkJc3RyaW5nCQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gY3JlYXRlLgoJCSAqCSRhZGRfZGlyZWN0b3J5CQkJCXN0cmluZwkJCQkJCUZ1bGwgZGlyZWN0b3J5IHRvIGFkZCB0byB6aXAgZmlsZS4KCQkgKgkkY29tcHJlc3Npb24JCQkJYm9vbGVhbgkJCQkJCVRydWUgdG8gZW5hYmxlIFpJUCBjb21wcmVzc2lvbiwKCQkgKgkJCQkJCQkJCQkJCQkJCShpZiBwb3NzaWJsZSB3aXRoIGF2YWlsYWJsZSB6aXAgbWV0aG9kcykKCQkgKgkkZXhjbHVkZXMJCQkJCWFycmF5KHN0cmluZ3MpCQkJCUFycmF5IG9mIHN0cmluZ3Mgb2YgcGF0aHMvZmlsZXMgdG8gZXhjbHVkZSBmcm9tIHppcHBpbmcsCgkJICoJCQkJCQkJCQkJCQkJCQkoaWYgcG9zc2libGUgd2l0aCBhdmFpbGFibGUgemlwIG1ldGhvZHMpLgoJCSAqCSR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeQlzdHJpbmcJCQkJCQlPcHRpb25hbC4gRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBkaXJlY3RvcnkgdG8gdGVtcG9yYXJpbHkgcGxhY2UgWklQCgkJICoJCQkJCQkJCQkJCQkJCQlmaWxlIHdoaWxlIGNyZWF0aW5nLiBVc2VzIHNhbWUgZGlyZWN0b3J5IGlmIG9taXR0ZWQuCgkJICoJJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZQlib29sZWFuCQkJCQkJVHJ1ZTogb25seSB1c2UgUENMWmlwLiBGYWxzZTogdHJ5IGV4ZWMgZmlyc3QgaWYgYXZhaWxhYmxlLAoJCSAqCQkJCQkJCQkJCQkJCQkJYW5kIGZhbGxiYWNrIHRvIGxlc3NlciBtZXRob2RzIGFzIHJlcXVpcmVkLgoJCSAqCgkJICoJQHJldHVybgkJCQkJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJZnVuY3Rpb24gYWRkX2RpcmVjdG9yeV90b196aXAoICR6aXBfZmlsZSwgJGFkZF9kaXJlY3RvcnksICRjb21wcmVzc2lvbiwgJGV4Y2x1ZGVzID0gYXJyYXkoKSwgJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ID0gJycsICRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUgPSBmYWxzZSApIHsKCQkJaWYgKCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID09PSB0cnVlICkgewoJCQkJJHppcF9tZXRob2RzID0gYXJyYXkoICdwY2x6aXAnICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSBtb2RlIChQQ0xaaXApIGJhc2VkIG9uIHNldHRpbmdzLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCX0gZWxzZSB7CgkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgYWxsIGF2YWlsYWJsZSB6aXAgbWV0aG9kcyBpbiBwcmVmZXJyZWQgb3JkZXIuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9CgkJCQoJCQkkYXBwZW5kID0gZmFsc2U7IC8vIFBvc3NpYmxlIGZ1dHVyZSBvcHRpb24gdG8gYWxsb3cgYXBwZW5kaW5nIGlmIGZpbGUgZXhpc3RzLgoJCQkKCQkJLy8gTm9ybWFsaXplICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSB0byBmb3JtYXQ6IC94eHgveXl5L3p6ei8uCgkJCSR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSA9IHJ0cmltKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnksICcvXFwnICkgLiAnLyc7CgkJCQoJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQlpZiAoICFmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7IC8vIENyZWF0ZSB0ZW1wIGRpciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KCQkJCQlta2RpciggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggaXNfYXJyYXkoICRleGNsdWRlcyApICkgewoJCQkJJGV4Y2x1ZGVzX3RleHQgPSBpbXBsb2RlKCAnLCcsICRleGNsdWRlcyApOwoJCQl9IGVsc2UgewoJCQkJJGV4Y2x1ZGVzX3RleHQgPSAnKGluIGZpbGU6IGAnIC4gJGV4Y2x1ZGVzIC4gJ2ApJzsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdDcmVhdGluZyBaSVAgZmlsZScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJHppcF9maWxlIC4gJ2AuICcgLiBfXygnQWRkaW5nIGRpcmVjdG9yeScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJGFkZF9kaXJlY3RvcnkgLiAnYC4gJyAuIF9fKCdDb21wcmVzc2lvbicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbXByZXNzaW9uIC4gJzsgJyAuIF9fKCdFeGNsdWRlcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGV4Y2x1ZGVzX3RleHQgKTsKCQkJdW5zZXQoICRleGNsdWRlc190ZXh0ICk7CgkJCQoJCQlpZiAoIGluX2FycmF5KCAnZXhlYycsICR6aXBfbWV0aG9kcyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgZXhlYygpIG1ldGhvZCBmb3IgWklQLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJJGNvbW1hbmQgPSAnemlwIC1xIC1yJzsKCQkJCQoJCQkJaWYgKCAkY29tcHJlc3Npb24gIT09IHRydWUgKSB7CgkJCQkJJGNvbW1hbmQgLj0gJyAtMCc7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQl9CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSApIHsKCQkJCQlpZiAoICRhcHBlbmQgPT09IHRydWUgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1pJUCBmaWxlIGV4aXN0cy4gQXBwZW5kaW5nIGJhc2VkIG9uIG9wdGlvbnMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkY29tbWFuZCAuPSAnIC1nJzsKCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaSVAgZmlsZSBleGlzdHMuIERlbGV0aW5nICYgd3JpdGluZyBiYXNlZCBvbiBvcHRpb25zLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJdW5saW5rKCAkemlwX2ZpbGUgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCS8vJGNvbW1hbmQgLj0gIiAtciI7CgkJCQkKCQkJCS8vIFNldCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHN0b3JlIFpJUCB3aGlsZSBpdCdzIGJlaW5nIGdlbmVyYXRlZC4KCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkkY29tbWFuZCAuPSAiIC1iICd7JHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5fSciOwoJCQkJfQoJCQkJCgkJCQkkY29tbWFuZCAuPSAiICd7JHppcF9maWxlfScgLiI7CgkJCQkvLyAtaSAnKiciOyAvLyBOb3QgbmVlZGVkLiBaaXAgZGVmYXVsdHMgdG8gZG9pbmcgdGhpcy4gUmVtb3ZlZCBKdWx5IDEwLCAyMDEyIGZvciB2My4wLjQxLgoJCQkJCgkJCQkJCQkJCgkJCQkvLyBIYW5kbGUgZXhjbHVzaW9ucyBieSBwbGFjaW5nIHRoZW0gaW4gYW4gZXhjbHVzaW9uIHRleHQgZmlsZS4KCQkJCSRleGNsdXNpb25fZmlsZSA9ICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSAuICdleGNsdXNpb25zLnR4dCc7CgkJCQkkdGhpcy0+X3JlbmRlcl9leGNsdXNpb25zX2ZpbGUoICRleGNsdXNpb25fZmlsZSwgJGV4Y2x1ZGVzLCAkYWRkX2RpcmVjdG9yeSApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgZXhjbHVzaW9uIGZpbGUgYCcgLiAkZXhjbHVzaW9uX2ZpbGUgLiAnYC4nICk7CgkJCQkkY29tbWFuZCAuPSAnIC14QCcgLiAiJ3skZXhjbHVzaW9uX2ZpbGV9JyI7CgkJCQkKCQkJCQoJCQkJJGNvbW1hbmQgLj0gJyAyPiYxJzsgLy8gIDI+JjEgcmVkaXJlY3RzIFNUREVSUiB0byBTVERPVVQKCQkJCQoJCQkJJHdvcmtpbmdfZGlyID0gZ2V0Y3dkKCk7CgkJCQljaGRpciggJGFkZF9kaXJlY3RvcnkgKTsgLy8gQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgcGF0aCB3ZSBhcmUgYWRkaW5nLgoJCQkJCgkJCQlpZiAoICR0aGlzLT5fZXhlY3BhdGggIT0gJycgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGN1c3RvbSBleGVjKCkgcGF0aDogJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+X2V4ZWNwYXRoICk7CgkJCQl9CgkJCQkKCQkJCS8vIFJ1biBaSVAgY29tbWFuZC4KCQkJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd6aXAuZXhlJyApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdBdHRlbXB0aW5nIHRvIHVzZSBwcm92aWRlZCBXaW5kb3dzIHppcC5leGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkY29tbWFuZCA9IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICRjb21tYW5kICk7IC8vIFdpbmRvd3Mgd2FudHMgZG91YmxlIHF1b3RlcwoJCQkJCQkkY29tbWFuZCA9IEFCU1BBVEggLiAkY29tbWFuZDsKCQkJCQl9CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyBjb21tYW5kIChXaW5kb3dzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbW1hbmQgKTsKCQkJCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICR0aGlzLT5fZXhlY3BhdGggLiAkY29tbWFuZCApOwoJCQkJfSBlbHNlIHsgLy8gQWxsb3cgZXhlYyB3YXJuaW5ncyBub3QgaW4gV2luZG93cwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4ZWMgY29tbWFuZCAoTGludXgpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkY29tbWFuZCApOwoJCQkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJHRoaXMtPl9leGVjcGF0aCAuICRjb21tYW5kICk7CgkJCQl9CgkJCQkKCQkJCQoJCQkJLy8gQ2xlYW51cCBleGNsdXNpb25zIGZpbGUgaWYgaXQgZXhpc3RzLgoJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gJ2V4Y2x1c2lvbnMudHh0JyApICkgewoJCQkJCUB1bmxpbmsoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSAuICdleGNsdXNpb25zLnR4dCcgKTsKCQkJCX0KCQkJCQoJCQkJCgkJCQlzbGVlcCggMSApOwoJCQkJCgkJCQkvLyBXZSBtYXkgbm90IGhhdmUgYSB6aXAgZmlsZSBvciB3ZSBtYXkgaGF2ZSBvbmUgYnV0IHRoZXJlIHdhcyBlcnJvci93YXJuaW5nIHdoZW4gcHJvZHVjaW5nIGl0CgkJCQkvLyBOb3RlOiBJbiBldmVudCBvZiB3YXJuaW5ncyB3ZSBjb3VsZCBzdGlsbCBnZXQgYSB6aXAgZmlsZSBpZiB0aGUgc2NyaXB0IHRlcm1pbmF0ZXMgd2hpbHN0IHppcCBjb21tYW5kIHN0aWxsIHJ1bm5pbmcKCQkJCQoJCQkJaWYgKCAoICEgZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgfHwgKCAkZXhlY19leGl0X2NvZGUgIT0gMCApICkgewoJCQkJCQoJCQkJCS8vIExvZyB0aGUgZmFpbHVyZQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdGdWxsIHNwZWVkIG1vZGUgZGlkIG5vdCBjb21wbGV0ZS4gVHJ5aW5nIGNvbXBhdGliaWxpdHkgbW9kZSBuZXh0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBDaGVjayB3aGV0aGVyIGEgemlwIGZpbGUgd2FzIGFjdHVhbGx5IHByb2R1Y2VkIGluIHRoZSBiYWNrdXBzIGRpcmVjdG9yeSAoYXMgb3Bwb3NlZCB0byB0aGUgdGVtcCB6aXAgZGlyZWN0b3J5KQoJCQkJCWlmICggISBmaWxlX2V4aXN0cyggJHppcF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGVjIGNvbW1hbmQgcmFuIGJ1dCBaSVAgZmlsZSBkaWQgbm90IGV4aXN0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFdlIGRpZCBnZXQgYSB6aXAgZmlsZSBidXQgY2Fubm90IHRydWVzdCBpdCBzbyBtdXN0IGRlbGV0ZSBpdAoJCQkJCWlmICggZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnQ2xlYW5pbmcgdXAgZGFtYWdlZCBaSVAgZmlsZS4gSXNzdWUgIzM0ODkzMjg5OTguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl1bmxpbmsoICR6aXBfZmlsZSApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gTmVlZCB0byBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IHppcCBkaXJlY3RvcnkKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0NsZWFuaW5nIHVwIGluY29tcGxldGUgdGVtcG9yYXJ5IFpJUCBmaWxlLiBJc3N1ZSAjMzQzODk0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJaWYgKCAhKCAkdGhpcy0+ZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgKSB7CgkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VuYWJsZSB0byBkZWxldGUgdGVtcG9yYXJ5IHppcCBkaXJlY3RvcnknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBXZSBnb3QgYSB6aXAgZmlsZSBhbmQgbm8gZXJyb3JzL3dhcm5pbmdzIHNvIGdvb2QgdG8gZ28KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCAnRnVsbCBzcGVlZCBtb2RlIGNvbXBsZXRlZCAmIGdlbmVyYXRlZCBaSVAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJaWYgKCAhKCAkdGhpcy0+ZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVbmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSB6aXAgZGlyZWN0b3J5JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJY2hkaXIoICR3b3JraW5nX2RpciApOwoJCQkJCgkJCQl1bnNldCggJGNvbW1hbmQgKTsKCQkJCXVuc2V0KCAkZXhjbHVkZSApOwoJCQkJdW5zZXQoICRleGNsdWRpbmdfYWRkaXRpb25hbCApOwoJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIGNvbW1hbmQgZGlkIG5vdCBzdWNjZWVkLiBGYWxsaW5nIGJhY2suJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCX0KCQkJCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkemlwX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1VzaW5nIENvbXBhdGliaWxpdHkgTW9kZSBmb3IgWklQLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdJZiB5b3VyIGJhY2t1cCB0aW1lcyBvdXQgaW4gY29tcGF0aWJpbGl0eSBtb2RlIHRyeSBkaXNhYmxlZCB6aXAgY29tcHJlc3Npb24uJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnV0FSTklORzogRGlyZWN0b3J5L2ZpbGUgZXhjbHVzaW9uIHVuYXZhaWxhYmxlIGluIENvbXBhdGliaWxpdHkgTW9kZS4gRXZlbiBleGlzdGluZyBvbGQgYmFja3VwcyB3aWxsIGJlIGJhY2tlZCB1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCXJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgemlwIGZpbGUgbmFtZSAvIHBhdGguCgkJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJJHBjbHppcF9maWxlID0gJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gYmFzZW5hbWUoICR6aXBfZmlsZSApOwoJCQkJfSBlbHNlIHsKCQkJCQkkcGNsemlwX2ZpbGUgPSAkemlwX2ZpbGU7CgkJCQl9CgkJCQkKCQkJCWlmICggIWZpbGVfZXhpc3RzKCBkaXJuYW1lKCAkcGNsemlwX2ZpbGUgKSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NyZWF0aW5nIFBDTFppcCBmaWxlIGRpcmVjdG9yeSBgJyAuIGRpcm5hbWUoICRwY2x6aXBfZmlsZSApIC4gJ2AuJyApOwoJCQkJCW1rZGlyKCBkaXJuYW1lKCAkcGNsemlwX2ZpbGUgKSApOwoJCQkJfQoJCQkJCgkJCQkvLyBJbnN0YW50aWF0ZSBQY2xaaXAgT2JqZWN0LgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUGNsWmlwIHppcCBmaWxlbmFtZTogYCcgLiAkcGNsemlwX2ZpbGUgLiAnYC4nICk7CgkJCQkkcGNsemlwID0gbmV3IFBjbFppcCggJHBjbHppcF9maWxlICk7CgkJCQkKCQkJCWlmICggJGNvbXByZXNzaW9uICE9PSB0cnVlICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BDTFppcCBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJJGFyZ3VtZW50cyA9IGFycmF5KCAkYWRkX2RpcmVjdG9yeSwgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiwgUENMWklQX09QVF9SRU1PVkVfUEFUSCwgJGFkZF9kaXJlY3RvcnkgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUENMWmlwIGNvbXByZXNzaW9uIGVuYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRhcmd1bWVudHMgPSBhcnJheSggJGFkZF9kaXJlY3RvcnksIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEgsICRhZGRfZGlyZWN0b3J5ICk7CgkJCQl9CgkJCQkKCQkJCSRtb2RlID0gJ2NyZWF0ZSc7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSAmJiAoICRhcHBlbmQgPT09IHRydWUgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaSVAgZmlsZSBleGlzdHMuIEFwcGVuZGluZyBiYXNlZCBvbiBvcHRpb25zLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkbW9kZSA9ICdhcHBlbmQnOwoJCQkJfQoJCQkJCgkJCQlpZiAoICRtb2RlID09ICdhcHBlbmQnICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0FwcGVuZGluZyB0byBaSVAgZmlsZSB2aWEgUENMWmlwLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkcmV0dmFsID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAmJHBjbHppcCwgJ2FkZCcgKSwgJGFyZ3VtZW50cyApOwoJCQkJfSBlbHNlIHsgLy8gY3JlYXRlCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0NyZWF0aW5nIFpJUCBmaWxlIHZpYSBQQ0xaaXAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzonIC4gaW1wbG9kZSggJzsnLCAkYXJndW1lbnRzICkgKTsKCQkJCQkvL2Vycm9yX2xvZyggJ3BjbHppcCBhcmdzOiAnIC4gcHJpbnRfciggJGFyZ3VtZW50cywgdHJ1ZSApIC4gIlxuIiApOwoJCQkJCSRyZXR2YWwgPSBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICYkcGNsemlwLCAnY3JlYXRlJyApLCAkYXJndW1lbnRzICk7CgkJCQl9CgkJCQkKCQkJCS8vIE1vdmUgdGhlIHppcCBmaWxlIGlmIHdlIHdlcmUgY3JlYXRpbmcgaXQgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5CgkJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gYmFzZW5hbWUoICR6aXBfZmlsZSApICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1JlbmFtaW5nIFBDTFppcCBGaWxlLi4uJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlyZW5hbWUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSAuIGJhc2VuYW1lKCAkemlwX2ZpbGUgKSwgJHppcF9maWxlICk7CgkJCQkJCWlmICggZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVuYW1pbmcgUENMWmlwIHN1Y2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVuYW1pbmcgUENMWmlwIGZhaWx1cmUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGVtcG9yYXJ5IFBDTFppcCBhcmNoaXZlIGZpbGUgZXhwZWN0ZWQgYnV0IG5vdCBmb3VuZC4gUGxlYXNlIHZlcmlmeSBwZXJtaXNzaW9ucyBvbiB0aGUgWklQIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCS8vIFdvcmsgb3V0IHdoZXRoZXIgd2UgaGF2ZSBhIHByb2JsZW0gb3Igbm90CgkJCQlpZiAoIGlzX2FycmF5KCAkcmV0dmFsICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIGFuIGFycmF5IHNvIGEgZ29vZCByZXN1bHQKCQkJCQkkZXhpdGNvZGUgPSAwOwoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gTm90IGFuIGFycmF5IHNvIGEgYmFkIGVycm9yIGNvZGUKCQkJCQkkZXhpdGNvZGUgPSAkcGNsemlwLT5lcnJvckNvZGUoKTsKCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBDb252ZW5pZW5jZSBmb3IgaGFuZGxpbmcgZGlmZmVyZW50IHNjYW5hcmlvcwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCQkvLyBTZWUgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCBoYXBwZW5lZCAtIG5vdGUgdGhhdCAkZXhpdGNvZGUgY291bGQgYmUgbm9uLXplcm8gZm9yIGEgd2FybmluZyBvciBlcnJvcgoJCQkJLy8gVGhlcmUgbWF5IGJlIG5vIHppcCBmaWxlIGF0IGFsbCBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGNyZWF0aW5nIGl0IG9yIGl0IG1heSBiZSBsZWZ0IGluIHRoZSB0ZW1wCgkJCQkvLyBkaXJlY3RvcnkgaWYgaXQgY291bGRuJ3QgYmUgbW92ZWQKCQkJCWlmICggKCAhIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSApIHx8ICggJGV4aXRjb2RlICE9IDAgKSApIHsKCQkJCQoJCQkJCS8vIElmIHdlIGhhZCBhIG5vbi16ZXJvIGV4aXQgY29kZSB0aGVuIHNob3VsZCByZXBvcnQgaXQgKGZpbGUgbWF5IG9yIG1heSBub3QgYmUgY3JlYXRlZCkKCQkJCQlpZiAoICRleGl0Y29kZSAhPSAwICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQkJCQkJCgkJCQkJfQoJCgkJCQkJLy8gUmVwb3J0IHdoZXRoZXIgb3Igbm90IHRoZSB6aXAgZmlsZSB3YXMgY3JlYXRlZAkJCQkKCQkJCQlpZiAoICEgZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBub3QgY3JlYXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIGNyZWF0ZWQgYnV0IHdpbGwgYmUgcmVtb3ZlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQoJCQkJCQlAdW5saW5rKCAkemlwX2ZpbGUgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFB1dCB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaW50byBhbiBhcnJheSBmb3IgY29uc2lzdGVuY3kKCQkJCQkkemlwX291dHB1dFtdID0gJHBjbHppcC0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJCgkJCQkJLy8gTm93IHdlIGRvbid0IG1vdmUgaXQgKGJlY2F1c2UgZWl0aGVyIGl0IGRvZXNuJ3QgZXhpc3Qgb3IgbWF5IGJlIGluY29tcGxldGUpIGJ1dCB3ZSdsbCBzaG93IGFueSBlcnJvci93YXJ0bmluZyBvdXRwdXQKCQkJCQlpZiAoICFlbXB0eSggJHppcF9vdXRwdXQgKSApIHsKCQkJCQkKCQkJCQkJLy8gQXNzdW1lIHdlIGRvbid0IGhhdmUgYSBsb3Qgb2YgbGluZXMgZm9yIG5vdyAtIGNvdWxkIGJlIHJpc2t5IGFzc3VtcHRpb24hCgkJCQkJCWZvcmVhY2ggKCAkemlwX291dHB1dCBhcyAkbGluZSApIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCQkvLyBFeHRyYSBkZXRhaWxzIGZvciBwYXJ0aWN1bGFyIGVycm9yCgkJCQkJCWlmICggZmFsc2UgIT09IHN0cnBvcyggJHBjbHppcC0+ZXJyb3JJbmZvKCB0cnVlICksICdQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMJyApICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1BDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwgZGV0YWlsczogVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCBmb3BlbiBmYWlsZWQgKHJldHVybmVkIGZhbHNlKSB3aGVuIHRyeWluZyB0byBvcGVuIHRoZSBmaWxlIGluIHRoZSBtb2RlIHNwZWNpZmllZC4gVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGR1ZSB0byBwZXJtaXNzaW9ucy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gT25lIHdheSBvciBhbm90aGVyIHdlIGZhaWxlZAoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBHb3QgZmlsZSB3aXRoIG5vIGVycm9yIG9yIHdhcm5pbmdzIGF0IGFsbCBzbyBpdCBzaG91bGQgYmUgZ29vZCB0byBnbwoJCQkJCQoJCQkJCWlmICggZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgb3Igd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIEFyY2hpdmUgZmlsZSBjb3VsZCBub3QgYmUgbW92ZWQgdG8gbG9jYWwgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkJCQkJCgkJCQl9CQkJCgkKCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQoJCQkJCS8vIENsZWFudXAgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3aWxsIGhhdmUgYWxsIGRldHJpdHVzIGFuZCBtYXliZSBpbmNvbXBsZXRlIHppcCBmaWxlCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJaWYgKCAhKCAkdGhpcy0+ZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgKSB7CgkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCWlmICggJHJlc3VsdCApIHJldHVybiAkcmVzdWx0OwoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIG1hZGUgaXQgdGhpcyBmYXIgdGhlbiBzb21ldGhpbmcgZGlkbnQgcmVzdWx0IGluIGEgc3VjY2Vzcy4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkKCQkKCQkvKioKCQkgKgl1bnppcCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJJHppcF9maWxlCQkJCQlzdHJpbmcJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGNyZWF0ZS4KCQkgKgkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlzdHJpbmcJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCSRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUJbWl4ZWQJCWZhbHNlIChkZWZhdWx0KTogdXNlIGJlc3QgbWV0aG9kcyBhdmFpbGFibGUgKHppcCBleGVjIGZpcnN0KSwgZmFsbGluZyBiYWNrIGFzIG5lZWRlZC4KCQkgKgkJCQkJCQkJCQkJemlwYXJjaGl2ZTogZmlyc3QgZmFsbGJhY2sgbWV0aG9kLiAoTWVkaXVtIHBlcmZvcm1hbmNlKQoJCSAqCQkJCQkJCQkJCQlwY2x6aXA6IHNlY29uZCBmYWxsYmFjayBtZXRob2QuIChXb3JzdCBwZXJmb3JtYW5jZTsgYnVnZ3kpCgkJICoKCQkgKglAcmV0dXJuYGAJCQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJZnVuY3Rpb24gdW56aXAoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9IGZhbHNlICkgewoJCQkKCQkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9IHJ0cmltKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAnXFwvJyApIC4gJy8nOyAvLyBNYWtlIHN1cmUgdHJhaWxpbmcgc2xhc2ggZXhpc3RzIHRvIG5vcm1hbGl6ZS4KCQkJCgkJCWlmICggJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9PSAnemlwYXJjaGl2ZScgKSB7CgkJCQkkemlwX21ldGhvZHMgPSBhcnJheSggJ3ppcGFyY2hpdmUnICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSBtb2RlIChaaXBBcmNoaXZlOyBtZWRpdW0gc3BlZWQpIGJhc2VkIG9uIHNldHRpbmdzLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCX0gZWxzZWlmICggJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9PSAncGNsemlwJyApIHsKCQkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCAncGNsemlwJyApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnRm9yY2VkIGNvbXBhdGliaWxpdHkgbW9kZSAoUENMWmlwOyBzbG93IHNwZWVkKSBiYXNlZCBvbiBzZXR0aW5ncy4gVGhpcyBpcyBzbG93ZXIgYW5kIGxlc3MgcmVsaWFibGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9IGVsc2UgewoJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1VzaW5nIGFsbCBhdmFpbGFibGUgemlwIG1ldGhvZHMgaW4gcHJlZmVycmVkIG9yZGVyLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJfQoJCQkKCQkJaWYgKCBpbl9hcnJheSggJ2V4ZWMnLCAkemlwX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdTdGFydGluZyBoaWdoc3BlZWQgZXh0cmFjdGlvbiAoZXhlYykuLi4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLicgKTsKCQkJCQoJCQkJJGNvbW1hbmQgPSAndW56aXAgLXFvJzsgLy8gcSA9IHF1aWV0LCBvID0gb3ZlcndyaXRlIHdpdGhvdXQgcHJvbXB0LgoJCQkJJGNvbW1hbmQgLj0gIiAnJHppcF9maWxlJyAtZCAnJGRlc3RpbmF0aW9uX2RpcmVjdG9yeScgLXggJ2ltcG9ydGJ1ZGR5LnBocCciOyAvLyB4IGV4Y2x1ZGVzIGltcG9ydGJ1ZGR5IHNjcmlwdCB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG5ld2VyIGltcG9ydGJ1ZGR5IG9uIGV4dHJhY3Qgc3RlcC4KCQkJCgkJCQkvLyBIYW5kbGUgd2luZG93cy4KCQkJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd1bnppcC5leGUnICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdBdHRlbXB0aW5nIHRvIHVzZSBXaW5kb3dzIHVuemlwLmV4ZS4nICk7CgkJCQkJCSRjb21tYW5kID0gc3RyX3JlcGxhY2UoICdcJycsICciJywgJGNvbW1hbmQgKTsgLy8gV2luZG93cyB3YW50cyBkb3VibGUgcXVvdGVzCgkJCQkJCSRjb21tYW5kID0gQUJTUEFUSCAuICRjb21tYW5kOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJJGNvbW1hbmQgLj0gJyAgMj4mMSc7IC8vIFJlZGlyZWN0IFNUREVSUiB0byBTVERPVVQuCgkJCQkKCQkJCWlmICggJHRoaXMtPl9leGVjcGF0aCAhPSAnJyApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVXNpbmcgY3VzdG9tIGV4ZWMoKSBwYXRoOiAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5fZXhlY3BhdGggKTsKCQkJCX0KCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUnVubmluZyBaSVAgY29tbWFuZC4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4nICk7CgkJCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICR0aGlzLT5fZXhlY3BhdGggLiAkY29tbWFuZCApOwoJCQkJCgkJCQkkZmFpbGVkID0gZmFsc2U7IC8vIERlZmF1bHQuCgkJCQkKCQkJCWlmICggIWZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gJ3dwLWxvZ2luLnBocCcgKSAmJiAhZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiAnZGJfMS5zcWwnICkgJiYgIWZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gJ3dvcmRwcmVzcy93cC1sb2dpbi5waHAnICkgKSB7IC8vIHdwLWxvZ2luLnBocCBmb3IgV29yZFByZXNzLCBkYl8xLnNxbCBmb3IgREIgYmFja3VwLCB3b3JkcHJlc3Mvd3AtbG9naW4ucGhwIGZvciBmcmVzaCBXb3JkUHJlc3MgZG93bmxvYWRlZCBmcm9tIHdwLm9yZyBmb3IgTVMgZXhwb3J0CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0JvdGggd3AtbG9naW4ucGhwIChmdWxsIGJhY2t1cHMpIGFuZCBkYl8xLnNxbCAoZGF0YWJhc2Ugb25seSBiYWNrdXBzKSBhcmUgbWlzc2luZyBhZnRlciBleHRyYWN0aW9uLiBVbnppcCBwcm9jZXNzIGFwcGVhcnMgdG8gaGF2ZSBmYWlsZWQuJyApOwoJCQkJCSRmYWlsZWQgPSB0cnVlOwoJCQkJfQoJCQkJCgkJCQlpZiAoICRleGVjX2V4aXRfY29kZSAhPSAnMCcgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgICdFeGl0IGNvZGUgYCcgLiAkZXhlY19leGl0X2NvZGUgLiAnYCBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdhcyBlbmNvdW50ZXJlZC4nICk7CgkJCQkJJGZhaWxlZCA9IHRydWU7CgkJCQl9CgkJCQkKCQkJCS8vIFNvbWV0aW1lcyBleGVjIHJldHVybnMgc3VjY2VzcyBjb2RlcyBidXQgbmV2ZXIgZXh0cmFjdGVkIGFjdHVhbCBmaWxlcy4gRG8gYSBjaGVjayB0byBtYWtlIHN1cmUga25vd24gZmlsZXMgd2VyZSBleHRyYWN0ZWQgdG8gdmVyaWZ5IGFnYWluc3QgdGhhdC4KCQkJCWlmICggJGZhaWxlZCA9PT0gZmFsc2UgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRmlsZSBleHRyYWN0aW9uIGNvbXBsZXRlLicgKTsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAgJ0ZhbGxpbmcgYmFjayB0byBuZXh0IGNvbXBhdGliaWxpdHkgbW9kZS4nICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggaW5fYXJyYXkoICd6aXBhcmNoaXZlJywgJHppcF9tZXRob2RzICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICAnU3RhcnRpbmcgbWVkaXVtIHNwZWVkIGV4dHJhY3Rpb24gKHppcGFyY2hpdmUpLi4uIFRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4nICk7CgkJCQkKCQkJCSR6aXAgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCWlmICggJHppcC0+b3BlbiggJHppcF9maWxlICkgPT09IHRydWUgKSB7CgkJCQkJaWYgKCB0cnVlID09PSAkemlwLT5leHRyYWN0VG8oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgJ1ppcEFyY2hpdmUgZXh0cmFjdGlvbiBzdWNjZXNzLicgKTsKCQkJCQkJJHppcC0+Y2xvc2UoKTsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHppcC0+Y2xvc2UoKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAgJ0Vycm9yOiBaaXBBcmNoaXZlIHdhcyBhdmFpbGFibGUgYnV0IGZhaWxlZCBleHRyYWN0aW5nIGZpbGVzLiAgRmFsbGluZyBiYWNrIHRvIG5leHQgY29tcGF0aWJpbGl0eSBtb2RlLicgKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgICdFcnJvcjogVW5hYmxlIHRvIG9wZW4gemlwIGZpbGUgdmlhIFppcEFyY2hpdmUuIEZhbGxpbmcgYmFjayB0byBuZXh0IGNvbXBhdGliaWxpdHkgbW9kZS4nICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkemlwX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdTdGFydGluZyBsb3cgc3BlZWQgZXh0cmFjdGlvbiAocGNsemlwKS4uLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50Li4uJyApOwoJCQkJCgkJCQlpZiAoICFjbGFzc19leGlzdHMoICdQY2xaaXAnICkgKSB7CgkJCQkJJHBjbHppcF9maWxlID0gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCc7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUENMWmlwIGNsYXNzIG5vdCBmb3VuZC4gQXR0ZW1wdGluZyB0byBsb2FkIGZyb20gYCcgLiAkcGNsemlwX2ZpbGUgLiAnYC4nICk7CgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHBjbHppcF9maWxlICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgYCcgLiAkcGNsemlwX2ZpbGUgLiAnYC4nICk7CgkJCQkJCXJlcXVpcmVfb25jZSggJHBjbHppcF9maWxlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUENMWmlwIGZpbGUgbm90IGZvdW5kOiBgJyAuICRwY2x6aXBfZmlsZSAuICdgLicgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCSRhcmNoaXZlID0gbmV3IFBjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gJGFyY2hpdmUtPmV4dHJhY3QoKTsgLy8gRXh0cmFjdCB0byBjdXJyZW50IGRpcmVjdG9yeS4gRXhwbGljaXR5IHVzaW5nIFBDTFpJUF9PUFRfUEFUSCByZXN1bHRzIGluIGV4dHJhY3Rpb24gdG8gYSBQQ0xaSVBfT1BUX1BBVEggc3ViZm9sZGVyLgoJCQkJCgkJCQlpZiAoIDAgPT0gJHJlc3VsdCApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICAnUENMWmlwIEZhaWx1cmU6ICcgLiAkYXJjaGl2ZS0+ZXJyb3JJbmZvKCB0cnVlICkgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICAnTG93IHNwZWVkIChQQ0xaaXApIGV4dHJhY3Rpb24gZmFpbGVkLicsICRhcmNoaXZlLT5lcnJvckluZm8oIHRydWUgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gTm90aGluZyBzdWNjZWVkZWQgaWYgd2UgbWFkZSBpdCB0aGlzIGZhci4uLgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCQoJCS8vIFRlc3QgYXZhaWxhYmlsaXR5IG9mIFppcEFyY2hpdmUgYW5kIHRoYXQgaXQgYWN0dWFsbHkgd29ya3MuCgkJZnVuY3Rpb24gdGVzdF96aXBhcmNoaXZlKCkgewoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnICkgKSB7CgkJCQkkdGVzdF9maWxlID0gJHRoaXMtPl90ZW1wZGlyIC4gJ3RlbXBfdGVzdF8nIC4gdW5pcWlkKCkgLiAnLnppcCc7CgkJCQkKCQkJCSR6aXAgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCWlmICggJHppcC0+b3BlbiggJHRlc3RfZmlsZSwgWklQQVJDSElWRTo6Q1JFQVRFIHwgWklQQVJDSElWRTo6T1ZFUldSSVRFICkgPT09IHRydWUgKSB7CgkJCQkJJHppcC0+YWRkRmlsZSggX19GSUxFX18sICd0aGlzX2lzX2FfdGVzdC50eHQnKTsKCQkJCQkkemlwLT5jbG9zZSgpOwoJCQkJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkJdW5saW5rKCAkdGVzdF9maWxlICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcEFyY2hpdmUgdGVzdCBwYXNzZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXBBcmNoaXZlIHRlc3QgZmFpbGVkOiBaaXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXBBcmNoaXZlIHRlc3QgRkFJTEVEOiBVbmFibGUgdG8gY3JlYXRlL29wZW4gemlwIGZpbGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUuCgkJICoJCgkJICoJQHBhcmFtCQkKCQkgKglAcmV0dXJuCQlhcnJheQkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoJCQoJCQkkZmlsZV9saXN0ID0gYXJyYXkoKTsKCQkJCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZQoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UpICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQoJCQkJCQlpZiAoICggJGZpbGVfY291bnQgPSAkemEtPm51bUZpbGVzICkgPiAwICkgewoJCQkJCQoJCQkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJCQlmb3IoICRpID0gMDsgJGkgPCAkZmlsZV9jb3VudDsgJGkrKyApewoJCQkJCQkJCgkJCQkJCQkJJHN0YXQgPSAkemEtPnN0YXRJbmRleCggJGkgKTsKCQkJCQkJCQkKCQkJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQkJJGZpbGVfbGlzdFtdID0gYXJyYXkoCgkJCQkJCQkJCSRzdGF0WyduYW1lJ10sCgkJCQkJCQkJCSRzdGF0WydzaXplJ10sCgkJCQkJCQkJCSRzdGF0Wydjb21wX3NpemUnXSwKCQkJCQkJCQkJJHN0YXRbJ210aW1lJ10sCgkJCQkJCQkJKTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQlyZXR1cm4gJGZpbGVfbGlzdDsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkdGhpcy0+emlwYXJjaGl2ZV9lcnJvcl9pbmZvKCAkcmVzdWx0ICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBsaXN0IGNvbnRlbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IFppcEFyY2hpdmUgY2xhc3Mgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gRHJvcHBlZCB0aHJvdWdoIGJlY2F1c2UgWmlwQXJjaGl2ZSBub3QgYXZhaWxhYmxlIG9yIGZhaWxlZCB0byBvcGVuIGZpbGUKCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBpdAoJCQkJaWYgKCAhY2xhc3NfZXhpc3RzKCAnUGNsWmlwJywgZmFsc2UgKSApIHsKCQkJCQoJCQkJCS8vIEl0J3Mgbm90IGFscmVhZHkgbG9hZGVkIHNvIHRyeSBhbmQgZmluZC9sb2FkIGl0IGZyb20gcG9zc2libGUgbG9jYXRpb25zCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIHVuZGVyIFdvcmRQcmVzcwoJCQkJCQlAaW5jbHVkZV9vbmNlKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLXBjbHppcC5waHAnICk7CgkJCQkJCQoJCQkJCX0gZWxzZWlmICggZmlsZV9leGlzdHMoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvcGNsemlwL3BjbHppcC5waHAnICkgKSB7CgkJCQkJCgkJCQkJCS8vIFJ1bm5pbmcgU3RhbmRhbG9uZSAoaW1wb3J0YnVkZHkpCgkJCQkJCUBpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvcGNsemlwL3BjbHppcC5waHAnICk7CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGRpZCBsb2FkIGl0CgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQkJaWYgKCAoICRjb250ZW50X2xpc3QgPSAkemEtPmxpc3RDb250ZW50KCkgKSAhPT0gMCApIHsKCQkJCQkKCQkJCQkJJGZpbGVfY291bnQgPSBzaXplb2YoICRjb250ZW50X2xpc3QgKTsKCQkJCQkJCgkJCQkJCS8vIEdldCBlYWNoIGZpbGUgaW4gc2VxdWVuY2UgYnkgaW5kZXggYW5kIGdldCB0aGUgcHJvcGVydGllcwoJCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgJGZpbGVfY291bnQ7ICRpKysgKSB7CgkJCQkJCQoJCQkJCQkJJHN0YXQgPSAkY29udGVudF9saXN0WyAkaSBdOwoJCQkJCQkJCgkJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQkkZmlsZV9saXN0W10gPSBhcnJheSgKCQkJCQkJCQkkc3RhdFsgJ2ZpbGVuYW1lJyBdLAoJCQkJCQkJCSRzdGF0WyAnc2l6ZScgXSwKCQkJCQkJCQkkc3RhdFsgJ2NvbXByZXNzZWRfc2l6ZScgXSwKCQkJCQkJCQkkc3RhdFsgJ210aW1lJyBdCgkJCQkJCQkpOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCXJldHVybiAkZmlsZV9saXN0OwoKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSBkcm9wIHRocm91Z2ggYXMgbWF5YmUgb3RoZXIgbWV0aG9kIHdpbGwgc3VjY2VlZD8KCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGxpc3QgY29udGVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gbGlzdCBiYWNrdXAgY29udGVudCB3YXMgYXZhaWxhYmxlIG9yIHdvcmtlZAoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0gLy8gRW5kIGdldF9maWxlX2xpc3QoKS4KCQkKCQkKCQkJCQkJCQkKCQkvKglhdmFpbGFibGVfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVRlc3QgYXZhaWxhYmlsaXR5IG9mIHppcCBtZXRob2RzIHRvIGRldGVybWluZSB3aGljaCBleGlzdCBhbmQgYWN0dWFsbHkgd29yay4KCQkgKglEZXRlY3RzIHRoZSBhdmFpbGFibGUgemlwcGluZyBtZXRob2RzIG9uIHRoaXMgc2VydmVyLiBUZXN0cyBjb21tYW5kIGxpbmUgemlwIHZpYSBleGVjKCksIFBIUCdzIFppcEFyY2hpdmUsIG9yIGVtdWxhdGVkIHppcCB2aWEgdGhlIFBIUCBQQ0xaaXAgbGlicmFyeS4KCQkgKglUT0RPOiBBY3R1YWxseSB0ZXN0IHVuemlwcGluZyBpbiB1bnppcCBtb2RlIG5vdCBqdXN0IHppcHBpbmcgYW5kIGFzc3VtaW5nIHRoZSBvdGhlciB3aWxsIHdvcmsKCQkgKgkKCQkgKglAcGFyYW0JCWJvb2xlYW4JCSRyZXR1cm5fYmVzdAkKCQkgKglAcGFyYW0JCXN0cmluZwkJJG1vZGUJCQlQb3NzaWJsZSB2YWx1ZXM6IHppcCwgdW56aXAKCQkgKglAcmV0dXJuCQlhcnJheQkJCQkJCVBvc3NpYmxlIHJldHVybiB2YWx1ZXM6IGV4ZWMsIHppcGFyY2hpdmUsIHBjbHppcAoJCSAqLwoJCWZ1bmN0aW9uIGF2YWlsYWJsZV96aXBfbWV0aG9kcyggJHJldHVybl9iZXN0ID0gdHJ1ZSwgJG1vZGUgPSAnemlwJyApIHsKCQkJJHJldHVybiA9IGFycmF5KCk7CgkJCSR0ZXN0X2ZpbGUgPSAkdGhpcy0+X3RlbXBkaXIgLiAndGVtcF8nIC4gdW5pcWlkKCkgLiAnLnppcCc7CgkJCQoJCQkvLyBUZXN0IGNvbW1hbmQtbGluZSBaSVAuCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCSRjb21tYW5kID0gJ3ppcCc7CgkJCQkkcnVuX2V4ZWNfemlwX3Rlc3QgPSB0cnVlOwoJCQkJCgkJCQkvLyBIYW5kbGUgd2luZG93cy4KCQkJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd6aXAuZXhlJyApICkgewoJCQkJCQkkY29tbWFuZCA9IEFCU1BBVEggLiAkY29tbWFuZDsKCQkJCQl9CgkJCQkJLy8gSWYgdW56aXAgbW9kZSBhbmQgdW56aXAuZXhlIGlzIGZvdW5kIHRoZW4gYXNzdW1lIHdlIGhhdmUgdGhhdCBvcHRpb24gZm9yIHVuemlwcGluZyBzaW5jZSB3ZSBhcmVudCBhY3R1YWxseSB0ZXN0aW5nIHVuemlwLgoJCQkJCWlmICggJG1vZGUgPT0gJ3VuemlwJyApIHsKCQkJCQkJJHJ1bl9leGVjX3ppcF90ZXN0ID0gZmFsc2U7CgkJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAndW56aXAuZXhlJyApICkgewoJCQkJCQkJYXJyYXlfcHVzaCggJHJldHVybiwgJ2V4ZWMnICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQkJJGV4ZWNfcGF0aHMgPSBhcnJheSggJycgKTsKCQkJCX0gZWxzZSB7IC8vICpOSVggc3lzdGVtLgoJCQkJCSRleGVjX3BhdGhzID0gYXJyYXkoICcnLCAnL3Vzci9iaW4vJywgJy91c3IvbG9jYWwvYmluLycsICcvdXNyL2xvY2FsL3NiaW4vJywgJy91c3Ivc2Jpbi8nLCAnL3NiaW4vJywgJy9iaW4vJyApOyAvLyBJbmNsdWRlIHByZWNlZWRpbmcgJiB0cmFpbGluZyBzbGFzaC4KCQkJCX0KCQkJCQoJCQkJaWYgKCAkcnVuX2V4ZWNfemlwX3Rlc3QgPT09IHRydWUgKSB7CgkJCQkJLy8gUG9zc2libGUgbG9jYXRpb25zIHRvIGZpbmQgdGhlIFpJUCBleGVjdXRhYmxlLiBTdGFydCB3aXRoIGEgYmxhbmsgc3RyaW5nIHRvIGF0dGVtcHQgdG8gcnVuIGluIGN1cnJlbnQgZGlyZWN0b3J5LgoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RyeWluZyBleGVjKCkgaW4gdGhlIGZvbGxvd2luZyBwYXRoczogYCcgLiBpbXBsb2RlKCAnLCcsICRleGVjX3BhdGhzICkgLiAnYCcgKTsKCQkJCQkKCQkJCQkkZXhlY19jb21wbGV0aW9uID0gZmFsc2U7IC8vIGRlZmF1bHQgc3RhdGUuCgkJCQkJd2hpbGUoICRleGVjX2NvbXBsZXRpb24gPT09IGZhbHNlICkgeyAvLyBDaGVjayBhbGwgcG9zc2libGUgemlwIHBhdGggbG9jYXRpb25zIHN0YXJ0aW5nIHdpdGggY3VycmVudCBkaXIuIFVzdWFsbHkgdGhlIHBhdGggaXMgc2V0IHRvIG1ha2UgdGhpcyB3b3JrIHdpdGhvdXQgaHVudGluZy4KCQkJCQkJaWYgKCBlbXB0eSggJGV4ZWNfcGF0aHMgKSApIHsKCQkJCQkJCSRleGVjX2NvbXBsZXRpb24gPSB0cnVlOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oICdFeGhhdXN0ZWQgYWxsIGtub3duIGV4ZWMoKSBwYXRoIHBvc3NpYmlsaXRpZXMgd2l0aCBubyBzdWNjZXNzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQkkcGF0aCA9IGFycmF5X3NoaWZ0KCAkZXhlY19wYXRocyApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVHJ5aW5nIGV4ZWMoKSBaSVAgcGF0aDonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgYCcgLiAkcGF0aCAuICdgLicgKTsKCQkJCQkJCgkJCQkJCSRleGVjX2NvbW1hbmQgPSAkcGF0aCAuICRjb21tYW5kIC4gJyAiJyAuICR0ZXN0X2ZpbGUgLiAnIiAiJyAuIF9fRklMRV9fIC4gJyIgIDI+JjEnOyAvLyAgMj4mMSB0byByZWRpcmVjdCBTVFJFUlIgdG8gU1RET1VULgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdaaXAgdGVzdCBleGVjKCkgY29tbWFuZDogYCcgLiAkZXhlY19jb21tYW5kIC4gJ2AnICk7CgkJCQkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJGV4ZWNfY29tbWFuZCApOwoJCQkJCQkKCQkJCQkJaWYgKCAoICFmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgfHwgKCAkZXhlY19leGl0X2NvZGUgPT0gJy0xJyApICkgeyAvLyBGaWxlIG5vdCBtYWRlIG9yIGVycm9yIHJldHVybmVkLgoJCQkJCQkJJGV4ZWNfY29tcGxldGlvbiA9IGZhbHNlOwoJCQkJCQkJCgkJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PSAnLTEnICkgewoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGVjIGNvbW1hbmQgcmV0dXJuZWQgLTEuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCX0KCQkJCQkJCWlmICggIWZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0V4ZWMgY29tbWFuZCByYW4gYnV0IFpJUCBmaWxlIGRpZCBub3QgZXhpc3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCX0KCQkJCQkJCWlmICggZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsgLy8gSWYgZmlsZSB3YXMgc29tZWhvdyBjcmVhdGVkLCBkbyBjbGVhbnVwIG9uIGl0LgoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdDbGVhbmluZyB1cCBkYW1hZ2VkIFpJUCBmaWxlLiBJc3N1ZSAjMzQ4OTMyODk5OC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJCXVubGluayggJHRlc3RfZmlsZSApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgeyAvLyBTdWNjZXNzLgoJCQkJCQkJJGV4ZWNfY29tcGxldGlvbiA9IHRydWU7CgkJCQkJCQkKCQkJCQkJCWlmICggIXVubGluayggJHRlc3RfZmlsZSApICkgewoJCQkJCQkJCWVjaG8gc3ByaW50ZiggX18oICdFcnJvciAjNTY0NjM0LiBVbmFibGUgdG8gZGVsZXRlIHRlc3QgZmlsZSAoJXMpIScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICk7CgkJCQkJCQl9CgkJCQkJCQlhcnJheV9wdXNoKCAkcmV0dXJuLCAnZXhlYycgKTsKCQkJCQkJCSR0aGlzLT5fZXhlY3BhdGggPSAkcGF0aDsKCQkJCQkJCQoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9IC8vIGVuZCB3aGlsZQoJCQkJfSAvLyBFbmQgJHJ1bl9leGVjX3Rlc3QgPT09IHRydWUuCgkJCX0gLy8gRW5kIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkuCgkJCQoJCQkvLyBUZXN0IFppcEFyY2hpdmUKCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJyApICkgewoJCQkJaWYgKCAkdGhpcy0+dGVzdF96aXBhcmNoaXZlKCkgPT09IHRydWUgKSB7CgkJCQkJYXJyYXlfcHVzaCggJHJldHVybiwgJ3ppcGFyY2hpdmUnICk7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFRlc3QgUENMWmlwCgkJCWlmICggY2xhc3NfZXhpc3RzKCAnUGNsWmlwJyApICkgeyAvLyBDbGFzcyBhbHJlYWR5IGxvYWRlZC4KCQkJCWFycmF5X3B1c2goICRyZXR1cm4sICdwY2x6aXAnICk7CgkJCX0gZWxzZSB7IC8vIENsYXNzIG5vdCBsb2FkZWQuIFNlZWsgaXQgb3V0LgoJCQkJCgkJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLXBjbHppcC5waHAnICkgKSB7IC8vIEluc2lkZSBXUC4KCQkJCQlyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKTsKCQkJCQlhcnJheV9wdXNoKCAkcmV0dXJuLCAncGNsemlwJyApOwoJCQkJfSBlbHNlaWYgKCBmaWxlX2V4aXN0cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKSApIHsgLy8gSW1wb3J0QnVkZHkuCgkJCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCWFycmF5X3B1c2goICRyZXR1cm4sICdwY2x6aXAnICk7CgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXR1cm47CgkJfSAvLyBFbmQgYXZhaWxhYmxlX3ppcF9tZXRob2RzKCkuCgkJCgkJCgkJCgkJLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5IGFuZCBhbGwgY29udGVudCB3aXRoaW4uCgkJZnVuY3Rpb24gZGVsZXRlX2RpcmVjdG9yeV9yZWN1cnNpdmUoICRkaXJlY3RvcnkgKSB7CgkJCWlmICggJycgPT0gJGRpcmVjdG9yeSApIHsKCQkJCWVycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5IEVycm9yICM0NzM4NDNiOiBIYWx0ZWQgZW1wdHkgZGlyZWN0b3J5IGRlbGV0aW9uLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJJGRpcmVjdG9yeSA9IHByZWdfcmVwbGFjZSggJ3xbL1xcXFxdKyR8JywgJycsICRkaXJlY3RvcnkgKTsKCQkJCgkJCSRmaWxlcyA9IGdsb2IoICRkaXJlY3RvcnkgLiAnLyonLCBHTE9CX01BUksgKTsKCQkJaWYgKCBpc19hcnJheSggJGZpbGVzICkgJiYgIWVtcHR5KCAkZmlsZXMgKSApIHsKCQkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCQlpZiggJy8nID09PSBzdWJzdHIoICRmaWxlLCAtMSApICkKCQkJCQkJJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZmlsZSApOwoJCQkJCWVsc2UKCQkJCQkJdW5saW5rKCAkZmlsZSApOwoJCQkJfQoJCQl9CgkJCQoJCQlpZiAoIGlzX2RpciggJGRpcmVjdG9yeSApICkgcm1kaXIoICRkaXJlY3RvcnkgKTsKCQkJCgkJCWlmICggaXNfZGlyKCAkZGlyZWN0b3J5ICkgKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IC8vIEVuZCBkZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSgpLgoJCQoJCQoJCQoJCWZ1bmN0aW9uIHNldF96aXBfbWV0aG9kcyggJG1ldGhvZHMgKSB7CgkJCSR0aGlzLT5femlwX21ldGhvZHMgPSAkbWV0aG9kczsKCQl9IC8vIEVuZCBzZXRfemlwX21ldGhvZHMoKS4KCQkKCQkKCQkKCQkvKglfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSgpCgkJICoJCgkJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQlGaWxlIHRvIHdyaXRlIGV4Y2x1c2lvbnMgaW50by4KCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVzaW9ucwkJQXJyYXkgb2YgZGlyZWN0b3JpZXMvcGF0aHMgdG8gZXhjbHVkZS4gT25lIHBlciBsaW5lLgoJCSAqCUBwYXJhbQkJYXRyaW5nCQkkcm9vdAkJCVJvb3QgZGlyZWN0b3J5IHRvIGV4Y2x1ZGUgcmVsYXRpdmUgdG8uCgkJICoJQHJldHVybgkJbnVsbAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGZpbGUsICRleGNsdXNpb25zLCAkcm9vdCA9ICcnICkgewoJCQlpZiAoICcnID09ICRyb290ICkgewoJCQkJJHJvb3QgPSBBQlNQQVRIOwoJCQl9IGVsc2UgewoJCQkJJHJvb3QgPSBydHJpbSggJHJvb3QsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCX0KCgkJCS8vIEFycmF5IGZvciBjbGVhbmVkIHVwIGV4Y2x1c2lvbnMgbGlzdAoJCQkkc2FuaXRpemVkX2V4Y2x1c2lvbnMgPSBhcnJheSgpOwoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgYmFja3VwIGV4Y2x1c2lvbnMgZmlsZSBgJyAuICRmaWxlIC4gJ2AuJyApOwoJCQkvLyRleGNsdXNpb25zID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X2RpcmVjdG9yeV9leGNsdXNpb25zKCk7CgkJCQoJCQkvLyBUZXN0IGVhY2ggZXhjbHVzaW9uIGZvciB2YWxpZGl0eSAocHJlc2VuY2UpIGFuZCBkcm9wIHRob3NlIG5vdCBhY3R1YWxseSBwcmVzZW50CgkJCWZvcmVhY2goICRleGNsdXNpb25zIGFzICRleGNsdXNpb24gKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBhcmUgdXNlZCAoY291bGQgaGF2ZSBtaWdyYXRlZCBmcm9tIGRpZmZlcmVudCBwbGF0Zm9ybSkKCQkJCSRleGNsdXNpb24gPSBwcmVnX3JlcGxhY2UoICd8WycgLiBhZGRzbGFzaGVzKCBzZWxmOjpESVJFQ1RPUllfU0VQQVJBVE9SUyApIC4gJ10rfCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRleGNsdXNpb24gKTsKCQkJCQoJCQkJLy8gRElSRUNUT1JZLgoJCQkJaWYgKCBpc19kaXIoICRyb290IC4gbHRyaW0oICRleGNsdXNpb24sIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICkgewoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4Y2x1ZGluZyBkaXJlY3RvcnkgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCQoJCQkJCS8vIE5lZWQgdG8gYWRkIHRoZSB3aWxkY2FyZCBzbyB0aGF0IHppcCB3aWxsIGV4Y2x1ZGUgdGhlIGRpcmVjdG9yeSBhbmQgY29udGVudAoJCQkJCSRleGNsdXNpb24gPSBydHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICcqJzsKCQkJCQoJCQkJLy8gRklMRS4KCQkJCX0gZWxzZWlmICggaXNfZmlsZSggJHJvb3QgLiBsdHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXhjbHVkaW5nIGZpbGUgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCgkJCQkvLyBTWU1CT0xJQyBMSU5LLgoJCQkJfSBlbHNlaWYgKCBpc19saW5rKCAkcm9vdCAuIGx0cmltKCAkZXhjbHVzaW9uLCBESVJFQ1RPUllfU0VQQVJBVE9SICkgKSApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgc3ltYm9saWMgbGluayBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkKCQkJCS8vIERPRVMgTk9UIEVYSVNULgoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbWl0dGluZyBleGNsdXNpb24gYXMgZmlsZS9kaXJlY3RvcnkgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0OiBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkJCgkJCQkJLy8gU2tpcCB0byBuZXh0IGV4Y2x1c2lvbgoJCQkJCWNvbnRpbnVlOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBXZSBoYXZlIGEgdmFsaWQgZXhjbHVkZSBzbyBhZGQgaXQKCQkJCSRzYW5pdGl6ZWRfZXhjbHVzaW9uc1tdID0gJGV4Y2x1c2lvbjsKCQkJCQoJCQl9CgkJCQoJCQkvLyBQdXQgdGhlIGV4Y2x1c2lvbnMgdG8gYSBmaWxlIGFzIGEgc3RyaW5nCgkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkZmlsZSwgaW1wbG9kZSggUEhQX0VPTCwgJHNhbml0aXplZF9leGNsdXNpb25zICkgLiBQSFBfRU9MICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JhY2t1cCBleGNsdXNpb25zIGZpbGUgY3JlYXRlZC4nICk7CgkJCQoJCX0gLy8gRW5kIHJlbmRlcl9leGNsdXNpb25zX2ZpbGUoKS4KCQkKCQkKCQkKCX0gLy8gRW5kIGNsYXNzCgkKfQo/Pg== ###PACKDATA,FILE_END,/lib/zipbuddy/legacy.zipbuddy.php,importbuddy/lib/zipbuddy/legacy.zipbuddy.php ###PACKDATA,FILE_START,/lib/zipbuddy/zbdir.php,importbuddy/lib/zipbuddy/zbdir.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piZGlyIENsYXNzCiAqCiAqICBQcm92aWRlcyBhIGRpcmVjdG9yeSBjbGFzcyBmb3IgemlwYnVkZHkgZm9yIGJ1aWxkaW5nIGEgZGlyZWN0b3J5IHRyZWUgZm9yIGJhY2t1cAogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YmRpciIgKSApIHsKCgljbGFzcyBwbHVnaW5idWRkeV96YmRpciB7CgkKCQkvLyBzdGF0dXMgbWV0aG9kIHR5cGUgcGFyYW1ldGVyIHZhbHVlcyAtIHdvdWxkIGxpa2UgYSBjbGFzcyBmb3IgdGhpcwoJCWNvbnN0IFNUQVRVU19UWVBFX0RFVEFJTFMgPSAnZGV0YWlscyc7CgkJY29uc3QgTk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SID0gJy8nOwoJCWNvbnN0IERJUkVDVE9SWV9TRVBBUkFUT1JTID0gJy9cXCc7CgoJCXB1YmxpYyAkX3ZlcnNpb24gPSAnMS4wJzsKCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgZGlyZWN0b3J5IG5vZGUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHBhdGggc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfcGF0aCA9ICIiOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBhYnNvbHV0ZSBwYXRocyB0byBiZSBleGNsdWRlZCwgbXVzdCBiZSAvIHRlcm1pbmF0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHBhdGhzX3RvX2V4Y2x1ZGUgYXJyYXkgb2Ygc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfcGF0aHNfdG9fZXhjbHVkZSA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkaXJlY3RvcnkgbGlzdGluZyBpdGVtcyB0byBiZSBpZ25vcmVkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBpdGVtc190b19pZ25vcmUgYXJyYXkgb2Ygc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfaXRlbXNfdG9faWdub3JlID0gYXJyYXkoICIuIiwgIi4uIiwgIi5EU19TdG9yZSIgKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGl0ZW1zIHRoYXQgYXJlIHRlcm1pbmFscyBhbmQgd2UgY2FuIGFkZCBkaXJlY3RseSBmb3IgdGhpcyBkaXJlY3RvcnkgKGFic29sdXRlIHBhdGhzKQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgdGVybWluYWxzIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3Rlcm1pbmFscyA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBicmFuY2ggbm9kZXMgb2Ygc3Vib3JkaW5hdGUgZGlyZWN0b3JpZXMgdGhhdCBhcmUgb24gYW4gZXhjbHVzaW9uIHBhdGgKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJyYW5jaGVzIGFycmF5IG9mIHN0cmluZyA9PiBwbHVnaW5idWRkeV96YmRpcgogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX2JyYW5jaGVzID0gYXJyYXkoKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgYSBzdGF0dXMgY2FsYmFjawogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaGF2ZV9zdGF0dXNfY2FsbGJhY2sgYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2hhdmVfc3RhdHVzX2NhbGxiYWNrID0gZmFsc2U7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogT2JqZWN0LT5tZXRob2QgYXJyYXkgZm9yIHN0YXR1cyBmdW5jdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RhdHVzX2NhbGxiYWNrIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzX2NhbGxiYWNrID0gYXJyYXkoKTsKCQkKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHBhdGgJCQlUaGUgcGF0aCB0byBmb3JtIGEgbm9kZSBmb3IKCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVkZXMJCVRoZSBsaXN0IG9mIGRpcnMvZmlsZXMgdG8gZXhjbHVkZSAoYWJzb2x1dGUgcGF0aHMgd2l0aCAvIHRlcm1pbmF0b3IgZm9yIGRpcnMpCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkcGF0aCwgJGV4Y2x1ZGVzID0gYXJyYXkoKSApIHsKCgkJCS8vIE5vcm1hbGl6ZSB0aGUgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBvbiB0aGUgcGF0aAoJCQkkcGF0aCA9IHJ0cmltKCAkcGF0aCwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCgkJCS8vIE5vcm1hbGl6ZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBpbiBwYXRoCgkJCSR0aGlzLT5fcGF0aCA9IHN0cl9yZXBsYWNlKCBESVJFQ1RPUllfU0VQQVJBVE9SLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IsICRwYXRoICk7CgkJCQoJCQkkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgPSAkZXhjbHVkZXM7CgkJCQoJCQkkY29udGVudCA9IHNjYW5kaXIoICR0aGlzLT5fcGF0aCApOyAvLyBHZXQgdGhlIGRpcmVjdG9yeSBjb250ZW50LCB3aWxsIGJlIHNpbXBsZSBuYW1lcwoJCQkKCQkJLy8gUHJvY2VzcyBlYWNoIGl0ZW0gZm9yIGlnbm9yaW5nLCB0cmVhdGluZyBhcyBhIHRlcm1pbmFsIG9yIGFzIGEgYnJhbmNoCgkJCWZvcmVhY2ggKCAkY29udGVudCBhcyAmJGl0ZW0gKSB7CgoJCQkJLy8gSW5pdGlhbGx5IGNoZWNrIHRoZSBzaW1wbGUgbmFtZQoJCQkJaWYgKCBpbl9hcnJheSggJGl0ZW0sICR0aGlzLT5faXRlbXNfdG9faWdub3JlICkgKSB7CgoJCQkJCS8vIFRoaXMgaXMganVzdCBmbHVmZiBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcKCQkJCQljb250aW51ZTsKCQkJCQkKCQkJCX0gZWxzZWlmICggaXNfZGlyKCAoICR0aGlzLT5fcGF0aCAuICRpdGVtICkgKSApIHsKCgkJCQkJLy8gSXQncyBhIGRpcmVjdG9yeSwgY2hlY2sgZm9yIG1hdGNoaW5nIGV4Y2x1c2lvbiBvciBiZWluZyBwcmVmaXggb2YgZXhjbHVzaW9uCgkJCQkJaWYgKCBpbl9hcnJheSggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCQkJCQkKCQkJCQkJLy8gRXhhY3QgbWF0Y2ggdG8gYW4gZXhjbHVzaW9uLCBleGNsdWRlIHRoaXMgZGlyZWN0b3J5IGNvbXBsZXRlbHkKCQkJCQkJY29udGludWU7CgkJCQkJCQoJCQkJCX0gZWxzZWlmICggJHRoaXMtPmluX2FycmF5X3ByZWZpeCggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCgkJCQkJCS8vIE5lZWQgYSBuZXcgbm9kZSwgYWRkIHRvIHRoZSBub2RlIGFycmF5IChhYnNvbHV0ZSBkaXIgcGF0aCBpcyBrZXkpCgkJCQkJCSR0aGlzLT5fYnJhbmNoZXNbICggJHRoaXMtPl9wYXRoIC4gJGl0ZW0gKSBdID0gbmV3IHBsdWdpbmJ1ZGR5X3piZGlyKCAoICR0aGlzLT5fcGF0aCAuICRpdGVtIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SICksICR0aGlzLT5fcGF0aHNfdG9fZXhjbHVkZSwgJHRoaXMgKTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gTmVpdGhlciBleGNsdXNpb24gbm9yIGV4Y2x1c2lvbiBwcmVmaXggc28gd2VsbCB0cmVhdCBpdCBhcyBhIHRlcm1pbmFsCgkJCQkJCSR0aGlzLT5fdGVybWluYWxzW10gPSAoICR0aGlzLT5fcGF0aCAuICRpdGVtICk7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gQXNzdW1lIGl0J3MgYSBmaWxlLCBjaGVjayBmb3IgbWF0Y2hpbmcgZXhjbHVzaW9uCgkJCQkJaWYgKCBpbl9hcnJheSggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCQkJCQkKCQkJCQkJLy8gRXhhY3QgbWF0Y2ggdG8gYW4gZXhjbHVzaW9uLCBleGNsdWRlIHRoaXMgZmlsZSBjb21wbGV0ZWx5CgkJCQkJCWNvbnRpbnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBOb3QgYW4gZXhjbHVzaW9uIHNvIGl0J3MgYSB0ZXJtaW5hbAoJCQkJCQkkdGhpcy0+X3Rlcm1pbmFsc1tdID0gKCAkdGhpcy0+X3BhdGggLiAkaXRlbSApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CQoJCQl9CgkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCgkJfQoJCQkJCgkJLyoqCgkJICoJc2V0X3N0YXR1c19jYWxsYmFjaygpCgkJICoKCQkgKglTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHN0YXR1cyB1cGRhdGUuCgkJICogIEFyZ3VtZW50IG11c3QgYXQgbGVhc3QgYmUgYSBub24tZW1wdHkgYXJyYXkgd2l0aCAyIGVsZW1lbnRzCgkJICoKCQkgKglAcGFyYW0JCWFycmF5IAkkY2FsbGJhY2sJT2JqZWN0LT5tZXRob2QgdG8gY2FsbCBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zdGF0dXNfY2FsbGJhY2soICRjYWxsYmFjayA9IGFycmF5KCkgKSB7CgkJCgkJCWlmICggaXNfYXJyYXkoICRjYWxsYmFjayApICYmICFlbXB0eSggJGNhbGxiYWNrICkgJiYgKCAyID09IGNvdW50KCAkY2FsbGJhY2sgKSApICkgewoJCQkKCQkJCSR0aGlzLT5fc3RhdHVzX2NhbGxiYWNrID0gJGNhbGxiYWNrOwoJCQkJJHRoaXMtPl9oYXZlX3N0YXR1c19jYWxsYmFjayA9IHRydWU7CgoJCQl9CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzdGF0dXMoKQoJCSAqCQoJCSAqCUludm9rZSBzdGF0dXMgbWV0aG9kIG9mIHBhcmVudCBpZiBpdCBleGlzdHMKCQkgKiAgTXVzdCBiZSBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG90aGVyd2lzZSBpZ25vcmUgdGhlIGNhbGwKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHR5cGUJCShFeHBlY3RlZCkgU3RhdHVzIG1lc3NhZ2UgdHlwZS4KCQkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJKEV4cGVjdGVkKSBTdGF0dXMgbWVzc2FnZS4KCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc3RhdHVzKCkgewoJCQoJCQlpZiAoICR0aGlzLT5faGF2ZV9zdGF0dXNfY2FsbGJhY2sgJiYgKCBmdW5jX251bV9hcmdzKCkgPiAwICkgKSB7CgoJCQkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJCQljYWxsX3VzZXJfZnVuY19hcnJheSggJHRoaXMtPl9zdGF0dXNfY2FsbGJhY2ssICRhcmdzICk7CgkJCQkKCQkJfQoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3Rlcm1pbmFscygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgdGVybWluYWxzIGZyb20gdGhpcyBkaXIgcGx1cyBzdWJvcmRpbmF0ZXMKCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQlGbGF0IGFycmF5IG9mIHRlcm1pbmFsIGZpbGVuYW1lcyBhbmQgZGlyZWN0b3J5IG5hbWVzCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X3Rlcm1pbmFscyggKSB7CgkJCgkJCS8vIE1pbmltdW0gaXMgb3VyIHRlcm1pbmFscwoJCQkkYWxsX3Rlcm1pbmFscyA9ICR0aGlzLT5fdGVybWluYWxzOwoJCQkKCQkJLy8gTm93IGFkZCB0ZXJtaW5hbHMgZnJvbSBlYWNoIHN1Ym9yZGluYXRlCgkJCWZvcmVhY2ggKCAkdGhpcy0+X2JyYW5jaGVzIGFzICRicmFuY2ggKSB7CgkJCQoJCQkJJGFsbF90ZXJtaW5hbHMgPSBhcnJheV9tZXJnZSggJGFsbF90ZXJtaW5hbHMsICRicmFuY2gtPmdldF90ZXJtaW5hbHMoKSApOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkYWxsX3Rlcm1pbmFsczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9yZWxhdGl2ZV9leGNsdWRlcygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgZXhjbHVzaW9ucyB3aXRoIG9wdGlvbmFsIGRpcmVjdG9yeSBwcmVmaXggcmVtb3ZlZAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCVRoZSBiYXNlIGRpcmVjdG9yeSBwcmVmaXggdG8gYmUgcmVtb3ZlZAoJCSAqCUByZXR1cm4JCWFycmF5CUZsYXQgYXJyYXkgb2YgcmVsYXRpdmUgKHRvIHNpdGUgcm9vdCkgZXhjbHVkZWQgZmlsZW5hbWVzIGFuZCBkaXJlY3RvcnkgbmFtZXMKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVsYXRpdmVfZXhjbHVkZXMoICRiYXNlID0gJycgKSB7CgkJCgkJCS8vIFRoZSBiYXNlZGlyIG11c3QgaGF2ZSBhIHRyYWlsaW5nIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRiYXNlICksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkKCQkJLy8gTm9ybWFsaXplIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGluIHBhdGgKCQkJJGJhc2VkaXIgPSBzdHJfcmVwbGFjZSggRElSRUNUT1JZX1NFUEFSQVRPUiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLCAkYmFzZWRpciApOwoJCQkKCQkJJHJlbGF0aXZlX2V4Y2x1ZGVzID0gJHRoaXMtPl9wYXRoc190b19leGNsdWRlOwoJCQkKCQkJZm9yZWFjaCAoICRyZWxhdGl2ZV9leGNsdWRlcyBhcyAmJGV4Y2x1ZGUgKSB7CgkJCQoJCQkJLy8gUmVtb3ZlIGJhc2UgcHJlZml4IGJ1dCBsZWF2ZSBsZWFkaW5nIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkJJGV4Y2x1ZGUgPSBzdHJfcmVwbGFjZSggcnRyaW0oICRiYXNlZGlyLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgKSwgJycsICRleGNsdWRlICk7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlbGF0aXZlX2V4Y2x1ZGVzOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaW5fYXJyYXlfcHJlZml4KCkKCQkgKgkKCQkgKglDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgcHJlZml4IG9mIGFueSBzdHJpbmcgaW4gdGhlIGdpdmVuIGFycmF5CgkJICoJCgkJICogIEBwYXJhbQkJc3RyaW5nCSRwcmVmaXgJCVRoZSBwcmVmaXggc3RyaW5nCgkJICogIEBwYXJhbQkJYXJyYXkJJGNhbmRpZGF0ZXMJVGhlIGFycmF5IG9mIHN0cmluZ3MKCQkgKglAcmV0dXJuCQlib29sCXRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHByZWZpeCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gaW5fYXJyYXlfcHJlZml4KCAkcHJlZml4LCBhcnJheSAkY2FuZGlkYXRlcyApIHsKCgkJCWZvcmVhY2ggKCAkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlICkgewoJCQkKCQkJCWlmICggISggZmFsc2UgPT09IHN0cnBvcyggJGNhbmRpZGF0ZSwgJHByZWZpeCApICkgKSB7CgoJCQkJCS8vIFdlIGZvdW5kIHRoZSBwcmVmaXgKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBHb3QgdGhpcyBmYXIgc28gbm90IGEgcHJlZml4CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJkaXIgY2xhc3MuCQoJCn0KPz4= ###PACKDATA,FILE_END,/lib/zipbuddy/zbdir.php,importbuddy/lib/zipbuddy/zbdir.php ###PACKDATA,FILE_START,/lib/zipbuddy/zbzip.php,importbuddy/lib/zipbuddy/zbzip.php UEsDBAoAAAAAAC8ELUHj5ZWwDAAAAAwAAAAIABwAdGVzdC50eHRVVAkAA8obUVDjG1FQdXgLAAEE+AEAAAQUAAAASGVsbG8gV29ybGQKUEsBAh4DCgAAAAAALwQtQePllbAMAAAADAAAAAgAGAAAAAAAAQAAAKSBAAAAAHRlc3QudHh0VVQFAAPKG1FQdXgLAAEE+AEAAAQUAAAAUEsFBgAAAAABAAEATgAAAE4AAAAAAA== ###PACKDATA,FILE_END,/lib/zipbuddy/zbzip.php,importbuddy/lib/zipbuddy/zbzip.php ###PACKDATA,FILE_START,/lib/zipbuddy/zbzipcore.php,importbuddy/lib/zipbuddy/zbzipcore.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwY29yZSBDbGFzcwogKgogKiAgUHJvdmlkZXMgYW4gYWJzdHJhY3QgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcwogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcGNvcmUiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9zdGF0IENsYXNzCgkgKgoJICoJQ29udmVuaWVuY2UgZm9yIGJlaW5nIGFibGUgdG8gYXVnbWVudCB0aGUgc3RhdCgpIGZ1bmN0aW9uIGVpdGhlciBpbiB0aGUgZXZlbnQKCSAqCW9mIGZhaWx1cmUgb3IgZm9yIGNhc2VzIHdoZXJlIHRoZSBhY3R1YWwgZmlsZSBzaXplIHJlcG9ydGVkIGlzIHRvbyBsYXJnZSBmb3IgdGhlCgkgKgkoc2lnbmVkKSBpbnRlZ2VyIHR5cGUgaW4gd2hpY2ggY2FzZSB3ZSBjcmVhdGUgYW4gYWRkaXRpb25hbCBhc3NvY2lhdGl2ZSBmaWVsZCBpbgoJICoJdGhlIGFycmF5IHdoaWNoIGlzIGEgZG91YmxlIGFuZCBjb250YWlucyB0aGUgZmlsZSBzaXplLgoJICoJRm9yIG5vdyBpdCdzIGp1c3Qgc29tZSBzdGF0aWMgbWV0aG9kcyBidXQgbWlnaHQgZXh0ZW5kIHRvIGJlIGEgdHJ1ZSBjbGFzcy4KCSAqCgkgKglAcGFyYW0Jc3RyaW5nCQkkZmlsZW5hbWUJVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc3RhdAoJICoJQHJldHVybglhcnJheXxib29sCQkJCUZhbHNlIG9uIGZhaWx1cmUgb3RoZXJ3aXNlIGFycmF5CgkgKgoJICovCgljbGFzcyBwbHVnaW5idWRkeV9zdGF0IHsKCgkJY29uc3QgVEhJUlRZX1RXT19CSVQgPSAzMjsKCQljb25zdCBTSVhUWV9GT1VSX0JJVCA9IDY0OwoJCQoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfcGhwKCAkYml0cyApIHsKCQkKCQkJJHJlc3VsdCA9ICggKCBQSFBfSU5UX1NJWkUgKiA4ICkgPT0gJGJpdHMgKSA/IHRydWUgOiBmYWxzZTsKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RhdCggJGZpbGVuYW1lICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkvLyBJZiB0aGUgZmlsZSBpcyByZWFkYWJsZSB0aGVuIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0YXQgaXQgCgkJCWlmICggQGlzX3JlYWRhYmxlKCAkZmlsZW5hbWUgKSApIHsKCQkJCgkJCQkkc3RhdHMgPSBAc3RhdCggJGZpbGVuYW1lICk7CgkJCQkKCQkJCWlmICggZmFsc2UgIT09ICRzdGF0cyApIHsKCQkJCQoJCQkJCS8vIExvb2tzIGxpa2Ugd2UgZ290IHNvbWUgdmFsaWQgZGF0YSAtIGZvciBub3cganVzdCBwcm9jZXNzIHRoZSBzaXplCgkJCQkJaWYgKCBzZWxmOjppc19waHAoIHNlbGY6OlRISVJUWV9UV09fQklUICkgKSB7CgkJCQkJCgkJCQkJCS8vIFBIUCBpcyAzMiBiaXRzIHNvIHdlIG1heSBoYXZlIGEgZmlsZSBzaXplIHByb2JsZW0gb3ZlciAyR0IuCgkJCQkJCS8vIFRoaXMgaXMgb25lIHdheSB0byB0ZXN0IGZvciBhIGZpbGUgc2l6ZSBwcm9ibGVtIC0gdGhlcmUgYXJlIG90aGVycwoJCQkJCQlpZiAoIDAgPiAkc3RhdHNbICdzaXplJyBdICkgewoJCQkJCQkKCQkJCQkJCS8vIFVuc2lnbmVkIGxvbmcgaGFzIGJlZW4gaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgaW50IGFuZCBoYXMgc2lnbiBiaXQKCQkJCQkJCS8vIHNldCBzbyBpcyBhcHBlYXJpbmcgYXMgbmVnYXRpdmUgLSBtYWdpY2FsbHkgY29udmVydCBpdCB0byBhIGRvdWJsZQoJCQkJCQkJLy8gTm90ZTogdGhpcyBvbmx5IHdvcmtzIHRvIGdpdmUgdXMgYW4gZXh0ZW5zaW9uIGZyb20gMkdCIHRvIDRHQiBidXQgdGhhdAoJCQkJCQkJLy8gc2hvdWxkIGJlIGVub3VnaCBhcyB0aGUgdW5kZXJseWluZyBPUyBwcm9iYWJseSBjYW4ndCBzdXBwb3J0ID40R0Igb3IKCQkJCQkJCS8vIHppcCBjb21tYW5kIGNhbm5vdCBhbnl3YXkKCQkJCQkJCSRzdGF0c1sgJ2RzaXplJyBdID0gKCAoZG91YmxlKTB4ODAwMDAwMDAgKyAoICRzdGF0c1sgJ3NpemUnIF0gJiAweDdGRkZGRkZGICkgKTsKCQkJCQkJCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQoJCQkJCQkJLy8gQXNzdW1lIGl0J3MgdmFsaWQKCQkJCQkJCSRzdGF0c1sgJ2RzaXplJyBdID0gKGRvdWJsZSkkc3RhdHNbICdzaXplJyBdOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQkJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBMb29rcyBsaWtlIDY0IGJpdCBQSFAgc28gZmlsZSBzaXplIHNob3VsZCBiZSBmaW5lCgkJCQkJCS8vIEZvcmNlIGFkZGVkIGl0ZW0gdG8gZG91YmxlIGZvciBjb25zaXN0ZW5jeQoJCQkJCQkkc3RhdHNbICdkc2l6ZScgXSA9IChkb3VibGUpJHN0YXRzWyAnc2l6ZScgXTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gQWRkIGFuIGFkZGl0aW9uYWwgaXRlbSBmb3Igc2hvcnQgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgbW9kZQoJCQkJCSRzdGF0c1sgJ21vZGVfb2N0YWxfZm91cicgXSA9IHN1YnN0ciggc3ByaW50ZiggJyVvJywgJHN0YXRzWyAnbW9kZScgXSApLCAtNCApOwoJCQkJCQoJCQkJCSRyZXN1bHQgPSAkc3RhdHM7CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBIbW0sIHN0YXQoKSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uIC0gY291bGQgYmUgYW4gTEZTIHByb2JsZW0gd2l0aCB0aGUKCQkJCQkvLyB3YXkgUEhQIGhhcyBiZWVuIGJ1aWx0IDotKAoJCQkJCS8vIFRPRE86IENvbnNpZGVyIGFsdGVybmF0aXZlcyAtIG1heSBiZSBhYmxlIHRvIHVzZSBleGVjIHRvIHJ1biB0aGUKCQkJCQkvLyBjb21tYW5kIGxpbmUgc3RhdCBmdW5jdGlvbiB3aGljaCBfc2hvdWxkXyBiZSBvayBhbmQgd2UgY2FuIG1hcCBvdXRwdXQKCQkJCQkvLyBpbnRvIHRoZSBzYW1lIGFycmF5IGZvcm1hdC4gVGhpcyBkb2VzIGRlcGVuZCBvbiBoYXZpbmcgZXhlYygpIGFuZCB0aGUKCQkJCQkvLyBzdGF0IGNvbW1hbmQgYXZhaWxhYmxlIGFuZCBpdCdzIGRlZmluaXRlbHkgbm90IGEgbmljZSBvcHRpb24KCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCQoJfQoKCWFic3RyYWN0IGNsYXNzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKCQkvLyBzdGF0dXMgbWV0aG9kIHR5cGUgcGFyYW1ldGVyIHZhbHVlcyAtIHdvdWxkIGxpa2UgYSBjbGFzcyBmb3IgdGhpcwoJCWNvbnN0IFNUQVRVU19UWVBFX0RFVEFJTFMgICAgICAgPSAnZGV0YWlscyc7CgkJCgkJLy8gQ29uc3RhbnRzIGZvciBoYW5kbGluZyBwYXRocwoJCWNvbnN0IE5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiAgPSAnLyc7CgkJY29uc3QgRElSRUNUT1JZX1NFUEFSQVRPUlMgICAgICA9ICcvXFwnOwoKCQkvLyBDb25zdGFudHMgZm9yIHJlc3VsdCBoYW5kbGluZwoJCWNvbnN0IE1BWF9FUlJPUl9MSU5FU19UT19TSE9XICAgPSAyMDsKCQljb25zdCBNQVhfV0FSTklOR19MSU5FU19UT19TSE9XID0gMjA7CgkJY29uc3QgTUFYX09USEVSX0xJTkVTX1RPX1NIT1cgICA9IDIwOwoJCQoJCS8vIEVudW1lcmF0ZWQgdHlwZXMgdGhhdCB3ZSBuZWVkIGZvciBub3cKCQkvLyBOb3RlOiBWYWx1ZXMgbXVzdCBiZSBzZXF1ZW50aWFsCgkJY29uc3QgT1NfVFlQRV9VTktOT1dOIAk9CTA7CgkJY29uc3QgT1NfVFlQRV9OSVgJCT0JMTsKCQljb25zdCBPU19UWVBFX1dJTgkJPQkyOwoJCWNvbnN0IE9TX1RZUEVfTUFYCQk9CTI7CgoJCWNvbnN0IFpJUF9XQVJOSU5HX1VOS05PV04gIAkJCT0gMDsKCQljb25zdCBaSVBfV0FSTklOR19HRU5FUklDICAJCQk9IDE7CgkJY29uc3QgWklQX1dBUk5JTkdfU0tJUFBFRCAgCQkJPSAyOwoJCWNvbnN0IFpJUF9XQVJOSU5HX0ZJTFRFUkVEIAkJCT0gMzsKCQljb25zdCBaSVBfV0FSTklOR19MT05HUEFUSCAJCQk9IDQ7CgkJY29uc3QgWklQX1dBUk5JTkdfSUdOT1JFRF9TWU1MSU5LIAk9IDU7CgkJCgkJY29uc3QgWklQX09USEVSX1VOS05PV04gICAgICAgICA9IDA7CgkJY29uc3QgWklQX09USEVSX0dFTkVSSUMgICAgICAgICA9IDE7CgkJY29uc3QgWklQX09USEVSX1NLSVBQRUQgIAkJPSAyOwoJCWNvbnN0IFpJUF9PVEhFUl9GSUxURVJFRCAJCT0gMzsKCQljb25zdCBaSVBfT1RIRVJfTE9OR1BBVEggCQk9IDQ7CgkJY29uc3QgWklQX09USEVSX0lHTk9SRURfU1lNTElOSwk9IDU7CgkJCgkJY29uc3QgQ09NTUFORF9VTktOT1dOX1BBVEgJPSAwOwoJCWNvbnN0IENPTU1BTkRfWklQX1BBVEgJCT0gMTsKCQljb25zdCBDT01NQU5EX1VOWklQX1BBVEgJPSAyOwoKCQlwdWJsaWMgJF92ZXJzaW9uID0gJzEuMCc7CgoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGx1Z2luIHBhdGggZm9yIHRoaXMgcGx1Z2luCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAkX3BsdWdpblBhdGggc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHVibGljICRfcGx1Z2luUGF0aCA9ICcnOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIGRpcmVjdG9yeSBub2RlCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBwYXRoIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3BhdGggPSAiIjsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYWJzb2x1dGUgcGF0aHMgdG8gYmUgZXhjbHVkZWQsIG11c3QgYmUgLyB0ZXJtaW5hdGVkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBwYXRoc190b19leGNsdWRlIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3BhdGhzX3RvX2V4Y2x1ZGUgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGV0YWlscyBvZiB0aGUgbWV0aG9kCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBtZXRob2RfZGV0YWlscyBhcnJheQogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX21ldGhvZF9kZXRhaWxzID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2V0IG9mIHBhdGhzIHdoZXJlIHRvIGxvb2sgZm9yIGV4ZWN1dGFibGVzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAgZXhlY3V0YWJsZV9wYXRocwlhcnJheQogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2V4ZWN1dGFibGVfcGF0aHMgPSBhcnJheSgpOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIEFycmF5IG9mIHN0YXR1cyBpbmZvcm1hdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RhdHVzIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBFbnVtZXJhdGVkIE9TIHR5cGUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIG9zX3R5cGUJaW50CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfb3NfdHlwZSA9IHNlbGY6Ok9TX1RZUEVfVU5LTk9XTjsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgUEhQIGhhcyBleGVjX2RpciBzZXQgb3Igbm90CiAgICAgICAgICogCiAgICAgICAgICogQHZhciBleGVjX2Rpcl9zZXQJYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2V4ZWNfZGlyX3NldCA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBXYXJuaW5ncyBzaG91bGQgYmUgaWdub3JlZCB3aGVuIGJ1aWxkaW5nIGFyY2hpdmVzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBpZ25vcmVfd2FybmluZ3MJYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2lnbm9yZV93YXJuaW5ncyA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBzeW1saW5rcyBzaG91bGQgYmUgaWdub3JlZC9ub3QtZm9sbG93ZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaWdub3JlX3N5bWxpbmtzCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9pZ25vcmVfc3ltbGlua3MgPSBmYWxzZTsKCQkKICAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNvbXByZXNzaW9uIHNob3VsIGRiZSB1c2VkIHdoZW4gYnVpbGRpbmcgYXJjaGl2ZXMKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGNvbXByZXNzaW9uCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9jb21wcmVzc2lvbiA9IGZhbHNlOwoJCQogICAgICAgLyoqCiAgICAgICAgICogVXNlZCB0byB0cmFuc2xhdGUgb3VyIHdhcm5pbmdzIHJlYXNvbnMgaW50byBhIGxvbmdlciBkZXNjcmlwdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfd2FybmluZ19kZXNjID0gYXJyYXkoIHNlbGY6OlpJUF9XQVJOSU5HX1VOS05PV04gIAkJCT0+ICd3YXJuaW5nIHJlYXNvbiB1bmtub3duJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgIAkJCT0+ICdnZW5lcmFsIHByb2JsZW0gYXMgaW5kaWNhdGVkJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9XQVJOSU5HX1NLSVBQRUQgIAkJCT0+ICdmaWxlIHVucmVhZGFibGUgb3IgZG9lcyBub3QgZXhpc3QnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfRklMVEVSRUQgCQkJPT4gJ2ZpbGUgZmlsdGVyZWQnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfTE9OR1BBVEggCQkJPT4gJ2ZpbGVuYW1lIHBhdGggdG9vIGxvbmcnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfSUdOT1JFRF9TWU1MSU5LICAJPT4gJ2ZpbGUgaXMgYSBzeW1saW5rIGFuZCBpcyBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzJywKCQkJCQkJCQkJCQkgKTsKCgkJcHVibGljIHN0YXRpYyAkX290aGVyX2Rlc2MgICA9IGFycmF5KCBzZWxmOjpaSVBfT1RIRVJfVU5LTk9XTiAJCQk9PiAnb3RoZXIgcmVhc29uIHVua25vd24nLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgCQkJPT4gJ290aGVyIHByb2JsZW0gYXMgaW5kaWNhdGVkJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9PVEhFUl9TS0lQUEVEIAkJCT0+ICdmaWxlIHVucmVhZGFibGUgb3IgZG9lcyBub3QgZXhpc3QnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0ZJTFRFUkVECQkJPT4gJ2ZpbGUgZmlsdGVyZWQnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0xPTkdQQVRIIAkJCT0+ICdmaWxlbmFtZSBwYXRoIHRvbyBsb25nJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9PVEhFUl9JR05PUkVEX1NZTUxJTksJPT4gJ2ZpbGUgaXMgYSBzeW1saW5rIGFuZCBpcyBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzJywKCQkJCQkJCQkJCQkgKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIFNlcnZlciBBUEkgdGhhdCBpcyBpbiB1c2UKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX3NhcGlfbmFtZSA9ICIiOwoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgd2UgYXJlIHJ1bm5pbmcgb24gZm9yIGxhdGVyCgkJCSR0aGlzLT5zZXRfb3NfdHlwZSgpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nIFdhcm5pbmdzIG9yIG5vdCAoZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyKQoJCQkkdGhpcy0+c2V0X2lnbm9yZV93YXJuaW5ncygpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nL25vdC1mb2xsb3dpbmcgc3ltbGlua3Mgb3Igbm90IChleHBlY3RlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHVzZXIpCgkJCSR0aGlzLT5zZXRfaWdub3JlX3N5bWxpbmtzKCk7CgkJCQoJCQkvLyBEZXJpdmUgd2hldGhlciBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCAoZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyKQoJCQkkdGhpcy0+c2V0X2NvbXByZXNzaW9uKCk7CgkJCQoJCQkvLyBTcGVjaWZpYyBtZXRob2QgY29uc3RydWN0b3Igd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZXNlIGFuZCB0aGUgdGVzdHMgbWF5IG92ZXJyaWRlIG90aGVycwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5KCAnbmFtZScgPT4gJ1Vua25vd24gTWV0aG9kJywKCQkJCQkJCQkJCQkJCSAgJ2NvbXBhdGliaWxpdHknID0+IGZhbHNlICwKCQkJCQkJCQkJCQkJCSAgJ2lzX2NoZWNrZXInID0+IGZhbHNlLAoJCQkJCQkJCQkJCQkJICAnaXNfbGlzdGVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX2FyY2hpdmVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX3VuYXJjaGl2ZXInID0+IGZhbHNlLAoJCQkJCQkJCQkJCQkJICAnaXNfY29tbWVudGVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX3ppcHBlcicgPT4gZmFsc2UsCgkJCQkJCQkJCQkJCQkgICdpc191bnppcHBlcicgPT4gZmFsc2UsCgkJCQkJCQkJCQkJCQkgICdpc19leHRyYWN0b3InID0+IGZhbHNlCgkJCQkJCQkJCQkJCQkgKTsKCgkJCS8vIE11c3QgX25vdF8gZGVmYXVsdCAncGF0aCcgdmFsdWVzIGJlY2F1c2Ugd2UgdGVzdCB3aGV0aGVyIHNldCBvciBub3QgdG8gZGVjaWRlIHdoZXRoZXIgdG8gdXNlCgkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXSA9IGFycmF5KCAvLyAncGF0aCcgPT4gJycsCgkJCQkJCQkJCQkJCQkgICAnemlwJyA9PiBhcnJheSggLy8gJ3BhdGgnID0+ICcnLAoJCQkJCQkJCQkJCQkJICAgCQkndmVyc2lvbicgPT4gYXJyYXkoICdtYWpvcicgPT4gMCwgJ21pbm9yJyA9PiAwICksCgkJCQkJCQkJCQkJCQkgICAJCSdvcHRpb25zJyA9PiAnJywKCQkJCQkJCQkJCQkJCSAgIAkJJ2luZm8nID0+ICcnICksCgkJCQkJCQkJCQkJCQkgICAndW56aXAnID0+IGFycmF5KCAvLyAncGF0aCcgPT4gJycsCgkJCQkJCQkJCQkJCQkgICAJCSd2ZXJzaW9uJyA9PiBhcnJheSggJ21ham9yJyA9PiAwLCAnbWlub3InID0+IDAgKSwKCQkJCQkJCQkJCQkJCSAgIAkJJ29wdGlvbnMnID0+ICcnLAoJCQkJCQkJCQkJCQkJICAgCQknaW5mbycgPT4gJycgKQoJCQkJCQkJCQkJCQkJICk7CgoJCX0KCQkKCQkvKioKCQkgKglfX2Rlc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGRlc3RydWN0b3IuCgkJICoJCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoICkgewoKCQl9CgkJCQkKCQkvKioKCQkgKglzZXRfb3NfdHlwZSgpCgkJICoKCQkgKglTZXRzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgT1MgdHlwZSB0aGF0IHdlIGFyZSBydW5uaW5nIG9uIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBmb3IKCQkgKglPUyBzcGVjaWZpYyBwcm9jZXNzaW5nLiBJZiBubyBlbnVtZXJhdGVkIHR5cGUgdmFsdWUgaXMgcGFzc2VkIGluIHRoZW4gZGVkdWNlIHRoZQoJCSAqCXZhbHVlIHRvIHNldCBmcm9tIHN5c3RlbSBpbmZvcm1hdGlvbi4KCQkgKglOb3RlOiBDdXJyZW50bHkgdXNlcyBQSFBfT1Mgd2hpY2ggc3RyaWN0bHkgc3BlYWtpbmcgaXMgdGhlIE9TIHRoYXQgUEhQIHdhcyBidWlsdCBvbgoJCSAqCXdoZXJlYXMgcGhwX3VuYW1lKCkgY291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBPUyBiZWluZyBydW4gb24gaWYgd2UgcmVhbGx5CgkJICoJbmVlZCB0aGF0IChhbmQgc29tZXRpbWVzIGl0IGhhcyB0byByZXZlcnQgYmFjayB0byBqdXN0IHJldHVybmluZyB0aGUgUEhQX09TIHZhbHVlIGlmCgkJICoJdGhlIE9TIHVuYW1lIGxpYnJhcnkgZG9lc24ndCBleGlzdCBvciBpc24ndCB3b3JraW5nIHByb3Blcmx5LgoJCSAqCgkJICoJQHBhcmFtCQkkb3NfdHlwZQlpbnQJCU9TIHR5cGUgdG8gc2V0IChjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBkZWR1Y2VkIHR5cGUpCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9vc190eXBlKCAkb3NfdHlwZSA9IFBIUF9JTlRfTUFYICkgewoJCSAKCQkgCS8vIENoZWNrIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUKCQkgCWlmICggKCBzZWxmOjpPU19UWVBFX1VOS05PV04gPCAkb3NfdHlwZSApICYmICggc2VsZjo6T1NfVFlQRV9NQVggPj0gJG9zX3R5cGUgKSApIHsKCQkgCQoJCSAJCSR0aGlzLT5fb3NfdHlwZSA9ICRvc190eXBlOwoJCSAJCQoJCSAJfSBlbHNlIHsKCQkgCQkKCQkgCQkvLyBVc2UgVUMgZm9yIGVhc2UgLSB0aGlzIF9zaG91bGQgbm90PyBjYXVzZSBhbnkgYW1iaWd1aXR5CgkJIAkJJG9zX25hbWUgPSBzdHJ0b3VwcGVyKCBQSFBfT1MgKTsKCQkgCgkJIAkJLy8gQ3VycmVudGx5IHdlJ2xsIGFzc3VtZSBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgbG9vayBsaWtlIFdpbmRvd3MgaXMgKm5peCBiYXNlZAoJCSAJCWlmICggc3Vic3RyKCAkb3NfbmFtZSwgMCwgMyApID09PSAnV0lOJykgewoJCSAJCQoJCSAJCQkkdGhpcy0+X29zX3R5cGUgPSBzZWxmOjpPU19UWVBFX1dJTjsKCQkgCQkJCgkJIAkJfSBlbHNlIHsKCQkgCQkKCQkgCQkJJHRoaXMtPl9vc190eXBlID0gc2VsZjo6T1NfVFlQRV9OSVg7CgkJIAkJCQoJCSAJCX0KCQkgCQoJCSAJfQoJCSAJCgkJIAlyZXR1cm4gJHRoaXM7CgkJIAkKCQkgfQoKCQkvKioKCQkgKglnZXRfb3NfdHlwZSgpCgkJICoKCQkgKglHZXRzIHRoZSBlbnVtZXJhdGVkIGlkZW50aWZpZXIgZm9yIHRoZSBPUyB0eXBlIHRoYXQgd2UgYXJlIHJ1bm5pbmcgb24KCQkgKgoJCSAqCUByZXR1cm4JCWludAkJRW51bWVyYXRlZCBPUyB0eXBlIHZhbHVlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIGdldF9vc190eXBlKCApIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X29zX3R5cGU7CgoJCSB9CgoJCS8qKgoJCSAqCXNldF9leGVjX2Rpcl9mbGFnKCkKCQkgKgoJCSAqCUNoZWNrcyB3aGV0aGVyIGV4ZWNfZGlyIGlzIHNldCBpbiBQSFAgZW52aXJvbm1lbnQgYW5kIHNldHMgaW50ZXJuYWwgZmxhZwoJCSAqCgkJICoJQHJldHVybgkJYm9vbAkJVHJ1ZSBpcyBleGVjX2RpciBpcyBzZXQgYW5kIG5vdC1lbXB0eQoJCSAqCgkJICovCgkJIHB1YmxpYyBmdW5jdGlvbiBzZXRfZXhlY19kaXJfZmxhZyggKSB7CgkJIAoJCSAJJGV4ZWNfZGlyID0gJyc7CgkJIAkkcmVzdWx0ID0gZmFsc2U7CgoJCSAJaWYgKCAoIGZhbHNlICE9PSAoICRleGVjX2RpciA9IGluaV9nZXQoICdleGVjX2RpcicgKSApICkgJiYgKCAnJyAhPSB0cmltKCAkZXhlY19kaXIgKSApICkgewoJCSAJCgkJIAkJJHJlc3VsdCA9IHRydWU7CgkJIAkKCQkgCX0gZWxzZSB7CgkJIAkKCQkgCQkkcmVzdWx0ID0gZmFsc2U7CgkJIAkJCgkJIAl9CgkJIAoJCSAJJHRoaXMtPl9leGVjX2Rpcl9zZXQgPSAkcmVzdWx0OwoKCQkJcmV0dXJuICR0aGlzOwoKCQkgfQoKCQkvKioKCQkgKglnZXRfZXhlY19kaXJfZmxhZygpCgkJICoKCQkgKglHZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiBleGVjX2RpciBzZXR0aW5nCgkJICoKCQkgKglAcmV0dXJuCQlib29sCQlWYWx1ZSBvZiAkX2V4ZWNfZGlyX3NldAoJCSAqCgkJICovCgkJIHB1YmxpYyBmdW5jdGlvbiBnZXRfZXhlY19kaXJfZmxhZygpIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X2V4ZWNfZGlyX3NldDsKCgkJIH0KCgkJLyoqCgkJICoJc2V0X2lnbm9yZV93YXJuaW5ncygpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBhcmNoaXZlcyBhcmUKCQkgKgliZWluZyBidWlsdC4KCQkgKgoJCSAqCUBwYXJhbQkJYm9vbAkkaWdub3JlCUZhbHNlIHRvIG5vdCBpZ25vcmUgd2FybmluZ3MsIFRydWUgdG8gZm9yY2UgaWdub3JlCgkJICoJQHJldHVybgkJYm9vbAkJCVRydWUgaWYgY29uZGl0aW9ucyBpbmRpY2F0ZSB3YXJuaW5ncyBzaG91bGQgYmUgaWdub3JlZCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9pZ25vcmVfd2FybmluZ3MoICRpZ25vcmUgPSBudWxsICkgewoJCSAKCQkgCSR0aGlzLT5faWdub3JlX3dhcm5pbmdzID0gKCBpc19ib29sKCAkaWdub3JlICkgKSA/ICRpZ25vcmUgOiBmYWxzZSA7CgoJCQlyZXR1cm4gJHRoaXM7CgoJCSB9CgoJCS8qKgoJCSAqCWdldF9pZ25vcmVfd2FybmluZ3MoKQoJCSAqCgkJICoJR2V0cyB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgd2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwoJCSAqCgkJICoJQHJldHVybgkJYm9vbAkJVmFsdWUgb2YgJF9pZ25vcmVfd2FybmluZ3MKCQkgKgoJCSAqLwoJCSBwdWJsaWMgZnVuY3Rpb24gZ2V0X2lnbm9yZV93YXJuaW5ncygpIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X2lnbm9yZV93YXJuaW5nczsKCgkJIH0KCgkJLyoqCgkJICoJc2V0X2lnbm9yZV9zeW5saW5rcygpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgc3ltbGlua3Mgc2hvdWxkIGJlIGlnbm9yZWQvbm90LWZvbGxvd2VkIHdoZW4gYXJjaGl2ZXMgYXJlCgkJICoJYmVpbmcgYnVpbHQuCgkJICoKCQkgKglAcGFyYW0JCWJvb2wJJGlnbm9yZQlGYWxzZSB0byBub3QgaWdub3JlIHN5bWxpbmtzLCBUcnVlIHRvIGZvcmNlIGlnbm9yZQoJCSAqCUByZXR1cm4JCWJvb2wJCQlUcnVlIGlmIGNvbmRpdGlvbnMgaW5kaWNhdGUgc3ltbGlua3Mgc2hvdWxkIGJlIGlnbm9yZWQvbm90LWZvbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCSBwdWJsaWMgZnVuY3Rpb24gc2V0X2lnbm9yZV9zeW1saW5rcyggJGlnbm9yZSA9IG51bGwgKSB7CgkJIAoJCSAJJHRoaXMtPl9pZ25vcmVfc3ltbGlua3MgPSAgKCBpc19ib29sKCAkaWdub3JlICkgKSA/ICRpZ25vcmUgOiB0cnVlIDsKCgkJCXJldHVybiAkdGhpczsKCgkJIH0KCgkJLyoqCgkJICoJZ2V0X2lnbm9yZV9zeW1saW5rcygpCgkJICoJCgkJICoJVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIG9wdGlvbiB0byBpZ25vcmUgc3ltbGlua3MgaXMgc2V0LiBJbiB0aGlzIGNvbnRleHQgaWdub3JpbmcKCQkgKgltZWFucyBub3QgZm9sbG93aW5nIGJ1dCB0aGUgc3ltbGluayBpdHNlbGYgaXMgcmVjb3JkZWQgaW4gdGhlIGJhY2t1cAoJCSAqCQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVmFsdWUgb2YgJF9pZ25vcmVfc3ltbGlua3MKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfaWdub3JlX3N5bWxpbmtzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9pZ25vcmVfc3ltbGlua3M7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCXNldF9jb21wcmVzc2lvbigpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgY29tcHJlc3Npb24gc2hvdWxkIGJlIHVzZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlLgoJCSAqCgkJICoJQHBhcmFtCQlib29sCSRjb21wcmVzc2lvbglGYWxzZSB0byBwcm9oaWJpdCBjb21wcmVzc2lvbiwgVHJ1ZSB0byBmb3JjZSBjb21wcmVzc2lvbgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgY29uZGl0aW9ucyBpbmRpY2F0ZSBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9jb21wcmVzc2lvbiggJGNvbXByZXNzaW9uID0gbnVsbCApIHsKCQkgCgkJIAkkdGhpcy0+X2NvbXByZXNzaW9uID0gICggaXNfYm9vbCggJGNvbXByZXNzaW9uICkgKSA/ICRjb21wcmVzc2lvbiA6IHRydWUgOwoKCQkJcmV0dXJuICR0aGlzOwoKCQkgfQoKCQkvKioKCQkgKglnZXRfY29tcHJlc3Npb24oKQoJCSAqCQoJCSAqCVRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcHRpb24gdG8gdXNlIGNvbXByZXNzaW9uIGlzIHNldC4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVZhbHVlIG9mICRfY29tcHJlc3Npb24KCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfY29tcHJlc3Npb24oKSB7CgkJCgkJCXJldHVybiAkdGhpcy0+X2NvbXByZXNzaW9uOwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfc2FwaV9uYW1lKCkKCQkgKgoJCSAqCVNldHMgdGhlIHNhcGkgbmFtZSB0byB0aGF0IGdpdmVuIG9yIGxlYXZlIGVtcHR5CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCSRuYW1lCUEgc2FwaSBuYW1lIHRvIHNldCAoZGVmYXVsdCBlbXB0eSkKCQkgKglAcmV0dXJuCW9iamVjdAkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zYXBpX25hbWUoICRzYXBpX25hbWUgPSAiIiApIHsKCQkKCQkJJHRoaXMtPl9zYXBpX25hbWUgPSAkc2FwaV9uYW1lOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWdldF9zYXBpX25hbWUoKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgc2FwaSBuYW1lCgkJICoKCQkgKglAcmV0dXJuCXN0cmluZwkJCVRoZSBzdG9yZWQgc2FwaSBuYW1lCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9zYXBpX25hbWUoKSB7CgkJCQoJCQlyZXR1cm4gJHRoaXMtPl9zYXBpX25hbWU7CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X3N0YXR1cygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgc3RhdHVzIGFycmF5CgkJICoJCgkJICoJQHJldHVybgkJYXJyYXkJVGhlIHN0YXR1cyBhcnJheQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9zdGF0dXMoKSB7CgkJCgkJCXJldHVybiAkdGhpcy0+X3N0YXR1czsKCQkKCQl9CgkJCgkJLyoqCgkJICoJbG9nX2FyY2hpdmVfZmlsZV9zdGF0cygpCgkJICoJCgkJICoJUHJvZHVjZWQgYSBzdGF0dXMgbG9nIGVudHJ5IGZvciB0aGUgYXJjaGl2ZSBmaWxlIHN0YXRzCgkJICoJCgkJICoJQHBhcmFtCXN0cmluZwkkZmlsZQlUaGUgZmlsZSB0byBzdGF0IGFuZCBhbmQgbG9nCgkJICoJQHJldHVybgkJCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gbG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJGZpbGUgKSB7CgkJCgkJCS8vIEdldCB0aGUgZmlsZSBzdGF0cyBzbyB3ZSBjYW4gbG9nIHNvbWUgaW5mb3JtYXRpb24KCQkJJGZpbGVfc3RhdHMgPSBwbHVnaW5idWRkeV9zdGF0OjpzdGF0KCAkZmlsZSApOwoJCQkKCQkJLy8gT25seSBsb2cgYW55dGhpbmcgaWYgd2UgZ290IHNvbWUgdmFsaWQgZmlsZSBzdGF0cwoJCQlpZiAoIGZhbHNlICE9PSAkZmlsZV9zdGF0cyApIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzaXplOiAlMSRzIGJ5dGVzLCBvd25lZCBieSB1c2VyOmdyb3VwICUyJHM6JTMkcyB3aXRoIHBlcm1pc3Npb25zICU0JHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGZpbGVfc3RhdHNbICdkc2l6ZScgXSwgJGZpbGVfc3RhdHNbICd1aWQnIF0sICRmaWxlX3N0YXRzWyAnZ2lkJyBdLCAkZmlsZV9zdGF0c1sgJ21vZGVfb2N0YWxfZm91cicgXSApICk7CgoJCQl9CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X21ldGhvZF90YWcoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIG1ldGhvZCB0YWcKCQkgKgkKCQkgKglAcmV0dXJuCQlzdHJpbmcgVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZygpOwoKCQkvKioKCQkgKglnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIGlzX2NvbXBhdGliaWxpdHlfbWV0aG9kIGJvb2xlYW4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCgkJICoKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCk7CgoJCS8qKgoJCSAqCWdldF9tZXRob2RfZGV0YWlscygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgZGV0YWlscyBhcnJheQoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5CgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZF9kZXRhaWxzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9tZXRob2RfZGV0YWlsczsKCQkJCgkJfQoKCQkvKioKCQkgKglzZXRfbWV0aG9kX2RldGFpbHMoKQoJCSAqCQoJCSAqCVNldHMgdGhlIGludGVybmFsIChzZXR0YWJsZSkgZGV0YWlscwoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZF9kZXRhaWxzKCBhcnJheSAkZGV0YWlscywgJG1lcmdlID0gdHJ1ZSApIHsKCQkKCQkJaWYgKCB0cnVlID09PSAkbWVyZ2UgKSB7CgkJCQoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0gPSBhcnJheV9tZXJnZSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0sICRkZXRhaWxzWyAnYXR0cicgXSApOwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdID0gYXJyYXlfbWVyZ2UoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXSwgJGRldGFpbHNbICdwYXJhbScgXSApOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzID0gJGRldGFpbHM7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7CgkJCQkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X2V4ZWN1dGFibGVfcGF0aHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGV4ZWN1dGFibGVfcGF0aHMgYXJyYXkKCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9leGVjdXRhYmxlX3BhdGhzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9leGVjdXRhYmxlX3BhdGhzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9leGVjdXRhYmxlX3BhdGhzKCkKCQkgKgkKCQkgKglTZXRzIHRoZSBleGVjdXRhYmxlX3BhdGhzIGFycmF5IHNvIGNhbiBiZSB1c2VkIHRvIGF1Z21lbnQgb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQKCQkgKgkKCQkgKglAcGFyYW0JCSRwYXRocwlhcnJheQlQYXRocyB0byBzZXQgb3IgbWVyZ2UKCQkgKglAcGFyYW0JCSRtZXJnZQlib29sCVRydWUgKGRlZmF1bHQpIGlmIG1lcmdpbmcgcGF0aHMgd2l0aCBjdXJyZW50IHBhdGhzCgkJICoJQHBhcmFtCQkkYmVmb3JlCWJvb2wJVHJ1ZSAoZGVmYXVsdCkgaWYgcGF0aHMgdG8gYmUgcHJlcGVuZGVkCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9leGVjdXRhYmxlX3BhdGhzKCBhcnJheSAkcGF0aHMsICRtZXJnZSA9IHRydWUsICRiZWZvcmUgPSB0cnVlICkgewoJCQoJCQlpZiAoIHRydWUgPT09ICRtZXJnZSApIHsKCQkJCgkJCQlpZiAoIHRydWUgPT09ICRiZWZvcmUgKSB7CgkJCQkKCQkJCQkkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMgPSBhcnJheV9tZXJnZSggJHBhdGhzLCAkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMgKTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQoJCQkJCSR0aGlzLT5fZXhlY3V0YWJsZV9wYXRocyA9IGFycmF5X21lcmdlKCAkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMsICRwYXRocyApOwoJCQkJCgkJCQl9CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR0aGlzLT5fZXhlY3V0YWJsZV9wYXRocyA9ICRwYXRoczsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCQkJCgkJfQoKCQkvKioKCQkgKglkZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSgpCgkJICoJCgkJICoJUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5IGFuZCBpdCdzIGNvbnRlbnQKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyZWN0b3J5CURpcmVjdG9yeSB0byBkZWxldGUKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgb3BlcmF0aW9uIGZ1bGx5IHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZGlyZWN0b3J5ICkgewoJCQlpZiAoICcnID09ICRkaXJlY3RvcnkgKSB7CgkJCQllcnJvcl9sb2coICdCYWNrdXBCdWRkeSBFcnJvciAjNDczODQzYzogSGFsdGVkIGVtcHR5IGRpcmVjdG9yeSBkZWxldGlvbi4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCS8vIFJlbW92ZSBhbnkgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBzbyB3ZSBrbm93IHdoZXJlIHdlIGFyZQoJCQkkZGlyZWN0b3J5ID0gcnRyaW0oICRkaXJlY3RvcnksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICk7CgkJCQoJCQkvLyBOb24tZXhpc3RlbnQgZGlyZWN0b3J5IHNvIHByZXRlbmQgd2UgZGVsZXRlZCBpdCBvawoJCQlpZiAoICFmaWxlX2V4aXN0cyggJGRpcmVjdG9yeSApICkgewoJCQkKCQkJCXJldHVybiB0cnVlOwoJCQkJCgkJCX0KCgkJCS8vIE1ha2Ugc3VyZSBpdCB3YXNuJ3QganVzdCBhIGZpbGUgb3IgbGluayAtIGlmIHNvIGp1c3QgZGVsZXRlIGl0IGFuZCByZXR1cm4JCQkKCQkJaWYgKCAhaXNfZGlyKCAkZGlyZWN0b3J5ICkgfHwgaXNfbGluayggJGRpcmVjdG9yeSApICkgewoJCQkKCQkJCXJldHVybiBAdW5saW5rKCAkZGlyZWN0b3J5ICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gU28gaXQgaXMgYSBkaXJlY3Rvcnkgc28gcHJvY2VzcyBjb250ZW50CgkJCWZvcmVhY2ggKCBzY2FuZGlyKCAkZGlyZWN0b3J5ICkgYXMgJGl0ZW0gKSB7CgkJCQoJCQkJLy8gU2tpcCB0aGUgdGhpcyBhbmQgcGFyZW50IGRpcmVjdG9yaWVzCgkJCQlpZiAoICRpdGVtID09ICcuJyB8fCAkaXRlbSA9PSAnLi4nICkgewoJCQkJCgkJCQkJY29udGludWU7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIERlbGV0ZSB0aGUgaXRlbSBpZiB3ZSBjYW4JCQkKCQkJCWlmICggISR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRpcmVjdG9yeSAuICIvIiAuICRpdGVtICkgKSB7CgkJCQkKCQkJCQkvLyBUT0RPOiBTdXBwb3NlZGx5IGNoYW5nZSB0aGUgcGVybXMgb24gdGhlIGl0ZW0gc28gd2UgY2FuIGRlbGV0ZSBpdD8KCQkJCQlAY2htb2QoICRkaXJlY3RvcnkgLiAiLyIgLiAkaXRlbSwgMDc3NyApOwoJCQkJCQoJCQkJCWlmICggISR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRpcmVjdG9yeSAuICIvIiAuICRpdGVtICkgKSB7CgkJCQkJCgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiBAcm1kaXIoICRkaXJlY3RvcnkgKTsKCQkJCQoJCX0KCQkKCQkvKglfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSgpCgkJICoJCgkJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQlGaWxlIHRvIHdyaXRlIGV4Y2x1c2lvbnMgaW50by4KCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVzaW9ucwkJQXJyYXkgb2YgZGlyZWN0b3JpZXMvcGF0aHMgdG8gZXhjbHVkZS4gT25lIHBlciBsaW5lLgoJCSAqCUBwYXJhbQkJYXRyaW5nCQkkcm9vdAkJCVJvb3QgZGlyZWN0b3J5IHRvIGV4Y2x1ZGUgcmVsYXRpdmUgdG8uCgkJICoJQHJldHVybgkJbnVsbAoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGZpbGUsICRleGNsdXNpb25zLCAkcm9vdCA9ICcnICkgewoJCQlpZiAoICcnID09ICRyb290ICkgewoJCQkJJHJvb3QgPSBBQlNQQVRIOwoJCQl9IGVsc2UgewoJCQkJJHJvb3QgPSBydHJpbSggJHJvb3QsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCX0KCgkJCS8vIEFycmF5IGZvciBjbGVhbmVkIHVwIGV4Y2x1c2lvbnMgbGlzdAoJCQkkc2FuaXRpemVkX2V4Y2x1c2lvbnMgPSBhcnJheSgpOwoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgYmFja3VwIGV4Y2x1c2lvbnMgZmlsZSBgJyAuICRmaWxlIC4gJ2AuJyApOwoJCQkvLyRleGNsdXNpb25zID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X2RpcmVjdG9yeV9leGNsdXNpb25zKCk7CgkJCQoJCQkvLyBUZXN0IGVhY2ggZXhjbHVzaW9uIGZvciB2YWxpZGl0eSAocHJlc2VuY2UpIGFuZCBkcm9wIHRob3NlIG5vdCBhY3R1YWxseSBwcmVzZW50CgkJCWZvcmVhY2goICRleGNsdXNpb25zIGFzICRleGNsdXNpb24gKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBhcmUgdXNlZCAoY291bGQgaGF2ZSBtaWdyYXRlZCBmcm9tIGRpZmZlcmVudCBwbGF0Zm9ybSkKCQkJCSRleGNsdXNpb24gPSBwcmVnX3JlcGxhY2UoICd8WycgLiBhZGRzbGFzaGVzKCBzZWxmOjpESVJFQ1RPUllfU0VQQVJBVE9SUyApIC4gJ10rfCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRleGNsdXNpb24gKTsKCQkJCQoJCQkJLy8gRElSRUNUT1JZLgoJCQkJaWYgKCBpc19kaXIoICRyb290IC4gbHRyaW0oICRleGNsdXNpb24sIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICkgewoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4Y2x1ZGluZyBkaXJlY3RvcnkgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCQoJCQkJCS8vIE5lZWQgdG8gYWRkIHRoZSB3aWxkY2FyZCBzbyB0aGF0IHppcCB3aWxsIGV4Y2x1ZGUgdGhlIGRpcmVjdG9yeSBhbmQgY29udGVudAoJCQkJCSRleGNsdXNpb24gPSBydHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICcqJzsKCQkJCQoJCQkJLy8gRklMRS4KCQkJCX0gZWxzZWlmICggaXNfZmlsZSggJHJvb3QgLiBsdHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXhjbHVkaW5nIGZpbGUgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCgkJCQkvLyBTWU1CT0xJQyBMSU5LLgoJCQkJfSBlbHNlaWYgKCBpc19saW5rKCAkcm9vdCAuIGx0cmltKCAkZXhjbHVzaW9uLCBESVJFQ1RPUllfU0VQQVJBVE9SICkgKSApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgc3ltYm9saWMgbGluayBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkKCQkJCS8vIERPRVMgTk9UIEVYSVNULgoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbWl0dGluZyBleGNsdXNpb24gYXMgZmlsZS9kaXJlY3RvcnkgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0OiBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkJCgkJCQkJLy8gU2tpcCB0byBuZXh0IGV4Y2x1c2lvbgoJCQkJCWNvbnRpbnVlOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBXZSBoYXZlIGEgdmFsaWQgZXhjbHVkZSBzbyBhZGQgaXQKCQkJCSRzYW5pdGl6ZWRfZXhjbHVzaW9uc1tdID0gJGV4Y2x1c2lvbjsKCQkJCQoJCQl9CgkJCQoJCQkvLyBQdXQgdGhlIGV4Y2x1c2lvbnMgdG8gYSBmaWxlIGFzIGEgc3RyaW5nCgkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkZmlsZSwgaW1wbG9kZSggUEhQX0VPTCwgJHNhbml0aXplZF9leGNsdXNpb25zICkgLiBQSFBfRU9MICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JhY2t1cCBleGNsdXNpb25zIGZpbGUgY3JlYXRlZC4nICk7CgkJCQoJCX0gLy8gRW5kIHJlbmRlcl9leGNsdXNpb25zX2ZpbGUoKS4KCQkKCQkvKioKCQkgKglzbGFzaGlmeSgpCgkJICoKCQkgKglBIGZ1bmN0aW9uIHRvIGFkZCBhIHNsYXNoIHRvIHRoZSBlbmQgb2YgYSBwYXRoLiBJdCBpcyBtdWNoIGxpa2UgdGhlIFdvcmRQcmVzcyB0cmFpbGluZ3NsYXNoaXQoKQoJCSAqCWJ1dCBhbGxvd3MgZm9yIG5vdCBhZGRpbmcgYSBzbGFzaCB0byBhbiBlbXB0eSBwYXRoLiBXaWxsIGFkZCBhIG5vcm1hbGl6ZWQgc2xhc2ggdW5sZXNzIG92ZXJyaWRkZW4KCQkgKglOb3RlOiBXaWxsIG5vdCBwcm9jZXNzIGFueSBlbWJlZGRlZCBkaXJlY3Rvcnkgc2VwYXJhdG9ycwoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkkcGF0aAkJCQkJVGhlIHBhdGggdG8gYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8KCQkgKglAcGFyYW0JYm9vbAkkaWdub3JlX2VtcHR5CQkJVHJ1ZSAoZGVmYXVsdCkgaWYgc2hvdWxkIF9ub3RfIGFkZCBhIHRyYWlsaW5nIHNsYXNoIHRvIGFuIGVtcHR5IHBhdGgKCQkgKglAcGFyYW0JYm9vbAkkdXNlX25vcm1hbGl6ZWRfc2xhc2gJVHJ1ZSAoZGVmYXVsdCkgdG8gYWRkIGEgbm9ybWFsaXplZCBzbGFzaCwgb3RoZXJ3aXNlIGFkZCBwbGF0Zm9ybSBzZXBhcmF0b3IKCQkgKglAcmV0dXJuCXN0cmluZwkJCQkJCQlUaGUgcGF0aCB3aXRoIHRyYWlsaW5nIHNsYXNoIG9wdGlvbmFsbHkgYWRkZWQKCQkgKgoJCSAqLwoJCSAKCQkgcHJvdGVjdGVkIGZ1bmN0aW9uIHNsYXNoaWZ5KCAkcGF0aCwgJGlnbm9yZV9lbXB0eSA9IHRydWUsICR1c2Vfbm9ybWFsaXplZF9zbGFzaCA9IHRydWUgKSB7CgkJIAoJCSAJLy8gQ2hlY2sgaWYgaXQgaXMgZW1wdHkgbm93IGJlZm9yZSB3ZSBtYXkgcmVtb3ZlIGEgc2luZ2xlIHNsYXNoCgkJIAlpZiAoICEgKCBlbXB0eSggJHBhdGggKSAmJiAoIHRydWUgPT09ICRpZ25vcmVfZW1wdHkgKSApICkgewoJCSAJCgkJCQkvLyBGaXJzdCByZW1vdmUgYW55IHRyYWlsaW5nIHNsYXNoIHRoYXQgbWF5IGJlIHByZXNlbnQKCQkJCSRwYXRoID0gJHRoaXMtPnVuc2xhc2hpZnkoICRwYXRoICk7CgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJHVzZV9ub3JtYWxpemVkX3NsYXNoICkgewoJCQkJCgkJCQkJJHBhdGggPSAkcGF0aCAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCSRwYXRoID0gJHBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkJCgkJCQl9CgkJCQkKCQkgCX0KCQkgCQoJCSAJcmV0dXJuICRwYXRoOwoJCSAKCQkgfQoJCQoJCS8qKgoJCSAqCXVuc2xhc2hpZnkoKQoJCSAqCgkJICoJQSBmdW5jdGlvbiB0byByZW1vdmUgYSBzbGFzaCB0byB0aGUgZW5kIG9mIGEgcGF0aC4gSXQgaXMgbXVjaCBsaWtlIHRoZSBXb3JkUHJlc3MgdW50cmFpbGluZ3NsYXNoaXQoKQoJCSAqCWJ1dCBjb3BlcyB3aXRoIGVpdGhlciBmb3JtIG9mIHRyYWlsaW5nIHNsYXNoLgoJCSAqCU5vdGU6IFdpbGwgbm90IHByb2Nlc3MgYW55IGVtYmVkZGVkIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGFuZCBtYXkgcHJvZHVjZSBhbiBlbXB0eSBwYXRoLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkkcGF0aAkJCQkJVGhlIHBhdGggdG8gcmVtb3ZlIGEgdHJhaWxpbmcgc2xhc2ggZnJvbQoJCSAqCUBwYXJhbQlib29sCSRpZ25vcmVfZW1wdHkJCQlUcnVlIChkZWZhdWx0KSBpZiBzaG91bGQgcHJvY2VlZCBldmVuIGlmIHdpbGwgcHJvZHVjZSBhbiBlbXB0eSBwYXRoCgkJICoJQHJldHVybglzdHJpbmcJCQkJCQkJVGhlIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaCByZW1vdmVkCgkJICoKCQkgKi8KCQkgCgkJIHByb3RlY3RlZCBmdW5jdGlvbiB1bnNsYXNoaWZ5KCAkcGF0aCwgJGlnbm9yZV9lbXB0eSA9IHRydWUgKSB7CgkJIAoJCSAJLy8gQ3JlYXRlIGEgY2FuZGlkYXRlIHBhdGggdG8gb3B0aW9uYWxseSByZXR1cm4KCQkgCSRjYW5kaWRhdGVfcGF0aCA9IHJ0cmltKCAkcGF0aCwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKTsKCQkgCgkJIAkvLyBJZiBjYW5kaWRhdGUgaXNuJ3QgZW1wdHkgb3Igd2UncmUgaWdub3JpbmcgaXQgYmVpbmcgZW1wdHkgYW55d2F5CgkJIAlpZiAoICFlbXB0eSggJGNhbmRpZGF0ZV9wYXRoICkgfHwgKCB0cnVlID09PSAkaWdub3JlX2VtcHR5ICkgKSB7CgkJIAkKCQkJCSRwYXRoID0gJGNhbmRpZGF0ZV9wYXRoOwoJCQkJCgkJIAl9CgkJIAkKCQkgCXJldHVybiAkcGF0aDsKCQkgCgkJIH0KCQkKCQkvKioKCQkgKglsb2dfemlwX3JlcG9ydHMoKQoJCSAqCgkJICoJQSBmdW5jdGlvbiB0byBwcm9jZXNzIHJlcG9ydHMgcGFyc2VkIGZyb20gdGhlIHppcCBwcm9jZXNzIG91dHB1dCBhbmQgbG9nIHRoZW0gYW5kIG9wdGlvbmFsbHkKCQkgKglzZW5kIHRvIGEgZmlsZSBpZiB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVwb3J0cy4gSWYgdGhlIG51bWJlciBvZiByZXBvcnRzIGlzIHN1Y2ggdGhhdCB0aGV5IHJlcXVpcmUKCQkgKgl0byBiZSB3cml0dGVuIHRvIGEgZmlsZSB0aGVuIGFsbCB0aGUgcmVwb3J0cyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUsIG5vdCBqdXN0IHRoZSBvdmVyZmxvdy4KLgkJICoKCQkgKglAcGFyYW0JYXJyYXkJJHJlcG9ydHNfbG9nCQkJYXJyYXkgY29udGFpbmluZyB0aGUgdHlwZSBvZiByZXBvcnRzIHRvIGxvZwoJCSAqCUBwYXJhbQlhcnJheQkkcmVwb3J0c19kZXNjCQkJYXJyYXkgY29udGFpbmluZyB0ZXh0IGRlc2NyaXB0aW9uIG9mIHJlcG9ydCByZWFzb24KCQkgKglAcGFyYW0Jc3RyaW5nCSRyZXBvcnRfcHJlZml4CQkJYSBwcmVmaXggc3RyaW5nIHRvIGdvIGJlZm9yZSB0aGUgcmVwb3J0IHRleHQKCQkgKglAcGFyYW0JaW50ZWdlcgkkcmVwb3J0X2xpbmVzX3RvX3Nob3cJdGhlIG51bWJlciBvZiByZXBvcnRzIHRvIHNob3cgaW4gbG9nIGJlZm9yZSBvdmVyZmxvd2luZyB0byBhIGZpbGUKCQkgKglAcGFyYW0Jc3RyaW5nCSRyZXBvcnRfZmlsZQkJCW92ZXJmbG93IGZpbGUgaWYgdG9vIG1hbnkgcmVwb3J0cyB0byBzaG93IGRpcmVjdGx5IGluIGxvZwoJCSAqCUByZXR1cm4JTi9BCQkJCQkJCQlDdXJyZW50bHkgbm8gcmV0dXJuIHBhcmFtZXRlcgoJCSAqCgkJICovCgkJIAoJCXByb3RlY3RlZCBmdW5jdGlvbiBsb2dfemlwX3JlcG9ydHMoICRyZXBvcnRzX2xvZywgJHJlcG9ydF9kZXNjLCAkcmVwb3J0X3ByZWZpeCwgJHJlcG9ydF9saW5lc190b19zaG93LCAkcmVwb3J0c19maWxlICkgewoKCQkJJHJlcG9ydHMgPSBhcnJheSgpOwoJCQkkcmVwb3J0c19jb3VudCA9IDA7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCS8vIE1ha2Ugc3VyZSB3ZSBjbGVhciB1cCBhbnQgcHJldmlvdXMgcmVwb3J0cyBmaWxlIHRoYXQgbWF5IHN0aWxsIGJlIHByZXNlbnQKCQkJaWYgKCBAZmlsZV9leGlzdHMoICRyZXBvcnRzX2ZpbGUgKSApIHsKCQoJCQkJQHVubGluayggJHJlcG9ydHNfZmlsZSApOwoJCQoJCQl9CgoJCQkvLyBQYXJzZSB0aGUgcmVwb3J0cyBhcnJheSBpbnRvIGFuIG9yZGVyZWQgYXJyYXkgYmFzZWQgb24gaWQgKGxvZyBsaW5lIG51bWJlcikgYXMgc29ydCBrZXkKCQkJZm9yZWFjaCAoICRyZXBvcnRzX2xvZyBhcyAkcmVhc29uID0+ICRyZXBvcnQgKSB7CgkKCQkJCWZvcmVhY2ggKCAkcmVwb3J0IGFzICRpZCA9PiAkZmlsZW5hbWUgKSB7CgoJCQkJCSRyZXBvcnRzWyAkaWQgXSA9IHNwcmludGYoIF9fKCAnJTEkczogKCUyJHMpOiAlMyRzJyAuIFBIUF9FT0wsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRyZXBvcnRfcHJlZml4LCAkcmVwb3J0X2Rlc2NbICRyZWFzb24gXSwgJGZpbGVuYW1lICk7CgoJCQkJfQoJCgkJCX0KCQoJCQkvLyBNYWtlIHN1cmUgYXJyYXkgaXMgbm93IG9yZGVyZWQgYnkgdGhlIG51bWVyaWMgbG9nIGxpbmUgbnVtYmVyIGtleQoJCQkkcmVzdWx0ID0ga3NvcnQoICRyZXBvcnRzLCBTT1JUX05VTUVSSUMgKTsKCgkJCS8vIEFsd2F5cyBzaG93IHRoZSBmaXJzdCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGxvZwoJCQkkc2hvd19saW5lcyA9IGFycmF5X3NsaWNlKCAkcmVwb3J0cywgMCwgJHJlcG9ydF9saW5lc190b19zaG93LCB0cnVlICk7CgoJCQlmb3JlYWNoICggJHNob3dfbGluZXMgYXMgJGxpbmUgKSB7CgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJGxpbmUgKTsKCgkJCX0KCQkKCQkJLy8gSWYgdGhlcmUgd2VyZSBtb3JlIGxpbmVzIHRoZW4gb3V0cHV0IHRoZSB3aG9sZSB0byB0aGUgcmVwb3J0IGZpbGUKCQkJJHJlcG9ydHNfY291bnQgPSBzaXplb2YoICRyZXBvcnRzICk7CgkJCWlmICggJHJlcG9ydHNfY291bnQgID4gJHJlcG9ydF9saW5lc190b19zaG93ICkgewoJCgkJCQlAZmlsZV9wdXRfY29udGVudHMoICRyZXBvcnRzX2ZpbGUsICRyZXBvcnRzICk7CgkJCgkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHJlcG9ydHNfZmlsZSApICkgewoJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdaaXAgcHJvY2VzcyByZXBvcnRlZCAlMSRzIG1vcmUgJTIkcyByZXBvcnQlMyRzIC0gcGxlYXNlIHJldmlldyBpbjogJTQkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICggJHJlcG9ydHNfY291bnQgLSAkcmVwb3J0X2xpbmVzX3RvX3Nob3cgKSwgJHJlcG9ydF9wcmVmaXgsICggKCAxID09ICRyZXBvcnRzX2NvdW50ICkgPyAnJyA6ICdzJyApLCAkcmVwb3J0c19maWxlICkgKTsKCQkJCgkJCQl9CgkJCgkJCX0KCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaXNfYXZhaWxhYmxlKCAkdGVtcGRpciApOwoJCQoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90aGVyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgPSBOVUxMICk7CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyA9IGFycmF5KCkgKTsKCgkJLyoqCgkJICoJZmlsZV9leGlzdHMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKglJZiBsZWF2ZV9vcGVuIGlzIHRydWUgdGhlbiB0aGUgemlwIG9iamVjdCB3aWxsIGJlIGxlZnQgb3BlbiBmb3IgZmFzdGVyIGNoZWNraW5nIGZvciBzdWJzZXF1ZW50IGZpbGVzIHdpdGhpbiB0aGlzIHppcAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXBfZmlsZQkJVGhlIHppcCBmaWxlIHRvIGNoZWNrCgkJICoJQHBhcmFtCQlzdHJpbmcJJGxvY2F0ZV9maWxlCVRoZSBmaWxlIHRvIHRlc3QgZm9yCgkJICoJQHBhcmFtCQlib29sCSRsZWF2ZV9vcGVuCQlPcHRpb25hbDogVHJ1ZSBpZiB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGxlZnQgb3BlbgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBvdGhlcndpc2UgZmFsc2UKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBmaWxlX2V4aXN0cyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUsICRsZWF2ZV9vcGVuID0gZmFsc2UgKTsKCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICk7CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJGNvbW1lbnQgKTsKCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlICk7CgkJCgoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIGNsYXNzLgkKCQp9Cj8+Cg== ###PACKDATA,FILE_END,/lib/zipbuddy/zbzipcore.php,importbuddy/lib/zipbuddy/zbzipcore.php ###PACKDATA,FILE_START,/lib/zipbuddy/zbzipexec.php,importbuddy/lib/zipbuddy/zbzipexec.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwZXhlYyBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcGV4ZWMiICkgKSB7CgoJY2xhc3MgcGx1Z2luYnVkZHlfemJ6aXBleGVjIGV4dGVuZHMgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIHsKCQoJCS8vIENvbnN0YW50cyBmb3IgZmlsZSBoYW5kbGluZwoJCWNvbnN0IFpJUF9MT0dfRklMRV9OQU1FICAgICAgICA9ICd0ZW1wX3ppcF9leGVjX2xvZy50eHQnOwoJCWNvbnN0IFpJUF9FUlJPUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X2V4ZWNfZXJyb3JzLnR4dCc7CgkJY29uc3QgWklQX1dBUk5JTkdTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfZXhlY193YXJuaW5ncy50eHQnOwoJCWNvbnN0IFpJUF9PVEhFUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X2V4ZWNfb3RoZXJzLnR4dCc7CgkJY29uc3QgWklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FID0gJ2V4Y2x1c2lvbnMudHh0JzsKCQljb25zdCBaSVBfSU5DTFVTSU9OU19GSUxFX05BTUUgPSAnaW5jbHVzaW9ucy50eHQnOwoJCWNvbnN0IFpJUF9URVNUX0ZJTEUgICAgICAgICAgICA9ICcvemJ6aXAucGhwJzsgLy8gQ29udGFpbnMgZmlsZSB0ZXN0LnR4dCB3aXRoIGNvbnRlbnQgIkhlbGxvIFdvcmxkIgoJCWNvbnN0IFpJUF9URVNUX0ZJTEVfU0lHICAgICAgICA9ICIwYTBmOWIyOGM1ZmY4OWRmYjRmMmEwNDcyYmUwZWE4ZiI7CgkJCgkJLy8gUG9zc2libGUgZXhlY3V0YWJsZSBwYXRoIHNldHMKCQljb25zdCBERUZBVUxUX0VYRUNVVEFCTEVfUEFUSFMgPSAnL3Vzci9sb2NhbC9iaW46Oi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjovdXNyL3NiaW46L3NiaW46L2Jpbic7CgkJY29uc3QgV0lORE9XU19FWEVDVVRBQkxFX1BBVEhTID0gJyc7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogbWV0aG9kIHRhZyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtZXRob2QgYW5kIGVudGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdCBzdWNoIGFzIGNsYXNzIG5hbWUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyICRfbWV0aG9kX3RhZyAJc3RyaW5nCiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF90YWcgPSAnZXhlYyc7CgkJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSBmYWxzZTsKCQkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyB0ZWxscyB1cyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgbWV0aG9kIHNvIHRoZXkgY2FuIGJlIGNoZWNrIHRvIHNlZSBpZiB0aGUgbWV0aG9kIGNhbiBiZSBzdXBwb3J0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF9kZXBlbmRlbmNpZXMgPSBhcnJheSggJ2NsYXNzZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZnVuY3Rpb25zJyA9PiBhcnJheSggJ2V4ZWMnICksCgkJCQkJCQkJCQkJICAJCSAnZXh0ZW5zaW9ucycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdmaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdjaGVja19mdW5jJyA9PiAnY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnCgkJCQkJCQkJCQkJCQkpOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBCb29sZWFuIHRvIGluZGljYXRlIGlmIHdlIGNhbiBzdXBwb3J0IGNvbW1lbnQgaGFuZGxpbmcgYmFzZWQgb24gZGVwZW5kZW5jeSBjaGVjawogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF9hbGxvd19pc19jb21tZW50ZXIgYm9vbAogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCBzdGF0aWMgJF9hbGxvd19pc19jb21tZW50ZXIgPSB0cnVlOwogICAgICAgIAoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfdGFnX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIHN0YXRpYyBtZXRob2QgdGFnIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCXN0cmluZwlUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCgkJLyoqCgkJICogCgkJICogZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIGNvbXBhdGliaWxpdHkgbWV0aG9kIGluZGljYXRvciBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlib29sCVRydWUgaWYgaXMgYSBjb21wYXRpYmlsaXR5IG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Rfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9pc19jb21wYXRpYmlsaXR5X21ldGhvZDsKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIG1ldGhvZCBkZXBlbmRlbmNpZXMgYXJyYXkgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVxdWlyZXMgdG8gYmUgYSBzdXBwb3J0ZWQgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX2RlcGVuZGVuY2llczsKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljKCkKCQkgKgoJCSAqIEFsbG93cyBhZGRpdGlvbmFsIG1ldGhvZCBkZXBlbmRlbmN5IGNoZWNrcyBiZXlvbmQgdGhlIHN0YW5kYXJkIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgY2hlY2tzIHBhc3NlZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQkvLyBOZWVkIHRvIGNoZWNrIGlmIGZ1bmN0aW9uIGVzY2FwZXNoZWxsYXJnIG9zIGF2YWlsYWJsZSAtIGlmIG5vdCB0aGVuIGV4ZWMgY2Fubm90CgkJCS8vIGJlIHVzZWQgZm9yIGNvbW1lbnQgaGFuZGxpbmcuIFRoaXMgaXNuJ3QgYSBzaG93IHN0b3BwZXIgc28gd2UnbGwgcmV0dXJuIHRydWUKCQkJLy8gYnV0IHNldCBhbiBpbnRlcm5hbCBmbGFnIHRvIGRpc2FibGUgY29tbWVudGluZyBjYXBhYmlsaXR5LgoJCQkKCQkJJGZ1bmN0aW9ucyA9IGFycmF5KCAnZXNjYXBlc2hlbGxhcmcnICk7CgkJCQoJCQkkZGlzYWJsZWRfZnVuY3Rpb25zID0gYXJyYXlfbWFwKCAidHJpbSIsIGV4cGxvZGUoICcsJywgaW5pX2dldCggJ2Rpc2FibGVfZnVuY3Rpb25zJyApICkgKTsKCQkJCgkJCS8vIENoZWNrIGVhY2ggZnVuY3Rpb24gZGVwZW5kZW5jeSBhbmQgYmFpbCBvdXQgb24gZmlyc3QgZmFpbHVyZQoJCQlmb3JlYWNoICggJGZ1bmN0aW9ucyBhcyAkZnVuY3Rpb24gKSB7CgkJCQoJCQkJJGZ1bmN0aW9uID0gdHJpbSggJGZ1bmN0aW9uICk7CgkJCQkKCQkJCWlmICggISggKCBmdW5jdGlvbl9leGlzdHMoICRmdW5jdGlvbiApICkgJiYgKCAhaW5fYXJyYXkoICRmdW5jdGlvbiwgJGRpc2FibGVkX2Z1bmN0aW9ucyApICkgKSApIHsKCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJCQoJCQkJfQoJCQkKCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCgkJCQkvLyBGb3VuZCB0aGF0IGVzY2FwZXNoZWxsYXJnIG5vdCBhdmFpbGFibGUgc28gZXhlYyBjYW5ub3QgYmUgdXNlZCBmb3IgY29tbWVudCBoYW5kbGluZwoJCQkJc2VsZjo6JF9hbGxvd19pc19jb21tZW50ZXIgPSBmYWxzZTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiB0cnVlOwoJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRwYXJlbnQJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdHVzKCkgZnVuY3Rpb24gZm9yIHN0YXR1cyB1cGRhdGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJiRwYXJlbnQgPSBOVUxMICkgewoKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCggJHBhcmVudCApOwoJCQkKCQkJLy8gU2V0IHRoZSBpbnRlcm5hbCBmbGFnIGluZGljYXRpbmcgaWYgZXhlY19kaXIgaXMgc2V0IGluIHRoZSBQSFAgZW52aXJvbm1lbnQKCQkJJHRoaXMtPnNldF9leGVjX2Rpcl9mbGFnKCk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnRXhlYyBNZXRob2QnLAoJCQkJCQkJCQkJCQkJICAJCQkgICAnY29tcGF0aWJpbGl0eScgPT4gcGx1Z2luYnVkZHlfemJ6aXBleGVjOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kICkKCQkJCQkJCQkJCQkJCSAgCSAgICk7CgkJCQkJCQkJCQkJCQkgIAkgICAKCQkJLy8gTm93IHNldCB1cCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIHBhdGhzIChub3QgbWVyZ2luZyBidXQgc2V0dGluZykKCQkJLy8gTm90ZTogUGFyZW50IGNvbnN0cnVjdG9yIHNldCB0aGUgb3MgdHlwZSB2YWx1ZQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBleHBsb2RlKCBQQVRIX1NFUEFSQVRPUiwgc2VsZjo6REVGQVVMVF9FWEVDVVRBQkxFX1BBVEhTICksIGZhbHNlKTsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBleHBsb2RlKCBQQVRIX1NFUEFSQVRPUiwgc2VsZjo6V0lORE9XU19FWEVDVVRBQkxFX1BBVEhTICksIGZhbHNlKTsKCQkJCQkKCQkJCQkvLyBOZWVkIHRvIG1lcmdlIGluIEFCU1BBVEggaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBzZXQgdGhhdCBpbiB0aGUgZGVmYXVsdHMgLSBpdCBpcyBwcmVwZW5kZWQKCQkJCQkkdGhpcy0+c2V0X2V4ZWN1dGFibGVfcGF0aHMoIGFycmF5KCBydHJpbSggQUJTUEFUSCwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKTsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkJLy8gTG9nIGVycm9yIGFuZCBsZWF2ZSBwYXRocyBlbXB0eQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1Vua25vd24gT1MgdHlwZSAoJTEkcykgY291bGQgbm90IHNldCBleGVjdXRhYmxlIHBhdGhzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHRoaXMtPmdldF9vc190eXBlKCkgKSApOwoJCQkJCQoJCQl9CgkJCQoJCX0KCQkKCQkvKioKCQkgKglfX2Rlc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGRlc3RydWN0b3IuCgkJICoJCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoICkgewoJCQoJCQlwYXJlbnQ6Ol9fZGVzdHJ1Y3QoKTsKCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9tZXRob2RfdGFnKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBtZXRob2QgdGFnCgkJICoJCgkJICoJQHJldHVybgkJc3RyaW5nIFRoZSBtZXRob2QgdGFnCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWcoKSB7CgkJCgkJCXJldHVybiBwbHVnaW5idWRkeV96YnppcGV4ZWM6OiRfbWV0aG9kX3RhZzsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgYm9vbGVhbgoJCSAqCQoJCSAqCUByZXR1cm4JCWJvb2wKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKSB7CgkJCgkJCXJldHVybiBwbHVnaW5idWRkeV96YnppcGV4ZWM6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfY29tbWFuZF9wYXRoKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdGhlIHBhdGggZm9yIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBmcm9tIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCUlmIG5vdCBmb3VuZCB0aGVuIHdpbGwgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGljaCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUKCQkgKgljb21tYW5kIGlzIGJlaW5nIGFjY2Vzc2VkIHRocm91Z2ggUEFUSAoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQlQYXRoIGZvciBjb21tYW5kLCB0cmltbWVkIC0gbWF5IGJlIGVtcHR5CgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbW1hbmRfcGF0aCggJGNvbW1hbmQgPSBzZWxmOjpDT01NQU5EX1VOS05PV05fUEFUSCApIHsKCQkKCQkJJHJlc3VsdCA9ICcnOwoJCQkKCQkJc3dpdGNoKCAkY29tbWFuZCApIHsKCQkJCgkJCQljYXNlIHNlbGY6OkNPTU1BTkRfWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApICkgewoJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJpbSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApOwoJCQkJCX0KCQkJCQkKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgKSB7CgkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cmltKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gKTsKCQkJCQl9CgkJCQkJCgkJCQkJYnJlYWs7CgkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBkZWZhdWx0IGZvciBub3cKCQkJCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgc2V0cyB0aGUgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIG1ldGhvZCBkZXRhaWxzCgkJICoJVXNlICJ6aXAgLWgiIHRvIGdldCBhIHN0YW5kYXJkaXplZCBoZWxwIG91dHB1dCB0aGF0IGNvbnRhaW5zIHRoZSB6aXAgdmVyc2lvbi4KCQkgKglUaGVvcmV0aWNhbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSAiemlwIC12IiB0byBnZXQgemlwIHZlcnNpb24gYW5kIGJ1aWxkCgkJICoJZGV0YWlscyBidXQgcHJlLXYzIHppcCBydW5uaW5nICJ6aXAgLXYiIHdpbGwgbm90IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dCBiZWNhdXNlCgkJICoJdGhlcmUgaXMgbm8gdHR5IGF0dGFjaGVkICh3aGVuIHJ1bm5pbmcgdGhyb3VnaCBleGVjKCkgb3IgZXF1aXZhbGVudCksIGluc3RlYWQKCQkgKglpdCB3aWxsIChvciBzaG91bGQpIHByb2R1Y2UgYSB6aXAgZmlsZS4gSG93ZXZlciwgaXQgaGFzIGJlZW4gZm91bmQgdGhhdCBldmVuIHRoaXMKCQkgKglpcyBub3QgcmVsaWFibGUgYW5kIHNvbWUgaW5zdGFsbGF0aW9ucyBqdXN0IHNlZW0gdG8gZnJlZXplIHdoZW4gInppcCAtdiIgaXMgcnVuCgkJICoJd2hpY2ggYm9ya3MgdGhlIHdob2xlIHByb2Nlc3MuCgkJICoJU28gd2UgdXNlICJ6aXAgLWgiIGZpcnN0IHRvIGdldCB0aGUgYmFzaWMgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGFzIGEgZnV0dXJlCgkJICoJZXh0ZW5zaW9uIGlmIGl0IGlzIHZlcnNpb24gMy4wKyAoMy4wIGlzIGN1cnJlbnQgYW5kIDMuMSBoYXNuJ3QgYmVlbiBvZmZpY2lhbGx5CgkJICoJcmVsZWFzZWQpIHdlIG1heSB0aGVuIHJ1biAiemlwIC12IiB0byBnZXQgdGhlIGV4dGVuZGVkIHZlcnNpb24gYW5kIGJ1aWxkIGluZm9ybWF0aW9uLgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfemlwX3ZlcnNpb24oICRtYWpvciA9IDAsICRtaW5vciA9IDAsICRvdmVycmlkZSA9IGZhbHNlICkgewoJCQoJCQkkZXhpdGNvZGUgPSAxMjc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRpbmZvID0gJyc7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkJcmV0dXJuICR0aGlzOyAKCQkJCgkJCX0KCQkJCgkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLWgnOwoJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gRXhwZWN0IGZvcm1hdCBsaWtlOiBaaXAgMy4wIChKdWx5IDV0aCAyMDA4KS4uLgoJCQkJLy8gICAgICAgICAgICAgICAgICAgICBaaXAgMy4xYyBCRVRBIChKdW5lIDIybmQgMjAxMCkuLi4KCQkJCS8vIFRoZSBtYXRjaCBzaG91bGQgdGFrZSBvbmx5IHRoZSBtYWpvci9taW5vciBkaWdpdHMgYW5kIGlnbm9yZSBhbnkgZm9sbG93aW5nIGFscGhhCgkJCQkvLyBNYXkgZXh0ZW5kIHRvIGNhcHR1cmUgdGhlIGFscGhhIGFuZCBhbHNvIHdoZXRoZXIgQkVUQSBpbmRpY2F0ZWQgYnV0IG5vdCBjdXJyZW50bHkKCQkJCS8vIHJlcXVpcmVkLgoJCQkJZm9yZWFjaCAoICRvdXRwdXQgYXMgJGxpbmUgKSB7CgoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcClccysoP1A8bWFqb3I+XGQpXC4oP1A8bWlub3I+XGQrKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCgkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJJG1pbm9yID0gKGludCkkbWF0Y2hlc1sgJ21pbm9yJyBdOwoJCQkJCQlicmVhazsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IG1hdGNoIGEgdmVyc2lvbiB0aGVuIHN1c3BlY3QgdGhpcyBpcyBzdGlsbCBub3QgdmFsaWQgdmVyc2lvbiBpbmZvCi8vIAkJCQlpZiAoICFlbXB0eSggJG1hdGNoZXMgKSApIHsKLy8gCQkJCQovLyAJCQkJCS8vIFdlIGRpZCBtYXRjaCBhIHZlcnNpb24gc28gY2hlY2sgaWYgd2UgaGF2ZSBhIGNoYW5jZSBvZiBnZXR0aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLy8gCQkJCQlpZiAoIDMgPT09ICRtYWpvciApIHsKLy8gCQkJCQkKLy8gCQkJCQkJJGV4aXRjb2RlID0gMTI3OwovLyAJCQkJCQkkb3V0cHV0ID0gYXJyYXkoKTsKLy8gCQkJCQkKLy8gCQkJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAovLyAJCQkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLXYnOwovLyAJCQkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwovLyAJCQkJCQkKLy8gCQkJCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7Ci8vIAkJCQkKLy8gCQkJCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluZm8gc3RyaW5nCi8vIAkJCQkJCQkvLyBOb3RlOiBub3Qgd29ydGggY29tcHJlc3NpbmcgYXMgdGhhdCBnaXZlcyBhIGxhcmdlciBzdHJpbmcgYWZ0ZXIgY29udmVydGluZwovLyAJCQkJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCi8vIAkJCQkJCQkkaW5mbyA9IGltcGxvZGUoIFBIUF9FT0wsICRvdXRwdXQgKTsKLy8gCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ2luZm8nIF0gPSAkaW5mbzsKLy8gCQkJCQkJCi8vIAkJCQkJCX0KLy8gCQkJCQkKLy8gCQkJCQl9Ci8vIAkJCQkKLy8gCQkJCX0KCQkJCgkJCX0KCgkJCS8vIE5vdyB1c2UgZWl0aGVyIHdoYXQgd2UgZ290IG9yIHdoYXQgd2Ugd2VyZSBnaXZlbi4uLgoJCQlpZiAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF0gPSBhcnJheSggJ21ham9yJyA9PiAkbWFqb3IsICdtaW5vcicgPT4gJG1pbm9yICk7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7IAoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgZ2V0cyB0aGUgemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfdmVyc2lvbigpIHsKCQkKCQkJJHJlc3VsdCA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF07CgkJCQoJCQlpZiAoIDAgPT09ICRyZXN1bHRbICdtYWpvcicgXSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfdW56aXBfdmVyc2lvbigpCgkJICoJCgkJICoJVGhpcyBzZXRzIHRoZSB1bnppcCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfdW56aXBfdmVyc2lvbiggJG1ham9yID0gMCwgJG1pbm9yID0gMCwgJG92ZXJyaWRlID0gZmFsc2UgKSB7CgkJCgkJCSRleGl0Y29kZSA9IDA7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3ZlcnNpb24nIF0gPSBhcnJheSggJ21ham9yJyA9PiAkbWFqb3IsICdtaW5vcicgPT4gJG1pbm9yICk7CgkJCQlyZXR1cm4gJHRoaXM7IAoJCQkKCQkJfQoJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCSR6aXBwYXRoID0gJHRoaXMtPmdldF9jb21tYW5kX3BhdGgoIHNlbGY6OkNPTU1BTkRfVU5aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCAtdic7CQoJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gU2hvdWxkIGJlIGdvb2Qgb3V0cHV0IHRvIHRyeSBhdCBsZWFzdAoJCQkJZm9yZWFjaCAoICRvdXRwdXQgYXMgJGxpbmUgKSB7CgoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHVuemlwKVxzKyg/UDxtYWpvcj5cZClcLig/UDxtaW5vcj5cZCspL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkKCQkJCQkJJG1ham9yID0gKGludCkkbWF0Y2hlc1sgJ21ham9yJyBdOwoJCQkJCQkkbWlub3IgPSAoaW50KSRtYXRjaGVzWyAnbWlub3InIF07CgkJCQkJCWJyZWFrOwoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkKCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluZm8gc3RyaW5nCgkJCQkvLyBOb3RlOiBub3Qgd29ydGggY29tcHJlc3NpbmcgYXMgdGhhdCBnaXZlcyBhIGxhcmdlciBzdHJpbmcgYWZ0ZXIgY29udmVydGluZwoJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCgkJCQkkaW5mbyA9IGltcGxvZGUoIFBIUF9FT0wsICRvdXRwdXQgKTsKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAnaW5mbycgXSA9ICRpbmZvOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE5vdyB1c2UgZWl0aGVyIHdoYXQgd2UgZ290IG9yIHdoYXQgd2Ugd2VyZSBnaXZlbi4uLgoJCQlpZiAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsgCgkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF91bnppcF92ZXJzaW9uKCkKCQkgKgkKCQkgKglUaGlzIGdldHMgdGhlIHVuemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF91bnppcF92ZXJzaW9uKCkgewoJCQoJCQkkcmVzdWx0ID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdOwoJCQkKCQkJaWYgKCAwID09PSAkcmVzdWx0WyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3ppcF9zdXBwb3J0c19sb2dmaWxlKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgemlwIGluIHVzZSBpcyBhYmxlIHRvIHN1cHBvcnQgbG9nZmlsZSB1c2FnZSBmb3IKCQkgKglsb2dnaW5nIHByb2dyZXNzIG9mIHppcCBvcGVyYXRpb24KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgbG9nZmlsZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfc3VwcG9ydHNfbG9nX2ZpbGUoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIEN1cnJlbnRseSBjaGVjayBiYXNlZCBqdXN0IG9uIHRoZSB6aXAgbWFqb3IgdmVyc2lvbgoJCQkvLyBUT0RPOiBkZWNpZGUgaWYgYmV0dGVyIHRvIHJlc3BvbmQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zCgkJCWlmICggMyA8PSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdWyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBpc19hdmFpbGFibGUoICR0ZW1wZGlyICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCS8vIFRoaXMgaXMganVzdCBhIG5pY2V0eSBmb3Igbm93IHVudGlsIHBsYXRmb3JtIGhhbmRsaW5nIGlzIGZ1bGx5IHJlc29sdmVkCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmlzX2F2YWlsYWJsZV9nZW5lcmljKCAkdGVtcGRpciApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmlzX2F2YWlsYWJsZV9nZW5lcmljKCAkdGVtcGRpciApOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCSAgCQoJCX0KCQkKCQkvKioKCQkgKglpc19hdmFpbGFibGVfZ2VuZXJpYygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBpc19hdmFpbGFibGVfZ2VuZXJpYyggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHBlbmRpbmdfcmVzdWx0ID0gZmFsc2U7CgkJCSRmb3VuZF96aXAgPSBmYWxzZTsKCQkJCgkJCS8vIFRoaXMgaXMgYSBzYWZldHkgdmFsdWUgaW4gY2FzZSBleGVjKCkgZmFpbHMgLSBob3BlZnVsbHkgaXQgd2lsbCBub3QgdXBkYXRlIHRoaXMKCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCSRjYW5kaWRhdGVfcGF0aHMgPSAkdGhpcy0+Z2V0X2V4ZWN1dGFibGVfcGF0aHMoKTsKCQkJCQoJCQkJLy8gV2UgYXJlIHNlYXJjaGluZyBmb3IgemlwIHVzaW5nIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHBhdGhzCgkJCQl3aGlsZSAoICggZmFsc2UgPT0gJGZvdW5kX3ppcCApICYmICggIWVtcHR5KCAkY2FuZGlkYXRlX3BhdGhzICkgKSApIHsKCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSBpdCBpcyBjbGVhbiBvZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UKCQkJCQkkcGF0aCA9IHRyaW0oIGFycmF5X3NoaWZ0KCAkY2FuZGlkYXRlX3BhdGhzICkgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnRXhlYyB0ZXN0ICh6aXApIHRyeWluZyBleGVjdXRhYmxlIHBhdGg6JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgYCcgLiAkcGF0aCAuICdgLicgKTsKCgkJCQkJJHRlc3RfZmlsZSA9ICR0ZW1wZGlyIC4gJ3RlbXBfdGVzdF8nIC4gdW5pcWlkKCkgLiAnLnppcCc7CgkJCQkJCgkJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAnemlwJyAuICIgJ3skdGVzdF9maWxlfSciIC4gIiAnIiAuIF9fRklMRV9fIC4gICInIjsKCQkJCQkKCQkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgkJCQkJCQkJCQoJCQkJCUBleGVjKCAkY29tbWFuZCwgJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKTsKCQkJCgkJCQkJLy8gTXVzdCBoYXZlIGJvdGggYSBmaWxlIGFuZCBhIHN1Y2Nlc3MgZXhpdCBjb2RlIHRvIGNvbnNpZGVyIHRoaXMgc3VjY2Vzc2Z1bAoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgJiYgKCAwID09PSAkZXhlY19leGl0X2NvZGUgKSApIHsKCQkJCgkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkKCQkJCQkJLy8gUGxhdGZvcm0gaW5kZXBlbmRlbnQgY2FwYWJpbGl0aWVzCgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfemlwcGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19hcmNoaXZlcicgXSA9IHRydWU7CgkJCQkJCQoJCQkJCQkvLyBQbGF0Zm9ybSBzcGVjaWZpYyBjYXBhYmlsaXRpZXMKCQkJCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCQkJLy8gTm9uZSBBcHBsaWNhYmxlCgkJCQkJCQkJYnJlYWs7CgkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCS8vIFRoZXJlIGlzIG5vIGRlZmF1bHQKCQkJCQkJfQoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh6aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCQkJCS8vIFRPRE86IENvbnNpZGVyIHBhcnNpbmcgemlwIGZpbGUgdG8gZ2V0IHZlcnNpb24gb2YgemlwIHRoYXQgY3JlYXRlZCBpdC4gVGhpcyBtYXkgc2VlbSBvZGQKCQkJCQkJLy8gYnV0IHByZS12MyB6aXAgaXQncyBub3QgcG9zc2libGUgdG8gcnVuICJ6aXAgLXYiIHRocm91Z2ggZXhlYygpIG9yIGVxdWl2YWxlbnQgYXMgaXQgb25seQoJCQkJCQkvLyBwcm92aWRlcyB0aGUgcmVxdWlyZWQgb3V0cHV0IGlmIGEgdHR5IGlzIGF0dGFjaGVkLCBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHppcCBmaWxlLiBXZQoJCQkJCQkvLyBtaWdodCBjb25zaWRlciBwYXJzaW5nIHRoZSBjcmVhdGVkIHppcCBmaWxlIGJ1dCBhcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBvbmUgaGVyZSB3ZQoJCQkJCQkvLyBtaWdodCBhcyB3ZWxsIHVzZSBpdAoJCQkJCQkKCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkkZm91bmRfemlwID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCQkvLyBEZWFsIHdpdGggdGhlIHBvc3NpYmxlIGZhaWx1cmUgY2F1c2VzCgkJCQkJCWlmICggIUBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4ZWMgdGVzdCAoemlwKSBGQUlMRUQ6IFRlc3QgemlwIGZpbGUgbm90IGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmICggMCAhPT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQkJCQkKCQkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhlY19leGl0X2NvZGU7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcCkgRkFJTEVEOiBleGVjIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gUmVtb3ZlIHRoZSB0ZXN0IHppcCBmaWxlIGlmIGl0IHdhcyBjcmVhdGVkCgkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJaWYgKCAhQHVubGluayggJHRlc3RfZmlsZSApICkgewoJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdFeGVjIHRlc3QgKHppcCkgdW5hYmxlIHRvIGRlbGV0ZSB0ZXN0IGZpbGUgKCVzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0ZXN0X2ZpbGUgKSApOwoJCQkJCQoJCQkJCQl9CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgemlwIGFueXdoZXJlIChvciBtYXliZSBmb3VuZCBpdCBidXQgaXQgZmFpbGVkKSB0aGVuIGxvZyBpdAoJCQkJaWYgKCBmYWxzZSA9PT0gJGZvdW5kX3ppcCApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcCkgRkFJTEVEOiBVbmFibGUgdG8gZmluZCB6aXAgZXhlY3V0YWJsZSBvbiBhbnkgc3BlY2lmaWVkIHBhdGguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gUmVtZW1iZXIgemlwIHJlc3VsdCBhbmQgcmVzZXQgZm9yIHVuemlwIHRlc3QKCQkJCSRwZW5kaW5nX3Jlc3VsdCA9ICRyZXN1bHQ7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHppcCB2ZXJzaW9uIGFuZCBwb3NzaWJseSBhdmFpbGFibGUgb3B0aW9ucy4gVGhpcyBjYW4gaGVscCB1cwoJCQkJLy8gZGV0ZXJtaW5lIGhvdyB0byBleGVjdXRlIG9wZXJhdGlvbnMgc3VjaCBhcyBjcmVhdGluZyBhIHppcCBmaWxlCgkJCQlpZiAoIHRydWUgPT09ICRmb3VuZF96aXAgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hlY2tpbmcgemlwIHZlcnNpb24uLi4nICk7CgoJCQkJCSR0aGlzLT5zZXRfemlwX3ZlcnNpb24oKTsKCQkJCQkKCQkJCQkkdmVyc2lvbiA9ICR0aGlzLT5nZXRfemlwX3ZlcnNpb24oKTsKCQkJCQlpZiAoIHRydWUgPT09IGlzX2FycmF5KCAkdmVyc2lvbiApICkgewoJCQkKCQkJCQkJKCAoIDIgPT0gJHZlcnNpb25bICdtYWpvcicgXSApICYmICggMCA9PSAkdmVyc2lvblsgJ21pbm9yJyBdICkgKSA/ICR2ZXJzaW9uWyAnbWlub3InIF0gPSAnWCcgOiB0cnVlIDsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ0ZvdW5kIHppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJCQl9IGVsc2UgewoJCQkKCQkJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoKCQkJCQl9CgoJCQkJfQoJCQkJCgkJCQkvLyBSZXNldCB0aGUgY2FuZGlkYXRlIHBhdGhzIGZvciBhIGZ1bGwgc2VhcmNoIGZvciB1bnppcAoJCQkJJGNhbmRpZGF0ZV9wYXRocyA9ICR0aGlzLT5fZXhlY3V0YWJsZV9wYXRoczsKCQkJCQkJICAKCQkJCS8vIFJlc2V0IHRoZSBzYWZldHkgdmFsdWUgaW4gY2FzZQoJCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkJCgkJCQkvLyBOZXcgc2VhcmNoCgkJCQkkZm91bmRfemlwID0gZmFsc2U7CgkJCQkKCQkJCS8vIFVzaW5nIGEgdGVzdCBmaWxlCgkJCQkkdGVzdF9maWxlID0gZGlybmFtZSggX19GSUxFX18gKSAuIHNlbGY6OlpJUF9URVNUX0ZJTEU7CgkJCQkKCQkJCS8vIEl0IGhhcyB0byBleGlzdCBhbmQgYmUgcmVhZGFibGUgb3RlaHJ3aXNlIHdlIGp1c3QgaGF2ZSB0byBiYWlsIG9uIHRlc3RpbmcgZm9yIHVuemlwCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnRXhlYyB0ZXN0ICh1bnppcCkgY2hlY2tpbmcgdGVzdCBmaWxlIHJlYWRhYmxlOiAlMSRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0ZXN0X2ZpbGUgKSApOwoJCQkJaWYgKCBpc19yZWFkYWJsZSggJHRlc3RfZmlsZSApICkgewoJCQkJCgkJCQkJLy8gT25seSBwcm9jZWVkIGlmIHRoZSBmaWxlIGxvb2tzIGFzIGV4cGVjdGVkCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ0V4ZWMgdGVzdCAodW56aXApIGNoZWNraW5nIHRlc3QgZmlsZSBpbnRhY3Q6ICUxJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgc2VsZjo6WklQX1RFU1RfRklMRV9TSUcgKSApOwoJCQkJCWlmICggc2VsZjo6WklQX1RFU1RfRklMRV9TSUcgPT09IG1kNV9maWxlKCAkdGVzdF9maWxlICkgKSB7CgkJCQkKCQkJCQkJLy8gV2UgYXJlIHNlYXJjaGluZyBmb3IgdW56aXAgdXNpbmcgdGhlIGxpc3Qgb2YgcG9zc2libGUgcGF0aHMKCQkJCQkJd2hpbGUgKCAoIGZhbHNlID09PSAkZm91bmRfemlwICkgJiYgKCAhZW1wdHkoICRjYW5kaWRhdGVfcGF0aHMgKSApICkgewoJCQkJCgkJCQkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgY2xlYW4gb2YgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCgkJCQkJCQkkcGF0aCA9IHRyaW0oIGFycmF5X3NoaWZ0KCAkY2FuZGlkYXRlX3BhdGhzICkgKTsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGVjIHRlc3QgKHVuemlwKSB0cnlpbmcgZXhlY3V0YWJsZSBwYXRoOicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJHBhdGggLiAnYC4nICk7CgoJCQkJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAndW56aXAgLXF0JyAuICIgJ3skdGVzdF9maWxlfSciIC4gIiAndGVzdC50eHQnIjsKCQkJCQkJCQkJCgkJCQkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgkJCQkJCgkJCQkJCQlAZXhlYyggJGNvbW1hbmQsICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICk7CgkJCQkJCgkJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PT0gMCApIHsKCQkJCQkJCQoJCQkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gPSAkcGF0aDsKCQkJCQkJCgkJCQkJCQkJLy8gUGxhdGZvcm0gaW5kZXBlbmRlbnQgY2FwYWJpbGl0aWVzCgkJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bnppcHBlcicgXSA9IHRydWU7CgkJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19jaGVja2VyJyBdID0gdHJ1ZTsKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3VuYXJjaGl2ZXInIF0gPSB0cnVlOwoJCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfbGlzdGVyJyBdID0gdHJ1ZTsKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2V4dHJhY3RvcicgXSA9IHRydWU7CgkJCQkJCQoJCQkJCQkJCS8vIFBsYXRmb3JtIHNwZWNpZmljIGNhcGFiaWxpdGllcwoJCQkJCQkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCQkJCQoJCQkJCQkJCQkJLy8gVGhpcyBpcyBzcGVjaWFsIC0gd2UgbXVzdCBoYXZlIHppcCBhbHNvIHNvIHRoaXMgd2lsbCBvbmx5IGVuZCB1cCB0cnVlIGlmIHdlIHByZXZpb3VzbHkgZm91bmQgemlwCgkJCQkJCQkJCQkvLyBhbmQgc3BlY3VsYXRpdmVseSBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gYmUgdHJ1ZS4gQWxzbyB3ZSBuZWVkIGZvciBleGVjX2RpciB0byBub3QgYmUgYWN0aXZlIC0gaWYKCQkJCQkJCQkJCS8vIGl0IGlzIHRoZSBjb21tYW5kIGxpbmUgaXMgZXNjYXBlZCBhbmQgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcGlwaW5nIHdlIGhhdmUgdG8gdXNlIHdoZW4KCQkJCQkJCQkJCS8vIHNldHRpbmcgYSBjb21tZW50LiBBbHNvIHdlIG5lZWQgdGhlIGVzY2FwZXNoZWxsYXJnIGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZSBhbmQgdGhhdCB3YXMgY2hlY2tlZAoJCQkJCQkJCQkJLy8gd2hlbiBkZXBlbmRlbmNpZXMgd2VyZSBjaGVja2VkCgkJCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdICYmIHRydWUgJiYgISR0aGlzLT5nZXRfZXhlY19kaXJfZmxhZygpICYmIHNlbGY6OiRfYWxsb3dfaXNfY29tbWVudGVyOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCQkJCQkvLyBOb25lIEFwcGxpY2FibGUKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkJLy8gVGhlcmUgaXMgbm8gZGVmYXVsdAoJCQkJCQkJCX0KCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgUEFTU0VELicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQkJCQkJCS8vIFRoaXMgd2lsbCBicmVhayB1cyBvdXQgb2YgdGhlIGxvb3AKCQkJCQkJCQkkZm91bmRfemlwID0gdHJ1ZTsKCQkJCQkJCgkJCQkJCQl9IGVsc2UgewoJCQkJCgkJCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGVjX2V4aXRfY29kZTsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHVuemlwKSBGQUlMRUQ6IFRlc3QgdW56aXAgZmlsZSB0ZXN0IGZhaWxlZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBleGVjIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQkJCX0KCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkJLy8gVGhlIHRlc3QgZmlsZSBsb29rZWQgY29ycnVwdGVkIHNvIHdhcm4gYW5kIGJhaWwgb3V0CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ0V4ZWMgdGVzdCAodW56aXApIEZBSUxFRDogVGVzdCBmaWxlIGFwcGVhcnMgdG8gYmUgY29ycnVwdGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgbWQ1X2ZpbGUoICR0ZXN0X2ZpbGUgKSApICk7CgoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFRoZSB0ZXN0IGZpbGUgZG9lc24ndCBzZWVtIHRvIGV4aXN0IG9yIGJlIHJlYWRhYmxlIHNvIHdhcm4gYW5kIGJhaWwgb3V0CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBUZXN0IGZpbGUgYXBwZWFycyB0byBlaXRoZXIgbm90IGV4aXN0IG9yIG5vdCBiZSByZWFkYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCX0KCQkJCgkJCQkvLyBJZiB3ZSBkaWRuJ3QgZmluZCB1bnppcCBhbnl3aGVyZSAob3IgbWF5YmUgZm91bmQgaXQgYnV0IGl0IGZhaWxlZCkgdGhlbiBsb2cgaXQKCQkJCWlmICggZmFsc2UgPT09ICRmb3VuZF96aXAgKSB7CgkJCQkJCgkJCQkJLy8gV2Ugc3BlY3VsYXRpdmVseSBzZXQgdGhpcyB0cnVlIHdoZW4gd2UgZm91bmQgemlwIGJ1dCB3ZSBuZWVkIGJvdGggemlwIGFuZCB1bnppcCBzbyBzZXQgaWYgZmFsc2UKCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9IGZhbHNlOwoKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHVuemlwKSBGQUlMRUQ6IFVuYWJsZSB0byBmaW5kIHVuemlwIGV4ZWN1dGFibGUgb24gYW55IHNwZWNpZmllZCBwYXRoLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgdW56aXAgdmVyc2lvbiBhbmQgcG9zc2libHkgYXZhaWxhYmxlIG9wdGlvbnMuIFRoaXMgY2FuIGhlbHAgdXMKCQkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIHVuemlwcGluZyBhIGZpbGUKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyB1bnppcCB2ZXJzaW9uLi4uJyApOwoKCQkJCQkkdGhpcy0+c2V0X3VuemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJCSR2ZXJzaW9uID0gJHRoaXMtPmdldF91bnppcF92ZXJzaW9uKCk7CgkJCQkJaWYgKCB0cnVlID09PSBpc19hcnJheSggJHZlcnNpb24gKSApIHsKCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB1bnppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJCQl9IGVsc2UgewoJCQkKCQkJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB1bnppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcC91bnppcCkgRkFJTEVEOiBPbmUgb3IgbW9yZSByZXF1aXJlZCBmdW5jdGlvbiBkbyBub3QgZXhpc3QuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCSAgCgkJICAJfQoJCSAgCQoJCSAgCS8vIElmIHdlIGZvdW5kIGJvdGggemlwIGFuZCB1bnppcCB0aGVuIGNvbXBhcmUgdGhlIHBhdGhzIGFuZCBpZiB0aGUgc2FtZSB0aGVuIHNldCB0aGUgY29tbW9uIHBhdGgKCQkgIAlpZiAoICRwZW5kaW5nX3Jlc3VsdCAmJiAkcmVzdWx0ICkgewoJCSAgCQoJCSAgCQlpZiAoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3BhdGgnIF0gPT09ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAncGF0aCcgXSApIHsKCQkgIAkJCgkJICAJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICdwYXRoJyBdID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXTsKCQkgIAkJCQoJCSAgCQl9CgkJICAJCQoJCSAgCX0KCQkgIAkKCQkgIAkvLyBPdXIgcmVzdWx0IHdpbGwgYmUgdHJ1ZSBpZiB3ZSBmb3VuZCBlaXRoZXIgb3IgYm90aCBvZiB6aXAgYW5kIHVuemlwCgkJICAJLy8gVGhlIG1ldGhvZCBhdHRyaWJ1dGVzIHdpbGwgdGVsbCB3aGljaCBpcyBhdmFpbGFibGUKCQkgIAkkcmVzdWx0ID0gKCAkcGVuZGluZ19yZXN1bHQgfHwgJHJlc3VsdCApOwoJCSAgCQoJCSAgCXJldHVybiAkcmVzdWx0OwoJCSAgCQoJCX0KCQkKCQkvKioKCQkgKgljcmVhdGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZQoJCSAqCUFsd2F5cyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90ZWhyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgPSBOVUxMICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV9nZW5lcmljKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+Y3JlYXRlX2dlbmVyaWMoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoJCQkKCQkvKioKCQkgKgljcmVhdGVfZ2VuZXJpYygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90ZWhyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCVtPcHRpb25hbF0gRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZV9nZW5lcmljKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkkZXhpdGNvZGUgPSAwOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJJHRlbXBfemlwID0gJyc7CgkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCSRleGNsdXNpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9IGZhbHNlOwoJCQkkemlwX2Vycm9yc19jb3VudCA9IDA7CgkJCSR6aXBfZXJyb3JzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gZmFsc2U7CgkJCSR6aXBfd2FybmluZ3NfY291bnQgPSAwOwoJCQkkemlwX3dhcm5pbmdzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2FkZGl0aW9ucyA9IGZhbHNlOwoJCQkkemlwX2FkZGl0aW9uc19jb3VudCA9IDA7CgkJCSR6aXBfYWRkaXRpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2RlYnVnID0gZmFsc2U7CgkJCSR6aXBfZGVidWdfY291bnQgPSAwOwoJCQkkemlwX2RlYnVnID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX290aGVyID0gZmFsc2U7CgkJCSR6aXBfb3RoZXJfY291bnQgPSAwOwoJCQkkemlwX290aGVyID0gYXJyYXkoKTsKCQkJJHppcF91c2luZ19sb2dfZmlsZSA9IGZhbHNlOwoJCQkkbG9nZmlsZV9uYW1lID0gJyc7CgkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSBmYWxzZTsKCQkKCQkJLy8gVGhlIGJhc2VkaXIgbXVzdCBoYXZlIGEgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRkaXIgKSwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkKCQkJaWYgKCBlbXB0eSggJHRlbXBkaXIgKSB8fCAhQGZpbGVfZXhpc3RzKCAkdGVtcGRpciApICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBtdXN0IGJlIGF2YWlsYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIFRlbGwgd2hpY2ggemlwIHZlcnNpb24gaXMgYmVpbmcgdXNlZAoJCQkkdmVyc2lvbiA9ICR0aGlzLT5nZXRfemlwX3ZlcnNpb24oKTsKCQkJCgkJCWlmICggdHJ1ZSA9PT0gaXNfYXJyYXkoICR2ZXJzaW9uICkgKSB7CgkJCQoJCQkJKCAoIDIgPT0gJHZlcnNpb25bICdtYWpvcicgXSApICYmICggMCA9PSAkdmVyc2lvblsgJ21pbm9yJyBdICkgKSA/ICR2ZXJzaW9uWyAnbWlub3InIF0gPSAnWCcgOiB0cnVlIDsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnVXNpbmcgemlwIHZlcnNpb246ICUxJHMuJTIkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdmVyc2lvblsgJ21ham9yJyBdLCAkdmVyc2lvblsgJ21pbm9yJyBdICkgKTsKCgkJCX0KCQkJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB6aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1pJUF9QQVRIICk7CgkJCQoJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJaWYgKCAhZW1wdHkoICR6aXBwYXRoICkgKSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQoJCQl9CgoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3ppcCc7CQoKCQkJLy8gQWx3YXlzIGRvIHJlY3Vyc2l2ZSBvcGVyYXRpb24KCQkJJGNvbW1hbmQgLj0gJyAtcic7CgkJCQoJCQkvLyBDaGVjayBpZiB0aGUgdmVyc2lvbiBvZiB6aXAgaW4gdXNlIHN1cHBvcnRzIGxvZyBmaWxlICh3aGljaCB3aWxsIGhlbHAgd2l0aCBtZW1vcnkgdXNhZ2UgZm9yIGxhcmdlIHNpdGVzKQoJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5nZXRfemlwX3N1cHBvcnRzX2xvZ19maWxlKCkgKSB7CgkJCQoJCQkJLy8gQ2hvb3NlIHRvIHVzZSBsb2cgZmlsZSBzbyBxdWlldGVuIHN0ZG91dCAtIHdlJ2xsIHNldCB1cCB0aGUgbG9nIGZpbGUgbGF0ZXIKCQkJCSRjb21tYW5kIC49ICcgLXEnOwoJCQkJJHppcF91c2luZ19sb2dfZmlsZSA9IHRydWU7CgkJCQoJCQl9CgkJCQoJCQkvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGNvbXByZXNzaW9uIGJ5IHNldHRpbmdzIChmYXN0ZXIgYnV0IGxhcmdlciBiYWNrdXApCgkJCWlmICggdHJ1ZSAhPT0gJHRoaXMtPmdldF9jb21wcmVzc2lvbigpICkgewoJCQkKCQkJCSRjb21tYW5kIC49ICcgLTAnOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gY29tcHJlc3Npb24gZGlzYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gY29tcHJlc3Npb24gZW5hYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQl9CgkJCQoJCQkvLyBDaGVjayBpZiBpZ25vcmluZyAobm90IGZvbGxvd2luZykgc3ltbGlua3MKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV9zeW1saW5rcygpICkgewoJCQkKCQkJCS8vIE5vdCBhbGwgT1Mgc3VwcG9ydCB0aGlzIGZvciBjb21tYW5kIGxpbmUgemlwIGJ1dCBiZXN0IHRvIGhhbmRsZSBpdCBsYXRlIGFuZCBqdXN0CgkJCQkvLyBpbmRpY2F0ZSBoZXJlIGl0IGlzIHJlcXVlc3RlZCBidXQgbm90IHN1cHBvcnRlZCBieSBPUwoJCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkJLy8gV2FudCB0byBub3QgZm9sbG93IHN5bWxpbmtzIHNvIHNldCBjb21tYW5kIG9wdGlvbiBhbmQgc2V0IGZsYWcgZm9yIGxhdGVyIHVzZQoJCQkJCQkkY29tbWFuZCAuPSAnIC15JzsKCQkJCQkJJHppcF9pZ25vcmluZ19zeW1saW5rcyA9IHRydWU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHdpbGwgbm90IGJlIGZvbGxvd2VkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gc3ltYm9saWMgbGlua3MgcmVxdWVzdGVkIHRvIG5vdCBiZSBmb2xsb3dlZCBiYXNlZCBvbiBzZXR0aW5ncyBidXQgdGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIG9wZXJhdGluZyBzeXN0ZW0uJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyByZXF1ZXN0ZWQgdG8gbm90IGJlIGZvbGxvd2VkIGJhc2VkIG9uIHNldHRpbmdzIGJ1dCB0aGlzIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyB3aWxsIGJlIGZvbGxvd2VkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCX0KCQkJCgkJCS8vIENoZWNrIGlmIHdlIGFyZSBpZ25vcmluZyB3YXJuaW5ncyAtIG1lYW5pbmcgY2FuIHN0aWxsIGdldCBhIGJhY2t1cCBldmVuCgkJCS8vIGlmLCBlLmcuLCBzb21lIGZpbGVzIGNhbm5vdCBiZSByZWFkCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApIHsKCQkJCgkJCQkvLyBOb3RlOiB3YXJuaW5ncyBhcmUgYmVpbmcgaWdub3JlZCBidXQgd2lsbCBzdGlsbCBiZSBnYXRoZXJlZCBhbmQgbG9nZ2VkCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBhY3Rpb25hYmxlIHdhcm5pbmdzIHdpbGwgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBhY3Rpb25hYmxlIHdhcm5pbmdzIHdpbGwgbm90IGJlIGlnbm9yZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJfQoJCQkKCQkJLy8gRGVsZXRlIGFueSBleGlzdGluZyB6aXAgZmlsZSBvZiBzYW1lIG5hbWUgLSByZWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCgkJCWlmICggQGZpbGVfZXhpc3RzKCAkemlwICkgKSB7CgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhpc3RpbmcgWklQIEFyY2hpdmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCUB1bmxpbmsoICR6aXAgKTsKCgkJCX0KCQkJCgkJCS8vIE5vdyB3ZSdsbCBzZXQgdXAgdGhlIGxvZ2dpbmcgdG8gZmlsZSBpZiByZXF1aXJlZCAtIHVzZSBmdWxsIGxvZ2dpbmcKCQkJaWYgKCB0cnVlID09PSAkemlwX3VzaW5nX2xvZ19maWxlICkgewoJCQkKCQkJCSRsb2dmaWxlX25hbWUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9MT0dfRklMRV9OQU1FOwoJCQkJJGNvbW1hbmQgLj0gIiAtbGYgJ3skbG9nZmlsZV9uYW1lfScgLWxpIjsKCQkJCgkJCX0KCQkJCQkJCgkJCS8vIFNldCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHN0b3JlIFpJUCB3aGlsZSBpdCdzIGJlaW5nIGdlbmVyYXRlZC4JCQkKCQkJJGNvbW1hbmQgLj0gIiAtYiAneyR0ZW1wZGlyfSciOwoKCQkJLy8gU3BlY2lmeSB3aGVyZSB0byBwbGFjZSB0aGUgZmluYWxpemVkIHppcCBhcmNoaXZlIGZpbGUKCQkJLy8gSWYgd2FybmluZ3MgYXJlIGJlaW5nIGlnbm9yZWQgd2UgY2FuIHRlbGwgemlwIHRvIGNyZWF0ZSB0aGUgemlwIGFyY2hpdmUgaW4gdGhlIGZpbmFsCgkJCS8vIGxvY2F0aW9uIC0gb3RoZXJ3aXNlIHdlIG11c3QgcHV0IGl0IGluIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCBtb3ZlIGl0IGxhdGVyIG9ubHkKCQkJLy8gaWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzLiBUaGlzIGNvcGVzIHdpdGggdGhlIGNhc2Ugd2hlcmUgKHRoaXMpIGNvbnRyb2xsaW5nIHNjcmlwdAoJCQkvLyBnZXRzIHRpbWVkIG91dCBieSB0aGUgc2VydmVyIGFuZCBpZiB0aGUgZmlsZSB3ZXJlIGNyZWF0ZWQgaW4gdGhlIGZpbmFsIGxvY2F0aW9uIHdpdGgKCQkJLy8gd2FybmluZ3MgdGhhdCBzaG91bGQgbm90IGJlIGlnbm9yZWQgd2UgY2Fubm90IHByZXZlbnQgaXQgYmVpbmcgY3JlYXRlZC4gVGhlIC1NTSBvcHRpb24KCQkJLy8gY291bGQgYmUgdXNlZCBidXQgdGhpcyBwcmV2ZW50cyB1cyBjYXRjaGluZyBzdWNoIHdhcm5pbmdzIGFuZCBiZWluZyBhYmxlIHRvIHJlcG9ydAoJCQkvLyB0aGVtIHRvIHRoZSB1c2VyIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzY3JpcHQgaGFzbid0IGJlZW4gdGVybWluYXRlZC4gQWRkaXRpb25hbGx5IHRoZQoJCQkvLyAtTU0gb3B0aW9uIHdvdWxkIGJhaWwgb3V0IG9uIHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBwcm9ibGVtIGFuZCBzbyBpZiB0aGVyZSB3ZXJlIGEgZmV3CgkJCS8vIHByb2JsZW1zIHRoZXkgd291bGQgZWFjaCBub3QgYmUgZm91bmQgdW50aWwgdGhlIGN1cnJlbnQgb25lIGlzIGZpeGVkIGFuZCB0cnkgYWdhaW4uCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApIHsKCQkJCgkJCQkkdGVtcF96aXAgPSAkemlwOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdGVtcF96aXAgPSAkdGVtcGRpciAuIGJhc2VuYW1lKCAkemlwICk7CgkJCQkKCQkJfQkJCgoJCQkkY29tbWFuZCAuPSAiICd7JHRlbXBfemlwfScgLiI7CgkJCQoJCQkvLyBOb3cgd29yayBvdXQgZXhjbHVzaW9ucyBkZXBlbmRlbnQgb24gd2hhdCB3ZSBoYXZlIGJlZW4gZ2l2ZW4KCQkJaWYgKCBpc19vYmplY3QoICRsaXN0bWFrZXIgKSAmJiAoIGRlZmluZWQoICdVU0VfRVhQRVJJTUVOVEFMX1pJUEJVRERZX0lOQ0xVU0lPTicgKSAmJiAoIHRydWUgPT09IFVTRV9FWFBFUklNRU5UQUxfWklQQlVERFlfSU5DTFVTSU9OICkgKSApIHsKCQkJCgkJCQkvLyBXZSdyZSBkb2luZyBhbiBpbmNsdXNpb24gb3BlcmF0aW9uLCBidXQgZmlyc3Qgd2UnbGwganVzdCBzaG93IHRoZSBleGNsdXNpb3NuCgkJCQkKCQkJCS8vIEZvciB6aXAgd2UgbmVlZCByZWxhdGl2ZSByYXRoZXIgdGhhbiBhYnNvbHV0ZSBleGNsdXNpb24gc3BhdGhzCgkJCQkkZXhjbHVzaW9ucyA9ICRsaXN0bWFrZXItPmdldF9yZWxhdGl2ZV9leGNsdWRlcyggJGJhc2VkaXIgKTsKCQkJCQoJCQkJaWYgKCBjb3VudCggJGV4Y2x1c2lvbnMgKSA+IDAgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdDYWxjdWxhdGluZyBkaXJlY3RvcmllcyB0byBleGNsdWRlIGZyb20gYmFja3VwLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSBmYWxzZTsKCQkJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCQkJZm9yZWFjaCAoICRleGNsdXNpb25zIGFzICRleGNsdWRlICkgewoJCQkJCQoJCQkJCQlpZiAoICFzdHJzdHIoICRleGNsdWRlLCAnYmFja3VwYnVkZHlfYmFja3VwcycgKSApIHsgLy8gU2V0IHZhcmlhYmxlIHRvIHNob3cgd2UgYXJlIGV4Y2x1ZGluZyBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGJlc2lkZXMgYmFja3VwIGRpci4KCQoJCQkJCQkJJGV4Y2x1ZGluZ19hZGRpdGlvbmFsID0gdHJ1ZTsKCQkJCQkJCQkKCQkJCQkJfQoJCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4Y2x1ZGluZycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGV4Y2x1ZGUgKTsKCQkJCQkJCQkJCQkJCQoJCQkJCQkkZXhjbHVkZV9jb3VudCsrOwoJCQkJCQkJCgkJCQkJfQoJCQkJCQkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIEdldCB0aGUgbGlzdCBvZiBpbmNsdXNpb25zIHRvIHByb2Nlc3MKCQkJCSRpbmNsdXNpb25zID0gJGxpc3RtYWtlci0+Z2V0X3Rlcm1pbmFscygpOwoJCQkJCgkJCQkvLyBGb3IgZWFjaCBkaXJlY3Rvcnkgd2UgbmVlZCB0byBwdXQgdGhlICJ3aWxkY2FyZCIgb24gdGhlIGVuZAoJCQkJZm9yZWFjaCAoICRpbmNsdXNpb25zIGFzICYkaW5jbHVzaW9uICkgewoJCQkJCgkJCQkJaWYgKCBpc19kaXIoICRpbmNsdXNpb24gKSApIHsKCQkJCQkKCQkJCQkJJGluY2x1c2lvbiAuPSBESVJFQ1RPUllfU0VQQVJBVE9SIC4gIioiOwoJCQkJCX0KCQkJCQoJCQkJCS8vIFJlbW92ZSBkaXJlY3RvcnkgcGF0aCBwcmVmaXggZXhjbHVkaW5nIGxlYWRpbmcgc2xhc2ggdG8gbWFrZSByZWxhdGl2ZSAobmVlZGVkIGZvciB6aXApCgkJCQkJJGluY2x1c2lvbiA9IHN0cl9yZXBsYWNlKCBydHJpbSggJGJhc2VkaXIsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSwgJycsICRpbmNsdXNpb24gKTsKCQkJCQkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluY2x1c2lvbnMgZmlsZSBpbiB0aGUgdGVtcGRpcgoJCQkJCgkJCQkvLyBBbmQgdXBkYXRlIHRoZSBjb21tYW5kIG9wdGlvbnMKCQkJCSRpZmlsZSA9ICR0ZW1wZGlyIC4gc2VsZjo6WklQX0lOQ0xVU0lPTlNfRklMRV9OQU1FOwoJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGlmaWxlICkgKSB7CgkJCQkKCQkJCQlAdW5saW5rKCAkaWZpbGUgKTsKCQkJCQoJCQkJfQoJCQkJCgkJCQlmaWxlX3B1dF9jb250ZW50cyggJGlmaWxlLCBpbXBsb2RlKCBQSFBfRU9MLCAkaW5jbHVzaW9ucyApIC4gUEhQX0VPTCAuIFBIUF9FT0wgKTsKCQkJCQoJCQkJJGNvbW1hbmQgLj0gIiAtaUAiIC4gIid7JGlmaWxlfSciOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBXZSdyZSBkb2luZyBhbiBleGNsdXNpb24gb3BlcmF0aW9uCgkJCQoJCQkJLy8kY29tbWFuZCAuPSAiLWkgJyonICI7IC8vIE5vdCBuZWVkZWQuIFppcCBkZWZhdWx0cyB0byBkb2luZyB0aGlzLiBSZW1vdmVkIEp1bHkgMTAsIDIwMTIgZm9yIHYzLjAuNDEuCgkJCQkKCQkJCS8vIFNpbmNlIHdlIGhhZCBubyAkbGlzdG1ha2VyIG9iamVjdCBvciBub3QgdXNpbmcgaXQgZ2V0IHRoZSBzdGFuZGFyZCByZWxhdGl2ZSBleGNsdWRlcyB0byBwcm9jZXNzCgkJCQkkZXhjbHVzaW9ucyA9ICRleGNsdWRlczsKCQkJCQoJCQkJaWYgKCBjb3VudCggJGV4Y2x1c2lvbnMgKSA+IDAgKSB7CgkJCQkKCQkJCQkvLyBIYW5kbGUgZXhjbHVzaW9ucyBieSBwbGFjaW5nIHRoZW0gaW4gYW4gZXhjbHVzaW9uIHRleHQgZmlsZS4KCQkJCQkkZXhjbHVzaW9uX2ZpbGUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9FWENMVVNJT05TX0ZJTEVfTkFNRTsKCQkJCQkkdGhpcy0+X3JlbmRlcl9leGNsdXNpb25zX2ZpbGUoICRleGNsdXNpb25fZmlsZSwgJGV4Y2x1c2lvbnMsICRkaXIgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnVXNpbmcgZXhjbHVzaW9uIGZpbGUgYCUxJHNgJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRleGNsdXNpb25fZmlsZSApICk7CgkJCQkJJGNvbW1hbmQgLj0gJyAteEAnIC4gIid7JGV4Y2x1c2lvbl9maWxlfSciOwoJCQkJCQkJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBjYW4ndCB1c2UgYSBsb2cgZmlsZSBidXQgZXhlY19kaXIgaXNuJ3QgaW4gdXNlIHdlIGNhbiByZWRpcmVjdCBzdGRlcnIgdG8gc3Rkb3V0CgkJCS8vIElmIGV4ZWNfZGlyIGlzIGluIHVzZSB3ZSBjYW5ub3QgcmVkaXJlY3QgYmVjYXVzZSBvZiBjb21tYW5kIGxpbmUgZXNjYXBpbmcgc28gY2Fubm90IGxvZyBlcnJvcnMvd2FybmluZ3MKCQkJaWYgKCBmYWxzZSA9PT0gJHppcF91c2luZ19sb2dfZmlsZSApIHsKCQkJCgkJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+Z2V0X2V4ZWNfZGlyX2ZsYWcoKSApIHsKCQkJCgkJCQkJJGNvbW1hbmQgLj0gJyAyPiYxJzsKCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdaaXAgRXJyb3JzL1dhcm5pbmdzIGNhbm5vdCBub3QgYmUgbG9nZ2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHppcCBhbmQgZXhlY19kaXIgYWN0aXZlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksIHRydWUgKSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gUmVtZW1iZXIgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBjaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSBiZWluZyBhZGRlZCBzbyB0aGF0ICIuIiBpcyB2YWxpZCBpbiBjb21tYW5kCgkJCSR3b3JraW5nX2RpciA9IGdldGN3ZCgpOwoJCQljaGRpciggJGRpciApOwoJCQkKCQkJJGNvbW1hbmQgPSAoIHNlbGY6Ok9TX1RZUEVfV0lOID09PSAkdGhpcy0+Z2V0X29zX3R5cGUoKSApID8gc3RyX3JlcGxhY2UoICdcJycsICciJywgJGNvbW1hbmQgKSA6ICRjb21tYW5kOwoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgY29tbWFuZCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbW1hbmQgKTsKCQkJQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdGNvZGUgKTsKCQkJCQkJCgkJCS8vIFNldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGJhY2sgdG8gd2hlcmUgd2Ugd2VyZQoJCQljaGRpciggJHdvcmtpbmdfZGlyICk7CgkJCQoJCQkvLyBDb252ZW5pZW5jZSBmb3IgaGFuZGxpbmcgZGlmZmVyZW50IHNjYW5hcmlvcwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQoJCQkvLyBJZiB3ZSB1c2VkIGEgbG9nIGZpbGUgdGhlbiBwcm9jZXNzIHRoZSBsb2cgZmlsZSAtIGVsc2UgcHJvY2VzcyBvdXRwdXQKCQkJLy8gQWx3YXlzIHNjYW4gdGhlIG91dHB1dC9sb2dmaWxlIGZvciB3YXJuaW5ncywgZXRjLiBhbmQgc2hvdyB3YXJuaW5ncyBldmVuIGlmIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUgdGhlbQoJCQlpZiAoIHRydWUgPT09ICR6aXBfdXNpbmdfbG9nX2ZpbGUgKSB7CgkJCQoJCQkJdHJ5IHsKCQkJCQoJCQkJCSRsb2dmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRsb2dmaWxlX25hbWUsICJyYiIgKTsKCQkJCQkKCQkJCQl3aGlsZSggISRsb2dmaWxlLT5lb2YoKSApIHsKCQkJCQkKCQkJCQkJJGxpbmUgPSAkbG9nZmlsZS0+Y3VycmVudCgpOwoJCQkJCQkkaWQgPSAkbG9nZmlsZS0+a2V5KCk7IC8vIFVzZSB0aGUgbGluZSBudW1iZXIgYXMgdW5pcXVlIGtleSBmb3IgbGF0ZXIgc29ydGluZwoJCQkJCQkkbG9nZmlsZS0+bmV4dCgpOwoJCQkJCQkKCQkJCQkJaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIHdhcm5pbmc6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkJCgkJCQkJCQkvLyBMb29raW5nIGZvciBzcGVjaWZpYyB0eXBlcyBvZiB3YXJuaW5nIC0gaW4gcGFydGljdWxhciB3YW50IHRoZSB3YXJuaW5nIHRoYXQKCQkJCQkJCS8vIGluZGljYXRlcyBhIGZpbGUgY291bGRuJ3QgYmUgcmVhZCBhcyB3ZSB3YW50IHRvIHRyZWF0IHRoYXQgYXMgYSAic2tpcHBlZCIKCQkJCQkJCS8vIHdhcm5pbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB6aXAgZmxhZ2dlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHByb2JsZW0gYnV0CgkJCQkJCQkvLyBjcmVhdGVkIHRoZSB6aXAgZmlsZSBhbnl3YXkgLSBidXQgaXQgd291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhlIG5vbi16ZXJvIGV4aXQKCQkJCQkJCS8vIGNvZGUgb2YgMTggYW5kIHdlIGtleSBvZmYgdGhhdCBsYXRlci4gQWxsIG90aGVyIHdhcm5pbmdzIGFyZSBub3QgY29uc2lkZXJlZAoJCQkJCQkJLy8gcmVhc29ucyB0byByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hpbHN0IHN0aWxsIGNyZWF0aW5nIGEgemlwIGZpbGUgc28KCQkJCQkJCS8vIHdlJ2xsIGZvbGxvdyB0aGUgbGVhZCBvbiB0aGF0IGFuZCBub3QgaGF2ZSBvdGhlciB3YXJuaW5nIHR5cGVzIGhhbHQgdGhlIGJhY2t1cC4KCQkJCQkJCS8vIFNvIHdlJ2xsIHRyeSBhbmQgbG9vayBmb3IgYSB3YXJuaW5nIG91dHB1dCB0aGF0IGxvb2tzIGxpa2UgaXQgaXMgZmlsZSByZWxhdGVkLi4uCgkJCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopXHMqKFteOl0qOilccyooLiopL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkJCQoJCQkJCQkJCS8vIE1hdGNoZWQgdG8gd2hhdCBsb29rcyBsaWtlIGEgZmlsZSByZWxhdGVkIHdhcm5pbmcgc28gY2hlY2sgcGFydGljdWxhciBjYXNlcwoJCQkJCQkJCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRtYXRjaGVzWyAyIF0gKSApIHsKCQkJCQkJCQkJY2FzZSAiY291bGQgbm90IG9wZW4gZm9yIHJlYWRpbmc6IjoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19TS0lQUEVEIF1bICRpZCBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICJuYW1lIG5vdCBtYXRjaGVkOiI6CQkJCQkJCQkJCQoJCQkJCQkJCQkJJHppcF9vdGhlclsgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkJJHppcF9vdGhlcl9jb3VudCsrOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19HRU5FUklDIF1bICRpZCBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBEaWRuJ3QgbWF0Y2ggdG8gd2hhdCB3b3VsZCBsb29rIGxpa2UgYSBmaWxlIHJlbGF0ZWQgd2FybmluZyBzbyBjb3VudCBpdCByZWdhcmRsZXNzCgkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfR0VORVJJQyBdWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCX0gZWxzZWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCBlcnJvcjopL2knLCAkbGluZSApICkgewoJCQkJCQkKCQkJCQkJCSR6aXBfZXJyb3JzWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkkemlwX2Vycm9yc19jb3VudCsrOwoJCQkJCQkKCQkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooYWRkaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCQoJCQkJCQkJLy8gQ3VycmVudGx5IG5vdCBwcm9jZXNzaW5nIGFkZGl0aW9ucyBlbnRyaWVkCgkJCQkJCQkvLyR6aXBfYWRkaXRpb25zW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJLy8kemlwX2FkZGl0aW9uc19jb3VudCsrOwoJCQkJCQkKCQkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooc2Q6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkJCgkJCQkJCQkkemlwX2RlYnVnWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkkemlwX2RlYnVnX2NvdW50Kys7CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzCgkJCQkJCQkvLyR6aXBfb3RoZXJbXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkvLyR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCXVuc2V0KCAkbG9nZmlsZSApOwoJCQkJCQoJCQkJCUB1bmxpbmsoICRsb2dmaWxlX25hbWUgKTsKCQkJCQkKCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQkKCQkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB3ZSBzaG91bGQgaGF2ZSBiZWVuIGFibGUgdG8gb3BlbiB0aGUgbG9nIGZpbGUuLi4KCQkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdMb2cgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIC0gZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gVE9ETzogJG91dHB1dCBjb3VsZCBiZSBsYXJnZSBzbyBpZiB3ZSBwYXJzZSBpdCBhbGwgaW50byBzZXBhcmF0ZSBhcnJheXMgdGhlbiBtYXkgd2FudCB0byBzaGlmdAoJCQkJLy8gb3V0IGVhY2ggbGluZSBhbmQgdGhlbiBkaXNjYXJkIGl0IGFmdGVyIGNvcGllZCB0byBhbm90aGVyIGFycmF5CgkJCQkkaWQgPSAwOyAvLyBDcmVhdGUgYSB1bmlxdWUga2V5IChsaWtlIGEgbGluZSBudW1iZXIpIGZvciBsYXRlciBzb3J0aW5nCgkJCQlmb3JlYWNoICggJG91dHB1dCBhcyAkbGluZSApIHsKCQkJCQoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCB3YXJuaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIExvb2tpbmcgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHdhcm5pbmcgLSBpbiBwYXJ0aWN1bGFyIHdhbnQgdGhlIHdhcm5pbmcgdGhhdAoJCQkJCQkvLyBpbmRpY2F0ZXMgYSBmaWxlIGNvdWxkbid0IGJlIHJlYWQgYXMgd2Ugd2FudCB0byB0cmVhdCB0aGF0IGFzIGEgInNraXBwZWQiCgkJCQkJCS8vIHdhcm5pbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB6aXAgZmxhZ2dlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHByb2JsZW0gYnV0CgkJCQkJCS8vIGNyZWF0ZWQgdGhlIHppcCBmaWxlIGFueXdheSAtIGJ1dCBpdCB3b3VsZCBoYXZlIGdlbmVyYXRlZCB0aGUgbm9uLXplcm8gZXhpdAoJCQkJCQkvLyBjb2RlIG9mIDE4IGFuZCB3ZSBrZXkgb2ZmIHRoYXQgbGF0ZXIuIEFsbCBvdGhlciB3YXJuaW5ncyBhcmUgbm90IGNvbnNpZGVyZWQKCQkJCQkJLy8gcmVhc29ucyB0byByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hpbHN0IHN0aWxsIGNyZWF0aW5nIGEgemlwIGZpbGUgc28KCQkJCQkJLy8gd2UnbGwgZm9sbG93IHRoZSBsZWFkIG9uIHRoYXQgYW5kIG5vdCBoYXZlIG90aGVyIHdhcm5pbmcgdHlwZXMgaGFsdCB0aGUgYmFja3VwLgoJCQkJCQkvLyBTbyB3ZSdsbCB0cnkgYW5kIGxvb2sgZm9yIGEgd2FybmluZyBvdXRwdXQgdGhhdCBsb29rcyBsaWtlIGl0IGlzIGZpbGUgcmVsYXRlZC4uLgoJCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopXHMqKFteOl0qOilccyooLiopL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkJCgkJCQkJCQkvLyBNYXRjaGVkIHRvIHdoYXQgbG9va3MgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNoZWNrIHBhcnRpY3VsYXIgY2FzZXMKCQkJCQkJCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRtYXRjaGVzWyAyIF0gKSApIHsKCQkJCQkJCQljYXNlICJjb3VsZCBub3Qgb3BlbiBmb3IgcmVhZGluZzoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQljYXNlICJuYW1lIG5vdCBtYXRjaGVkOiI6CQkJCQkJCQkJCQoJCQkJCQkJCQkkemlwX290aGVyWyBzZWxmOjpaSVBfT1RIRVJfR0VORVJJQyBdWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJJHppcF9vdGhlcl9jb3VudCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19HRU5FUklDIF1bICRpZCsrIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQl9CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIERpZG4ndCBtYXRjaCB0byB3aGF0IHdvdWxkIGxvb2sgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNvdW50IGl0IHJlZ2FyZGxlc3MKCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkKysgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgZXJyb3I6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkKCQkJCQkJJHppcF9lcnJvcnNbICRpZCsrIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkkemlwX2Vycm9yc19jb3VudCsrOwoJCQkJCQoJCQkJCX0gZWxzZWlmICggcHJlZ19tYXRjaCggJy9eXHMqKGFkZGluZzopL2knLCAkbGluZSApICkgewoJCQkJCQoJCQkJCQkvLyBDdXJyZW50bHkgbm90IHByb2Nlc3NpbmcgYWRkaXRpb25zIGVudHJpZWQKCQkJCQkJLy8kemlwX2FkZGl0aW9uc1tdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJLy8kemlwX2FkZGl0aW9uc19jb3VudCsrOwoJCQkJCQkkaWQrKzsKCQkJCQkKCQkJCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKihzZDopL2knLCAkbGluZSApICkgewoJCQkJCQoJCQkJCQkkemlwX2RlYnVnWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJJHppcF9kZWJ1Z19jb3VudCsrOwoJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzCgkJCQkJCS8vJHppcF9vdGhlcltdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJLy8kemlwX290aGVyX2NvdW50Kys7CgkJCQkJCSRpZCsrOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0KCQoJCQkJLy8gTm93IGZyZWUgdXAgdGhlIG1lbW9yeS4uLgoJCQkJdW5zZXQoICRvdXRwdXQgKTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBTZXQgY29udmVuaWVuY2UgZmxhZ3MJCQkKCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gKCAwIDwgJHppcF93YXJuaW5nc19jb3VudCApOwoJCQkkaGF2ZV96aXBfZXJyb3JzID0gKCAwIDwgJHppcF9lcnJvcnNfY291bnQgKTsKCQkJJGhhdmVfemlwX2FkZGl0aW9ucyA9ICggMCA8ICR6aXBfYWRkaXRpb25zX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9kZWJ1ZyA9ICggMCA8ICR6aXBfZGVidWdfY291bnQgKTsKCQkJJGhhdmVfemlwX290aGVyID0gKCAwIDwgJHppcF9vdGhlcl9jb3VudCApOwoJCQkKCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgZXhpdCBjb2RlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBtaWdodCBpZ25vcmUgaXQgb3Igbm90CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBwcm9jZXNzIGV4aXQgY29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRleGl0Y29kZSApOwoJCQkKCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgbnVtYmVyIG9mIHdhcm5pbmdzIC0gZXZlbiBqdXN0IHRvIGNvbmZpcm0gdGhhdCB3ZSBkaWRuJ3QgaGF2ZSBhbnkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgd2FybmluZyUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX3dhcm5pbmdzX2NvdW50LCAoICggMSA9PSAkemlwX3dhcm5pbmdzX2NvdW50ICkgPyAnJyA6ICdzJyApICkgKTsKCgkJCS8vIEFsd2F5cyByZXBvcnQgd2FybmluZ3MgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVzZXIgaGFzIHNlbGVjdGVkIHRvIGlnbm9yZSB0aGVtCgkJCWlmICggdHJ1ZSA9PT0gJGhhdmVfemlwX3dhcm5pbmdzICkgewoJCQkKCQkJCSR0aGlzLT5sb2dfemlwX3JlcG9ydHMoICR6aXBfd2FybmluZ3MsIHNlbGY6OiRfd2FybmluZ19kZXNjLCAiV0FSTklORyIsIHNlbGY6Ok1BWF9XQVJOSU5HX0xJTkVTX1RPX1NIT1csIGRpcm5hbWUoIGRpcm5hbWUoICR0ZW1wZGlyICkgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAncGJfYmFja3VwYnVkZHknIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHNlbGY6OlpJUF9XQVJOSU5HU19GSUxFX05BTUUgKTsKCgkJCX0KCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgb3RoZXIgcmVwb3J0cyByZWdhcmRsZXNzCgkJCWlmICggdHJ1ZSA9PT0gJGhhdmVfemlwX290aGVyICkgewoJCQkKCQkJCS8vIE9ubHkgcmVwb3J0IG51bWJlciBvZiBpbmZvcm1hdGlvbmFscyBpZiB3ZSBoYXZlIGFueSBhcyB0aGV5IGFyZSBub3QgdGhhdCBpbXBvcnRhbnQKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIGluZm9ybWF0aW9uJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfb3RoZXJfY291bnQsICggKCAxID09ICR6aXBfb3RoZXJfY291bnQgKSA/ICdhbCcgOiAnYWxzJyApICkgKTsKCgkJCQkkdGhpcy0+bG9nX3ppcF9yZXBvcnRzKCAkemlwX290aGVyLCBzZWxmOjokX290aGVyX2Rlc2MsICJJTkZPUk1BVElPTiIsIHNlbGY6Ok1BWF9PVEhFUl9MSU5FU19UT19TSE9XLCBkaXJuYW1lKCBkaXJuYW1lKCAkdGVtcGRpciApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BiX2JhY2t1cGJ1ZGR5JyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfT1RIRVJTX0ZJTEVfTkFNRSApOwoKCQkJfQoJCQkKCQkJLy8gU2VlIGlmIHdlIGNhbiBmaWd1cmUgb3V0IHdoYXQgaGFwcGVuZWQgLSBub3RlIHRoYXQgJGV4aXRjb2RlIGNvdWxkIGJlIG5vbi16ZXJvIGZvciBhY3Rpb25hYmxlIHdhcm5pbmcocykgb3IgZXJyb3IKCQkJLy8gaWYgKCAobm8gemlwIGZpbGUpIG9yIChmYXRhbCBleGl0IGNvZGUpIG9yIChub3QgaWdub3Jpbmcgd2FybmFibGUgZXhpdCBjb2RlKSApCgkJCS8vIFRPRE86IEhhbmRsZSBjb25kaXRpb24gdGVzdGluZyB3aXRoIGZ1bmN0aW9uIGNhbGxzIGJhc2VkIG9uIG1hcHBpbmcgZXhpdCBjb2RlcyB0byBleGl0IHR5cGUgKGZhdGFsIHZzIG5vbi1mYXRhbCkKCQkJaWYgKCAoICEgQGZpbGVfZXhpc3RzKCAkdGVtcF96aXAgKSApIHx8CgkJCQkgKCAoIDAgIT0gJGV4aXRjb2RlICkgJiYgKCAxOCAhPSAkZXhpdGNvZGUgKSApIHx8CgkJCQkgKCAoIDE4ID09ICRleGl0Y29kZSApICYmICEkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgKSB7CgkJCQoJCQkJLy8gSWYgd2UgaGF2ZSBhbnkgemlwIGVycm9ycyByZXBvcnRlZCBzaG93IHRoZW0gcmVnYXJkbGVzcwoJCQkJaWYgKCB0cnVlID09PSAkaGF2ZV96aXBfZXJyb3JzICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgZXJyb3IlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9lcnJvcnNfY291bnQsICggKCAxID09ICR6aXBfZXJyb3JzX2NvdW50ICkgPyAnJyA6ICdzJyApICApICk7CgkJCQkJCgkJCQkJZm9yZWFjaCAoICR6aXBfZXJyb3JzIGFzICRsaW5lICkgewoJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgcHJvY2VzcyByZXBvcnRlZDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRsaW5lICk7CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgoJCQkJLy8gUmVwb3J0IHdoZXRoZXIgb3Igbm90IHRoZSB6aXAgZmlsZSB3YXMgY3JlYXRlZCAod2hldGhlciB0aGF0IGJlIGluIHRoZSBmaW5hbCBvciB0ZW1wb3JhcnkgbG9jYXRpb24pCQkJCgkJCQlpZiAoICEgQGZpbGVfZXhpc3RzKCAkdGVtcF96aXAgKSApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIG5vdCBjcmVhdGVkIC0gY2hlY2sgcHJvY2VzcyBleGl0IGNvZGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBjcmVhdGVkIGJ1dCB3aXRoIGVycm9ycy9hY3Rpb25hYmxlLXdhcm5pbmdzIHNvIHdpbGwgYmUgZGVsZXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlIGFuZCB3YXJuaW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCQkvLyBUaGUgb3BlcmF0aW9uIGhhcyBmYWlsZWQgb25lIHdheSBvciBhbm90aGVyLiBOb3RlIHRoYXQgYXMgdGhlIHVzZXIgZGlkbid0IGNob29zZSB0byBpZ25vcmUgZXJyb3JzIHRoZSB6aXAgZmlsZQoJCQkJLy8gaXMgYWx3YXlzIGNyZWF0ZWQgaW4gYSB0ZW1wb3JhcnkgbG9jYXRpb24gYW5kIHRoZW4gb25seSBtb3ZlZCB0byBmaW5hbCBsb2NhdGlvbiBvbiBzdWNjZXNzIHdpdGhvdXQgZXJyb3Igb3Igd2FybmluZ3MuCgkJCQkvLyBUaGVyZWZvcmUgaWYgdGhlcmUgaXMgYSB6aXAgZmlsZSAocHJvZHVjZWQgYnV0IHdpdGggd2FybmluZ3MpIGl0IHdpbGwgbm90IGJlIHZpc2libGUgYW5kIHdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZQoJCQkJLy8gdGVtcG9yYXJ5IGRpcmVjdG9yeSBpcyBkZWxldGVkIGJlbG93LgoJCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBHb3QgZmlsZSB3aXRoIG5vIGVycm9yIG9yIHdhcm5pbmdzIF9vcl8gd2l0aCB3YXJuaW5ncyB0aGF0IHRoZSB1c2VyIGhhcyBjaG9zZW4gdG8gaWdub3JlCgkJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkJCgkJCQkJLy8gQmVjYXVzZSBub3QgaWdub3Jpbmcgd2FybmluZ3MgdGhlIHppcCBhcmNoaXZlIHdhcyBidWlsdCBpbiB0ZW1wb3JhcnkgbG9jYXRpb24gc28gd2UgbmVlZCB0byBtb3ZlIGl0CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnTW92aW5nIFppcCBBcmNoaXZlIGZpbGUgdG8gbG9jYWwgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIG5vIHN0YWxlIGZpbGUgaW5mb3JtYXRpb24KCQkJCQljbGVhcnN0YXRjYWNoZSgpOwoJCQkJCQoJCQkJCUByZW5hbWUoICR0ZW1wX3ppcCwgJHppcCApOwoJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkemlwICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBBcmNoaXZlIGZpbGUgbW92ZWQgdG8gbG9jYWwgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCB3aXRoIG5vIGVycm9ycyBvciBhY3Rpb25hYmxlIHdhcm5pbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwICk7CgkJCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBBcmNoaXZlIGZpbGUgY291bGQgbm90IGJlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFdhcm5pbmdzIHdlcmUgYmVpbmcgaWdub3JlZCBzbyBidWlsdCBpbiBmaW5hbCBsb2NhdGlvbiBzbyBubyBuZWVkIHRvIG1vdmUgaXQKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCB3aXRoIG5vIGVycm9ycyAoYW55IGFjdGlvbmFibGUgd2FybmluZ3MgaWdub3JlZCBieSB1c2VyIHNldHRpbmdzKS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcCApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBPZGQgY29uZGl0aW9uIC0gZmlsZSBzaG91bGQgYmUgcHJlc2VudCBidXQgYXBwYXJlbnRseSBub3Q/CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBBcmNoaXZlIGZpbGUgY291bGQgbm90IGJlIGZvdW5kIGluIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CQkJCgoJCQkvLyBDbGVhbnVwIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd2lsbCBoYXZlIGFsbCBkZXRyaXR1cyBhbmQgbWF5YmUgaW5jb21wbGV0ZSB6aXAgZmlsZQkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdSZW1vdmluZyB0ZW1wb3JhcnkgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCgkJCWlmICggISggJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkdGVtcGRpciApICkgKSB7CgkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcGRpciApOwoJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQkJCQkJCQoJCX0KCQkKCQkvKioKCQkgKglleHRyYWN0KCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoJSWYgbm8gc3BlY2lmaWMgaXRlbXMgZ2l2ZW4gdG8gZXh0cmFjdCB0aGVuIGl0J3MgYSBjb21wbGV0ZSB1bnppcAoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyA9IGFycmF5KCkgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkKCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJaWYgKCBlbXB0eSggJGl0ZW1zICkgKSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRpdGVtcyApOwkJCQkJCgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgoJCS8qKgoJCSAqCWV4dHJhY3RfZ2VuZXJpY19mdWxsKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycgKSB7CgkJCgkJCSRzdW1tYXJ5ID0gJyc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkZXhpdF9jb2RlID0gMTI3OwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCgkJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHVuemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJCSR6aXBwYXRoID0gJHRoaXMtPmdldF9jb21tYW5kX3BhdGgoIHNlbGY6OkNPTU1BTkRfVU5aSVBfUEFUSCApOwoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJCWlmICggIWVtcHR5ICggJHppcHBhdGggKSApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVc2luZyBhYnNvbHV0ZSB1bnppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICR6aXBwYXRoICkgLiAndW56aXAnOwkKCQoJCQkJLy8gV2UnbGwgdHJ5IGFuZCBleHRyYWN0IGZyb20gdGhlIGJhY2t1cCBmaWxlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnksIHZlcnkgcXVpZXRseSB3aXRoIG92ZXJ3cml0ZQoJCQkJLy8gSWYgd2UganVzdCBkaWQgLW8gd2UgY291bGQgdHJ5IGFuZCBnZXQgZmlsZSBjb3VudCBmcm9tIHByb2Nlc3NpbmcgJG91dHB1dCBidXQgaXQgd291bGQgYmUgYSBiaXQgdGltZS1jb25zdW1pbmcKCQkJCSR1bnppcF9jb21tYW5kID0gJGNvbW1hbmQgLiAiIC1xcW8gJ3skemlwX2ZpbGV9JyAtZCAneyRkZXN0aW5hdGlvbl9kaXJlY3Rvcnl9JyAteCAnaW1wb3J0YnVkZHkucGhwJyI7CgkJCQkKCQkJCSR1bnppcF9jb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICR1bnppcF9jb21tYW5kICkgOiAkdW56aXBfY29tbWFuZDsKCQkJCQoJCQkJQGV4ZWMoICR1bnppcF9jb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJY2FzZSAwOgoJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGFwcGFyZW50bHkgbm8gZXh0cmFjdGlvbiBwcm9ibGVtcwoJCQkJCQkKCQkJCQkJLy8gTm93IHdlIGhhdmUgdG8gZG8gYSBzZWNvbmQgcnVuIHRvIGZpbmQgb3V0IHRoZSBmaWxlIGNvdW50IChjcmF6eSkKCQkJCQkJJGxpc3RfY29tbWFuZCA9ICRjb21tYW5kIC4gIiAtcWwgJ3skemlwX2ZpbGV9JyI7CgkJCQkJCQoJCQkJCQkkbGlzdF9jb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICRsaXN0X2NvbW1hbmQgKSA6ICRsaXN0X2NvbW1hbmQ7CgkJCQkJCQoJCQkJCQkvLyRzdW1tYXJ5ID0gQGV4ZWMoICRsaXN0X2NvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCQkkc3VtbWFyeSA9IEBleGVjKCAkbGlzdF9jb21tYW5kICk7CgoJCQkJCQkvLyBDdXJyZW50bHkgZG9uJ3QgYm90aGVyIHRvIGNoZWNrIGV4aXQgY29kZSwgaWYgd2UgZmFpbGVkIHRoZW4gd2hhdGV2ZXIgd2UgZ290IGJhY2sgaW4KCQkJCQkJLy8gTGFzdCBvdXRwdXQgbGluZSBfc2hvdWxkXyBoYXZlIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIChhbmQgdGhhdCBpcyByZXR1cm5lZCBieSBleGVjKQoJCQkJCQkvLyAkc3VtbWFyeSBpcyB1bmxpa2VseSB0byBtYXRjaCB0aGUgcGF0dGVybiBzbyBmaWxlIGNvdW50IHdpbGwganVzdCBkZWZhdWx0IHRvIDAKCQkJCQkJaWYgKCBwcmVnX21hdGNoKCJ8W1s6XmRpZ2l0Ol1dKyg/UDxieXRlX2NvdW50PltbOmRpZ2l0Ol1dKylbWzpeZGlnaXQ6XV0rKD9QPGZpbGVfY291bnQ+W1s6ZGlnaXQ6XV0rKVtbOnNwYWNlOl1dKyhmaWxlcyl8IiwgJHN1bW1hcnksICRtYXRjaGVzICkgKSB7CgkJCQkJCQoJCQkJCQkJLy8gU2hvdWxkIGJlIGFibGUgdG8gcHVsbCB0aGlzIHN0cmFpZ2h0IG91dCBwcm92aWRlZCB0aGUgdW56aXAgdmVyc2lvbiBzdHVjayB0byB0aGUgcnVsZXMKCQkJCQkJCSRmaWxlX2NvdW50ID0gJG1hdGNoZXNbICdmaWxlX2NvdW50JyBdOwoJCQkJCQkJCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQoJCQkJCQkJLy8gU29tZSByZWFzb24gd2UgZGlkbid0IGdldCBnb29kIG91dHB1dCBvciB0aGUgZm9ybWF0IGlzIG9kZAoJCQkJCQkJJGZpbGVfY291bnQgPSAwOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoJCgkJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsKCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gZXh0cmFjdCBjb250ZW50cyAoJTEkcyB0byAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQoJCX0KCgkJLyoqCgkJICoJZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcGFyYW0JYXJyYXkJCSRpdGVtcwkJCQkJCU1hcHBpbmcgb2Ygd2hhdCB0byBleHRyYWN0IGFuZCB0byB3aGF0CgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzIChhbGwgZXh0cmFjdGlvbnMgc3VjY2Vzc2Z1bCksIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgKSB7CgkJCgkJCSRzdW1tYXJ5ID0gJyc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkZXhpdF9jb2RlID0gMTI3OwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJJHJlbmFtZV9yZXF1aXJlZCA9IGZhbHNlOwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgdW56aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHVuemlwIHBhdGg6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkemlwcGF0aCApOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCc7CQoJCgkJCQkvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGVhY2ggaXRlbSBhbmQgcnVuIGFuIHVuemlwIGZvciBpdCAtIHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gZWFzeSB3YXkgb2YgY29tYmluaW5nCgkJCQkvLyBhcmJpdHJhcnkgZXh0cmFjdGlvbnMgaW50byBhIHNpbmdsZSBjb21tYW5kIGlmIHNvbWUgbWlnaHQgYmUgdG8gYSAKCQkJCWZvcmVhY2ggKCAkaXRlbXMgYXMgJHdoYXQgPT4gJHdoZXJlICkgewoJCQkJCgkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IGZhbHNlOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJCS8vIERlY2lkZSBob3cgdG8gZXh0cmFjdCBiYXNlZCBvbiB3aGVyZQoJCQkJCWlmICggZW1wdHkoICR3aGVyZSkgKSB7CgkJCQkJCgkJCQkJCS8vIEV4dHJhY3QgZGlyZWN0IHRvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aXRoIGp1bmtlZCBwYXRoCgkJCQkJCSR1bnppcF9jb21tYW5kID0gJGNvbW1hbmQgLiAiIC1xcW9qICd7JHppcF9maWxlfScgJ3skd2hhdH0nIC1kICd7JGRlc3RpbmF0aW9uX2RpcmVjdG9yeX0nICI7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCAhZW1wdHkoICR3aGVyZSApICkgewoJCQkJCQoJCQkJCQlpZiAoICR3aGF0ID09PSAkd2hlcmUgKSB7CgkJCQkJCQoJCQkJCQkJLy8gRXh0cmFjdCB0byBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgLSBkb24ndCBqdW5rIHBhdGgsIG5vIG5lZWQgdG8gYWRkIHdoZXJlIHRvIGRlc3RuYXRpb24gYXMgYXV0b21hdGljCgkJCQkJCQkkdW56aXBfY29tbWFuZCA9ICRjb21tYW5kIC4gIiAtcXFvICd7JHppcF9maWxlfScgJ3skd2hhdH0nIC1kICd7JGRlc3RpbmF0aW9uX2RpcmVjdG9yeX0nICI7CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIEZpcnQgd2UnbGwgZXh0cmFjdCBhbmQganVuayB0aGUgcGF0aAoJCQkJCQkJJHVuemlwX2NvbW1hbmQgPSAkY29tbWFuZCAuICIgLXFxb2ogJ3skemlwX2ZpbGV9JyAneyR3aGF0fScgLWQgJ3skZGVzdGluYXRpb25fZGlyZWN0b3J5fScgIjsKCQkJCQkJCQoJCQkJCQkJLy8gV2lsbCBuZWVkIHRvIHJlbmFtZSBpZiB0aGUgZXh0cmFjdCBpcyBvawoJCQkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IHRydWU7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQkJJHVuemlwX2NvbW1hbmQgPSAoIHNlbGY6Ok9TX1RZUEVfV0lOID09PSAkdGhpcy0+Z2V0X29zX3R5cGUoKSApID8gc3RyX3JlcGxhY2UoICdcJycsICciJywgJHVuemlwX2NvbW1hbmQgKSA6ICR1bnppcF9jb21tYW5kOwoJCQkJCgkJCQkJQGV4ZWMoICR1bnppcF9jb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJCS8vIE5vdGU6IHdlIGRvbid0IG9wZW4gdGhlIGZpbGUgYW5kIHRoZW4gZG8gc3R1ZmYgYnV0IGl0J3MgYWxsIGRvbmUgaW4gb25lIGFjdGlvbgoJCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJCWNhc2UgMDoKCQkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBubyBleHRyYWN0aW9uIHByb2JsZW1zCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR3aGF0LCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGVyZSApICk7CgkJCQkJCQoJCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJCS8vIFJlbmFtZSBpZiB3ZSBoYXZlIHRvCgkJCQkJCQlpZiAoIHRydWUgPT09ICRyZW5hbWVfcmVxdWlyZWQpIHsKCQkJCQkJCQoJCQkJCQkJCS8vIE5vdGU6IHdlIGp1bmtlZCB0aGUgcGF0aCBvbiB0aGUgZXh0cmFjdGlvbiBzbyBqdXN0IHRoZSBmaWxlbmFtZSBvZiAkd2hhdCBpcyB0aGUgc291cmNlIGJ1dAoJCQkJCQkJCS8vICR3aGVyZSBjb3VsZCBiZSBhIHNpbXBsZSBmaWxlIG5hbWUgb3IgYSBmaWxlIHBhdGggCgkJCQkJCQkJJHJlc3VsdCA9ICRyZXN1bHQgJiYgcmVuYW1lKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGJhc2VuYW1lKCAkd2hhdCApLAoJCQkJCQkJCQkJCQkJCQkgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkd2hlcmUgKTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCS8vIEZvciBub3cgbGV0J3MganVzdCBwcmludCB0aGUgZXJyb3IgY29kZSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJGV4aXRfY29kZTsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gZXh0cmFjdCBjb250ZW50cyAoJTEkcyBmcm9tICUyJHMgdG8gJTMkcyU0JHMpIC0gRXJyb3IgSW5mbzogJTUkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkd2hhdCwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkd2hlcmUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCX0KCQkJCQkKCQkJCQkvLyBJZiB0aGUgZXh0cmFjdGlvbiBmYWlsZWQgKG9yIHJlbmFtZSBhZnRlciBleHRyYWN0aW9uKSB0aGVuIGJyZWFrIG91dCBvZiB0aGUgZm9yZWFjaCBhbmQgc2ltcGx5IHJldHVybiBmYWxzZQoJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgZXhlYyBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgZnVuY3Rpb24KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ2V4ZWMgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGV4ZWMgZnVuY3Rpb24gbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiQ2xhc3Mgbm90IGF2YWlsYWJsZSB0byBtYXRjaCBtZXRob2QiICk7CgkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCgkJfQoKCQkvKioKCQkgKglmaWxlX2V4aXN0cygpCgkJICoJCgkJICoJVGVzdHMgd2hldGhlciBhIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBnaXZlbiB6aXAgZmlsZQoJCSAqCUlmIGxlYXZlX29wZW4gaXMgdHJ1ZSB0aGVuIHRoZSB6aXAgb2JqZWN0IHdpbGwgYmUgbGVmdCBvcGVuIGZvciBmYXN0ZXIgY2hlY2tpbmcgZm9yIHN1YnNlcXVlbnQgZmlsZXMgd2l0aGluIHRoaXMgemlwCgkJICogIE5vdGU6IHRoaXMgaXMgaWdub3JlZCBoZXJlIGJlY2F1c2UgaXQgaGFzIG5vIG1lYW5pbmcgaW4gdGhlIHVzZSBvZiB0aGUgdW56aXAgY29tbWFuZAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXBfZmlsZQkJVGhlIHppcCBmaWxlIHRvIGNoZWNrCgkJICoJQHBhcmFtCQlzdHJpbmcJJGxvY2F0ZV9maWxlCVRoZSBmaWxlIHRvIHRlc3QgZm9yCgkJICoJQHBhcmFtCQlib29sCSRsZWF2ZV9vcGVuCQlPcHRpb25hbDogVHJ1ZSBpZiB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGxlZnQgb3BlbgoJCSAqCUByZXR1cm4JCWJvb2wvYXJyYXkJCQkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBmb3VuZCBpbiB0aGUgemlwIGFuZCBmYWxzZSBpZiBub3QsIGFycmF5IGZvciBvdGhlciBwcm9ibGVtCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmZpbGVfZXhpc3RzX2dlbmVyaWMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZmlsZV9leGlzdHNfZ2VuZXJpYyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCQkgIAkKCQl9CgoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzX2dlbmVyaWMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUByZXR1cm4JCWJvb2wvYXJyYXkJCQkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBmb3VuZCBpbiB0aGUgemlwIGFuZCBmYWxzZSBpZiBub3QsIGFycmF5IGZvciBvdGhlciBwcm9ibGVtCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHNfZ2VuZXJpYyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUgKSB7CgkJCgkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkdlbmVyaWMgZmFpbHVyZSBpbmRpY2F0aW9uIiApOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgdW56aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHVuemlwIHBhdGg6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkemlwcGF0aCApOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCc7CQoJCgkJCQkvLyBUcnkgYW4gYXJjaGl2ZSB0ZXN0IG9uIHRoZSBmaWxlIGFuZCB3ZSdsbCBqdXN0IGxvb2sgYXQgdGhlIHJldHVybiBjb2RlCgkJCQkkY29tbWFuZCAuPSAiIC1xdCAneyR6aXBfZmlsZX0nICd7JGxvY2F0ZV9maWxlfSciOwoJCQkJCgkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgoJCQkJQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gaW5kaWNhdGUKCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJY2FzZSAwOgoJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGZpbGUgZm91bmQgYW5kIGNoZWNrZWQgb3V0IG9rIHNvIHJldHVybiBzdWNjZXNzCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgZm91bmQgKGV4ZWMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTE6CgkJCQkJCS8vIE5vIHByb2JsZW0gaGFuZGxpbmcgYXJjaGl2ZSBidXQgZmlsZSBzaW1wbHkgbm90IGZvdW5kIHNvIHJldHVybiBmYWlsdXJlCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kIChleGVjKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHMgKGxvb2tpbmcgZm9yICUxJHMgaW4gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRsb2NhdGVfZmlsZSAsICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkZhaWxlZCB0byBvcGVuL3Byb2Nlc3MgZmlsZSIgKTsKCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgZXhlYyBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgZnVuY3Rpb24KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ2V4ZWMgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGV4ZWMgZnVuY3Rpb24gbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgoJCX0KCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmdldF9maWxlX2xpc3RfZ2VuZXJpYyggJHppcF9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+Z2V0X2ZpbGVfbGlzdF9nZW5lcmljKCAkemlwX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoJCQoJCS8qCWdldF9maWxlX2xpc3RfZ2VuZXJpYygpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3RfZ2VuZXJpYyggJHppcF9maWxlICkgewoJCQoJCQkkZmlsZV9saXN0ID0gYXJyYXkoKTsKCQkJJHN0YXRfa2V5cyA9IGFycmF5KCAncGVybWlzc2lvbnMnLCAnemlwX3ZlcnNpb24nLCAnemlwX29zJywgJ3NpemUnLCAndHlwZV9hdHRyJywgJ2NvbXByZXNzZWRfc2l6ZScsICdjb21wcmVzc2lvbl9tZXRob2QnLCAnbWRhdGUnLCAnZmlsZW5hbWUnICk7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCQoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkgKSB7CgkJCQoJCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEggKTsKCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoCgkJCQlpZiAoICFlbXB0eSAoICR6aXBwYXRoICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVXNpbmcgYWJzb2x1dGUgdW56aXAgcGF0aDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR6aXBwYXRoICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIEFkZCB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgcmVxdWlyZWQKCQkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3VuemlwJzsJCgoJCQkJLy8gV2UnbGwgdHJ5IGFuZCBnZXQgYSAqbml4IHN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nIG91dHB1dCBhbmQgcHJvY2VzcyBpdAoJCQkJLy8gTm90ZTogd2UnbGwgaWdub3JlIHN0ZGVyciBvdXRwdXQgZm9yIG5vdyBhcyBpdCBtaWdodCBpbnRlcmZlcmUKCQkJCS8vIE5vdGU6IHRoZSBmaWxlIGRhdGUgZ2l2ZW4gaXMgdGhlIHN0b3JlZCBsb2NhbCB0aW1lIChub3QgVVRDIHdoaWNoIG1heSBiZSBzdG9yZWQgYXMgd2VsbCkKCQkJCQoJCQkJLy8gT3V0cHV0IGZvcm1hdCBzaG91bGQgYmUgbGlrZToKCQkJCS8vIC1yd3hyLXhyLXggIDIuMyB1bnggICAgIDI3MjkgdHggICAgMTA5OSBkZWZOIDIwMTIwMjIwLjIzMTk1NiBmaWxlL3BhdGgvbmFtZS5leHQKCQkJCSRjb21tYW5kIC49ICIgLVogLS1oIC0tdCAtbFQgJ3skemlwX2ZpbGV9JyI7CgkJCQkKCQkJCSRjb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICRjb21tYW5kICkgOiAkY29tbWFuZDsKCgkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCgkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJc3dpdGNoICggKGludCkgJGV4aXRfY29kZSApIHsKCQkJCQljYXNlIDA6CgkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBnb3QgYSBsaXN0IHNvIHRyeSBhbmQgcHJvY2VzcyBpdAoJCQkJCQkKCQkJCQkJLy8gU2hvdWxkIGJlIG9uZSBmaWxlIHBlciBsaW5lLCBubyBtb3JlIG5vIGxlc3MKCQkJCQkJJGZpbGVfY291bnQgPSBzaXplb2YoICRvdXRwdXQgKTsKCQkJCQkJCgkJCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoJCQkJCQkKCQkJCQkJCS8vIEJyZWFrIHVwIHRoZSBvdXRwdXQgYmFzZWQgb24gd2hpdGVzcGFjZSBmb3IgbWF4IG9mIDkgZmllbGRzIChsYXN0IHdpbGwgYmUgZmlsZW5hbWUpCgkJCQkJCQkkc3RhdCA9IGFycmF5X2NvbWJpbmUoICAkc3RhdF9rZXlzICwgcHJlZ19zcGxpdCggIi9bXHMsXSsvIiwgJGxpbmUsIDkgKSApOwoJCQkJCQkJCgkJCQkJCQkvLyBDb252ZXJ0IHNjcmV3eSBkYXRlIGZvcm1hdCB0byBhIGNvbW1vbiBub3RhdGlvbiAoY2hvb3NlIE15U1FMIGZvcm1hdCkKCQkJCQkJCSR0cmFuc2xhdGVkX21kYXRlID0gcHJlZ19yZXBsYWNlKCAnLyhcZHs0fSkoXGR7Mn0pKFxkezJ9KS4oXGR7Mn0pKFxkezJ9KShcZHsyfSkvJywnJDEtJDItJDMgJDQ6JDU6JDYnICwgJHN0YXRbICdtZGF0ZScgXSApOwoKCQkJCQkJCS8vIE11c3QgY29udmVydCB0byBhIHRpbWVzdGFtcCAodXNpbmcgY3VycmVudCB0aW1lem9uZSkKCQkJCQkJCSRzdGF0WyAnbXRpbWUnIF0gPSBzdHJ0b3RpbWUoICR0cmFuc2xhdGVkX21kYXRlICk7CgkJCQkJCQkKCQkJCQkJCSRmaWxlX2xpc3RbXSA9IGFycmF5KAoJCQkJCQkJCSRzdGF0WyAnZmlsZW5hbWUnIF0sCgkJCQkJCQkJJHN0YXRbICdzaXplJyBdLAoJCQkJCQkJCSRzdGF0WyAnY29tcHJlc3NlZF9zaXplJyBdLAoJCQkJCQkJCSRzdGF0WyAnbXRpbWUnIF0KCQkJCQkJCSk7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAodW56aXApIGxpc3RlZCBmaWxlIGNvbnRlbnRzICglMSRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXBfZmlsZSApOwoJCQkJCQkKCQkJCQkJJHJlc3VsdCA9ICYkZmlsZV9saXN0OwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gbGlzdCBjb250ZW50cyAoJTEkcykgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCX0KCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBleGVjIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmdW5jdGlvbgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnZXhlYyBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXhlYyBmdW5jdGlvbiBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJDbGFzcyBub3QgYXZhaWxhYmxlIHRvIG1hdGNoIG1ldGhvZCIgKTsKCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJICAJCgkJfQoJCQoJCS8qCXNldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPnNldF9jb21tZW50X2xpbnV4KCAkemlwX2ZpbGUsICRjb21tZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+c2V0X2NvbW1lbnRfd2luZG93cyggJHppcF9maWxlLCAkY29tbWVudCApOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgoJCS8qCXNldF9jb21tZW50X3dpbmRvd3MoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnRfd2luZG93cyggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoKCQkvKglzZXRfY29tbWVudF9saW51eCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHNldCBjb21tZW50IG9uLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJGNvbW1lbnQJCUNvbW1lbnQgdG8gYXBwbHkgdG8gYXJjaGl2ZS4KCQkgKglAcmV0dXJuCQlib29sCQkJCQkJCXRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tbWVudF9saW51eCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJJG91dHB1dCA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCgkJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1pJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICR6aXBwYXRoICkgLiAnemlwJzsJCgoJCQkJLy8gV2UgaGF2ZSB0byBmZWVkIHRoZSBjb21tZW50IGluIC0gdHJ5aW5nIGJ5IHBpcGUgaGVyZQoJCQkJLy8gV2UgbmVlZCB0byBwcmVwZW5kIHRoZSBjb21tZW50IGlucHV0CgkJCQkkY29tbWFuZCAuPSAiIC16ICd7JHppcF9maWxlfSciOwoJCQkJCgkJCQkvLyBOb3RlIHRoYXQgd2UgZXNjYXBlIHRoZSBjb21tZW50IGFyZyBmb3IgdGhlIHNoZWxsLi4uCgkJCQkkY29tbWFuZCAgPSAnZWNobyAnIC4gZXNjYXBlc2hlbGxhcmcoICRjb21tZW50ICkgLiAnIHwgJyAuICRjb21tYW5kOwoJCQkJCgkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCgkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJc3dpdGNoICggKGludCkgJGV4aXRfY29kZSApIHsKCQkJCQljYXNlIDA6CgkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBzZXQgdGhlIGNvbW1lbnQgLSBubyBmdXJ0aGVyIGFjdGlvbiByZXF1aXJlZAoJCQkJCQkJCQkJCQkJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAoemlwKSBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHppcCkgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIHRvIHNldCBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGEgc3RyaW5nIGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYSBzdHJpbmcgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQoJCX0KCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmdldF9jb21tZW50X2xpbnV4KCAkemlwX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5nZXRfY29tbWVudF93aW5kb3dzKCAkemlwX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoJCQoJCS8qCWdldF9jb21tZW50X3dpbmRvd3MoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudF93aW5kb3dzKCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBidXQganVzdCBpbiBjYXNlIHJldHVybiBmYWxzZSBzaWxlbnRseQoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCQoJCS8qCWdldF9jb21tZW50X2xpbnV4KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnRfbGludXgoICR6aXBfZmlsZSApIHsKCgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSRjb21tZW50ID0gIiI7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCQoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkgKSB7CgkJCQoJCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEggKTsKCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoCgkJCQlpZiAoICFlbXB0eSAoICR6aXBwYXRoICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVXNpbmcgYWJzb2x1dGUgdW56aXAgcGF0aDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR6aXBwYXRoICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIEFkZCB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgcmVxdWlyZWQKCQkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3VuemlwJzsJCgoJCQkJLy8gV2UgZXhwZWN0IHR3byBsaW5lcyBvZiBvdXRwdXQgLSB0aGUgZmlyc3Qgc2hwdWxkIGJlIHRoZSBhcmNoaXZlIG5hbWUgYW5kIHRoZSBzZWNvbmQgY29tbWVudCBpZiBwcmVzZW50CgkJCQkkY29tbWFuZCAuPSAiIC16ICd7JHppcF9maWxlfSciOwoJCQkJCgkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCgkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJc3dpdGNoICggKGludCkgJGV4aXRfY29kZSApIHsKCQkJCQljYXNlIDA6CgkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBnb3QgYSBjb21tZW50IHNvIHRyeSBhbmQgcHJvY2VzcyBpdAoJCQkJCQkKCQkJCQkJLy8gU2hvdWxkIGJlIG9uZSBmaWxlIHBlciBsaW5lLCBubyBtb3JlIG5vIGxlc3MKCQkJCQkJJGxpbmVfY291bnQgPSBzaXplb2YoICRvdXRwdXQgKTsKCQkJCQkJCgkJCQkJCS8vIE11c3QgaGF2ZSBhdCBsZWFzdCAyIGxpbmVzIGZvciB0aGVyZSB0byBiZSBhIG5vbi1lbXB0eSBjb21tZW50CgkJCQkJCWlmICggJGxpbmVfY291bnQgPiAxICkgewoJCQkJCQkKCQkJCQkJCS8vIFNpbXBsZSBjcml0ZXJpYSBmb3Igbm93IC0ganVzdCB0YWtlIHRoZSBmaW5hbCBsaW5lCgkJCQkJCQkvLyBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbm8gY29tbWVudCB0aGlzIGlzIHN0aWxsIHZhbGlkIGFzIGFuIGVtcHR5IGNvbW1lbnQKCQkJCQkJCS8vIHNvIHdlIGRvbid0IHRyZWF0IHRoaXMgYXMgYW4gZXJyb3IKCQkJCQkJCS8vJGNvbW1lbnQgPSAkb3V0cHV0WyAkbGluZV9jb3VudCAtIDFdOwoJCQkJCQkJdW5zZXQoICRvdXRwdXRbMF0gKTsKCQkJCQkJCSRjb21tZW50ID0gaW1wbG9kZSggJycsICRvdXRwdXQgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAodW56aXApIHJldHJpZXZlZCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCQkKCQkJCQkJJHJlc3VsdCA9ICRjb21tZW50OwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGdldCBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGEgc3RyaW5nIGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYSBzdHJpbmcgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCX0gLy8gZW5kIHBsdWdpbmJ1ZGR5X3piemlwZXhlYyBjbGFzcy4JCgkKfQ== ###PACKDATA,FILE_END,/lib/zipbuddy/zbzipexec.php,importbuddy/lib/zipbuddy/zbzipexec.php ###PACKDATA,FILE_START,/lib/zipbuddy/zbzippclzip.php,importbuddy/lib/zipbuddy/zbzippclzip.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwcGNsemlwIENsYXNzCiAqCiAqICBFeHRlbmRzIHRoZSB6aXAgY2FwYWJpbGl0eSBjb3JlIGNsYXNzIHdpdGggcGNsemlwIHNwZWNpZmljIGNhcGFiaWxpdHkKICoJCiAqCVZlcnNpb246IDEuMC4wCiAqCUF1dGhvcjoKICoJQXV0aG9yIFVSSToKICoKICoJQHBhcmFtCQkkcGFyZW50CQlvYmplY3QJCU9wdGlvbmFsIHBhcmVudCBvYmplY3Qgd2hpY2ggY2FuIHByb3ZpZGUgZnVuY3Rpb25zIGZvciByZXBvcnRpbmcsIGV0Yy4KICoJQHJldHVybgkJbnVsbAogKgogKi8KaWYgKCAhY2xhc3NfZXhpc3RzKCAicGx1Z2luYnVkZHlfemJ6aXBwY2x6aXAiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9QY2xaaXAgQ2xhc3MKCSAqCgkgKglXcmFwcGVyIGZvciBQY2xaaXAgdG8gZW5jYXBzdWxhdGUgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUgUGNsWmlwIGxpYnJhcnkgKGlmIG5vdAoJICoJYWxyZWFkeSBsb2FkZWQsIHdoaWNoIGl0IHNob3VsZG4ndCBiZSBnZW5lcmFsbHkpIGFuZCBhbHNvIHN1cnJvdW5kaW5nIG1ldGhvZCBjYWxscwoJICoJd2l0aCB0aGUgdW5wbGVhc2FudCB3b3JrYXJvdW5kIGZvciB0aGUgbWJzdHJpbmcgaXNzdWUgd2hlcmUgdGhpbmdzIG1heSBmYWlsIGJlY2F1c2UKCSAqCVBjbFppcCBpcyB1c2luZyBzdHJpbmcgZnVuY3Rpb25zIHRvIHByb2Nlc3MgYmluYXJ5IGRhdGEgYW5kIGlmIHRoZSBzdHJpbmcgZnVuY3Rpb25zCgkgKglhcmUgb3ZlcmxvYWRlZCB3aXRoIHRoZSBtdWx0aS1ieXRlIHZlcnNpb25zIHRoZSBwcm9jZXNzaW5nIGNhbiAocHJvYmFibHkgd2lsbCkgZmFpbC4KCSAqCgkgKglAcGFyYW0Jc3RyaW5nCSR6aXBfZmlsZW5hbWUJVGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlIHRoYXQgd2lsbCBiZSBtYW5hZ2VkCgkgKglAcmV0dXJuCW51bGwKCSAqCgkgKi8KCWNsYXNzIHBsdWdpbmJ1ZGR5X1BjbFppcCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjcmVhdGVkIFBjbFppcCBvYmplY3QgaWYgaXQgY2FuIGJlIGNyZWF0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyICRfemEgCW9iamVjdAogICAgICAgICAqLwoJCXByaXZhdGUgJF96YSA9IE5VTEw7CgkJCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJVGhpcyBpcyB1c2VkIHRvIHRyeSBhbmQgbG9hZCB0aGUgUGNsWmlwIGxpYnJhcnkgYW5kIHRoZW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mCgkJICoJYW4gYXJjaGl2ZSB3aXRoIHRoYXQuIElmIHRoZSBsaWJyYXJ5IGNhbm5vdCBiZSBtYWRlIGF2YWlsYWJsZSB0aGVuIGFuIGV4Y2VwdGlvbgoJCSAqCWlzIHRocm93biBhbmQgdGhhdCBpcyBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIuCgkJICoJVE9ETzogQ29uc2lkZXIgaGF2aW5nIGEgInN1cHByZXNzIHdhcm5pbmdzIiBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgbWV0aG9kcwoJCSAqCXNob3VsZCBiZSBpbnZva2VkIHdpdGggd2FybmluZ3Mgc3VwcHJlc3NlZCBvciBub3QuIEZvciBpc19hdmFpbGFibGUoKSB1c2FnZSB3ZSB3b3VsZAoJCSAqCXdhbnQgdG8gc28gYXMgbm90IHRvIHBvdGVudGlhbGx5IGZsb29kIHRoZSBQSFAgZXJyb3IgbG9nLiBGb3Igb3RoZXIgZnVuY3Rpb25zIHRoYXQKCQkgKglhcmUgbm90IGNhbGxlZCBmcmVxdWVudGx5IHdlIG1pZ2h0IG5vdCB3YW50IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5ncy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGVuYW1lCVRoZSBuYW1lIG9mIHRoZSB6aXAgZmlsZSB0aGF0IHdpbGwgYmUgbWFuYWdlZAoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHppcF9maWxlbmFtZSApIHsKCQkKCQkJLy8gVGhlIFBjbFppcCBjbGFzcyBoYXMgdG8gYmUgYXZhaWxhYmxlIGZvciB1cyBzbyBsZXQncyBoYXZlIGEgZ28KCQkJLy8gTm90ZTogaXQgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2Ugbm90aGluZyB3aWxsIGJyZWFrIHdpdGhvdXQgaXQgYnV0IHRoZSBtZXRob2Qgd2lsbCAKCQkJLy8gc2ltcGx5IG5vdCBiZSBhdmFpbGFibGUKCQkJLy8gVGhpcyBtYXkgc2VlbSBsYWJvcmlvdXMgYnV0IGl0J3Mgcm9idXN0IGFnYWluc3QgaW5jbHVkZV9vbmNlIG5vdCBwbGF5aW5nIG5pY2UgaWYgdGhlCgkJCS8vIGNsYXNzIGlzIGFscmVhZHkgaW5jbHVkZWQgYW5kIHRyeWluZyB0byBpbmNsdWRlIGl0IGFnYWluCgkJCWlmICggIUBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSApICkgewoJCQkKCQkJCSRwb3NzaWJsZXMgPSBhcnJheSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJywgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKTsKCQkJCQoJCQkJZm9yZWFjaCAoICRwb3NzaWJsZXMgYXMgJHBvc3NpYmxlKSB7CgkJCQkKCQkJCQlpZiAoIEBpc19yZWFkYWJsZSggJHBvc3NpYmxlICkgKSB7CgkJCQkJCgkJCQkJCS8vIEZvdW5kIG9uZSB0aGF0IHNob3VsZCBiZSBsb2FkYWJsZSBzbyB0cnkgaXQgYW5kIHRoZW4gYnJlYWsgb3V0CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BDTFppcCBjbGFzcyBub3QgZm91bmQuIEF0dGVtcHRpbmcgdG8gbG9hZCBmcm9tIGAnIC4gJHBvc3NpYmxlIC4gJ2AuJyApOwoJCQkJCQlAaW5jbHVkZV9vbmNlKCAkcG9zc2libGUgKTsKCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkKCQkJCQl9IAoJCQkJCgkJCQl9CgoJCQl9CgkJCQoJCQkvLyBCeSBub3cgUGNsWmlwIF9zaG91bGRfIGJlIGF2YWlsYWJsZSBzbyBsZXQncyBzZWUuLi4KCQkJaWYgKCBAY2xhc3NfZXhpc3RzKCAnUGNsWmlwJywgZmFsc2UgKSApIHsKCQkJCgkJCQkvLyBJdCdzIGF2YWlsYWJsZSBzbyBjcmVhdGUgdGhlIHByaXZhdGUgaW5zdGFuY2UKCQkJCSR0aGlzLT5femEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGVuYW1lICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBOb3QgYXZhaWxhYmxlIHNvIHRocm93IHRoZSBleGNlcHRpb24gZm9yIHRoZSBjYWxsZXIgdG8gaGFuZGxlCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAnUGNsWmlwIGNsYXNzIGRvZXMgbm90IGV4aXN0LicgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCQoJCQlpZiAoIE5VTEwgIT0gJHRoaXMtPl96YSApIHsgdW5zZXQgKCAkdGhpcy0+X3phICk7IH0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19jYWxsKCkKCQkgKgkKCQkgKglNYWdpYyBtZXRob2QgaW50ZXJjZXB0aW5nIGNhbGxzIHRvIHVua25vd24gbWV0aG9kcy4gVGhpcyBhbGxvd3MgdXMgdG8gaW50ZXJjZXB0CgkJICoJYWxsIG1ldGhvZCBjYWxscyBhbmQgYWRkIGFkZGl0aW9uYWwgcHJvY2Vzc2luZwoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRtZXRob2QJCVRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QKCQkgKglAcGFyYW0JCWFycmF5CSRhcmd1bWVudHMJQXJyYXkgb2YgdGhlIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZCBjYWxsCgkJICoJQHJldHVybgkJbWl4ZWQJJHJlc3VsdAkJV2hhdGV2ZXIgdGhlIGludm9rZWQgd3JhcHBlciBtZXRob2QgY2FsbCByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCAkbWV0aG9kLCAkYXJndW1lbnRzICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCS8vIFNlZSAjMTU3ODkgLSBQY2xaaXAgdXNlcyBzdHJpbmcgZnVuY3Rpb25zIG9uIGJpbmFyeSBkYXRhCgkJCS8vIElmIGl0J3Mgb3ZlcmxvYWRlZCB3aXRoIE11bHRpYnl0ZSBzYWZlIGZ1bmN0aW9ucyB0aGUgcmVzdWx0cyBhcmUgaW5jb3JyZWN0LgoJCQlpZiAoIEBpbmlfZ2V0KCAnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcgKSAmJiBAZnVuY3Rpb25fZXhpc3RzKCAnbWJfaW50ZXJuYWxfZW5jb2RpbmcnICkgKSB7CgkJCQoJCQkJJHByZXZpb3VzX2VuY29kaW5nID0gQG1iX2ludGVybmFsX2VuY29kaW5nKCk7CgkJCQlAbWJfaW50ZXJuYWxfZW5jb2RpbmcoICdJU08tODg1OS0xJyApOwoJCQkJCgkJCX0KCQkKCQkJJHJlc3VsdCA9IEBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICR0aGlzLT5femEsICRtZXRob2QgKSwgJGFyZ3VtZW50cyApOwoJCQkKCQkJLy8gTm93IHVuZG8gYW55IGNoYW5nZSB3ZSBtYXkgaGF2ZSBtYWRlIHRvIHRoZSBlbmNvZGluZwoJCQlpZiAoIGlzc2V0KCAkcHJldmlvdXNfZW5jb2RpbmcgKSApIHsKCQkJCgkJCQlAbWJfaW50ZXJuYWxfZW5jb2RpbmcoICRwcmV2aW91c19lbmNvZGluZyApOwoJCQkJdW5zZXQoICRwcmV2aW91c19lbmNvZGluZyApOwoKCQkJfQoJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkKCX0KCgljbGFzcyBwbHVnaW5idWRkeV96YnppcHBjbHppcCBleHRlbmRzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKCQkvLyBDb25zdGFudHMgZm9yIGZpbGUgaGFuZGxpbmcKCQljb25zdCBaSVBfRVJST1JTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcGNsemlwX2Vycm9ycy50eHQnOwoJCWNvbnN0IFpJUF9XQVJOSU5HU19GSUxFX05BTUUgPSAnbGFzdF9wY2x6aXBfd2FybmluZ3MudHh0JzsKCQljb25zdCBaSVBfT1RIRVJTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcGNsemlwX290aGVycy50eHQnOwoJCWNvbnN0IFpJUF9DT05URU5UX0ZJTEVfTkFNRSAgPSAnbGFzdF9wY2x6aXBfbGlzdC50eHQnOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIG1ldGhvZCB0YWcgdXNlZCB0byByZWZlciB0byB0aGUgbWV0aG9kIGFuZCBlbnRpdGllcyBhc3NvY2lhdGVkIHdpdGggaXQgc3VjaCBhcyBjbGFzcyBuYW1lCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAkX21ldGhvZF90YWcgCXN0cmluZwogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9tZXRob2RfdGFnID0gJ3BjbHppcCc7CgkJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSB0cnVlOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIE5vdGU6IFBjbFppcCBjb25zdHJ1Y3RvciBjaGVja3MgZm9yIGd6b3BlbiBmdW5jdGlvbiBhbmQgZGllcyBvbiBmYWlsdXJlIHNvIHdlIG1heSBhcyB3ZWxsIHByZS1lbXB0IHRoYXQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF9kZXBlbmRlbmNpZXMgPSBhcnJheSggJ2NsYXNzZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZnVuY3Rpb25zJyA9PiBhcnJheSggJ2d6b3BlbicgKSwKCQkJCQkJCQkJCQkgIAkJICdleHRlbnNpb25zJyA9PiBhcnJheSggKSwKCQkJCQkJCQkJCQkgIAkJICdmaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdjaGVja19mdW5jJyA9PiAnY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnCgkJCQkJCQkJCQkJCQkpOwoJCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBzdGF0aWMgbWV0aG9kIHRhZyBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlzdHJpbmcJVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWdfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBjb21wYXRpYmlsaXR5IG1ldGhvZCBpbmRpY2F0b3IgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYm9vbAlUcnVlIGlmIGlzIGEgY29tcGF0aWJpbGl0eSBtZXRob2QKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBtZXRob2QgZGVwZW5kZW5jaWVzIGFycmF5IGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWFycmF5CVRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlcXVpcmVzIHRvIGJlIGEgc3VwcG9ydGVkIG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF9kZXBlbmRlbmNpZXM7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBBbGxvd3MgYWRkaXRpb25hbCBtZXRob2QgZGVwZW5kZW5jeSBjaGVja3MgYmV5b25kIHRoZSBzdGFuZGFyZCBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlib29sCVRydWUgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmN5IGNoZWNrcyBwYXNzZWQKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIE5lZWQgdG8gdmVyaWZ5IHRoYXQgYXQgbGVhc3QgUGNsWmlwIHNob3VsZCBiZSBhdmFpbGFibGUgdG8gYmUgbG9hZGVkIChidXQgd2UKCQkJLy8gZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBsb2FkIGl0IGhlcmUpCgkJCSRwb3NzaWJsZXMgPSBhcnJheSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJywgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKTsKCQkJCgkJCWZvcmVhY2ggKCAkcG9zc2libGVzIGFzICRwb3NzaWJsZSkgewoJCQkKCQkJCWlmICggQGlzX3JlYWRhYmxlKCAkcG9zc2libGUgKSApIHsKCQkJCQoJCQkJCS8vIEZvdW5kIG9uZSB0aGF0IHNob3VsZCBiZSBsb2FkYWJsZSBzbyBicmVhayBvdXQKCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQl9IAoJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXJlZmVyZW5jZQkmJHBhcmVudAkJW29wdGlvbmFsXSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAmJHBhcmVudCA9IE5VTEwgKSB7CgoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAkcGFyZW50ICk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnUGNsWmlwIE1ldGhvZCcsCgkJCQkJCQkJCQkJCQkgIAkJCSAgICdjb21wYXRpYmlsaXR5JyA9PiBwbHVnaW5idWRkeV96YnppcHBjbHppcDo6JF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCApCgkJCQkJCQkJCQkJCQkgIAkgICApOwoKCQkJLy8gTm8gcmVsZXZhbnQgcGFyYW1ldGVycyBmb3IgdGhpcyBtZXRob2QKCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdID0gYXJyYXkoKTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCV9fZGVzdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgZGVzdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCggKSB7CgkJCgkJCXBhcmVudDo6X19kZXN0cnVjdCgpOwoKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X21ldGhvZF90YWcoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIG1ldGhvZCB0YWcKCQkgKgkKCQkgKglAcmV0dXJuCQlzdHJpbmcgVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZygpIHsKCQkKCQkJcmV0dXJuIHBsdWdpbmJ1ZGR5X3piemlwcGNsemlwOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCQkKCQkJLyoqCgkJICoJZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBpc19jb21wYXRpYmlsaXR5X21ldGhvZCBib29sZWFuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpIHsKCQkKCQkJcmV0dXJuIHBsdWdpbmJ1ZGR5X3piemlwcGNsemlwOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaXNfYXZhaWxhYmxlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHNwZWNpZmljIG1ldGhvZCBhbmQgaXRzIGF2YWlsYWJsZSBtb2Rlcy4gV2lsbCB0ZXN0IGZvcgoJCSAqICBtdWx0aXBsZSBtb2RlcyAoemlwICYgdW56aXApIGFuZCBvbmx5IHJldHVybiBmYWxzZSBpZiBuZWl0aGVyIGlzIGF2YWlsYWJsZS4gQWN0dWFsIGF2YWlsYWJsZSBtb2RlcyB3aWxsCgkJICogIGJlIGluZGljYXRlZCBpbiB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMuCgkJICoKCQkgKiAgTm90ZTogaW4gdGhpcyBjYXNlIGFzIHRoZSB6aXAgYW5kIHVuemlwIGNhcGFiaWxpdGllcyBhcmUgYWxsIHdyYXBwZWQgdXAgaW4gdGhlIHNhbWUgY2xhc3MgdGhlbiBpZiB3ZQoJCSAqICBjYW4gemlwIHRoZW4gd2UnbGwgYXNzdW1lIChmb3Igbm93KSB0aGF0IHdlIGNhbiB1bnppcCBhcyB3ZWxsIHNvIGF0dHJpYnV0ZXMgYXJlIHNldCBhY2NvcmRpbmdseS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcglUZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYW55IHRlc3QgZmlsZXMgKG11c3QgYmUgd3JpdGVhYmxlKQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3Qgb25lIG1vZGUsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGlzX2F2YWlsYWJsZSggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCSR0ZXN0X2ZpbGUgPSAkdGVtcGRpciAuICd0ZW1wX3Rlc3RfJyAuIHVuaXFpZCgpIC4gJy56aXAnOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR0ZXN0X2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgdGVzdCBGQUlMRUQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJaWYgKCAkemEtPmNyZWF0ZSggX19GSUxFX18gLCBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRILCBkaXJuYW1lKCBfX0ZJTEVfXykgICkgIT09IDAgKSB7CgkJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ0Vycm9yICM1NjQ2MzQuIFVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcykhJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHRlc3RfZmlsZSApICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBUaGUgemlwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAtIGltcGxpZXMgY2FuIHppcCBhbmQgdW56aXAgYW5kIGhlbmNlIGFyY2hpdmUsIGNoZWNrIGFuZCBsaXN0CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfemlwcGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bnppcHBlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfYXJjaGl2ZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NoZWNrZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2xpc3RlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bmFyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19leHRyYWN0b3InIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUGNsWmlwIHRlc3QgUEFTU0VELicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BjbFppcCB0ZXN0IEZBSUxFRDogWmlwIGZpbGUgbm90IGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUGNsWmlwIHRlc3QgRkFJTEVEOiBVbmFibGUgdG8gY3JlYXRlL29wZW4gemlwIGZpbGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BjbFppcCBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCSAgCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQoJCSAgCQoJCSAgCXJldHVybiAkcmVzdWx0OwoJCSAgCQoJCX0KCQkKCQkvKioKCQkgKgljcmVhdGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZQoJCSAqCQoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyID0gTlVMTCApIHsKCQkKCQkJJHphID0gTlVMTDsKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkZXhpdGNvZGUgPSAwOwoJCQkkemlwX291dHB1dCA9IGFycmF5KCk7CgkJCSR0ZW1wX3ppcCA9ICcnOwoJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSBmYWxzZTsKCQkJJGV4Y2x1ZGVfY291bnQgPSAwOwoJCQkkZXhjbHVzaW9ucyA9IGFycmF5KCk7CgkJCSR0ZW1wX2ZpbGVfY29tcHJlc3Npb25fdGhyZXNob2xkID0gNTsKCQkJJHByZV9hZGRfZnVuYyA9ICcnOwoJCQkkaGF2ZV96aXBfZXJyb3JzID0gZmFsc2U7CgkJCSR6aXBfZXJyb3JzX2NvdW50ID0gMDsKCQkJJHppcF9lcnJvcnMgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfd2FybmluZ3MgPSBmYWxzZTsKCQkJJHppcF93YXJuaW5nc19jb3VudCA9IDA7CgkJCSR6aXBfd2FybmluZ3MgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfYWRkaXRpb25zID0gZmFsc2U7CgkJCSR6aXBfYWRkaXRpb25zX2NvdW50ID0gMDsKCQkJJHppcF9hZGRpdGlvbnMgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfZGVidWcgPSBmYWxzZTsKCQkJJHppcF9kZWJ1Z19jb3VudCA9IDA7CgkJCSR6aXBfZGVidWcgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfb3RoZXIgPSBmYWxzZTsKCQkJJHppcF9vdGhlcl9jb3VudCA9IDA7CgkJCSR6aXBfb3RoZXIgPSBhcnJheSgpOwoJCQkkemlwX2lnbm9yaW5nX3N5bWxpbmtzID0gZmFsc2U7CgkJCSRzeW1saW5rc19mb3VuZCA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGUgYmFzZWRpciBtdXN0IGhhdmUgYSB0cmFpbGluZyBub3JtYWxpemVkIGRpcmVjdG9yeSBzZXBhcmF0b3IKCQkJJGJhc2VkaXIgPSAoIHJ0cmltKCB0cmltKCAkZGlyICksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkKCQkJLy8gTm9ybWFsaXplIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGluIHBhdGgKCQkJJGJhc2VkaXIgPSBzdHJfcmVwbGFjZSggRElSRUNUT1JZX1NFUEFSQVRPUiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLCAkYmFzZWRpciApOwoJCQkKCQkJLy8gRW5zdXJlIG5vIHN0YWxlIGZpbGUgaW5mb3JtYXRpb24KCQkJY2xlYXJzdGF0Y2FjaGUoKTsKCQkJCgkJCS8vIE5vdGU6IGNvdWxkIGVuZm9yY2UgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBmb3Igcm9idXN0bmVzcwoJCQlpZiAoIGVtcHR5KCAkdGVtcGRpciApIHx8ICFmaWxlX2V4aXN0cyggJHRlbXBkaXIgKSApIHsKCQkJCgkJCQkvLyBUaGlzIGJyZWFrcyB0aGUgcnVsZSBvZiBzaW5nbGUgcG9pbnQgb2YgZXhpdCAoYXQgZW5kKSBidXQgaXQncyBlYXJseSBlbm91Z2ggdG8gbm90IGJlIGEgcHJvYmxlbQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5IG11c3QgYmUgYXZhaWxhYmxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnVXNpbmcgQ29tcGF0aWJpbGl0eSBNb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnSWYgeW91ciBiYWNrdXAgdGltZXMgb3V0IGluIENvbXBhdGliaWxpdHkgTW9kZSB0cnkgZGlzYWJsaW5nIHppcCBjb21wcmVzc2lvbiBpbiBTZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQkvLyBVcGRhdGUgdGhlIGRlZmluaXRpb24gYmVmb3JlIGl0IGlzIHVzZWQgYnkgbG9hZGluZyB0aGUgbGlicmFyeQoJCQkvLyBUaGlzIHdpbGwgbm90IHdvayBpZiBwZXJjaGFuY2UgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgOi0oCgkJCWRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJHRlbXBkaXIgKTsKCQkJCgkJCS8vIERlY2lkZSB3aGV0aGVyIHdlIGFyZSBvZmZlcmluZyBleGNsdXNpb25zIG9yIG5vdAoJCQkvLyBOb3RlIHRoYXQgdW5saWtlIHByb2MgYW5kIHppcCB3ZSBhbHdheXMgdXNlIGluY2x1c2lvbiBpZiBhdmFpbGFibGUgdG8gb2ZmZXIgZXhjbHVzaW9uIGNhcGFiaWxpdHkgZm9yIHBjbHppcAoJCQlpZiAoIGlzX29iamVjdCggJGxpc3RtYWtlciApICkgewoJCQkJCgkJCQkvLyBOZWVkIHRvIGdldCB0aGUgcmVsYXRpdmUgZXhjbHVzaW9ucyBzbyB3ZSBjYW4gbG9nIHdoYXQgaXMgYmVpbmcgZXhjbHVkZWQuLi4KCQkJCSRleGNsdXNpb25zID0gJGxpc3RtYWtlci0+Z2V0X3JlbGF0aXZlX2V4Y2x1ZGVzKCAkYmFzZWRpciApOwoJCQkJCgkJCQkvLyBCdWlsZCB0aGUgZXhjbHVzaW9uIGxpc3QgLSBmaXJzdCB0aGUgcmVsYXRpdmUgZGlyZWN0b3JpZXMKCQkJCWlmICggY291bnQoICRleGNsdXNpb25zICkgPiAwICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnQ2FsY3VsYXRpbmcgZGlyZWN0b3JpZXMvZmlsZXMgdG8gZXhjbHVkZSBmcm9tIGJhY2t1cCAocmVsYXRpdmUgdG8gc2l0ZSByb290KS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJZm9yZWFjaCAoICRleGNsdXNpb25zIGFzICRleGNsdWRlICkgewoJCQkJCQoJCQkJCQlpZiAoICFzdHJzdHIoICRleGNsdWRlLCAnYmFja3VwYnVkZHlfYmFja3VwcycgKSApIHsKCQoJCQkJCQkJLy8gU2V0IHZhcmlhYmxlIHRvIHNob3cgd2UgYXJlIGV4Y2x1ZGluZyBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGJlc2lkZXMgYmFja3VwIGRpci4KCQkJCQkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IHRydWU7CgkJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGNsdWRpbmcnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRleGNsdWRlICk7CgkJCQkJCQoJCQkJCQkkZXhjbHVkZV9jb3VudCsrOwoJCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJGV4Y2x1ZGluZ19hZGRpdGlvbmFsICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ0V4Y2x1ZGluZyBhcmNoaXZlcyBkaXJlY3RvcnkgYW5kIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgZGVmaW5lZCBpbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gJGV4Y2x1ZGVfY291bnQgLiAnICcgLiBfXyggJ3RvdGFsJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcuJyApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdPbmx5IGV4Y2x1ZGluZyBhcmNoaXZlcyBkaXJlY3RvcnkgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgJyAuICRleGNsdWRlX2NvdW50IC4gJyAnIC4gX18oICd0b3RhbCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnLicgKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGdldCB0aGUgbGlzdCBmcm9tIHRoZSB0b3Agbm9kZQoJCQkJJHRoZV9saXN0ID0gJGxpc3RtYWtlci0+Z2V0X3Rlcm1pbmFscygpOwoJCQkJCgkJCQkvLyBSZXRhaW4gdGhpcyBmb3IgcmVmZXJlbmNlIGZvciBub3cKCQkJCS8vZmlsZV9wdXRfY29udGVudHMoICggZGlybmFtZSggJHRlbXBkaXIgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfQ09OVEVOVF9GSUxFX05BTUUgKSwgcHJpbnRfciggJHRoZV9saXN0LCB0cnVlICkgKTsKCQkJCgkJCX0gZWxzZSB7CgkJCgkJCQkvLyBXZSBkb24ndCBoYXZlIHRoZSBpbmNsdXNpb24gbGlzdCBzbyB3ZSBhcmUgbm90IG9mZmVyaW5nIGV4Y2x1c2lvbnMKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1dBUk5JTkc6IERpcmVjdG9yeS9maWxlIGV4Y2x1c2lvbiB1bmF2YWlsYWJsZSBpbiBDb21wYXRpYmlsaXR5IE1vZGUuIEV2ZW4gZXhpc3Rpbmcgb2xkIGJhY2t1cHMgd2lsbCBiZSBiYWNrZWQgdXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJJHRoZV9saXN0ID0gYXJyYXkoICRkaXIgKTsKCQkJCgkJCX0KCQkKCQkJLy8gR2V0IHN0YXJ0ZWQgd2l0aCBvdXQgemlwIG9iamVjdAoJCQkvLyBQdXQgb3VyIGZpbmFsIHppcCBmaWxlIGluIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IC0gaXQgd2lsbCBiZSBtb3ZlZCBsYXRlcgoJCQkkdGVtcF96aXAgPSAkdGVtcGRpciAuIGJhc2VuYW1lKCAkemlwICk7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAkdGVtcF96aXAgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCgkJCQkvLyBCYXNpYyBhcmd1bWVudCBsaXN0CgkJCQkkYXJndW1lbnRzID0gYXJyYXkoKTsKCQkJCWFycmF5X3B1c2goICRhcmd1bWVudHMsICR0aGVfbGlzdCApOwoJCQkJYXJyYXlfcHVzaCggJGFyZ3VtZW50cywgUENMWklQX09QVF9SRU1PVkVfUEFUSCwgJGRpciApOwkJCQkKCgkJCQlpZiAoIHRydWUgIT09ICR0aGlzLT5nZXRfY29tcHJlc3Npb24oKSApIHsKCQkJCQoJCQkJCS8vIE5vdGU6IGRvbid0IG5lZWQgdG8gZm9yY2UgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcyBmb3IgY29tcHJlc3Npb24KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJYXJyYXlfcHVzaCggJGFyZ3VtZW50cywgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQoJCQkJCS8vIE5vdGU6IGZvcmNlIHRoZSB1c2Ugb2YgdGVtcG9yYXJ5IGZpbGVzIGZvciBjb21wcmVzc2lvbiB3aGVuIGZpbGUgc2l6ZSBleGNlZWRzIGdpdmVuIHZhbHVlLgoJCQkJCS8vIFRoaXMgb3Zlci1yaWRlcyB0aGUgImF1dG8tc2Vuc2UiIHdoaWNoIGlzIGJhc2VkIG9uIG1lbW9yeV9saW1pdCBhbmQgdGhpcyBfbWF5XyBpbmRpY2F0ZSBhCgkJCQkJLy8gbWVtb3J5IGF2YWlsYWJpbGl0eSB0aGF0IGlzIGhpZ2hlciB0aGFuIHJlYWxpdHkgbGVhZGluZyB0byBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGlmCgkJCQkJLy8gdHJ5aW5nIHRvIGNvbXByZXNzIGxhcmdlIGZpbGVzLiBTZXQgdGhlIHRocmVzaG9sZCBsb3cgZW5vdWdoIChzcGVjaWZ5IGluIE1CKSBzbyB0aGF0IGV4Y2VwdCBpbgoJCQkJCS8vIFRoZSB0aWdodGVzdCBtZW1vcnkgc2l0dWF0aW9ucyB3ZSBzaG91bGQgYmUgb2suIENvdWxkIGhhdmUgb3B0aW9uIHRvIGZvcmNlIHVzZSBvZiB0ZW1wb3JhcnkKCQkJCQkvLyBmaWxlcyByZWdhcmRsZXNzLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGVuYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCWFycmF5X3B1c2goICRhcmd1bWVudHMsIFBDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCwgJHRlbXBfZmlsZV9jb21wcmVzc2lvbl90aHJlc2hvbGQgKTsKCQkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIENoZWNrIGlmIGlnbm9yaW5nIChub3QgZm9sbG93aW5nKSBzeW1saW5rcwoJCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV9zeW1saW5rcygpICkgewoJCQkKCQkJCQkvLyBXYW50IHRvIG5vdCBmb2xsb3cgc3ltbGlua3Mgc28gc2V0IGZsYWcgZm9yIGxhdGVyIHVzZQoJCQkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSB0cnVlOwoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gc3ltYm9saWMgbGlua3Mgd2lsbCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQl9IGVsc2UgewoJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyB3aWxsIG5vdCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQl9CgkJCQoJCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGlnbm9yaW5nIHdhcm5pbmdzIC0gbWVhbmluZyBjYW4gc3RpbGwgZ2V0IGEgYmFja3VwIGV2ZW4KCQkJCS8vIGlmLCBlLmcuLCBzb21lIGZpbGVzIGNhbm5vdCBiZSByZWFkCgkJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSB7CgkJCQkKCQkJCQkvLyBOb3RlOiB3YXJuaW5ncyBhcmUgYmVpbmcgaWdub3JlZCBidXQgd2lsbCBzdGlsbCBiZSBnYXRoZXJlZCBhbmQgbG9nZ2VkCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gYWN0aW9uYWJsZSB3YXJuaW5ncyB3aWxsIGJlIGlnbm9yZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGFjdGlvbmFibGUgd2FybmluZ3Mgd2lsbCBub3QgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCQkvLyBVc2UgYW5vbnltb3VzIGZ1bmN0aW9uIHRvIHdlZWQgb3V0IHRoZSB1bnJlYWRhYmxlIGFuZCBub24tZXhpc3RlbnQgZmlsZXMgKGNvbW1vbiByZWFzb24gZm9yIGZhaWx1cmUpCgkJCQkvLyBhbmQgcG9zc2libHkgc3ltbGlua3MgYmFzZWQgb24gdXNlciBzZXR0aW5ncy4KCQkJCS8vIFBjbFppcCB3aWxsIHJlY29yZCB0aGVzZSBmaWxlcyBhcyAnc2tpcHBlZCcgaW4gdGhlIGZpbGUgc3RhdHVzIGFuZCB3ZSBjYW4gcG9zdC1wcm9jZXNzIHRvIGRldGVybWluZQoJCQkJLy8gaWYgd2UgaGFkIGFueSBvZiB0aGVzZSBhbmQgaGVuY2UgZWl0aGVyIHN0b3AgdGhlIGJhY2t1cCBvciBjb250aW51ZSBkZXBlbmRlbnQgb24gd2hldGhlciB0aGUgdXNlcgoJCQkJLy8gaGFzIGNob3NlbiB0byBpZ25vcmUgd2FybmluZ3Mgb3Igbm90IGFuZC9vciBpZ25vcmUgc3ltbGlua3Mgb3Igbm90LgoJCQkJLy8gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgZGlyZWN0bHkgdGFnIHRoZSBmaWxlIHdpdGggdGhlIHJlYXNvbiB3aHkgaXQgaGFzIGJlZW4gc2tpcHBlZCBzbyB3aGVuIHdlCgkJCQkvLyBoYXZlIHRvIHByb2Nlc3MgdGhlIHNraXBwZWQgaXRlbXMgd2UgaGF2ZSB0byB0cnkgYW5kIHdvcmsgb3V0IHdoeSBpdCB3YXMgc2tpcHBlZCAtIGJ1dCBzaG91bGRuJ3QKCQkJCS8vIGJlIHRvbyBoYXJkLgoJCQkJLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRoaXMgaW50byB0aGUgUGNsWmlwIHdyYXBwZXIgYW5kIGhhdmUgYSBtZXRob2QgdG8gc2V0IHRoZSB2YXJpb3VzIHByZS9wb3N0CgkJCQkvLyBmdW5jdGlvbnMgb3Igc2VsZWN0IHByZWRlZmluZWQgZnVuY3Rpb25zIChzdWNoIGFzIHRoaXMpLgoJCQkJaWYgKCB0cnVlICkgewoJCQkJCgkJCQkJLy8gTm90ZTogVGhpcyBjb3VsZCBiZSBzaW1wbGlmaWVkIC0gaXQncyB3cml0dGVuIHRvIGJlIGV4dGVuc2libGUgYnV0IG1heSBub3QgbmVlZCB0byBiZQoJCQkJCSRhcmdzID0gJyRldmVudCwgJiRoZWFkZXInOwoJCQkJCSRjb2RlID0gJyc7CgkJCQkJJGNvZGUgLj0gJ3N0YXRpYyAkc3ltbGlua3MgPSBhcnJheSgpOyAnOwoJCQkJCSRjb2RlIC49ICckcmVzdWx0ID0gdHJ1ZTsgJzsKCQkJCQkKCQkJCQkvLyBIYW5kbGUgc3ltbGlua3MgLSBrZWVwIHRoZSB0d28gY2FzZXMgb2YgaWdub3Jpbmcvbm90LWlnbm9yaW5nIHNlcGFyYXRlIGZvciBub3cgdG8gbWFrZSBsb2dpYyBtb3JlCgkJCQkJLy8gYXBwYXJlbnQgLSBidXQgY291bGQgYmUgbWVyZ2VkIHdpdGggZGlmZmVyZW50IGNvbmRpdGlvbmFsIGhhbmRsaW5nCgkJCQkJLy8gRm9yIGEgdmFsaWQgc3ltbGluazogaXNfbGluaygpIC0+IHRydWU7IGlzX2ZpbGUoKS9pc19kaXIoKSAtPiB0cnVlOyBmaWxlX2V4aXN0cygpIC0+IHRydWUKCQkJCQkvLyBGb3IgYSBicm9rZW4gc3ltbGluazogaXNfbGluaygpIC0+IHRydWU7IGlzX2ZpbGUoKS9pc19kaXIoKSAtPiBmYWxzZTsgZmlsZV9leGlzdHMoKSAtPiBmYWxzZQoJCQkJCS8vIE5vdGU6IHBjbHppcCBmaXJzdCB0ZXN0cyBldmVyeSBmaWxlIHVzaW5nIGZpbGVfZXhpc3RzKCkgYmVmb3JlIGV2ZXIgdHJ5aW5nIHRvIGFkZCB0aGUgZmlsZSBzbwoJCQkJCS8vIGZvciBhIGJyb2tlbiBzeW1saW5rIGl0IHdpbGwgX2Fsd2F5c18gZXJyb3Igb3V0IGltbWVkaWF0ZWx5IGl0IGRpc2NvdmVycyBhIGJyb2tlbiBzeW1saW5rIHNvCgkJCQkJLy8gd2UgbmV2ZXIgaGF2ZSBhIGNoYW5jZSB0byBmaWx0ZXIgdGhlc2Ugb3V0IGF0IHRoaXMgc3RhZ2UuCgkJCQkJaWYgKCB0cnVlID09PSAkemlwX2lnbm9yaW5nX3N5bWxpbmtzICkgewoJCQkJCQoJCQkJCQkvLyBJZiBpdCdzIGEgc3ltbGluayBvciBpdCdzIG5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeSB0aGVuIGlnbm9yZSBpdC4gQSBicm9rZW4gc3ltbGluawoJCQkJCQkvLyB3aWxsIG5ldmVyIGdldCB0aGlzIGZhciBiZWNhdXNlIHBjbHppcCB3aWxsIGhhdmUgY2hva2VkIG9uIGl0CgkJCQkJCSRjb2RlIC49ICdpZiAoICggdHJ1ZSA9PT0gJHJlc3VsdCApICYmICEoIEBpc19saW5rKCAkaGVhZGVyW1wnZmlsZW5hbWVcJ10gKSApICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgIGlmICggQGlzX2ZpbGUoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApIHx8IEBpc19kaXIoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICAgICAkcmVzdWx0ID0gdHJ1ZTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgZm9yZWFjaCAoICRzeW1saW5rcyBhcyAkcHJlZml4ICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICAgICAgICAgaWYgKCAhKCBmYWxzZSA9PT0gc3RycG9zKCAkaGVhZGVyW1wnZmlsZW5hbWVcJ10sICRwcmVmaXggKSApICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICAgICAgICAgICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgICAgICAgICBicmVhazsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgICAgICB9ICc7CgkJCQkJCSRjb2RlIC49ICcgICAgICAgIH0gJzsKCQkJCQkJJGNvZGUgLj0gJyAgICB9IGVsc2UgeyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgICAgIGVycm9yX2xvZyggIk5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeSAoaWdub3JpbmcpOiBcJyIgLiAkaGVhZGVyW1wnZmlsZW5hbWVcJ10gLiAiXCciICk7ICc7CgkJCQkJCSRjb2RlIC49ICcgICAgICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICB9ICc7CgkJCQkJCSRjb2RlIC49ICd9IGVsc2UgeyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiRmlsZSBpcyBhIHN5bWxpbmsgKGlnbm9yaW5nKTogXCciIC4gJGhlYWRlcltcJ2ZpbGVuYW1lXCddIC4gIlwnIiApOyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICRzeW1saW5rc1tdID0gJGhlYWRlcltcJ2ZpbGVuYW1lXCddOyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiU3ltbGlua3MgQXJyYXk6IFwnIiAuIHByaW50X3IoICRzeW1saW5rcywgdHJ1ZSApIC4gIlwnIiApOyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJ30gJzsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gSWYgaXQncyBuZWl0aGVyIGEgZmlsZSBub3IgZGlyZWN0b3J5IHRoZW4gaWdub3JlIGl0IC0gYSB2YWxpZCBzeW1saW5rIHdpbGwgcmVnaXN0ZXIgYXMgYSBmaWxlCgkJCQkJCS8vIG9yIGRpcmVjdG9yeSBkZXBlbmRlbnQgb24gd2hhdCBpdCBpcyBwb2ludGluZyBhdC4gQSBicm9rZW4gc3ltbGluayB3aWxsIG5ldmVyIGdldCB0aGlzIGZhci4KCQkJCQkJJGNvZGUgLj0gJ2lmICggKCB0cnVlID09PSAkcmVzdWx0ICkgJiYgKCBAaXNfZmlsZSggJGhlYWRlcltcJ2ZpbGVuYW1lXCddICkgfHwgQGlzX2RpciggJGhlYWRlcltcJ2ZpbGVuYW1lXCddICkgKSApIHsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAkcmVzdWx0ID0gdHJ1ZTsgJzsKCQkJCQkJJGNvZGUgLj0gJ30gZWxzZSB7ICc7Ci8vCQkJCQkJJGNvZGUgLj0gJyAgICBlcnJvcl9sb2coICJOZWl0aGVyIGEgZmlsZSBub3IgYSBkaXJlY3RvcnkgKGlnbm9yaW5nKTogXCciIC4gJGhlYWRlcltcJ2ZpbGVuYW1lXCddIC4gIlwnIiApOyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJ30gJzsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIEFkZCB0aGUgY29kZSBibG9jayBmb3IgaWdub3JpbmcgdW5yZWFkYWJsZSBmaWxlcwoJCQkJCWlmICggdHJ1ZSApIHsKCQkJCQkKCQkJCQkJJGNvZGUgLj0gJ2lmICggKCB0cnVlID09PSAkcmVzdWx0ICkgJiYgKCBAaXNfcmVhZGFibGUoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApICkgKSB7ICc7CgkJCQkJCSRjb2RlIC49ICcgICAgJHJlc3VsdCA9IHRydWU7ICc7CgkJCQkJCSRjb2RlIC49ICd9IGVsc2UgeyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiRmlsZSBub3QgcmVhZGFibGU6IFwnIiAuICRoZWFkZXJbXCdmaWxlbmFtZVwnXSAuICJcJyIgKTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAkcmVzdWx0ID0gZmFsc2U7ICc7CgkJCQkJCSRjb2RlIC49ICd9ICc7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFJldHVybiB0cnVlICh0byBpbmNsdWRlIGZpbGUpIGlmIGZpbGUgcGFzc2VzIGNvbmRpdGlvbnMgb3RoZXJ3aXNlIGZhbHNlICh0byBza2lwIGZpbGUpIGlmIG5vdAoJCQkJCSRjb2RlIC49ICdyZXR1cm4gKCAoIHRydWUgPT09ICRyZXN1bHQgKSA/IDEgOiAwICk7ICc7CgoJCQkJCSRwcmVfYWRkX2Z1bmMgPSBjcmVhdGVfZnVuY3Rpb24oICRhcmdzLCAkY29kZSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIElmIHdlIGhhZCBjYXVzZSB0byBjcmVhdGUgYSBwcmUgYWRkIGZ1bmN0aW9uIHRoZW4gYWRkIGl0IHRvIHRoZSBhcmd1bWVudCBsaXN0IGhlcmUKCQkJCWlmICggIWVtcHR5KCAkcHJlX2FkZF9mdW5jICkgKSB7CgkJCQkKCQkJCQlhcnJheV9wdXNoKCAkYXJndW1lbnRzLCBQQ0xaSVBfQ0JfUFJFX0FERCwgJHByZV9hZGRfZnVuYyApOwoJCQoJCQkJfQoJCQkJCgkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhpc3RpbmcgWklQIEFyY2hpdmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQlAdW5saW5rKCAkemlwICk7CgkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGFjdHVhbGx5IGNyZWF0ZSB0aGUgemlwIGFyY2hpdmUgZmlsZQoJCQkJLy8gRmlyc3QgaW1wbG9kZSBhbnkgZW1iZWRkZWQgYXJyYXkgaW4gdGhlIGFyZ3VtZW50IGxpc3QgYW5kIHRydW5jYXRlIHRoZSByZXN1bHQgaWYgdG9vIGxvbmcKCQkJCS8vIEFzc3VtZSBubyBhcnJheXMgZW1iZWRkZWQgaW4gYXJyYXlzIC0gY3VycmVudGx5IG5vIHJlYXNvbiBmb3IgdGhhdAoJCQkJLy8gVE9ETzogTWFrZSB0aGUgc3VtbWFyeSBsZW5ndGggY29uZmlndXJhYmxlIHNvIHRoYXQgY2FuIHNlZSBtb3JlIGlmIHJlcXVpcmVkCgkJCQkvLyBUT0RPOiBDb25zaWRlciBtYXBwaW5nIHBjbHppcCBhcmd1bWVudCBpZGVudGlmaWVycyB0byBzdHJpbmcgcmVwcmVzZW50YXRpb25zIGZvciBjbGFyaXR5CgkJCQkkYXJncyA9ICckaXRlbSc7CgkJCQkkY29kZSA9ICdpZiAoIGlzX2FycmF5KCAkaXRlbSApICkgeyAkc3RyaW5nX2l0ZW0gPSBpbXBsb2RlKCAiLCIsICRpdGVtKTsgcmV0dXJuICggKCBzdHJsZW4oICRzdHJpbmdfaXRlbSApIDw9IDUwICkgPyAkc3RyaW5nX2l0ZW0gOiAiTGlzdDogIiAuIHN1YnN0ciggJHN0cmluZ19pdGVtLCAwLCA1MCApIC4gIi4uLiIgKTsgfSBlbHNlIHsgcmV0dXJuICRpdGVtOyB9OyAnOwoJCQkJJGltcGxvZGVyX2Z1bmMgPSBjcmVhdGVfZnVuY3Rpb24oICRhcmdzLCAkY29kZSApOwoJCQkJJGltcGxvZGVkX2FyZ3VtZW50cyA9IGFycmF5X21hcCggJGltcGxvZGVyX2Z1bmMsICRhcmd1bWVudHMgKTsKCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCAnIGNvbW1hbmQgYXJndW1lbnRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiBpbXBsb2RlKCAnOycsICRpbXBsb2RlZF9hcmd1bWVudHMgKSApOwoJCQkJCgkJCQkkb3V0cHV0ID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAmJHphLCAnY3JlYXRlJyApLCAkYXJndW1lbnRzICk7CgkJCQkKCQkJCS8vIFdvcmsgb3V0IHdoZXRoZXIgd2UgaGF2ZSBhIHByb2JsZW0gb3Igbm90CgkJCQlpZiAoIGlzX2FycmF5KCAkb3V0cHV0ICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIGFuIGFycmF5IHNvIGF0IGxlYXN0IHdlIHByb2R1Y2VkIGEgemlwIGFyY2hpdmUgCgkJCQkJJGV4aXRjb2RlID0gMDsKCQkJCQkKCQkJCQkvLyBQcm9jZXNzIHRoZSBhcnJheSBmb3IgYW55ICJ3YXJuaW5ncyIgb3Igb3RoZXIgcmVwb3J0YWJsZSBjb25kaXRpb25zCgkJCQkJJGlkID0gMDsgLy8gQ3JlYXRlIGEgdW5pcXVlIGtleSAobGlrZSBhIGxpbmUgbnVtYmVyKSBmb3IgbGF0ZXIgc29ydGluZwoJCQkJCWZvcmVhY2goICRvdXRwdXQgYXMgJGZpbGUgKSB7CgkJCQkJCgkJCQkJCXN3aXRjaCAoICRmaWxlWyAnc3RhdHVzJyBdICkgewoJCQkJCQkJY2FzZSAic2tpcHBlZCI6CgkJCQkJCQkKCQkJCQkJCQkvLyBGaXJzdCBuZWVkIHRvIGZpbHRlciBvdXQgYW55IGZpbGVzIHNraXBwZWQgYmVjYXVzZSB1bmRlciBhIHN5bWxpbmsgZGlyCgkJCQkJCQkJZm9yZWFjaCAoICRzeW1saW5rc19mb3VuZCBhcyAkcHJlZml4ICkgewoJCQkJCQkJCQoJCQkJCQkJCQlpZiAoICEoIGZhbHNlID09PSBzdHJwb3MoICRmaWxlWyAnZmlsZW5hbWUnIF0sICRwcmVmaXggKSApICkgewoJCQkJCQkJCQkKCQkJCQkJCQkJCSRpZCsrOwoJCQkJCQkJCQkJLy8gYnJlYWsgb3V0IG9mIHRoZSBmb3JlYWNoIGFuZCB0aGUgc3dpdGNoCgkJCQkJCQkJCQlicmVhayAyOwoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCS8vIEZvciBza2lwcGVkIGZpbGVzIG5lZWQgdG8gZGV0ZXJtaW5lIHdoeSBpdCB3YXMgc2tpcHBlZAoJCQkJCQkJCWlmICggKCB0cnVlID09PSAkemlwX2lnbm9yaW5nX3N5bWxpbmtzICkgJiYgQGlzX2xpbmsoICRmaWxlWyAnZmlsZW5hbWUnIF0gKSApIHsKCQkJCQkJCQkKCQkJCQkJCQkJLy8gUmVtZW1iZXIgdGhpcyBmb3IgZmlsdGVyaW5nIG90aGVyIGZpbGVzIHNraXBwZWQgYmVjYXVzZSBpbiBzeW1saW5rIGRpcmVjdG9yeQoJCQkJCQkJCQkkc3ltbGlua3NfZm91bmRbXSA9ICRmaWxlWyAnZmlsZW5hbWUnIF07CgkJCQkJCQkJCQoJCQkJCQkJCQkvLyBTa2lwcGVkIGJlY2F1c2Ugd2UgYXJlIGlnbm9yaW5nIHN5bWxpbmtzIGFuZCB0aGlzIGlzIGEgc3ltbGluawoJCQkJCQkJCQkkemlwX290aGVyWyBzZWxmOjpaSVBfT1RIRVJfSUdOT1JFRF9TWU1MSU5LIF1bICRpZCsrIF0gPSAkZmlsZVsgJ2ZpbGVuYW1lJyBdOwoJCQkJCQkJCQkkemlwX290aGVyX2NvdW50Kys7CgkJCQkJCQkJCQoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCgkJCQkJCQkJCS8vU2tpcHBlZCBiZWNhdXNlIHByb2JhYmx5IHVucmVhZGFibGUgb3Igbm9uLWV4aXN0ZW50IChjYXRjaC1hbGwgZm9yIG5vdykKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQrKyBdID0gJGZpbGVbICdmaWxlbmFtZScgXTsKCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQkKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJmaWx0ZXJlZCI6CgkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX09USEVSX0ZJTFRFUkVEIF1bICRpZCsrIF0gPSAkZmlsZVsgJ2ZpbGVuYW1lJyBdOwoJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgImZpbGVuYW1lX3Rvb19sb25nIjoKCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfT1RIRVJfTE9OR1BBVEggXVsgJGlkKysgXSA9ICRmaWxlWyAnZmlsZW5hbWUnIF07CgkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkvLyBDdXJyZW50bHkgbm90IHByb2Nlc3NpbmcgIm9rIiBlbnRyaWVzCgkJCQkJCQkJJGlkKys7CgkJCQkJCX0KCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gTm93IGZyZWUgdXAgdGhlIG1lbW9yeS4uLgoJCQkJCXVuc2V0KCAkb3V0cHV0ICk7CgkJCQkJCgkJCQkJLy8gU2V0IGNvbnZlbmllbmNlIGZsYWdzCQkJCgkJCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gKCAwIDwgJHppcF93YXJuaW5nc19jb3VudCApOwoJCQkJCSRoYXZlX3ppcF9vdGhlciA9ICggMCA8ICR6aXBfb3RoZXJfY291bnQgKTsKCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIE5vdCBhbiBhcnJheSBzbyBhIGJhZCBlcnJvciBjb2RlLCBzb21ldGhpbmcgd2UgZGlkbid0IG9yIGNvdWxkbid0IGNhdGNoCgkJCQkJJGV4aXRjb2RlID0gJHphLT5lcnJvckNvZGUoKTsKCQkJCQkKCQkJCQkvLyBQdXQgdGhlIGVycm9yIGluZm9ybWF0aW9uIGludG8gYW4gYXJyYXkgZm9yIGNvbnNpc3RlbmN5CgkJCQkJJHppcF9lcnJvcnNbXSA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJJHppcF9lcnJvcnNfY291bnQgPSBzaXplb2YoICR6aXBfZXJyb3JzICk7CgkJCQkJJGhhdmVfemlwX2Vycm9ycyA9ICggMCA8ICR6aXBfZXJyb3JzX2NvdW50ICk7CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQ29udmVuaWVuY2UgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBzY2FuYXJpb3MKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgZXhpdCBjb2RlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBtaWdodCBpZ25vcmUgaXQgb3Igbm90CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQoJCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgbnVtYmVyIG9mIHdhcm5pbmdzIC0gZXZlbiBqdXN0IHRvIGNvbmZpcm0gdGhhdCB3ZSBkaWRuJ3QgaGF2ZSBhbnkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIHdhcm5pbmclMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF93YXJuaW5nc19jb3VudCwgKCAoIDEgPT0gJHppcF93YXJuaW5nc19jb3VudCApID8gJycgOiAncycgKSApICk7CgkJCQkKCQkJCS8vIEFsd2F5cyByZXBvcnQgd2FybmluZ3MgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVzZXIgaGFzIHNlbGVjdGVkIHRvIGlnbm9yZSB0aGVtCgkJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF93YXJuaW5ncyApIHsKCQkJCgkJCQkJJHRoaXMtPmxvZ196aXBfcmVwb3J0cyggJHppcF93YXJuaW5ncywgc2VsZjo6JF93YXJuaW5nX2Rlc2MsICJXQVJOSU5HIiwgc2VsZjo6TUFYX1dBUk5JTkdfTElORVNfVE9fU0hPVywgZGlybmFtZSggZGlybmFtZSggJHRlbXBkaXIgKSApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdwYl9iYWNrdXBidWRkeScgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gc2VsZjo6WklQX1dBUk5JTkdTX0ZJTEVfTkFNRSApOwoKCQkJCX0KCQkJCgkJCQkvLyBBbHdheXMgcmVwb3J0IG90aGVyIHJlcG9ydHMgcmVnYXJkbGVzcwoJCQkJaWYgKCB0cnVlID09PSAkaGF2ZV96aXBfb3RoZXIgKSB7CgkJCQoJCQkJCS8vIE9ubHkgcmVwb3J0IG51bWJlciBvZiBpbmZvcm1hdGlvbmFscyBpZiB3ZSBoYXZlIGFueSBhcyB0aGV5IGFyZSBub3QgdGhhdCBpbXBvcnRhbnQKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyBpbmZvcm1hdGlvbiUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX290aGVyX2NvdW50LCAoICggMSA9PSAkemlwX290aGVyX2NvdW50ICkgPyAnYWwnIDogJ2FscycgKSApICk7CgoJCQkJCSR0aGlzLT5sb2dfemlwX3JlcG9ydHMoICR6aXBfb3RoZXIsIHNlbGY6OiRfb3RoZXJfZGVzYywgIklORk9STUFUSU9OIiwgc2VsZjo6TUFYX09USEVSX0xJTkVTX1RPX1NIT1csIGRpcm5hbWUoIGRpcm5hbWUoICR0ZW1wZGlyICkgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAncGJfYmFja3VwYnVkZHknIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHNlbGY6OlpJUF9PVEhFUlNfRklMRV9OQU1FICk7CgoJCQkJfQoJCQkKCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZmlndXJlIG91dCB3aGF0IGhhcHBlbmVkCgkJCQkvLyBOb3RlOiBvbmx5IGV4cGVjdCBleGl0Y29kZSB0byBiZSBub24temVybyBmb3IgYW4gZXJyb3Igd2UgY291bGRuJ3QgcHJlLWVtcHQKCQkJCS8vIE5vdGU6IHdhcm5pbmdzIHdpbGwgY2F1c2UgdGhlIG9wZXJhdGlvbiB0byBiZSBzdG9wcGVkIGlmIHVzZXIgaGFzbid0IGNob3NlbiB0byBpZ25vcmUgcmVnYXJkbGVzcwoJCQkJLy8gb2Ygd2hldGhlciB3ZSBnb3QgYSB6aXAgZmlsZSAod2hpY2ggd2UgbW9zdCBsaWtlbHkgZGlkKS4KCQkJCS8vIE5vdGU6IGEgbm9uLXplcm8gZXhpdGNvZGUgYW5kIHByZXNlbmNlIG9mIHdhcm5pbmdzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKCQkJCWlmICggKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB8fAoJCQkJCSAoIDAgIT0gJGV4aXRjb2RlICkgfHwKCQkJCQkgKCAoIHRydWUgPT0gJGhhdmVfemlwX3dhcm5pbmdzICkgJiYgISR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSApIHsKCQkJCQoJCQkJCS8vIElmIHdlIGhhdmUgYW55IHppcCBlcnJvcnMgcmVwb3J0ZWQgc2hvdyB0aGVtIHJlZ2FyZGxlc3MKCQkJCQlpZiAoIHRydWUgPT0gJGhhdmVfemlwX2Vycm9ycyApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgZXJyb3IlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9lcnJvcnNfY291bnQsICggKCAxID09ICR6aXBfZXJyb3JzX2NvdW50ICkgPyAnJyA6ICdzJyApICApICk7CgkJCQkJCgkJCQkJCWZvcmVhY2ggKCAkemlwX2Vycm9ycyBhcyAkbGluZSApIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBSZXBvcnQgd2hldGhlciBvciBub3QgdGhlIHppcCBmaWxlIHdhcyBjcmVhdGVkICh0aGlzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSB0ZW1wb3JhcnkgbG9jYXRpb24pCQkJCgkJCQkJaWYgKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIG5vdCBjcmVhdGVkIC0gY2hlY2sgcHJvY2VzcyBleGl0IGNvZGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgY3JlYXRlZCBidXQgd2l0aCBlcnJvcnMvYWN0aW9uYWJsZS13YXJuaW5ncyBzbyB3aWxsIGJlIGRlbGV0ZWQgLSBjaGVjayBwcm9jZXNzIGV4aXQgY29kZSBhbmQgd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFRoZSBvcGVyYXRpb24gaGFzIGZhaWxlZCBvbmUgd2F5IG9yIGFub3RoZXIuIE5vdGUgdGhhdCBmb3IgcGNsemlwIHRoZSB6aXAgZmlsZSBpcyBhbHdheXMgY3JlYXRlZCBpbiB0aGUgdGVtcG9yYXJ5CgkJCQkJLy8gbG9jYXRpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB1c2VyIHNlbGVjdGVkIHRvIGlnbm9yZSBlcnJvcnMgb3Igbm90ICh3ZSBjYW4gbmV2ZXIgZ3VhcmFudGVlIHRvIGNyZWF0ZSBhIHZhbGlkCgkJCQkJLy8gemlwIGZpbGUgYmVjYXVzZSB0aGUgc2NyaXB0IG1pZ2h0IGJlIHRlcm1pbmF0ZWQgYnkgdGhlIHNlcnZlciBzbyB3ZSBtdXN0IHdhaXQgdG8gcHJvZHVjZSBhIHZhbGlkIGZpbGUgYW5kIHRoZW4KCQkJCQkvLyBtb3ZlIGl0IHRvIHRoZSBmaW5hbCBsb2NhdGlvbiBpZiBpdCBpcyB2YWxpZCkuCgkJCQkJLy8gVGhlcmVmb3JlIGlmIHRoZXJlIGlzIGEgemlwIGZpbGUgKHByb2R1Y2VkIGJ1dCB3aXRoIHdhcm5pbmdzKSBpdCB3aWxsIG5vdCBiZSB2aXNpYmxlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUKCQkJCQkvLyB0ZW1wb3JhcnkgZGlyZWN0b3J5IGlzIGRlbGV0ZWQgYmVsb3cuCgkJCQkJCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIEdvdCBmaWxlIHdpdGggbm8gZXJyb3Igb3Igd2FybmluZ3MgX29yXyB3aXRoIHdhcm5pbmdzIHRoYXQgdGhlIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUKCQkJCQkvLyBGaWxlIGFsd2F5cyBidWlsdCBpbiB0ZW1wb3JhcnkgbG9jYXRpb24gc28gYWx3YXlzIG5lZWQgdG8gbW92ZSBpdAoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ01vdmluZyBaaXAgQXJjaGl2ZSBmaWxlIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgbm8gc3RhbGUgZmlsZSBpbmZvcm1hdGlvbgoJCQkJCWNsZWFyc3RhdGNhY2hlKCk7CgkJCQkJCgkJCQkJLy8gUmVsb2NhdGUgdGhlIHRlbXBvcmFyeSB6aXAgZmlsZSB0byBmaW5hbCBsb2NhdGlvbgoJCQkJCUByZW5hbWUoICR0ZW1wX3ppcCwgJHppcCApOwoJCQkJCQoJCQkJCS8vIENoZWNrIHRoYXQgd2UgbW92ZWQgdGhlIGZpbGUgb2sKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgKGFueSBhY3Rpb25hYmxlIHdhcm5pbmdzIGlnbm9yZWQgYnkgdXNlciBzZXR0aW5ncykuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXAgKTsKCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBtb3ZlZCB0byBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQkJCQkKCQkJCX0KCgkJCX0KCQkJCgkJCS8vIENsZWFudXAgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3aWxsIGhhdmUgYWxsIGRldHJpdHVzIGFuZCBtYXliZSBpbmNvbXBsZXRlIHppcCBmaWxlCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBkaXIgKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CgkJICAJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJCQkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfZnVsbCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQkJCQkJCgkJCS8vIFVwZGF0ZSB0aGUgZGVmaW5pdGlvbiBiZWZvcmUgaXQgaXMgdXNlZCBieSBsb2FkaW5nIHRoZSBsaWJyYXJ5CgkJCS8vIFRoaXMgd2lsbCBub3Qgd29rIGlmIHBlcmNoYW5jZSB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCA6LSgKCQkJLy8gVE9ETzogTmVlZCBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3ZSBjYW4gdXNlIGZvciB0aGlzCgkJCS8vZGVmaW5lKCAnUENMWklQX1RFTVBPUkFSWV9ESVInLCAkdGVtcGRpciApOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgaWYgbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCSAJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQlpZiAoICggJGNvbnRlbnRfbGlzdCA9ICR6YS0+ZXh0cmFjdCggUENMWklQX09QVF9QQVRILCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKSAhPT0gMCApIHsKCQkJCQoJCQkJCS8vIEhvdyBtYW55IGZpbGVzIC0gbXVzdCBiZSA+MCB0byBoYXZlIGdvdCBoZXJlCgkJCQkJJGZpbGVfY291bnQgPSBzaXplb2YoICRjb250ZW50X2xpc3QgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoKCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcF9maWxlICk7CQoJCQkJCQoJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBleHRyYWN0IGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCgkJLyoqCgkJICoJZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcGFyYW0JYXJyYXkJCSRpdGVtcwkJCQkJCU1hcHBpbmcgb2Ygd2hhdCB0byBleHRyYWN0IGFuZCB0byB3aGF0CgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzIChhbGwgZXh0cmFjdGlvbnMgc3VjY2Vzc2Z1bCksIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJJHN0YXQgPSBhcnJheSgpOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgaWYgbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR6aXBfZmlsZSApOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCBpdCBoYXMgY29udGVudAoJCQkJaWYgKCAoICRjb250ZW50X2xpc3QgPSAkemEtPmxpc3RDb250ZW50KCkgKSAhPT0gMCApIHsKCQkJCQoJCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIHRha2UgZWFjaCBpdGVtIGFuZCBydW4gYW4gdW56aXAgZm9yIGl0IC0gdW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBlYXN5IHdheSBvZiBjb21iaW5pbmcKCQkJCQkvLyBhcmJpdHJhcnkgZXh0cmFjdGlvbnMgaW50byBhIHNpbmdsZSBjb21tYW5kIGlmIHNvbWUgbWlnaHQgYmUgdG8gYSAKCQkJCQlmb3JlYWNoICggJGl0ZW1zIGFzICR3aGF0ID0+ICR3aGVyZSApIHsKCQkJCgkJCQkJCSRyZW5hbWVfcmVxdWlyZWQgPSBmYWxzZTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCQkJCS8vIERlY2lkZSBob3cgdG8gZXh0cmFjdCBiYXNlZCBvbiB3aGVyZQoJCQkJCQlpZiAoIGVtcHR5KCAkd2hlcmUpICkgewoJCQkJCQoJCQkJCQkJLy8gRmlyc3Qgd2UnbGwgZXh0cmFjdCBhbmQganVuayB0aGUgcGF0aAoJCQkJCQkJLy8gTm90ZTogRm9yIHNvbWUgb2RkIHJlYXNvbiB3aGVuIHdlIGhhdmUgYSAkd2hhdCBmaWxlIHRoYXQgaXMgYSBoaWRkZW4gKGRvdCkgZmlsZQoJCQkJCQkJLy8gdGhlIGZpbGVfZXhpc3RzKCkgdGVzdCBpbiBwY2x6aXAgZm9yIHRoZSBmaWxlcGF0aCB0byBleHRyYWN0IHRvIHJldHVybnMgdHJ1ZSBldmVuCgkJCQkJCQkvLyB0aG91Z2ggb25seSB0aGUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIG5vdCB0aGUgZmlsZSBpdHNlbGYuIE5vIGlkZWEgd2h5IGF0CgkJCQkJCQkvLyBwcmVzZW50LiBCZWNhdXNlIG9mIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIFBDTF9aSVBfT1BUX1JFUExBQ0VfTkVXRVIgb3B0aW9uCgkJCQkJCQkvLyBzbyB0aGUgZmFjdCB0aGUgdGVzdCByZXR1cm5zIHRydWUgaXMgaWdub3JlZC4KCQkJCQkJCSRleHRyYWN0X2xpc3QgPSAkemEtPmV4dHJhY3QoIFBDTFpJUF9PUFRfUEFUSCwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgUENMWklQX09QVF9CWV9OQU1FLCAkd2hhdCwgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEgsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoJCQkJCQkJCQoJCQkJCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBzdWNjZWVkZWQgb3Igbm90ICh3b3VsZCBvbmx5IGJlIG5vIGxpc3QgYXJyYXkgZm9yIGEgemlwIGZpbGUgcHJvYmxlbSkKCQkJCQkJCS8vIGJ1dCBleHRyYWN0aW9uIG9mIHRoZSBmaWxlIGl0c2VsZiBtYXkgc3RpbGwgaGF2ZSBmYWlsZWQKCQkJCQkJCSRyZXN1bHQgPSAoICRleHRyYWN0X2xpc3QgIT09IDAgICYmICggJGV4dHJhY3RfbGlzdFsgMCBdWyAnc3RhdHVzJyBdID09ICdvaycgKSApOwoJCQkJCQkJCQkJCQkJCQkKCQkJCQkJfSBlbHNlaWYgKCAhZW1wdHkoICR3aGVyZSApICkgewoJCQkJCQoJCQkJCQkJaWYgKCAkd2hhdCA9PT0gJHdoZXJlICkgewoJCQkJCQkJCgkJCQkJCQkJLy8gQ2hlY2sgZm9yIHdpbGRjYXJkIGRpcmVjdG9yeSBleHRyYWN0aW9uIGxpa2UgZGlyLyogPT4gZGlyLyoKCQkJCQkJCQlpZiAoICIqIiA9PSBzdWJzdHIoIHRyaW0oICR3aGF0ICksIC0xICkgKSB7CgoJCQkJCQkJCQkvLyBUdXJuIHRoaXMgaW50byBhIHByZWdfbWF0Y2ggcGF0dGVybgoJCQkJCQkJCQkkd2hhdG1hdGNoID0gInxeIiAuICR3aGF0IC4gInwiOwkJCQkJCQkJCQoKCQkJCQkJCQkJLy8gRmlyc3Qgd2UnbGwgZXh0cmFjdCBidXQgd2UncmUgbm90IGp1bmtpbmcgdGhlIHBhdGhzCgkJCQkJCQkJCS8vIE5vdGU6IEZvciBzb21lIG9kZCByZWFzb24gd2hlbiB3ZSBoYXZlIGEgJHdoYXQgZmlsZSB0aGF0IGlzIGEgaGlkZGVuIChkb3QpIGZpbGUKCQkJCQkJCQkJLy8gdGhlIGZpbGVfZXhpc3RzKCkgdGVzdCBpbiBwY2x6aXAgZm9yIHRoZSBmaWxlcGF0aCB0byBleHRyYWN0IHRvIHJldHVybnMgdHJ1ZSBldmVuCgkJCQkJCQkJCS8vIHRob3VnaCBvbmx5IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0cyBhbmQgbm90IHRoZSBmaWxlIGl0c2VsZi4gTm8gaWRlYSB3aHkgYXQKCQkJCQkJCQkJLy8gcHJlc2VudC4gQmVjYXVzZSBvZiB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBQQ0xfWklQX09QVF9SRVBMQUNFX05FV0VSIG9wdGlvbgoJCQkJCQkJCQkvLyBzbyB0aGUgZmFjdCB0aGUgdGVzdCByZXR1cm5zIHRydWUgaXMgaWdub3JlZC4KCQkJCQkJCQkJJGV4dHJhY3RfbGlzdCA9ICR6YS0+ZXh0cmFjdCggUENMWklQX09QVF9QQVRILCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCBQQ0xaSVBfT1BUX0JZX1BSRUcsICR3aGF0bWF0Y2gsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoKCQkJCQkJCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBzdWNjZWVkZWQgb3Igbm90ICh3b3VsZCBvbmx5IGJlIG5vIGxpc3QgYXJyYXkgZm9yIGEgemlwIGZpbGUgcHJvYmxlbSkKCQkJCQkJCQkJLy8gYnV0IGV4dHJhY3Rpb24gb2YgaW5kaXZpZHVhbCBmaWxlcyB0aGVtc2VsdmVzIG1heSBzdGlsbCBoYXZlIGZhaWxlZAoJCQkJCQkJCQlpZiAoIDAgIT09ICRleHRyYWN0X2xpc3QgKSB7CgkJCQkJCQkJCQoJCQkJCQkJCQkJLy8gU28gZmFyIHNvIGdvb2QgLSBhc3N1bWUgZXZlcnl0aGluZyB3aWxsIGJlIG9rCgkJCQkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQoJCQkJCQkJCQkJLy8gQXQgbGVhc3Qgd2UgZ290IG5vIG1ham9yIGZhaWx1cmUgc28gY2hlY2sgdGhlIGV4dHJhY3RlZCBmaWxlcwoJCQkJCQkJCQkJZm9yZWFjaCAoICRleHRyYWN0X2xpc3QgYXMgJGZpbGUgKSB7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQlpZiAoICdvaycgIT09ICRmaWxlWyAnc3RhdHVzJyBdICkgewoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQkvLyBPb3BzIC0gd2UgZm91bmQgYSBmaWxlIHRoYXQgZGlkbid0IGV4dHJhY3Qgb2sgc28gYmFpbCBvdXQgd2l0aCBmYWxzZQoJCQkJCQkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCgkJCQkJCQkJCS8vIEl0J3MganVzdCBhIHNpbmdsZSBmaWxlIGV4dHJhY3Rpb24gLSBicmVhdGggYSBzaWduIG9mIHJlbGllZgoJCQkJCQkJCQkvLyBFeHRyYWN0IHRvIHNhbWUgZGlyZWN0b3J5IHN0cnVjdHVyZSAtIGRvbid0IGp1bmsgcGF0aCwgbm8gbmVlZCB0byBhZGQgd2hlcmUgdG8gZGVzdG5hdGlvbiBhcyBhdXRvbWF0aWMKCQkJCQkJCQkJLy8gTm90ZTogRm9yIHNvbWUgb2RkIHJlYXNvbiB3aGVuIHdlIGhhdmUgYSAkd2hhdCBmaWxlIHRoYXQgaXMgYSBoaWRkZW4gKGRvdCkgZmlsZQoJCQkJCQkJCQkvLyB0aGUgZmlsZV9leGlzdHMoKSB0ZXN0IGluIHBjbHppcCBmb3IgdGhlIGZpbGVwYXRoIHRvIGV4dHJhY3QgdG8gcmV0dXJucyB0cnVlIGV2ZW4KCQkJCQkJCQkJLy8gdGhvdWdoIG9ubHkgdGhlIHBhcmVudCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBub3QgdGhlIGZpbGUgaXRzZWxmLiBObyBpZGVhIHdoeSBhdAoJCQkJCQkJCQkvLyBwcmVzZW50LiBCZWNhdXNlIG9mIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIFBDTF9aSVBfT1BUX1JFUExBQ0VfTkVXRVIgb3B0aW9uCgkJCQkJCQkJCS8vIHNvIHRoZSBmYWN0IHRoZSB0ZXN0IHJldHVybnMgdHJ1ZSBpcyBpZ25vcmVkLgoJCQkJCQkJCQkkZXh0cmFjdF9saXN0ID0gJHphLT5leHRyYWN0KCBQQ0xaSVBfT1BUX1BBVEgsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksIFBDTFpJUF9PUFRfQllfTkFNRSwgJHdoYXQsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoJCQkJCQkJCQkKCQkJCQkJCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBzdWNjZWVkZWQgb3Igbm90ICh3b3VsZCBvbmx5IGJlIG5vIGxpc3QgYXJyYXkgZm9yIGEgemlwIGZpbGUgcHJvYmxlbSkKCQkJCQkJCQkJLy8gYnV0IGV4dHJhY3Rpb24gb2YgdGhlIGZpbGUgaXRzZWxmIG1heSBzdGlsbCBoYXZlIGZhaWxlZAoJCQkJCQkJCQkkcmVzdWx0ID0gKCAkZXh0cmFjdF9saXN0ICE9PSAwICAmJiAoIGlzc2V0KCAkZXh0cmFjdF9saXN0WyAwIF0gKSApICYmICggJGV4dHJhY3RfbGlzdFsgMCBdWyAnc3RhdHVzJyBdID09ICdvaycgKSApOwoKCQkJCQkJCQl9CgkJCQkJCQoJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJLy8gRmlyc3Qgd2UnbGwgZXh0cmFjdCBhbmQganVuayB0aGUgcGF0aAoJCQkJCQkJCS8vIE5vdGU6IEZvciBzb21lIG9kZCByZWFzb24gd2hlbiB3ZSBoYXZlIGEgJHdoYXQgZmlsZSB0aGF0IGlzIGEgaGlkZGVuIChkb3QpIGZpbGUKCQkJCQkJCQkvLyB0aGUgZmlsZV9leGlzdHMoKSB0ZXN0IGluIHBjbHppcCBmb3IgdGhlIGZpbGVwYXRoIHRvIGV4dHJhY3QgdG8gcmV0dXJucyB0cnVlIGV2ZW4KCQkJCQkJCQkvLyB0aG91Z2ggb25seSB0aGUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIG5vdCB0aGUgZmlsZSBpdHNlbGYuIE5vIGlkZWEgd2h5IGF0CgkJCQkJCQkJLy8gcHJlc2VudC4gQmVjYXVzZSBvZiB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBQQ0xfWklQX09QVF9SRVBMQUNFX05FV0VSIG9wdGlvbgoJCQkJCQkJCS8vIHNvIHRoZSBmYWN0IHRoZSB0ZXN0IHJldHVybnMgdHJ1ZSBpcyBpZ25vcmVkLgoJCQkJCQkJCSRleHRyYWN0X2xpc3QgPSAkemEtPmV4dHJhY3QoIFBDTFpJUF9PUFRfUEFUSCwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgUENMWklQX09QVF9CWV9OQU1FLCAkd2hhdCwgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEgsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQoJCQkJCQkJCS8vIENoZWNrIHdoZXRoZXIgd2Ugc3VjY2VlZGVkIG9yIG5vdCAod291bGQgb25seSBiZSBubyBsaXN0IGFycmF5IGZvciBhIHppcCBmaWxlIHByb2JsZW0pCgkJCQkJCQkJLy8gYnV0IGV4dHJhY3Rpb24gb2YgdGhlIGZpbGUgaXRzZWxmIG1heSBzdGlsbCBoYXZlIGZhaWxlZAoJCQkJCQkJCSRyZXN1bHQgPSAoICRleHRyYWN0X2xpc3QgIT09IDAgICYmICggJGV4dHJhY3RfbGlzdFsgMCBdWyAnc3RhdHVzJyBdID09ICdvaycgKSApOwoKCQkJCQkJCQkvLyBXaWxsIG5lZWQgdG8gcmVuYW1lIGlmIHRoZSBleHRyYWN0IGlzIG9rCgkJCQkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IHRydWU7CgkJCQkJCQoJCQkJCQkJfQoJCQkJCQoJCQkJCQl9CgkJCQkKCQkJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJCQkvLyBDdXJyZW50bHkgd2UgY2FuIG9ubHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdWNjZXNzIGFuZCBmYWlsdXJlIGJ1dCBubyBmaW5lciBncmFpbgoJCQkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR3aGF0LCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGVyZSApICk7CgoJCQkJCQkJLy8gUmVuYW1lIGlmIHdlIGhhdmUgdG8KCQkJCQkJCWlmICggdHJ1ZSA9PT0gJHJlbmFtZV9yZXF1aXJlZCkgewoJCQkJCQkJCgkJCQkJCQkJLy8gTm90ZTogd2UganVua2VkIHRoZSBwYXRoIG9uIHRoZSBleHRyYWN0aW9uIHNvIGp1c3QgdGhlIGZpbGVuYW1lIG9mICR3aGF0IGlzIHRoZSBzb3VyY2UgYnV0CgkJCQkJCQkJLy8gJHdoZXJlIGNvdWxkIGJlIGEgc2ltcGxlIGZpbGUgbmFtZSBvciBhIGZpbGUgcGF0aCAKCQkJCQkJCQkkcmVzdWx0ID0gJHJlc3VsdCAmJiByZW5hbWUoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYmFzZW5hbWUoICR3aGF0ICksCgkJCQkJCQkJCQkJCQkJCSAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR3aGVyZSApOwoJCQkJCQkJCgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGZhaWxlZCB0byBvcGVuL3Byb2Nlc3MgZmlsZSB0byBleHRyYWN0IGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKSAtIEVycm9yIEluZm86ICU1JHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCQkJCS8vIE1heSBzZWVtIHJlZHVuZGFudCBidXQgYmVsdCduJ2JyYWNlcwoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQkJLy8gSWYgdGhlIGV4dHJhY3Rpb24gZmFpbGVkIChvciByZW5hbWUgYWZ0ZXIgZXh0cmFjdGlvbikgdGhlbiBicmVhayBvdXQgb2YgdGhlIGZvcmVhY2ggYW5kIHNpbXBseSByZXR1cm4gZmFsc2UKCQkJCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBleHRyYWN0IGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkKCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZmlsZV9leGlzdHMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKglJZiBsZWF2ZV9vcGVuIGlzIHRydWUgdGhlbiB0aGUgemlwIG9iamVjdCB3aWxsIGJlIGxlZnQgb3BlbiBmb3IgZmFzdGVyIGNoZWNraW5nIGZvciBzdWJzZXF1ZW50IGZpbGVzIHdpdGhpbiB0aGlzIHppcAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXBfZmlsZQkJVGhlIHppcCBmaWxlIHRvIGNoZWNrCgkJICoJQHBhcmFtCQlzdHJpbmcJJGxvY2F0ZV9maWxlCVRoZSBmaWxlIHRvIHRlc3QgZm9yCgkJICoJQHBhcmFtCQlib29sCSRsZWF2ZV9vcGVuCQlPcHRpb25hbDogVHJ1ZSBpZiB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGxlZnQgb3BlbgoJCSAqCUByZXR1cm4JCWJvb2wvYXJyYXkJCQkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBmb3VuZCBpbiB0aGUgemlwIGFuZCBmYWxzZSBpZiBub3QsIGFycmF5IGZvciBvdGhlciBwcm9ibGVtCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQoJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJHZW5lcmljIGZhaWx1cmUgaW5kaWNhdGlvbiIgKTsKCQkJJHphID0gTlVMTDsKCQkJJHN0YXQgPSBhcnJheSgpOwoJCQkJCQkJCQoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR6aXBfZmlsZSApOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiQ2xhc3Mgbm90IGF2YWlsYWJsZSB0byBtYXRjaCBtZXRob2QiICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQlpZiAoICggJGNvbnRlbnRfbGlzdCA9ICR6YS0+bGlzdENvbnRlbnQoKSApICE9PSAwICkgewoJCQkJCgkJCQkJLy8gQXNzdW1lIGZhaWx1cmUKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJZm9yICggJGkgPSAwOyAkaSA8IHNpemVvZiggJGNvbnRlbnRfbGlzdCApOyAkaSsrICkgewoJCQkJCQoJCQkJCQkkc3RhdCA9ICRjb250ZW50X2xpc3RbICRpIF07CgkJCQkJCQoJCQkJCQkvLyBBc3N1bWUgdGhlIGtleSBleGlzdHMgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCWlmICggJHN0YXRbICdmaWxlbmFtZScgXSA9PSAkbG9jYXRlX2ZpbGUgKSB7CgkJCQkJCQoJCQkJCQkJLy8gRmlsZSBmb3VuZCBzbyB3ZSBjYW4gbm90ZSB0aGF0CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkJCgkJCQkJCQkvLyBOZWVkIHRvIGV4aXQgdGhlIGZvciBsb29wCgkJCQkJCQlicmVhazsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQkvLyBPbmx5IGdldCBoZXJlIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAocGNsemlwKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCQoJCQkJCX0KCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkbG9jYXRlX2ZpbGUgLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiRmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIiApOwoKCQkJCX0KCQkJCQkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQoJCX0KCQkJCQoJCS8qCWdldF9maWxlX2xpc3QoKQoJCSAqCQoJCSAqCUdldCBhbiBhcnJheSBvZiBhbGwgZmlsZXMgaW4gYSB6aXAgZmlsZSB3aXRoIHNvbWUgZmlsZSBwcm9wZXJ0aWVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJVGhlIGZpbGUgdG8gbGlzdCB0aGUgY29udGVudCBvZgoJCSAqCUByZXR1cm4JCWJvb2x8YXJyYXkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgb3RoZXJ3aXNlIGFycmF5IG9mIGZpbGUgcHJvcGVydGllcyAobWF5IGJlIGVtcHR5KQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmlsZV9saXN0KCAkemlwX2ZpbGUgKSB7CgkJCgkJCSRmaWxlX2xpc3QgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCSRzdGF0ID0gYXJyYXkoKTsKCQkJCQkJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIGNvbnRlbnQKCQkJCWlmICggMCAhPT0gKCAkY29udGVudF9saXN0ID0gJHphLT5saXN0Q29udGVudCgpICkgKSB7CgkJCQkKCQkJCQkvLyBIb3cgbWFueSBmaWxlcyAtIG11c3QgYmUgPjAgdG8gaGF2ZSBnb3QgaGVyZQoJCQkJCSRmaWxlX2NvdW50ID0gc2l6ZW9mKCAkY29udGVudF9saXN0ICk7CgkJCQkJCgkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJZm9yICggJGkgPSAwOyAkaSA8ICRmaWxlX2NvdW50OyAkaSsrICkgewoJCQkJCQoJCQkJCQkkc3RhdCA9ICRjb250ZW50X2xpc3RbICRpIF07CgkJCQkJCQoJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCSRmaWxlX2xpc3RbXSA9IGFycmF5KAoJCQkJCQkJJHN0YXRbICdmaWxlbmFtZScgXSwKCQkJCQkJCSRzdGF0WyAnc2l6ZScgXSwKCQkJCQkJCSRzdGF0WyAnY29tcHJlc3NlZF9zaXplJyBdLAoJCQkJCQkJJHN0YXRbICdtdGltZScgXQoJCQkJCQkpOwoJCQkJCQkJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGxpc3RlZCBmaWxlIGNvbnRlbnRzICglMSRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkkcmVzdWx0ID0gJiRmaWxlX2xpc3Q7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGxpc3QgY29udGVudHMgKCUxJHMpIC0gRXJyb3IgSW5mbzogJTIkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkJCQkKCQkJfSAKCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCgkJfQoJCQoJCS8qCXNldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCB3ZSBhZGRlZCB0aGUgY29tbWVudCBvawoJCQkJLy8gTm90ZTogdXNpbmcgZW1wdHkgYXJyYXkgYXMgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBhZGQgYW55IGZpbGVzCgkJCQlpZiAoIDAgIT09ICggJGxpc3QgPSAkemEtPmFkZCggYXJyYXkoKSwgUENMWklQX09QVF9DT01NRU5ULCAkY29tbWVudCApICkgKSB7CgkJCQkKCQkJCQkvLyBXZSBnb3QgYSBsaXN0IGJhY2sgc28gYWRkaW5nIGNvbW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBzdWNjZXNzZnVsCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIHNldCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgY29tbW5lbnQgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgZmFpbGVkIHRvIHNldCBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQkJCQoJCQkJfQoJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkKCQl9CgoJCS8qCWdldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnQoICR6aXBfZmlsZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkemEgPSBOVUxMOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIHByb3BlcnRpZXMKCQkJCWlmICggMCAhPT0gKCAkcHJvcGVydGllcyA9ICR6YS0+cHJvcGVydGllcygpICkgKSB7CgkJCQkKCQkJCQkvLyBXZSBnb3QgcHJvcGVydGllcyBzbyBzaG91bGQgaGF2ZSBhIGNvbW1lbnQgdG8gcmV0dXJuLCBldmVuIGlmIGVtcHR5CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIHJldHJpZXZlZCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJJHJlc3VsdCA9ICRwcm9wZXJ0aWVzWyAnY29tbWVudCcgXTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJ6aXBwY2x6aXAgY2xhc3MuCQoJCn0KPz4K ###PACKDATA,FILE_END,/lib/zipbuddy/zbzippclzip.php,importbuddy/lib/zipbuddy/zbzippclzip.php ###PACKDATA,FILE_START,/lib/zipbuddy/zbzipproc.php,importbuddy/lib/zipbuddy/zbzipproc.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwcHJvYyBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcHByb2MiICkgKSB7CgoJY2xhc3MgcGx1Z2luYnVkZHlfemJ6aXBwcm9jIGV4dGVuZHMgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIHsKCQoJCS8vIENvbnN0YW50cyBmb3IgZmlsZSBoYW5kbGluZwoJCWNvbnN0IFpJUF9MT0dfRklMRV9OQU1FICAgICAgICA9ICd0ZW1wX3ppcF9wcm9jX2xvZy50eHQnOwoJCWNvbnN0IFpJUF9FUlJPUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X3Byb2NfZXJyb3JzLnR4dCc7CgkJY29uc3QgWklQX1dBUk5JTkdTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcHJvY193YXJuaW5ncy50eHQnOwoJCWNvbnN0IFpJUF9PVEhFUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X3Byb2Nfb3RoZXJzLnR4dCc7CgkJY29uc3QgWklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FID0gJ2V4Y2x1c2lvbnMudHh0JzsKCQljb25zdCBaSVBfSU5DTFVTSU9OU19GSUxFX05BTUUgPSAnaW5jbHVzaW9ucy50eHQnOwoJCgkJLy8gUG9zc2libGUgZXhlY3V0YWJsZSBwYXRoIHNldHMKCQljb25zdCBERUZBVUxUX0VYRUNVVEFCTEVfUEFUSFMgPSAnL3Vzci9sb2NhbC9iaW46Oi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjovdXNyL3NiaW46L3NiaW46L2Jpbic7CgkJY29uc3QgV0lORE9XU19FWEVDVVRBQkxFX1BBVEhTID0gJyc7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogbWV0aG9kIHRhZyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtZXRob2QgYW5kIGVudGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdCBzdWNoIGFzIGNsYXNzIG5hbWUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9tZXRob2RfdGFnID0gJ3Byb2MnOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSBmYWxzZTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX2RlcGVuZGVuY2llcyA9IGFycmF5KCAnY2xhc3NlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdmdW5jdGlvbnMnID0+IGFycmF5KCAncHJvY19vcGVuJywgJ3Byb2NfY2xvc2UnLCAncHJvY19nZXRfc3RhdHVzJywgJ3Byb2NfdGVybWluYXRlJyApLAoJCQkJCQkJCQkJCSAgCQkgJ2V4dGVuc2lvbnMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZmlsZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnY2hlY2tfZnVuYycgPT4gJ2NoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljJwoJCQkJCQkJCQkJCQkJKTsKCQkJCgkJLyoqCgkJICogCgkJICogZ2V0X21ldGhvZF90YWdfc3RhdGljKCkKCQkgKgoJCSAqIEdldCB0aGUgc3RhdGljIG1ldGhvZCB0YWcgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJc3RyaW5nCVRoZSBtZXRob2QgdGFnCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX3RhZzsKCQkJCgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Rfc3RhdGljKCkKCQkgKgoJCSAqIEdldCB0aGUgY29tcGF0aWJpbGl0eSBtZXRob2QgaW5kaWNhdG9yIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBpcyBhIGNvbXBhdGliaWxpdHkgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIG1ldGhvZCBkZXBlbmRlbmNpZXMgYXJyYXkgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVxdWlyZXMgdG8gYmUgYSBzdXBwb3J0ZWQgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX2RlcGVuZGVuY2llczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqIAoJCSAqIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljKCkKCQkgKgoJCSAqIEFsbG93cyBhZGRpdGlvbmFsIG1ldGhvZCBkZXBlbmRlbmN5IGNoZWNrcyBiZXlvbmQgdGhlIHN0YW5kYXJkIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgY2hlY2tzIHBhc3NlZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJLy8gTmVlZCB0byBhZGRpdGlvbmFsbHkgY2hlY2sgdGhlIE9TIC0gbmVlZCAqbml4IHR5cGUgYXQgbGVhc3QKCQkJCQoJCQkvLyBVc2UgVUMgZm9yIGVhc2UgLSB0aGlzIF9zaG91bGQgbm90PyBjYXVzZSBhbnkgYW1iaWd1aXR5CgkJCSRvc19uYW1lID0gc3RydG91cHBlciggUEhQX09TICk7CgkgCgkJCS8vIEN1cnJlbnRseSB3ZSdsbCBhc3N1bWUgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGxvb2sgbGlrZSBXaW5kb3dzIGlzICpuaXggYmFzZWQKCQkJaWYgKCAhKCBzdWJzdHIoICRvc19uYW1lLCAwLCAzICkgPT09ICdXSU4nKSApIHsKCQkJCgkJCQkvLyBXZSdyZSBvayBhcyBtZWV0IGRlcGVuZGVuY3kgdGhhdCB0aGlzIGlzbid0IFdpbmRvd3MgYmFzZWQgT1MKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkKCQkJfQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRwYXJlbnQJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdHVzKCkgZnVuY3Rpb24gZm9yIHN0YXR1cyB1cGRhdGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJiRwYXJlbnQgPSBOVUxMICkgewoKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCggJHBhcmVudCApOwoJCQkKCQkJLy8gT3ZlcnJpZGUgc29tZSBvZiBwYXJlbnQgZGVmYXVsdHMKCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0gPSBhcnJheV9tZXJnZSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0sCgkJCQkJCQkJCQkJCQkJCWFycmF5KCAnbmFtZScgPT4gJ1Byb2MgTWV0aG9kJywKCQkJCQkJCQkJCQkJCSAgCQkJICAgJ2NvbXBhdGliaWxpdHknID0+IHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgKQoJCQkJCQkJCQkJCQkJICAJICAgKTsKCgkJCS8vIE5vdyBzZXQgdXAgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBwYXRocyAobm90IG1lcmdpbmcgYnV0IHNldHRpbmcpCgkJCS8vIE5vdGU6IFBhcmVudCBjb25zdHJ1Y3RvciBzZXQgdGhlIG9zIHR5cGUgdmFsdWUKCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQoJCQkJCSR0aGlzLT5zZXRfZXhlY3V0YWJsZV9wYXRocyggZXhwbG9kZSggUEFUSF9TRVBBUkFUT1IsIHNlbGY6OkRFRkFVTFRfRVhFQ1VUQUJMRV9QQVRIUyApLCBmYWxzZSk7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCQoJCQkJCSR0aGlzLT5zZXRfZXhlY3V0YWJsZV9wYXRocyggZXhwbG9kZSggUEFUSF9TRVBBUkFUT1IsIHNlbGY6OldJTkRPV1NfRVhFQ1VUQUJMRV9QQVRIUyApLCBmYWxzZSk7CgkJCQkJCgkJCQkJLy8gTmVlZCB0byBtZXJnZSBpbiBBQlNQQVRIIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3Qgc2V0IHRoYXQgaW4gdGhlIGRlZmF1bHRzIC0gaXQgaXMgcHJlcGVuZGVkCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBhcnJheSggcnRyaW0oIEFCU1BBVEgsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICk7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQlkZWZhdWx0OgoJCQkJCS8vIExvZyBlcnJvciBhbmQgbGVhdmUgcGF0aHMgZW1wdHkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmtub3duIE9TIHR5cGUgKCUxJHMpIGNvdWxkIG5vdCBzZXQgZXhlY3V0YWJsZSBwYXRocycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgKTsKCQkJCQkKCQkJfQoJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCQkKCQkJcGFyZW50OjpfX2Rlc3RydWN0KCk7CgoJCX0KCQkKCQkvKioKCQkgKglnZXRfbWV0aG9kX3RhZygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgbWV0aG9kIHRhZwoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZyBUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBpc19jb21wYXRpYmlsaXR5X21ldGhvZCBib29sZWFuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfY29tbWFuZF9wYXRoKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdGhlIHBhdGggZm9yIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBmcm9tIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCUlmIG5vdCBmb3VuZCB0aGVuIHdpbGwgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGljaCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUKCQkgKgljb21tYW5kIGlzIGJlaW5nIGFjY2Vzc2VkIHRocm91Z2ggUEFUSAoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQlQYXRoIGZvciBjb21tYW5kLCB0cmltbWVkIC0gbWF5IGJlIGVtcHR5CgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbW1hbmRfcGF0aCggJGNvbW1hbmQgPSBzZWxmOjpDT01NQU5EX1VOS05PV05fUEFUSCApIHsKCQkKCQkJJHJlc3VsdCA9ICcnOwoJCQkKCQkJc3dpdGNoKCAkY29tbWFuZCApIHsKCQkJCgkJCQljYXNlIHNlbGY6OkNPTU1BTkRfWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApICkgewoJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJpbSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApOwoJCQkJCX0KCQkJCQkKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgKSB7CgkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cmltKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gKTsKCQkJCQl9CgkJCQkJCgkJCQkJYnJlYWs7CgkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBkZWZhdWx0IGZvciBub3cKCQkJCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgc2V0cyB0aGUgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIG1ldGhvZCBkZXRhaWxzCgkJICoJTm90ZTogcHJlLXYzIHppcCBydW5uaW5nICJ6aXAgLXYiIHdpbGwgbm90IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dCBiZWNhdXNlCgkJICoJdGhlcmUgaXMgbm8gdHR5IGF0dGFjaGVkICh3aGVuIHJ1bm5pbmcgdGhyb3VnaCBleGVjKCkgb3IgZXF1aXZhbGVudCksIGluc3RlYWQKCQkgKglpdCB3aWxsIHByb2R1Y2UgYSB6aXAgZmlsZS5DdXJyZW50bHkgd2UnbGwganVzdCBkZXRlY3QgdGhhdCBhbmQgc2V0IHRoZSB2ZXJzaW9uCgkJICoJYXMgMi4wIGFuZCBub3Qgc2V0IHRoZSBpbmZvLgoJCSAqCVRPRE86IFdlIGNvdWxkIHBhcnNlIHRoZSB6aXAgZmlsZSB0byBnZXQgdGhlIHZlcnNpb24gYnV0IGFsc28gY29uc2lkZXJpbmcgZG9pbmcKCQkgKgl0aGF0IGluIHRoZSBpc19hdmFpbGFibGUoKSB0ZXN0IHdoZXJlIHdlIGFscmVhZHkgY3JlYXRlZCBhIHppcCBmaWxlLgoJCSAqCVRPRE86IENvbnNpZGVyIHRlc3RpbmcgaWYgbWV0aG9kIGNhbiB6aXAgYW5kIG9ubHkgdGhlbiBydW4gdGhlIHRlc3QKCQkgKglUT0RPOiBUaGlzIG5lZWRzIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgY2xlYW5lcgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfemlwX3ZlcnNpb24oICRtYWpvciA9IDAsICRtaW5vciA9IDAsICRvdmVycmlkZSA9IGZhbHNlICkgewoJCQoJCQkkZXhpdGNvZGUgPSAxMjc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRpbmZvID0gJyc7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkJcmV0dXJuICR0aGlzOyAKCQkJCgkJCX0KCQkJCgkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLXYnOwoJCQkKCQkJLy9AZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJLy8gR2V0IGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlIGZvciBjb21tYW5kIG91dHB1dAoJCQkkb3V0ZmlsZV9uYW1lID0gdGVtcG5hbSggc3lzX2dldF90ZW1wX2RpcigpLCB1bmlxaWQoICdwYl8nICkgKTsKCQkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGZpbGUgd2UgY2FuIHdyaXRlIHRvCgkJCWlmICggaXNfc3RyaW5nKCAkb3V0ZmlsZV9uYW1lICkgJiYgaXNfd3JpdGFibGUoICRvdXRmaWxlX25hbWUgKSApIHsgCgkJCQoJCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCgkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkxID0+IGFycmF5KCAiZmlsZSIsICRvdXRmaWxlX25hbWUsICJ3IiApLAoJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJKTsKCQkJCQoJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQoJCQkJJHByb2Nlc3MgPSBAcHJvY19vcGVuKCAkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMgKTsKCQkJCQoJCQkJaWYgKCBpc19yZXNvdXJjZSggJHByb2Nlc3MgKSApIHsKCQkJCQoJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCgkJCQkJJHBzdGF0dXMgPSBwcm9jX2dldF9zdGF0dXMoICRwcm9jZXNzICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHdlIG9ubHkgZG8gNCBsb29wIG1heAoJCQkJCSRjb3VudCA9IDA7CgkJCQkJCgkJCQkJd2hpbGUgKCB0cnVlID09ICRwc3RhdHVzWyAncnVubmluZyddICYmICggJGNvdW50KysgPCA0ICkgKSB7CgkJCQkJCXVzbGVlcCggNTAwMDAwICk7CgkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJLy8gSG1tLCBzaG91bGRuJ3Qgc3RpbGwgYmUgcnVubmluZywgdHJ5IHRvIGtpbGwgaXQgYW5kIG1vdmUgb24KCQkJCQkJQHByb2NfdGVybWluYXRlKCAkcHJvY2VzcyApOwoJCQkJCQkKCQkJCQkJLy8gR2V0IHN0YXR1cyBhZ2FpbiBhbmQgc2VlIGlmIG5vdyBub3QgcnVubmluZywgaWYgc28gZ2V0IGV4aXQgY29kZQoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBQcm9jZXNzIGZpbmlzaGVkIG5vcm1hbGx5IHNvIGdldCBleGl0IGNvZGUgZm9yIHBvc3NpYmxlIHVzZQoJCQkJCQkkZXhpdGNvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gSWdub3JlIGFueSBjbG9zZSBpc3N1ZSwgc2hvdWxkbid0IGdldCBzdHVjayBoZXJlIGJ1dCBpdCBpcyBwb3NzaWJsZSBpZgoJCQkJCS8vIHdlIHByb2Nlc3Mgd2FzIHN0aWxsIHJ1bm5pbmcgYW5kIHdlIGZhaWxlZCB0byB0ZXJtaW5hdGUgaXQgLSB0cmlja3kgb25lCgkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQlAcHJvY19jbG9zZSggJHByb2Nlc3MgKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBOb3RlOiBpZiB3ZSBjb3VsZG4ndCBjcmVhdGUgYSBwcm9jZXNzIGp1c3QgZmFsbCB0aHJvdWdoIHNpbGVudGx5CgkJCQoJCQlpZiAoIDAgPT09ICRleGl0Y29kZSApIHsKCQkJCgkJCQkvLyBQdXQgdGhlIGZpbGUgY29udGVudCBpbnRvIGFuIGFycmF5CgkJCQl0cnkgewoJCQkJCgkJCQkJJG91dGZpbGUgPSBuZXcgU3BsRmlsZU9iamVjdCggJG91dGZpbGVfbmFtZSwgInJiIiApOwoJCQkJCQoJCQkJCXdoaWxlKCAhJG91dGZpbGUtPmVvZigpICkgewoJCQkJCQoJCQkJCQkvLyBOZWVkIHRvIHRyaW0gbGluZSBlbmRpbmdzIGJlY2F1c2Ugb2YgaW1wbG9kaW5nIHdpdGggUEhQX0VPTCBsYXRlcgoJCQkJCQkkb3V0cHV0W10gPSBydHJpbSggJG91dGZpbGUtPmN1cnJlbnQoKSApOwoJCQkJCQkkb3V0ZmlsZS0+bmV4dCgpOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQl1bnNldCggJG91dGZpbGUgKTsKCQkJCQkKCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQkKCQkJCQkvLyBNYXliZSB0aGUgZmlsZSBkaWRuJ3QgZXhpc3QgZm9yIHNvbWUgcmVhc29uPwoJCQkJCS8vIEluIGFueSBjYXNlIGp1c3QgZmFsbCB0aHJvdWdoIHNpbGVudGx5CgkJCQkJCgkJCQl9CgkJCQoJCQkJLy8gU2hvdWxkIGJlIGdvb2Qgb3V0cHV0IHRvIHRyeSBhdCBsZWFzdAoJCQkJLy8gSWYgdGhpcyBoYXMgYSB6aXAgZmlsZSBzaWduYXR1cmUgdGhlbiBpdCBtdXN0IGJlIHByZS12MyB6aXAKCQkJCSR6X2RhdGEgPSB1bnBhY2soICdWc2lnJywgJG91dHB1dFswXSApOwoJCQkKCQkJCWlmICggMHgwNDAzNGI1MCA9PSAkel9kYXRhWyAnc2lnJyBdICkgewoJCQkJCgkJCQkJLy8gVE9ETzogQ29uc2lkZXIgdGhhdCB3ZSBjb3VsZCB1c2UgdW56aXAgLVogLXYgb24gdGhpcyBmaWxlIGFuZCBwYXJzZSB0aGUKCQkJCQkvLyBvdXRwdXQgZm9yIHRoZSBDZW50cmFsIERpciBpbmZvIG9uIHdoYXQgdmVyc2lvbiBvZiB6aXAgY3JlYXRlZCB0aGUgZmlsZS4KCQkJCQkvLyBDdXJyZW50bHksIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB3ZSBkb24ndCBrbm93IGlmIHdlIGhhdmUgdW56aXAKCQkJCQkvLyBzbyB3ZSBjYW4ndCBhc3N1bWUgLSB3aXRoIGEgcmVqaWcgd2UgY291bGQgY2FsbCB0aGlzIGxhdGVyIGFuZCB1c2UgdW56aXAKCQkJCQkvLyBpZiBhdmFpbGFibGUuCgkJCQkJLy8gQ2FuJ3QgdGVsbCB3aGljaCAyLlggdmVyc2lvbiwgY2Fubm90IHBvcHVsYXRlICRpbmZvCgkJCQkJJG1ham9yID0gMjsKCQkJCQkkbWlub3IgPSAwOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIERvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgemlwIGZpbGUgc28gc2hvdWxkIGJlIHZlcnNpb24gaW5mbwoJCQkJCS8vIEV4cGVjdCBmb3JtYXQgbGlrZTogVGhpcyBpcyBaaXAgMy4wIChKdWx5IDV0aCAyMDA4KS4uLgoJCQkJCS8vICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBaaXAgMy4xYyBCRVRBIChKdW5lIDIybmQgMjAxMCkuLi4KCQkJCQkvLyBUaGUgbWF0Y2ggc2hvdWxkIHRha2Ugb25seSB0aGUgbWFqb3IvbWlub3IgZGlnaXRzIGFuZCBpZ25vcmUgYW55IGZvbGxvd2luZyBhbHBoYQoJCQkJCS8vIE1heSBleHRlbmQgdG8gY2FwdHVyZSB0aGUgYWxwaGEgYW5kIGFsc28gd2hldGhlciBCRVRBIGluZGljYXRlZCBidXQgbm90IGN1cnJlbnRseQoJCQkJCS8vIHJlcXVpcmVkLgoJCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoJCgkJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHRoaXMpXHMrKGlzKVxzKyh6aXApXHMrKD9QPG1ham9yPlxkKVwuKD9QPG1pbm9yPlxkKykvaScsICRsaW5lLCAkbWF0Y2hlcyApICkgewoJCQkJCQkKCQkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJCSRtaW5vciA9IChpbnQpJG1hdGNoZXNbICdtaW5vcicgXTsKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBJZiB3ZSBkaWRuJ3QgbWF0Y2ggYSB2ZXJzaW9uIHRoZW4gc3VzcGVjdCB0aGlzIGlzIHN0aWxsIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm8KCQkJCQlpZiAoICFlbXB0eSggJG1hdGNoZXMgKSApIHsKCQkJCQkKCQkJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5mbyBzdHJpbmcKCQkJCQkJLy8gTm90ZTogbm90IHdvcnRoIGNvbXByZXNzaW5nIGFzIHRoYXQgZ2l2ZXMgYSBsYXJnZXIgc3RyaW5nIGFmdGVyIGNvbnZlcnRpbmcKCQkJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCgkJCQkJCSRpbmZvID0gaW1wbG9kZSggUEhQX0VPTCwgJG91dHB1dCApOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICdpbmZvJyBdID0gJGluZm87CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm93IHVzZSBlaXRoZXIgd2hhdCB3ZSBnb3Qgb3Igd2hhdCB3ZSB3ZXJlIGdpdmVuLi4uCgkJCWlmICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApIHsKCQkJCgkJCQkvLyBTZXQgdGhlIGdpdmVuIHZlcnNpb24gcmVnYXJkbGVzcwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCgkJCX0KCQkJCgkJCS8vIENhdGNoLWFsbCBjbGVhbnVwIG9mIHRoZSBvdXRwdXQgZmlsZQoJCQlpZiAoIEBmaWxlX2V4aXN0cyggJG91dGZpbGVfbmFtZSApICkgewoJCQkKCQkJCUB1bmxpbmsoICRvdXRmaWxlX25hbWUgKTsKCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7IAoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgZ2V0cyB0aGUgemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfdmVyc2lvbigpIHsKCQkKCQkJJHJlc3VsdCA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF07CgkJCQoJCQlpZiAoIDAgPT09ICRyZXN1bHRbICdtYWpvcicgXSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfdW56aXBfdmVyc2lvbigpCgkJICoJCgkJICoJVGhpcyBzZXRzIHRoZSB6aXAgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgbWV0aG9kIGRldGFpbHMKCQkgKglUT0RPOiBUaGlzIG5lZWRzIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgY2xlYW5lcgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfdW56aXBfdmVyc2lvbiggJG1ham9yID0gMCwgJG1pbm9yID0gMCwgJG92ZXJyaWRlID0gZmFsc2UgKSB7CgkJCgkJCSRleGl0Y29kZSA9IDEyNzsKCQkJJG91dHB1dCA9IGFycmF5KCk7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCSRtYXRjaGVzID0gYXJyYXkoKTsKCQkJJGluZm8gPSAnJzsKCQkKCQkJLy8gSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgdmFsdWUgdG8gdXNlIHdpdGggb3ZlcnJpZGUgdGhlbiBqdXN0IHVzZSBpdAoJCQlpZiAoICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApICYmICggdHJ1ZSA9PT0gJG92ZXJyaWRlICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCXJldHVybiAkdGhpczsgCgkJCQoJCQl9CgkJCQoJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHVuemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3VuemlwIC12JzsKCQkJCgkJCS8vQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdGNvZGUgKTsKCQkJCgkJCS8vIEdldCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZSBmb3IgY29tbWFuZCBvdXRwdXQKCQkJJG91dGZpbGVfbmFtZSA9IHRlbXBuYW0oIHN5c19nZXRfdGVtcF9kaXIoKSwgdW5pcWlkKCAncGJfJyApICk7CgkJCQoJCQkvLyBNYWtlIHN1cmUgd2Ugb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBmaWxlIHdlIGNhbiB3cml0ZSB0bwoJCQlpZiAoIGlzX3N0cmluZyggJG91dGZpbGVfbmFtZSApICYmIGlzX3dyaXRhYmxlKCAkb3V0ZmlsZV9uYW1lICkgKSB7IAoJCQkKCQkJCSRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KAoJCQkJCTAgPT4gYXJyYXkoICJwaXBlIiwgInIiICksCgkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAkb3V0ZmlsZV9uYW1lLCAidyIgKSwKCQkJCQkyID0+IGFycmF5KCAiZmlsZSIsICIvZGV2L251bGwiLCAiYSIgKQkKCQkJCSk7CgkJCQkKCQkJCSRwcm9jZXNzID0gTlVMTDsgLy8gTWF5YmUgaXQgZG9lc24ndCB3b3JrCgkJCQkKCQkJCSRwcm9jZXNzID0gQHByb2Nfb3BlbiggJGNvbW1hbmQsICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzICk7CgkJCQkKCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkKCQkJCQlmY2xvc2UoICRwaXBlc1swXSApOyAvLyBOZXZlciB3YW50IHRvIHNlbmQgaW5wdXQgc28ganVzdCBjbG9zZSBpdAoJCQkJCQoJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkkY291bnQgPSAwOwoJCQkJCQoJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQl1c2xlZXAoIDUwMDAwMCApOwoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQl9CgkJCQkJCgkJCQkJaWYgKCB0cnVlID09PSAkcHN0YXR1c1sgJ3J1bm5pbmcnIF0gKSB7CgkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCUBwcm9jX3Rlcm1pbmF0ZSggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gUHJvY2VzcyBmaW5pc2hlZCBub3JtYWxseSBzbyBnZXQgZXhpdCBjb2RlIGZvciBwb3NzaWJsZSB1c2UKCQkJCQkJJGV4aXRjb2RlID0gJHBzdGF0dXNbICdleGl0Y29kZScgXTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkvLyB3ZSBwcm9jZXNzIHdhcyBzdGlsbCBydW5uaW5nIGFuZCB3ZSBmYWlsZWQgdG8gdGVybWluYXRlIGl0IC0gdHJpY2t5IG9uZQoJCQkJCS8vIHRvIG92ZXJjb21lIGJ1dCBfc2hvdWxkXyBiZSByYXJlCgkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm90ZTogaWYgd2UgY291bGRuJ3QgY3JlYXRlIGEgcHJvY2VzcyBqdXN0IGZhbGwgdGhyb3VnaCBzaWxlbnRseQoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gUHV0IHRoZSBmaWxlIGNvbnRlbnQgaW50byBhbiBhcnJheQoJCQkJdHJ5IHsKCQkJCQoJCQkJCSRvdXRmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRvdXRmaWxlX25hbWUsICJyYiIgKTsKCQkJCQkKCQkJCQl3aGlsZSggISRvdXRmaWxlLT5lb2YoKSApIHsKCQkJCQkKCQkJCQkJLy8gTmVlZCB0byB0cmltIGxpbmUgZW5kaW5ncyBiZWNhdXNlIG9mIGltcGxvZGluZyB3aXRoIFBIUF9FT0wgbGF0ZXIKCQkJCQkJJG91dHB1dFtdID0gcnRyaW0oICRvdXRmaWxlLT5jdXJyZW50KCkgKTsKCQkJCQkJJG91dGZpbGUtPm5leHQoKTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJdW5zZXQoICRvdXRmaWxlICk7CgkJCQkJCgkJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkJCgkJCQkJLy8gTWF5YmUgdGhlIGZpbGUgZGlkbid0IGV4aXN0IGZvciBzb21lIHJlYXNvbj8KCQkJCQkvLyBJbiBhbnkgY2FzZSBqdXN0IGZhbGwgdGhyb3VnaCBzaWxlbnRseQoJCQkJCQoJCQkJfQoJCQkKCQkJCS8vIFNob3VsZCBiZSBnb29kIG91dHB1dCB0byB0cnkgYXQgbGVhc3QKCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoKCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih1bnppcClccysoP1A8bWFqb3I+XGQpXC4oP1A8bWlub3I+XGQrKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCgkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJJG1pbm9yID0gKGludCkkbWF0Y2hlc1sgJ21pbm9yJyBdOwoJCQkJCQlicmVhazsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5mbyBzdHJpbmcKCQkJCS8vIE5vdGU6IG5vdCB3b3J0aCBjb21wcmVzc2luZyBhcyB0aGF0IGdpdmVzIGEgbGFyZ2VyIHN0cmluZyBhZnRlciBjb252ZXJ0aW5nCgkJCQkvLyBmcm9tIGJpbmFyeSB0byBoZXggZm9ybWF0IGZvciBzYXZpbmcKCQkJCSRpbmZvID0gaW1wbG9kZSggUEhQX0VPTCwgJG91dHB1dCApOwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdpbmZvJyBdID0gJGluZm87CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm93IHVzZSBlaXRoZXIgd2hhdCB3ZSBnb3Qgb3Igd2hhdCB3ZSB3ZXJlIGdpdmVuLi4uCgkJCWlmICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApIHsKCQkJCgkJCQkvLyBTZXQgdGhlIGdpdmVuIHZlcnNpb24gcmVnYXJkbGVzcwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2F0Y2gtYWxsIGNsZWFudXAgb2YgdGhlIG91dHB1dCBmaWxlCgkJCWlmICggQGZpbGVfZXhpc3RzKCAkb3V0ZmlsZV9uYW1lICkgKSB7CgkJCQoJCQkJQHVubGluayggJG91dGZpbGVfbmFtZSApOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsgCgkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF91bnppcF92ZXJzaW9uKCkKCQkgKgkKCQkgKglUaGlzIGdldHMgdGhlIHVuemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF91bnppcF92ZXJzaW9uKCkgewoJCQoJCQkkcmVzdWx0ID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdOwoJCQkKCQkJaWYgKCAwID09PSAkcmVzdWx0WyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3ppcF9zdXBwb3J0c19sb2dmaWxlKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgemlwIGluIHVzZSBpcyBhYmxlIHRvIHN1cHBvcnQgbG9nZmlsZSB1c2FnZSBmb3IKCQkgKglsb2dnaW5nIHByb2dyZXNzIG9mIHppcCBvcGVyYXRpb24KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgbG9nZmlsZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfc3VwcG9ydHNfbG9nX2ZpbGUoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIEN1cnJlbnRseSBjaGVjayBiYXNlZCBqdXN0IG9uIHRoZSB6aXAgbWFqb3IgdmVyc2lvbgoJCQkvLyBUT0RPOiBkZWNpZGUgaWYgYmV0dGVyIHRvIHJlc3BvbmQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zCgkJCWlmICggMyA8PSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdWyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBpc19hdmFpbGFibGUoICR0ZW1wZGlyICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5pc19hdmFpbGFibGVfbGludXgoICR0ZW1wZGlyICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+aXNfYXZhaWxhYmxlX3dpbmRvd3MoICR0ZW1wZGlyICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJICAJCgkJfQoKCQkvKioKCQkgKglpc19hdmFpbGFibGVfd2luZG93cygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gaXNfYXZhaWxhYmxlX3dpbmRvd3MoICR0ZW1wZGlyICkgewoJCQoJCQkvLyBKdXN0IHJldHVybiBmYWxzZSBzaWxlbnRseSBvdGhlcndpc2Ugd2UnZCBiZSBsb2dnaW5nIHJlcGVhdGVkbHkuLi4KCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICR0aGlzLT5fbWV0aG9kX3RhZyAuIF9fKCcgbWV0aG9kIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZV9saW51eCgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gaXNfYXZhaWxhYmxlX2xpbnV4KCAkdGVtcGRpciApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkcGVuZGluZ19yZXN1bHQgPSBmYWxzZTsKCQkJJGZvdW5kX3ppcCA9IGZhbHNlOwoJCQkkcHN0YXR1cyA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGlzIGlzIGEgc2FmZXR5IHZhbHVlIGluIGNhc2Ugc29tZXRoaW5nIG9kZCBoYXBwZW5zCgkJCSRleGVjX2V4aXRfY29kZSA9IDEyNzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAncHJvY19vcGVuJyApICYmIGZ1bmN0aW9uX2V4aXN0cyggJ3Byb2NfY2xvc2UnICkgJiYKCQkJCSBmdW5jdGlvbl9leGlzdHMoICdwcm9jX2dldF9zdGF0dXMnICkgJiYgZnVuY3Rpb25fZXhpc3RzKCAncHJvY190ZXJtaW5hdGUnICkgKSB7CgkJCQkgCgkJCQkkY2FuZGlkYXRlX3BhdGhzID0gJHRoaXMtPl9leGVjdXRhYmxlX3BhdGhzOwoJCQkJCgkJCQkvLyBXZSBhcmUgc2VhcmNoaW5nIGZvciB6aXAgdXNpbmcgdGhlIGxpc3Qgb2YgcG9zc2libGUgcGF0aHMKCQkJCXdoaWxlICggKCBmYWxzZSA9PSAkZm91bmRfemlwICkgJiYgKCAhZW1wdHkoICRjYW5kaWRhdGVfcGF0aHMgKSApICkgewoJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIGl0IGlzIGNsZWFuIG9mIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZQoJCQkJCSRwYXRoID0gdHJpbSggYXJyYXlfc2hpZnQoICRjYW5kaWRhdGVfcGF0aHMgKSApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdUcnlpbmcgZXhlY3V0YWJsZSBwYXRoIGZvciB6aXAgcHJvYzonLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRwYXRoIC4gJ2AuJyApOwoKCQkJCQkkdGVzdF9maWxlID0gJHRlbXBkaXIgLiAndGVtcF90ZXN0XycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCQkKCQkJCQkkY29tbWFuZCA9ICdleGVjICcgLiAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAnemlwICInIC4gJHRlc3RfZmlsZSAuICciICInIC4gX19GSUxFX18gLiAnIic7CgkKCQkJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKCQkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAiL2Rldi9udWxsIiwgImEiICksCgkJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJCSk7CgkJCQkJCgkJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQkKCQkJCQkkcHJvY2VzcyA9IEBwcm9jX29wZW4oICRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyApOwoJCQkJCQoJCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkJCgkJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCQoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkJJGNvdW50ID0gMDsKCQkJCQkJCgkJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQkJdXNsZWVwKCA1MDAwMDAgKTsKCQkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCQlAcHJvY190ZXJtaW5hdGUoICRwcm9jZXNzICk7CgkJCQkJCQkKCQkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIFByb2Nlc3MgZmluaXNoZWQgbm9ybWFsbHkgc28gZ2V0IGV4aXQgY29kZSBmb3IgcG9zc2libGUgdXNlCgkJCQkJCQkkZXhlY19leGl0X2NvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkJLy8gd2UgcHJvY2VzcyB3YXMgc3RpbGwgcnVubmluZyBhbmQgd2UgZmFpbGVkIHRvIHRlcm1pbmF0ZSBpdCAtIHRyaWNreSBvbmUKCQkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCQoJCQkJCQkvLyBNdXN0IGhhdmUgYm90aCBhIGZpbGUgYW5kIGEgc3VjY2VzcyBleGl0IGNvZGUgdG8gY29uc2lkZXIgdGhpcyBzdWNjZXNzZnVsCgkJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgJiYgKCAwID09PSAkZXhlY19leGl0X2NvZGUgKSApIHsKCQkJCQoJCQkJCQkJLy8gU2V0IHRoZSBwYXJhbWV0ZXIgdG8gYmUgcmVtZW1iZXJlZCAobm90ZTogcGF0aCB3aXRob3V0IHRyYWlsaW5nIHNsYXNoKQoJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkJCgkJCQkJCQkvLyBUaGUgemlwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBzbyB3ZSBjYW4gYXQgbGVhc3QgemlwIGFuZCBhcmNoaXZlCgkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3ppcHBlcicgXSA9IHRydWU7CgkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2FyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh6aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkKCQkJCQkJCS8vIFRPRE86IENvbnNpZGVyIHBhcnNpbmcgemlwIGZpbGUgdG8gZ2V0IHZlcnNpb24gb2YgemlwIHRoYXQgY3JlYXRlZCBpdC4gVGhpcyBtYXkgc2VlbSBvZGQKCQkJCQkJCS8vIGJ1dCBwcmUtdjMgemlwIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJ1biAiemlwIC12IiB0aHJvdWdoIGV4ZWMoKSBvciBlcXVpdmFsZW50IGFzIGl0IG9ubHkKCQkJCQkJCS8vIHByb3ZpZGVzIHRoZSByZXF1aXJlZCBvdXRwdXQgaWYgYSB0dHkgaXMgYXR0YWNoZWQsIG90aGVyd2lzZSBpdCBjcmVhdGVzIGEgemlwIGZpbGUuIFdlCgkJCQkJCQkvLyBtaWdodCBjb25zaWRlciBwYXJzaW5nIHRoZSBjcmVhdGVkIHppcCBmaWxlIGJ1dCBhcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBvbmUgaGVyZSB3ZQoJCQkJCQkJLy8gbWlnaHQgYXMgd2VsbCB1c2UgaXQKCQkJCQkJCQoJCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkJJGZvdW5kX3ppcCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJCS8vIERlYWwgd2l0aCB0aGUgcG9zc2libGUgZmFpbHVyZSBjYXVzZXMKCQkJCQkJCWlmICggIUBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh6aXApIEZBSUxFRDogVGVzdCB6aXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJCgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWlmICggMCA9PT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQkJCQkJCgkJCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGVjX2V4aXRfY29kZTsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgKHppcCkgRkFJTEVEOiBwcm9jIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBSZW1vdmUgdGhlIHRlc3QgemlwIGZpbGUgaWYgaXQgd2FzIGNyZWF0ZWQKCQkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkJCgkJCQkJCQlpZiAoICFAdW5saW5rKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUHJvYyB0ZXN0ICh6aXApIHVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICkgKTsKCQkJCQkJCgkJCQkJCQl9CgkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0IEZBSUxFRDogVW5hYmxlIHRvIGNyZWF0ZSB0ZXN0IHppcCBmaWxlIHByb2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCWlmICggZmFsc2UgPT0gJGZvdW5kX3ppcCApIHsKCQkJCQoJCQkJCS8vIE5ldmVyIGZvdW5kIHppcCBvbiBhbnkgY2FuZGlkYXRlIHBhdGgKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgRmFpbGVkOiBVbmFibGUgdG8gZmluZCB6aXAgZXhlY3V0YWJsZSBvbiBhbnkgc3BlY2lmaWVkIHBhdGguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQkJCQoJCQkJfQoJCQkJCSAgCgkJCQkvLyBSZW1lbWJlciB6aXAgcmVzdWx0IGFuZCByZXNldCBmb3IgdW56aXAgdGVzdAoJCQkJJHBlbmRpbmdfcmVzdWx0ID0gJHJlc3VsdDsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgemlwIHZlcnNpb24gYW5kIHBvc3NpYmx5IGF2YWlsYWJsZSBvcHRpb25zLiBUaGlzIGNhbiBoZWxwIHVzCgkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIGNyZWF0aW5nIGEgemlwIGZpbGUKCQkJCWlmICggdHJ1ZSA9PT0gJGZvdW5kX3ppcCApIHsKCQkJCQoJCQkJCSR0aGlzLT5zZXRfemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBSZXNldCB0aGUgY2FuZGlkYXRlIHBhdGhzIGZvciBhIGZ1bGwgc2VhcmNoIGZvciB1bnppcAoJCQkJJGNhbmRpZGF0ZV9wYXRocyA9ICR0aGlzLT5fZXhlY3V0YWJsZV9wYXRoczsKCQkJCQkJICAKCQkJCS8vIFJlc2V0IHRoZSBzYWZldHkgdmFsdWUgaW4gY2FzZQoJCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkJCgkJCQkvLyBOZXcgc2VhcmNoCgkJCQkkZm91bmRfemlwID0gZmFsc2U7CgkJCQkKCQkJCS8vIE5lZWQgdG8gY3JlYXRlIGEgdGVzdCB6aXAgZmlsZSAtIGhlcmUncyBvbmUgSSBwcmVwYXJlZCBlYXJsaWVyCgkJCQkvLyBjb250YWluaW5nIHRoZSBvbmUgZmlsZSB0ZXN0LnR4dCAod2l0aCBjb250ZW50ICJIZWxsbyBXb3JsZCIpCgkJCQkvLyBDYW4gdXNlIHRoaXMgZm9yIGFsbCBjYXNlIHRlc3RzIGFuZCBkZWxldGUgYXQgZW5kCgkJCQkkdGVzdF9maWxlID0gJHRlbXBkaXIgLiAndGVtcF90ZXN0XycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCUBmaWxlX3B1dF9jb250ZW50cyggJHRlc3RfZmlsZSwgYmFzZTY0X2RlY29kZSggIlVFc0RCQW9BQUFBQUFDOEVMVUhqNVpXd0RBQUFBQXdBQUFBSUFCd0FkR1Z6ZEM1MGVIUlZWQWtBQThvYlVWRGpHMUZRZFhnTEFBRUUrQUVBQUFRVUFBQUFTR1ZzYkc4Z1YyOXliR1FLVUVzQkFoNERDZ0FBQUFBQUx3UXRRZVBsbGJBTUFBQUFEQUFBQUFnQUdBQUFBQUFBQVFBQUFLU0JBQUFBQUhSbGMzUXVkSGgwVlZRRkFBUEtHMUZRZFhnTEFBRUUrQUVBQUFRVUFBQUFVRXNGQmdBQUFBQUJBQUVBVGdBQUFFNEFBQUFBQUE9PSIgKSApOwoKCQkJCS8vIFdlIGFyZSBzZWFyY2hpbmcgZm9yIHppcCB1c2luZyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBwYXRocwoJCQkJd2hpbGUgKCAoIGZhbHNlID09ICRmb3VuZF96aXAgKSAmJiAoICFlbXB0eSggJGNhbmRpZGF0ZV9wYXRocyApICkgKSB7CgkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgY2xlYW4gb2YgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCgkJCQkJJHBhdGggPSB0cmltKCBhcnJheV9zaGlmdCggJGNhbmRpZGF0ZV9wYXRocyApICk7CgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdUcnlpbmcgZXhlY3V0YWJsZSBwYXRoIGZvciB1bnppcDonLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRwYXRoIC4gJ2AuJyApOwoJCQkJCQoJCQkJCSRjb21tYW5kID0gJ2V4ZWMgJyAuICR0aGlzLT5zbGFzaGlmeSggJHBhdGggKSAuICd1bnppcCAtcXQgJyAuICcgIicgLiAkdGVzdF9maWxlIC4gJyIgInRlc3QudHh0Iic7CgkKCQkJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKCQkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAiL2Rldi9udWxsIiwgImEiICksCgkJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJCSk7CgkJCQkJCgkJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQkKCQkJCQkkcHJvY2VzcyA9IEBwcm9jX29wZW4oICRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyApOwoJCQkJCQoJCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkJCgkJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCQoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkJJGNvdW50ID0gMDsKCQkJCQkJCgkJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQkJdXNsZWVwKCA1MDAwMDAgKTsKCQkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCQlAcHJvY190ZXJtaW5hdGUoICRwcm9jZXNzICk7CgkJCQkJCQkKCQkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIFByb2Nlc3MgZmluaXNoZWQgbm9ybWFsbHkgc28gZ2V0IGV4aXQgY29kZSBmb3IgcG9zc2libGUgdXNlCgkJCQkJCQkkZXhlY19leGl0X2NvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkJLy8gd2UgcHJvY2VzcyB3YXMgc3RpbGwgcnVubmluZyBhbmQgd2UgZmFpbGVkIHRvIHRlcm1pbmF0ZSBpdCAtIHRyaWNreSBvbmUKCQkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCQoJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PSAwICkgewoJCQkJCQkKCQkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkJCgkJCQkJCQkvLyBUaGUgdW56aXAgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIHNvIHdlIGNhbiBhdCBsZWFzdCB1bnppcAoJCQkJCQkJLy8gTm90ZTogd2UgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMgZm9yIGNoZWNraW5nIHlldAkKCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfdW56aXBwZXInIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1Byb2MgdGVzdCAodW56aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCQoJCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkJJGZvdW5kX3ppcCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJGV4ZWNfZXhpdF9jb2RlOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBUZXN0IHVuemlwIGZpbGUgdGVzdCBmYWlsZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyBFeGl0IENvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXJyb3Jfc3RyaW5nICk7CgkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1Byb2MgdGVzdCBGQUlMRUQ6IFVuYWJsZSB0byBjcmVhdGUgdGVzdCB1bnppcCBmaWxlIHByb2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIFJlbW92ZSB0aGUgdGVzdCB6aXAgZmlsZSBpZiBpdCB3YXMgY3JlYXRlZAoJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQoJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1Byb2MgdGVzdCAodW56aXApIHVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICkgKTsKCQkJCQoJCQkJCX0KCQkJCgkJCQl9CgkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgdW56aXAgYW55d2hlcmUgKG9yIG1heWJlIGZvdW5kIGl0IGJ1dCBpdCBmYWlsZWQpIHRoZW4gbG9nIGl0CgkJCQlpZiAoIGZhbHNlID09ICRmb3VuZF96aXAgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgRmFpbGVkOiBVbmFibGUgdG8gZmluZCB1bnppcCBleGVjdXRhYmxlIG9uIGFueSBzcGVjaWZpZWQgcGF0aC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgdW56aXAgdmVyc2lvbiBhbmQgcG9zc2libHkgYXZhaWxhYmxlIG9wdGlvbnMuIFRoaXMgY2FuIGhlbHAgdXMKCQkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIHVuemlwcGluZyBhIGZpbGUKCQkJCQkKCQkJCQkkdGhpcy0+c2V0X3VuemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0IEZBSUxFRDogT25lIG9yIG1vcmUgcmVxdWlyZWQgZnVuY3Rpb24gZG8gbm90IGV4aXN0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkgIAoJCQl9CgkJICAJCgkJICAJLy8gSWYgd2UgZm91bmQgYm90aCB6aXAgYW5kIHVuemlwIHRoZW4gY29tcGFyZSB0aGUgcGF0aHMgYW5kIGlmIHRoZSBzYW1lIHRoZW4gc2V0IHRoZSBjb21tb24gcGF0aAoJCSAgCWlmICggJHBlbmRpbmdfcmVzdWx0ICYmICRyZXN1bHQgKSB7CgkJICAJCgkJICAJCWlmICggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9PT0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgewoJCSAgCQkKCQkgIAkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gPSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICdwYXRoJyBdOwoJCSAgCQkJCgkJICAJCX0KCQkgIAkJCgkJICAJfQoJCSAgCQoJCSAgCS8vIE91ciByZXN1bHQgd2lsbCBiZSB0cnVlIGlmIHdlIGZvdW5kIGVpdGhlciBvciBib3RoIG9mIHppcCBhbmQgdW56aXAKCQkgIAkvLyBUaGUgbWV0aG9kIGF0dHJpYnV0ZXMgd2lsbCB0ZWxsIHdoaWNoIGlzIGF2YWlsYWJsZQoJCSAgCSRyZXN1bHQgPSAoICRwZW5kaW5nX3Jlc3VsdCB8fCAkcmVzdWx0ICk7CgkJICAJCgkJICAJcmV0dXJuICRyZXN1bHQ7CgkJICAJCgkJfQoJCQoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJQWx3YXlzIGNsZWFucyB1cCBhZnRlciBpdHNlbGYKCQkgKgkKCQkgKglUaGUgJGV4Y2x1ZGVzIHdpbGwgYmUgYSBsaXN0IG9yIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgaWYgdGhlICRsaXN0bWFrZXIgb2JqZWN0IGlzIE5VTEwgb3RlaHJ3aXNlCgkJICoJd2lsbCBiZSBhYnNvbHV0ZSBwYXRoIGV4Y2x1ZGVzIGFuZCByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGNhbiBiZSBoYWQgZnJvbSB0aGUgJGxpc3RtYWtlciBvYmplY3QKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBjcmVhdGUKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyCQkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSB0byBhZGQgdG8gWklQIEFyY2hpdmUgZmlsZQoJCSAqCUBwYXJhbWUJCWFycmF5CSRleGNsdWRlcwkJTGlzdCBvZiBlaXRoZXIgYWJzb2x1dGUgcGF0aCBleGNsdXNpb25zIG9yIHJlbGF0aXZlIGV4Y2x1c2lvbnMKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcgkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciA9IE5VTEwgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV9saW51eCggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV93aW5kb3dzKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkJCgkJLyoqCgkJICoJY3JlYXRlX3dpbmRvd3MoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZSBvbiBMaW51eAoJCSAqCUFsd2F5cyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmCgkJICoKCQkgKglUaGUgJGV4Y2x1ZGVzIHdpbGwgYmUgYSBsaXN0IG9yIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgaWYgdGhlICRsaXN0bWFrZXIgb2JqZWN0IGlzIE5VTEwgb3RlaHJ3aXNlCgkJICoJd2lsbCBiZSBhYnNvbHV0ZSBwYXRoIGV4Y2x1ZGVzIGFuZCByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGNhbiBiZSBoYWQgZnJvbSB0aGUgJGxpc3RtYWtlciBvYmplY3QKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBjcmVhdGUKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyCQkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSB0byBhZGQgdG8gWklQIEFyY2hpdmUgZmlsZQoJCSAqCUBwYXJhbWUJCWFycmF5CSRleGNsdWRlcwkJTGlzdCBvZiBlaXRoZXIgYWJzb2x1dGUgcGF0aCBleGNsdXNpb25zIG9yIHJlbGF0aXZlIGV4Y2x1c2lvbnMKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcgkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZV93aW5kb3dzKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnV0IGp1c3QgaW4gY2FzZSByZXR1cm4gZmFsc2Ugc2lsZW50bHkKCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGFyY2hpdmluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCgkJfQkJCQoJCQoJCS8qKgoJCSAqCWNyZWF0ZV9saW51eCgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlIG9uIExpbnV4CgkJICoJQWx3YXlzIGNsZWFucyB1cCBhZnRlciBpdHNlbGYKCQkgKgoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlX2xpbnV4KCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkkZXhpdGNvZGUgPSAwOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJJHRlbXBfemlwID0gJyc7CgkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCSRleGNsdXNpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9IGZhbHNlOwoJCQkkemlwX2Vycm9yc19jb3VudCA9IDA7CgkJCSR6aXBfZXJyb3JzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gZmFsc2U7CgkJCSR6aXBfd2FybmluZ3NfY291bnQgPSAwOwoJCQkkemlwX3dhcm5pbmdzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2FkZGl0aW9ucyA9IGZhbHNlOwoJCQkkemlwX2FkZGl0aW9uc19jb3VudCA9IDA7CgkJCSR6aXBfYWRkaXRpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2RlYnVnID0gZmFsc2U7CgkJCSR6aXBfZGVidWdfY291bnQgPSAwOwoJCQkkemlwX2RlYnVnID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX290aGVyID0gZmFsc2U7CgkJCSR6aXBfb3RoZXJfY291bnQgPSAwOwoJCQkkemlwX290aGVyID0gYXJyYXkoKTsKCQkJJHppcF91c2luZ19sb2dfZmlsZSA9IGZhbHNlOwoJCQkkbG9nZmlsZV9uYW1lID0gJyc7CgkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSBmYWxzZTsKCQkKCQkJLy8gVGhlIGJhc2VkaXIgbXVzdCBoYXZlIGEgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRkaXIgKSwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkKCQkJaWYgKCBlbXB0eSggJHRlbXBkaXIgKSB8fCAhQGZpbGVfZXhpc3RzKCAkdGVtcGRpciApICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBtdXN0IGJlIGF2YWlsYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCQkKCQkJLy8gVGVsbCB3aGljaCB6aXAgdmVyc2lvbiBpcyBiZWluZyB1c2VkCgkJCSR2ZXJzaW9uID0gJHRoaXMtPmdldF96aXBfdmVyc2lvbigpOwoJCQkKCQkJaWYgKCB0cnVlID09PSBpc19hcnJheSggJHZlcnNpb24gKSApIHsKCQkJCgkJCQkoICggMiA9PSAkdmVyc2lvblsgJ21ham9yJyBdICkgJiYgKCAwID09ICR2ZXJzaW9uWyAnbWlub3InIF0gKSApID8gJHZlcnNpb25bICdtaW5vcicgXSA9ICdYJyA6IHRydWUgOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1VzaW5nIHppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdmVyc2lvbiA9IGFycmF5KCAibWFqb3IiID0+ICJYIiwgIm1pbm9yIiA9PiAiWSIgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoKCQkJfQoJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB6aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1pJUF9QQVRIICk7CgkJCQoJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJaWYgKCAhZW1wdHkoICR6aXBwYXRoICkgKSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQoJCQl9CgoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3ppcCc7CQoKCQkJLy8gSGFyZGNvZGluZyBzb21lIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3Igbm93CgkJCS8vJGNvbW1hbmQgLj0gJyAtcSAtcic7CgkJCS8vIE5vdGU6IG5vIGxvbmdlciB1c2luZyBxdWlldCBfYnV0XyBtYXkgdXNlIGl0IGlmIG91dHB1dCBpcyBiZWluZyBzZW50IHRvIGxvZyBmaWxlCgkJCSRjb21tYW5kIC49ICcgLXInOwoJCQkKCQkJLy8gQ2hlY2sgaWYgdGhlIHZlcnNpb24gb2YgemlwIGluIHVzZSBzdXBwb3J0cyBsb2cgZmlsZSAod2hpY2ggd2lsbCBoZWxwIHdpdGggbWVtb3J5IHVzYWdlIGZvciBsYXJnZSBzaXRlcykKCQkJaWYgKCAkdGhpcy0+Z2V0X3ppcF9zdXBwb3J0c19sb2dfZmlsZSgpICkgewoJCQkKCQkJCS8vIENob29zZSB0byB1c2UgbG9nIGZpbGUgc28gcXVpZXRlbiBzdGRvdXQgLSB3ZSdsbCBzZXQgdXAgdGhlIGxvZyBmaWxlIGxhdGVyCgkJCQkkY29tbWFuZCAuPSAnIC1xJzsKCQkJCSR6aXBfdXNpbmdfbG9nX2ZpbGUgPSB0cnVlOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB0dXJuIG9mZiBjb21wcmVzc2lvbiBieSBzZXR0aW5ncyAoZmFzdGVyIGJ1dCBsYXJnZXIgYmFja3VwKQoJCQlpZiAoIHRydWUgIT09ICR0aGlzLT5nZXRfY29tcHJlc3Npb24oKSApIHsKCQkJCgkJCQkkY29tbWFuZCAuPSAnIC0wJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGRpc2FibGVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGVuYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgaWdub3JpbmcgKG5vdCBmb2xsb3dpbmcpIHN5bWxpbmtzCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfc3ltbGlua3MoKSApIHsKCQkJCgkJCQkvLyBXYW50IHRvIG5vdCBmb2xsb3cgc3ltbGlua3Mgc28gc2V0IGNvbW1hbmQgb3B0aW9uIGFuZCBzZXQgZmxhZyBmb3IgbGF0ZXIgdXNlCgkJCQlpZiAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICE9IHNlbGY6Ok9TX1RZUEVfV0lOICkgewoJCQkJCSRjb21tYW5kIC49ICcgLXknOwoJCQkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSB0cnVlOwoJCQkJfQoJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyB3aWxsIG5vdCBiZSBmb2xsb3dlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHdpbGwgYmUgZm9sbG93ZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGlnbm9yaW5nIHdhcm5pbmdzIC0gbWVhbmluZyBjYW4gc3RpbGwgZ2V0IGEgYmFja3VwIGV2ZW4KCQkJLy8gaWYsIGUuZy4sIHNvbWUgZmlsZXMgY2Fubm90IGJlIHJlYWQKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkKCQkJCS8vIE5vdGU6IHdhcm5pbmdzIGFyZSBiZWluZyBpZ25vcmVkIGJ1dCB3aWxsIHN0aWxsIGJlIGdhdGhlcmVkIGFuZCBsb2dnZWQKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHdhcm5pbmdzIHdpbGwgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiB3YXJuaW5ncyB3aWxsIG5vdCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCX0KCQkJCQoJCQkvLyBEZWxldGUgYW55IGV4aXN0aW5nIHppcCBmaWxlIG9mIHNhbWUgbmFtZSAtIHJlYWxseSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KCQkJaWYgKCBAZmlsZV9leGlzdHMoICR6aXAgKSApIHsKCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGlzdGluZyBaSVAgQXJjaGl2ZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJQHVubGluayggJHppcCApOwoKCQkJfQoJCQkJCQkKCQkJLy8gTm93IHdlJ2xsIHNldCB1cCB0aGUgbG9nZ2luZyB0byBmaWxlIGlmIHJlcXVpcmVkIC0gdXNlIGZ1bGwgbG9nZ2luZwoJCQkvLyBOb3RlOiB3ZSBhbHdheXMgdXNlIHRoaXMgZmlsZSBlaXRoZXIgZm9yIGNvbW1hbmQgbGluZSBsb2cgb3B0aW9uIG9yIGNhcHR1cmVkIG91dHB1dAoJCQkvLyBzbyBhbHdheXMgc2V0IGl0CgkJCSRsb2dmaWxlX25hbWUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9MT0dfRklMRV9OQU1FOwoJCQlpZiAoIHRydWUgPT09ICR6aXBfdXNpbmdfbG9nX2ZpbGUgKSB7CgkJCQoJCQkJLy8gVXNpbmcgdGhlIGNvbW1hbmQgbGluZSBsb2dmaWxlIG9wdGlvbgoJCQkJJGNvbW1hbmQgLj0gIiAtbGYgJ3skbG9nZmlsZV9uYW1lfScgLWxpIjsKCQkJCQoJCQkJLy8gQWN0dWFsIGNvbW1hbmQgb3V0cHV0IHdpbGwgYmUgc2VudCB0byB0aGUgYml0LWJ1Y2tldCBpbiB0aGUgc2t5CgkJCQkvLyBUT0RPOiBpZiB3ZSB3YW50IHRvIGNhcHR1cmUgZGVidWcgb3V0cHV0IHdlJ2xsIG5lZWQgYSByZWFsIGZpbGUKCQkJCS8vIGlzIGl0IHNhZmUgdG8gdXNlIHRoZSBzYW1lIGZpbGVuYW1lIChwcm9iYWJseSBub3QpCgkJCQkkb3V0cHV0ID0gJy9kZXYvbnVsbCc7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE9sZCBzdHlsZWUgemlwIG5vdCBzdXBwb3J0aW5nIGxvZ2ZpbGUgc28gcmVkaXJlY3Qgb3V0cHV0IHRvIHRoZSBmaWxlIGluc3RlYWQKCQkJCSRvdXRwdXQgPSAkbG9nZmlsZV9uYW1lOwoJCQkKCQkJfQoJCQkJCQkKCQkJLy8gU2V0IHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gc3RvcmUgWklQIHdoaWxlIGl0J3MgYmVpbmcgZ2VuZXJhdGVkLgkJCQoJCQkkY29tbWFuZCAuPSAiIC1iICd7JHRlbXBkaXJ9JyI7CgoJCQkvLyBJZiB3YXJuaW5ncyBhcmUgYmVpbmcgaWdub3JlZCB3ZSBjYW4gdGVsbCB6aXAgdG8gY3JlYXRlIHRoZSB6aXAgYXJjaGl2ZSBpbiB0aGUgZmluYWwKCQkJLy8gbG9jYXRpb24gLSBvdGhlcndpc2Ugd2UgbXVzdCBwdXQgaXQgaW4gYSB0ZW1wb3JhcnkgbG9jYXRpb24gYW5kIG1vdmUgaXQgbGF0ZXIgb25seQoJCQkvLyBpZiB0aGVyZSBhcmUgbm8gd2FybmluZ3MuIFRoaXMgY29wZXMgd2l0aCB0aGUgY2FzZSB3aGVyZSAodGhpcykgY29udHJvbGxpbmcgc2NyaXB0CgkJCS8vIGdldHMgdGltZWQgb3V0IGJ5IHRoZSBzZXJ2ZXIgYW5kIGlmIHRoZSBmaWxlIHdlcmUgY3JlYXRlZCBpbiB0aGUgZmluYWwgbG9jYXRpb24gd2l0aAoJCQkvLyB3YXJuaW5ncyB0aGF0IHNob3VsZCBub3QgYmUgaWdub3JlZCB3ZSBjYW5ub3QgcHJldmVudCBpdCBiZWluZyBjcmVhdGVkLiBUaGUgLU1NIG9wdGlvbgoJCQkvLyBjb3VsZCBiZSB1c2VkIGJ1dCB0aGlzIHByZXZlbnRzIHVzIGNhdGNoaW5nIHN1Y2ggd2FybmluZ3MgYW5kIGJlaW5nIGFibGUgdG8gcmVwb3J0CgkJCS8vIHRoZW0gdG8gdGhlIHVzZXIgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHNjcmlwdCBoYXNuJ3QgYmVlbiB0ZXJtaW5hdGVkLiBBZGRpdGlvbmFsbHkgdGhlCgkJCS8vIC1NTSBvcHRpb24gd291bGQgYmFpbCBvdXQgb24gdGhlIGZpcnN0IGVuY291bnRlcmVkIHByb2JsZW0gYW5kIHNvIGlmIHRoZXJlIHdlcmUgYSBmZXcKCQkJLy8gcHJvYmxlbXMgdGhleSB3b3VsZCBlYWNoIG5vdCBiZSBmb3VuZCB1bnRpbCB0aGUgY3VycmVudCBvbmUgaXMgZml4ZWQgYW5kIHRyeSBhZ2Fpbi4KCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkKCQkJCSR0ZW1wX3ppcCA9ICR6aXA7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR0ZW1wX3ppcCA9ICR0ZW1wZGlyIC4gYmFzZW5hbWUoICR6aXAgKTsKCQkJCQoJCQl9CQkKCgkJCSRjb21tYW5kIC49ICIgJ3skdGVtcF96aXB9JyAuIjsKCQkJCgkJCS8vIE5vdyB3b3JrIG91dCBleGNsdXNpb25zIGRlcGVuZGVudCBvbiB3aGF0IHdlIGhhdmUgYmVlbiBnaXZlbgoJCQlpZiAoIGlzX29iamVjdCggJGxpc3RtYWtlciApICYmICggZGVmaW5lZCggJ1VTRV9FWFBFUklNRU5UQUxfWklQQlVERFlfSU5DTFVTSU9OJyApICYmICggdHJ1ZSA9PT0gVVNFX0VYUEVSSU1FTlRBTF9aSVBCVUREWV9JTkNMVVNJT04gKSApICkgewoJCQkKCQkJCS8vIFdlJ3JlIGRvaW5nIGFuIGluY2x1c2lvbiBvcGVyYXRpb24sIGJ1dCBmaXJzdCB3ZSdsbCBqdXN0IHNob3cgdGhlIGV4Y2x1c2lvc24KCQkJCQoJCQkJLy8gRm9yIHppcCB3ZSBuZWVkIHJlbGF0aXZlIHJhdGhlciB0aGFuIGFic29sdXRlIGV4Y2x1c2lvbiBzcGF0aHMKCQkJCSRleGNsdXNpb25zID0gJGxpc3RtYWtlci0+Z2V0X3JlbGF0aXZlX2V4Y2x1ZGVzKCAkYmFzZWRpciApOwoJCQkJCgkJCQlpZiAoIGNvdW50KCAkZXhjbHVzaW9ucyApID4gMCApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0NhbGN1bGF0aW5nIGRpcmVjdG9yaWVzIHRvIGV4Y2x1ZGUgZnJvbSBiYWNrdXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkJCSRleGNsdWRlX2NvdW50ID0gMDsKCQkJCQlmb3JlYWNoICggJGV4Y2x1c2lvbnMgYXMgJGV4Y2x1ZGUgKSB7CgkJCQkJCgkJCQkJCWlmICggIXN0cnN0ciggJGV4Y2x1ZGUsICdiYWNrdXBidWRkeV9iYWNrdXBzJyApICkgeyAvLyBTZXQgdmFyaWFibGUgdG8gc2hvdyB3ZSBhcmUgZXhjbHVkaW5nIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYmVzaWRlcyBiYWNrdXAgZGlyLgoJCgkJCQkJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSB0cnVlOwoJCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhjbHVkaW5nJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkZXhjbHVkZSApOwoJCQkJCQkJCQkJCQkJCgkJCQkJCSRleGNsdWRlX2NvdW50Kys7CgkJCQkJCQkKCQkJCQl9CgkJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gR2V0IHRoZSBsaXN0IG9mIGluY2x1c2lvbnMgdG8gcHJvY2VzcwoJCQkJJGluY2x1c2lvbnMgPSAkbGlzdG1ha2VyLT5nZXRfdGVybWluYWxzKCk7CgkJCQkKCQkJCS8vIEZvciBlYWNoIGRpcmVjdG9yeSB3ZSBuZWVkIHRvIHB1dCB0aGUgIndpbGRjYXJkIiBvbiB0aGUgZW5kCgkJCQlmb3JlYWNoICggJGluY2x1c2lvbnMgYXMgJiRpbmNsdXNpb24gKSB7CgkJCQkKCQkJCQlpZiAoIGlzX2RpciggJGluY2x1c2lvbiApICkgewoJCQkJCQoJCQkJCQkkaW5jbHVzaW9uIC49IERJUkVDVE9SWV9TRVBBUkFUT1IgLiAiKiI7CgkJCQkJfQoJCQkJCgkJCQkJLy8gUmVtb3ZlIGRpcmVjdG9yeSBwYXRoIHByZWZpeCBleGNsdWRpbmcgbGVhZGluZyBzbGFzaCB0byBtYWtlIHJlbGF0aXZlIChuZWVkZWQgZm9yIHppcCkKCQkJCQkkaW5jbHVzaW9uID0gc3RyX3JlcGxhY2UoIHJ0cmltKCAkYmFzZWRpciwgRElSRUNUT1JZX1NFUEFSQVRPUiApLCAnJywgJGluY2x1c2lvbiApOwoJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5jbHVzaW9ucyBmaWxlIGluIHRoZSB0ZW1wZGlyCgkJCQkKCQkJCS8vIEFuZCB1cGRhdGUgdGhlIGNvbW1hbmQgb3B0aW9ucwoJCQkJJGlmaWxlID0gJHRlbXBkaXIgLiBzZWxmOjpaSVBfSU5DTFVTSU9OU19GSUxFX05BTUU7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkaWZpbGUgKSApIHsKCQkJCQoJCQkJCUB1bmxpbmsoICRpZmlsZSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkaWZpbGUsIGltcGxvZGUoIFBIUF9FT0wsICRpbmNsdXNpb25zICkgLiBQSFBfRU9MIC4gUEhQX0VPTCApOwoJCQkJCgkJCQkkY29tbWFuZCAuPSAiIC1pQCIgLiAiJ3skaWZpbGV9JyI7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFdlJ3JlIGRvaW5nIGFuIGV4Y2x1c2lvbiBvcGVyYXRpb24KCQkJCgkJCQkvLyRjb21tYW5kIC49ICItaSAnKicgIjsgLy8gTm90IG5lZWRlZC4gWmlwIGRlZmF1bHRzIHRvIGRvaW5nIHRoaXMuIFJlbW92ZWQgSnVseSAxMCwgMjAxMiBmb3IgdjMuMC40MS4KCQkJCQoJCQkJLy8gU2luY2Ugd2UgaGFkIG5vICRsaXN0bWFrZXIgb2JqZWN0IG9yIG5vdCB1c2luZyBpdCBnZXQgdGhlIHN0YW5kYXJkIHJlbGF0aXZlIGV4Y2x1ZGVzIHRvIHByb2Nlc3MKCQkJCSRleGNsdXNpb25zID0gJGV4Y2x1ZGVzOwoJCQkJCgkJCQlpZiAoIGNvdW50KCAkZXhjbHVzaW9ucyApID4gMCApIHsKCQkJCQoJCQkJCS8vIEhhbmRsZSBleGNsdXNpb25zIGJ5IHBsYWNpbmcgdGhlbSBpbiBhbiBleGNsdXNpb24gdGV4dCBmaWxlLgoJCQkJCSRleGNsdXNpb25fZmlsZSA9ICR0ZW1wZGlyIC4gc2VsZjo6WklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FOwoJCQkJCSR0aGlzLT5fcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGV4Y2x1c2lvbl9maWxlLCAkZXhjbHVzaW9ucywgJGRpciApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyBleGNsdXNpb24gZmlsZSBgJTEkc2AnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGV4Y2x1c2lvbl9maWxlICkgKTsKCQkJCQkkY29tbWFuZCAuPSAnIC14QCcgLiAiJ3skZXhjbHVzaW9uX2ZpbGV9JyI7CgkJCQkJCQkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCS8vIFJlbWVtYmVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgYmVpbmcgYWRkZWQgc28gdGhhdCAiLiIgaXMgdmFsaWQgaW4gY29tbWFuZAoJCQkkd29ya2luZ19kaXIgPSBnZXRjd2QoKTsKCQkJY2hkaXIoICRkaXIgKTsKCQkJCgkJCS8vIEV4ZWN1dGUgWklQIGNvbW1hbmQgLSB3ZSBkb24ndCBjYXJlIGEgYWJvdXQgV2luZG93cyBoZXJlIGJlY2F1c2UgdGhpcyBtZXRob2QgaXNuJ3Qgc3VwcG9ydGVkIHlldAoJCQkvLyBQcmVwZW5kICJleGVjIiBzbyB0aGF0IHNwYXduZWQgcHJvY2VzcyBiZWNvbWVzIHRoZSBhY3R1YWwgemlwIHByb2Nlc3MKCQkJJGNvbW1hbmQgPSAnZXhlYyAnIC4gJGNvbW1hbmQ7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIGNvbW1hbmQgKExpbnV4KScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbW1hbmQgKTsKCQkJCgkJCS8vIFNldCBzdGRpbiB0byBiZSBhIHBpcGUgdGhhdCB3ZSdsbCBjbG9zZSBpbW1lZGlhdGVseSBhbnl3YXkKCQkJLy8gU2VuZCBzdGRvdXQgdG8gYSBmaWxlIG9yIGR1bXAgaXQgZGVwZW5kZW50IG9uIHRoZSB6aXAgdmVyc2lvbiAodGhlIGRlc3RpbmF0aW9uIGlzIHNldCBhYm92ZSkKCQkJLy8gU2VuZCBzdGRlcnIgdG8gd2hlcmV2ZXIgc3Rkb3V0IGlzIGdvaW5nIChvbiBwcmUtdjMgemlwIHdlIG5lZWQgc3RkZXJyIGZvciB3YXJuaW5ncykKCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCgkJCQkwID0+IGFycmF5KCAicGlwZSIsICJyIiApLAoJCQkJMSA9PiBhcnJheSggImZpbGUiLCAkb3V0cHV0LCAidyIgKSwKCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgJG91dHB1dCwgInciICkKCQkJKTsKCQkJCgkJCSRwcm9jZXNzID0gcHJvY19vcGVuKCAkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMgKTsKCQkJCgkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQoJCQkJZmNsb3NlKCAkcGlwZXNbIDAgXSApOyAvLyBOZXZlciB3YW50IHRvIHNlbmQgaW5wdXQgc28ganVzdCBjbG9zZSBpdAoJCQkJCgkJCQkkc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCgkJCQl3aGlsZSAoIHRydWUgPT0gJHN0YXR1c1sgJ3J1bm5pbmcnXSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNyZWF0aW9uIGluIHByb2dyZXNzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQlzbGVlcCg1KTsKCQkJCQkkc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQoJCQkJCS8vIENvdWxkIGFsc28gY2hlY2sgZm9yIHBlcnNpc3RlbnQgZmluYWwgemlwIGZpbGUgKGkuZS4sIHByZXNlbnQgb3ZlciB0d28gbG9vcHMpCgkJCQkJLy8gd2hpY2ggbWlnaHQgbWVhbiB3ZSBhcmUgc29tZWhvdyBub3Qgc2VlaW5nIHRoZSBwcm9jZXNzIGFzIGZpbmlzaGVkIHNvIHdlIHNob3VsZAoJCQkJCS8vIHRlcm1pbmF0ZSBpdCBhbmQgY2xvc2UgaXQgLSBhbmQgaW5kaWNhdGUgc29tZSBmYWlsdXJlCgkJCQl9CgkJCQkKCQkJCSRleGl0Y29kZSA9ICRzdGF0dXNbICdleGl0Y29kZScgXTsKCQkJCQoJCQkJcHJvY19jbG9zZSggJHByb2Nlc3MgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE11c3QgY2xlYW4gdXAgdGVtcG9yYXJ5IGRpcmVjdG9yeQoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBjcmVhdGUgWmlwIHByb2Nlc3M6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1JlbW92aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcGRpciApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCWNoZGlyKCAkd29ya2luZ19kaXIgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBTZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBiYWNrIHRvIHdoZXJlIHdlIHdlcmUKCQkJY2hkaXIoICR3b3JraW5nX2RpciApOwoJCQkKCQkJLy8gQ29udmVuaWVuY2UgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBzY2FuYXJpb3MKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJLy8gTG9nIGZpbGUgaXMgYWx3YXlzIHByZXNlbnQgLSBlaXRoZXIgY2FwdHVyaW5nIG91dHB1dCBvciBhcyBjb21tYW5kIGxpbmUgb3B0aW9uCgkJCS8vIEFsd2F5cyBzY2FuIHRoZSBsb2dmaWxlIGZvciB3YXJuaW5ncywgZXRjLiBhbmQgc2hvdyB3YXJuaW5ncyBldmVuIGlmIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUgdGhlbQoJCQl0cnkgewoJCQkKCQkJCSRsb2dmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRsb2dmaWxlX25hbWUsICJyYiIgKTsKCQkJCQoJCQkJd2hpbGUoICEkbG9nZmlsZS0+ZW9mKCkgKSB7CgkJCQkKCQkJCQkkbGluZSA9ICRsb2dmaWxlLT5jdXJyZW50KCk7CgkJCQkJJGlkID0gJGxvZ2ZpbGUtPmtleSgpOyAvLyBVc2UgdGhlIGxpbmUgbnVtYmVyIGFzIHVuaXF1ZSBrZXkgZm9yIGxhdGVyIHNvcnRpbmcKCQkJCQkkbG9nZmlsZS0+bmV4dCgpOwoJCQkJCQoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCB3YXJuaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIExvb2tpbmcgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHdhcm5pbmcgLSBpbiBwYXJ0aWN1bGFyIHdhbnQgdGhlIHdhcm5pbmcgdGhhdAoJCQkJCQkvLyBpbmRpY2F0ZXMgYSBmaWxlIGNvdWxkbid0IGJlIHJlYWQgYXMgd2Ugd2FudCB0byB0cmVhdCB0aGF0IGFzIGEgInNraXBwZWQiCgkJCQkJCS8vIHdhcm5pbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB6aXAgZmxhZ2dlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHByb2JsZW0gYnV0CgkJCQkJCS8vIGNyZWF0ZWQgdGhlIHppcCBmaWxlIGFueXdheSAtIGJ1dCBpdCB3b3VsZCBoYXZlIGdlbmVyYXRlZCB0aGUgbm9uLXplcm8gZXhpdAoJCQkJCQkvLyBjb2RlIG9mIDE4IGFuZCB3ZSBrZXkgb2ZmIHRoYXQgbGF0ZXIuIEFsbCBvdGhlciB3YXJuaW5ncyBhcmUgbm90IGNvbnNpZGVyZWQKCQkJCQkJLy8gcmVhc29ucyB0byByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hpbHN0IHN0aWxsIGNyZWF0aW5nIGEgemlwIGZpbGUgc28KCQkJCQkJLy8gd2UnbGwgZm9sbG93IHRoZSBsZWFkIG9uIHRoYXQgYW5kIG5vdCBoYXZlIG90aGVyIHdhcm5pbmcgdHlwZXMgaGFsdCB0aGUgYmFja3VwLgoJCQkJCQkvLyBTbyB3ZSdsbCB0cnkgYW5kIGxvb2sgZm9yIGEgd2FybmluZyBvdXRwdXQgdGhhdCBsb29rcyBsaWtlIGl0IGlzIGZpbGUgcmVsYXRlZC4uLgoJCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopXHMqKFteOl0qOilccyooLiopL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkJCgkJCQkJCQkvLyBNYXRjaGVkIHRvIHdoYXQgbG9va3MgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNoZWNrIHBhcnRpY3VsYXIgY2FzZXMKCQkJCQkJCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRtYXRjaGVzWyAyIF0gKSApIHsKCQkJCQkJCQljYXNlICJjb3VsZCBub3Qgb3BlbiBmb3IgcmVhZGluZzoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAibmFtZSBub3QgbWF0Y2hlZDoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF9vdGhlclsgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX290aGVyX2NvdW50Kys7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQl9CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIERpZG4ndCBtYXRjaCB0byB3aGF0IHdvdWxkIGxvb2sgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNvdW50IGl0IHJlZ2FyZGxlc3MKCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIGVycm9yOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCSR6aXBfZXJyb3JzWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCSR6aXBfZXJyb3JzX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooYWRkaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBhZGRpdGlvbnMgZW50cmllZAoJCQkJCQkvLyR6aXBfYWRkaXRpb25zW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkvLyR6aXBfYWRkaXRpb25zX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooc2Q6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkKCQkJCQkJJHppcF9kZWJ1Z1sgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkkemlwX2RlYnVnX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ3VycmVudGx5IG5vdCBwcm9jZXNzaW5nIG90aGVyIGVudHJpZXMKCQkJCQkJLy8kemlwX290aGVyW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkvLyR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCXVuc2V0KCAkbG9nZmlsZSApOwoJCQkJCgkJCQlAdW5saW5rKCAkbG9nZmlsZV9uYW1lICk7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB3ZSBzaG91bGQgaGF2ZSBiZWVuIGFibGUgdG8gb3BlbiB0aGUgbG9nIGZpbGUuLi4KCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnTG9nIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCAtIGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gU2V0IGNvbnZlbmllbmNlIGZsYWdzCQkJCgkJCSRoYXZlX3ppcF93YXJuaW5ncyA9ICggMCA8ICR6aXBfd2FybmluZ3NfY291bnQgKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9ICggMCA8ICR6aXBfZXJyb3JzX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9hZGRpdGlvbnMgPSAoIDAgPCAkemlwX2FkZGl0aW9uc19jb3VudCApOwoJCQkkaGF2ZV96aXBfZGVidWcgPSAoIDAgPCAkemlwX2RlYnVnX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9vdGhlciA9ICggMCA8ICR6aXBfb3RoZXJfY291bnQgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIGV4aXQgY29kZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgbWlnaHQgaWdub3JlIGl0IG9yIG5vdAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIG51bWJlciBvZiB3YXJuaW5ncyAtIGV2ZW4ganVzdCB0byBjb25maXJtIHRoYXQgd2UgZGlkbid0IGhhdmUgYW55CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIHdhcm5pbmclMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF93YXJuaW5nc19jb3VudCwgKCAoIDEgPT0gJHppcF93YXJuaW5nc19jb3VudCApID8gJycgOiAncycgKSApICk7CgoJCQkvLyBBbHdheXMgcmVwb3J0IHdhcm5pbmdzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB1c2VyIGhhcyBzZWxlY3RlZCB0byBpZ25vcmUgdGhlbQoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF93YXJuaW5ncyApIHsKCQkJCgkJCQkkdGhpcy0+bG9nX3ppcF9yZXBvcnRzKCAkemlwX3dhcm5pbmdzLCBzZWxmOjokX3dhcm5pbmdfZGVzYywgIldBUk5JTkciLCBzZWxmOjpNQVhfV0FSTklOR19MSU5FU19UT19TSE9XLCBkaXJuYW1lKCBkaXJuYW1lKCAkdGVtcGRpciApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BiX2JhY2t1cGJ1ZGR5JyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfV0FSTklOR1NfRklMRV9OQU1FICk7CgoJCQl9CgkJCQoJCQkvLyBBbHdheXMgcmVwb3J0IG90aGVyIHJlcG9ydHMgcmVnYXJkbGVzcwoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF9vdGhlciApIHsKCQkJCgkJCQkvLyBPbmx5IHJlcG9ydCBudW1iZXIgb2YgaW5mb3JtYXRpb25hbHMgaWYgd2UgaGF2ZSBhbnkgYXMgdGhleSBhcmUgbm90IHRoYXQgaW1wb3J0YW50CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyBpbmZvcm1hdGlvbiUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX290aGVyX2NvdW50LCAoICggMSA9PSAkemlwX290aGVyX2NvdW50ICkgPyAnYWwnIDogJ2FscycgKSApICk7CgoJCQkJJHRoaXMtPmxvZ196aXBfcmVwb3J0cyggJHppcF9vdGhlciwgc2VsZjo6JF9vdGhlcl9kZXNjLCAiSU5GT1JNQVRJT04iLCBzZWxmOjpNQVhfT1RIRVJfTElORVNfVE9fU0hPVywgZGlybmFtZSggZGlybmFtZSggJHRlbXBkaXIgKSApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdwYl9iYWNrdXBidWRkeScgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gc2VsZjo6WklQX09USEVSU19GSUxFX05BTUUgKTsKCgkJCX0KCQkJCgkJCQkvLyBTZWUgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCBoYXBwZW5lZCAtIG5vdGUgdGhhdCAkZXhpdGNvZGUgY291bGQgYmUgbm9uLXplcm8gZm9yIGFjdGlvbmFibGUgd2FybmluZyhzKSBvciBlcnJvcgoJCQkJLy8gaWYgKCAobm8gemlwIGZpbGUpIG9yIChmYXRhbCBleGl0IGNvZGUpIG9yIChub3QgaWdub3Jpbmcgd2FybmFibGUgZXhpdCBjb2RlKSApCgkJCQlpZiAoICggISBAZmlsZV9leGlzdHMoICR0ZW1wX3ppcCApICkgfHwKCQkJCSAoICggMCAhPSAkZXhpdGNvZGUgKSAmJiAoIDE4ICE9ICRleGl0Y29kZSApICkgfHwKCQkJCSAoICggMTggPT0gJGV4aXRjb2RlICkgJiYgISR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSApIHsKCQkJCQoJCQkJLy8gSWYgd2UgaGF2ZSBhbnkgemlwIGVycm9ycyByZXBvcnRlZCBzaG93IHRoZW0gcmVnYXJkbGVzcwoJCQkJaWYgKCB0cnVlID09PSAkaGF2ZV96aXBfZXJyb3JzICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgZXJyb3JzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9lcnJvcnNfY291bnQgKSApOwoJCQkJCQoJCQkJCWZvcmVhY2ggKCAkemlwX2Vycm9ycyBhcyAkbGluZSApIHsKCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoKCQkJCS8vIFJlcG9ydCB3aGV0aGVyIG9yIG5vdCB0aGUgemlwIGZpbGUgd2FzIGNyZWF0ZWQgKHdoZXRoZXIgdGhhdCBiZSBpbiB0aGUgZmluYWwgb3IgdGVtcG9yYXJ5IGxvY2F0aW9uKQkJCQoJCQkJaWYgKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBub3QgY3JlYXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgY3JlYXRlZCBidXQgd2l0aCBlcnJvcnMvYWN0aW9uYWJsZS13YXJuaW5ncyBzbyB3aWxsIGJlIGRlbGV0ZWQgLSBjaGVjayBwcm9jZXNzIGV4aXQgY29kZSBhbmQgd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQkJLy8gVGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkIG9uZSB3YXkgb3IgYW5vdGhlci4gTm90ZSB0aGF0IGFzIHRoZSB1c2VyIGRpZG4ndCBjaG9vc2UgdG8gaWdub3JlIGVycm9ycyB0aGUgemlwIGZpbGUKCQkJCS8vIGlzIGFsd2F5cyBjcmVhdGVkIGluIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCB0aGVuIG9ubHkgbW92ZWQgdG8gZmluYWwgbG9jYXRpb24gb24gc3VjY2VzcyB3aXRob3V0IGVycm9yIG9yIHdhcm5pbmdzLgoJCQkJLy8gVGhlcmVmb3JlIGlmIHRoZXJlIGlzIGEgemlwIGZpbGUgKHByb2R1Y2VkIGJ1dCB3aXRoIHdhcm5pbmdzKSBpdCB3aWxsIG5vdCBiZSB2aXNpYmxlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUKCQkJCS8vIHRlbXBvcmFyeSBkaXJlY3RvcnkgaXMgZGVsZXRlZCBiZWxvdy4KCQkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gR290IGZpbGUgd2l0aCBubyBlcnJvciBvciB3YXJuaW5ncyBfb3JfIHdpdGggd2FybmluZ3MgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGlnbm9yZQoJCQkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApIHsKCQkJCQoJCQkJCS8vIEJlY2F1c2Ugbm90IGlnbm9yaW5nIHdhcm5pbmdzIHRoZSB6aXAgYXJjaGl2ZSB3YXMgYnVpbHQgaW4gdGVtcG9yYXJ5IGxvY2F0aW9uIHNvIHdlIG5lZWQgdG8gbW92ZSBpdAoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ01vdmluZyBaaXAgQXJjaGl2ZSBmaWxlIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSBubyBzdGFsZSBmaWxlIGluZm9ybWF0aW9uCgkJCQkJY2xlYXJzdGF0Y2FjaGUoKTsKCQkJCQkKCQkJCQlAcmVuYW1lKCAkdGVtcF96aXAsICR6aXAgKTsKCQkJCQkKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgb3IgYWN0aW9uYWJsZSB3YXJuaW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcCApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBtb3ZlZCB0byBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBXYXJuaW5ncyB3ZXJlIGJlaW5nIGlnbm9yZWQgc28gYnVpbHQgaW4gZmluYWwgbG9jYXRpb24gc28gbm8gbmVlZCB0byBtb3ZlIGl0CgkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR6aXAgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgKGFueSBhY3Rpb25hYmxlIHdhcm5pbmdzIGlnbm9yZWQgYnkgdXNlciBzZXR0aW5ncykuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXAgKTsKCQkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gT2RkIGNvbmRpdGlvbiAtIGZpbGUgc2hvdWxkIGJlIHByZXNlbnQgYnV0IGFwcGFyZW50bHkgbm90PwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQkJCQoKCQkJLy8gQ2xlYW51cCB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdpbGwgaGF2ZSBhbGwgZGV0cml0dXMgYW5kIG1heWJlIGluY29tcGxldGUgemlwIGZpbGUJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBkaXIgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0KCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycpIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciB1bmFyY2hpdmluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyApIHsKCQkKCQkJLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlCgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sL2FycmF5CQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBhbmQgZmFsc2UgaWYgbm90LCBhcnJheSBmb3Igb3RoZXIgcHJvYmxlbQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBhcmNoaXZlIGZpbGUgY2hlY2tpbmcuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQlyZXR1cm4gYXJyYXkoIDEsICJNZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBhY3Rpb24iICk7CgoJCX0KCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoJCQoJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnV0IGp1c3QgaW4gY2FzZSByZXR1cm4gZmFsc2Ugc2lsZW50bHkKCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGFyY2hpdmUgZmlsZSBsaXN0aW5nLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoKCQl9CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBhcmNoaXZlIGNvbW1lbnQgc2V0dGluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiAiTWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgYWN0aW9uIjsKCgkJfQoKCQkvKglnZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUByZXR1cm4JCWJvb2x8c3RyaW5nCQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBaaXAgY29tbWVudCBvdGhlcndpc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9jb21tZW50KCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBidXQganVzdCBpbiBjYXNlIHJldHVybiBmYWxzZSBzaWxlbnRseQoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RoZSAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIG1ldGhvZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgYXJjaGl2ZSBjb21tZW50IHJldHJpZXZhbC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJ6aXBwcm9jIGNsYXNzLgkKCQp9Cj8+Cg== ###PACKDATA,FILE_END,/lib/zipbuddy/zbzipproc.php,importbuddy/lib/zipbuddy/zbzipproc.php ###PACKDATA,FILE_START,/lib/zipbuddy/zbzipziparchive.php,importbuddy/lib/zipbuddy/zbzipziparchive.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcHppcGFyY2hpdmUiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9aaXBBcmNoaXZlIENsYXNzCgkgKgoJICoJV3JhcHBlciBmb3IgWmlwQXJjaGl2ZSB0byBoYW5kbGUgZXJyb3Igc2l0dWF0aW9ucyBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucwoJICoKCSAqCUBwYXJhbQlub25lCgkgKglAcmV0dXJuCW51bGwKCSAqCgkgKi8KCWNsYXNzIHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUgewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3JlYXRlZCBaaXBBcmNoaXZlIG9iamVjdCBpZiBpdCBjYW4gYmUgY3JlYXRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF96YSAJb2JqZWN0CiAgICAgICAgICovCgkJcHJpdmF0ZSAkX3phID0gTlVMTDsKCQkKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKglUT0RPOiBDb25zaWRlciBoYXZpbmcgYSAic3VwcHJlc3Mgd2FybmluZ3MiIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciBtZXRob2RzCgkJICoJc2hvdWxkIGJlIGludm9rZWQgd2l0aCB3YXJuaW5ncyBzdXBwcmVzc2VkIG9yIG5vdC4gRm9yIGlzX2F2YWlsYWJsZSgpIHVzYWdlIHdlIHdvdWxkCgkJICoJd2FudCB0byBzbyBhcyBub3QgdG8gcG90ZW50aWFsbHkgZmxvb2QgdGhlIFBIUCBlcnJvciBsb2cuIEZvciBvdGhlciBmdW5jdGlvbnMgdGhhdAoJCSAqCWFyZSBub3QgY2FsbGVkIGZyZXF1ZW50bHkgd2UgbWlnaHQgbm90IHdhbnQgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzLgoJCSAqCQoJCSAqCUBwYXJhbQkJbm9uZQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQkJCgkJCWlmICggY2xhc3NfZXhpc3RzKCAnWmlwQXJjaGl2ZScsIGZhbHNlICkgKSB7CgkJCQoJCQkJLy8gSXQncyBhdmFpbGFibGUgc28gY3JlYXRlIHRoZSBwcml2YXRlIGluc3RhbmNlCgkJCQkkdGhpcy0+X3phID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE5vdCBhdmFpbGFibGUgc28gdGhyb3cgdGhlIGV4Y2VwdGlvbiBmb3IgdGhlIGNhbGxlciB0byBoYW5kbGUKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oICdaaXBBcmNoaXZlIGNsYXNzIGRvZXMgbm90IGV4aXN0LicgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCQoJCQlpZiAoIE5VTEwgIT0gJHRoaXMtPl96YSApIHsgdW5zZXQgKCAkdGhpcy0+X3phICk7IH0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19jYWxsKCkKCQkgKgkKCQkgKglNYWdpYyBtZXRob2QgaW50ZXJjZXB0aW5nIGNhbGxzIHRvIHVua25vd24gbWV0aG9kcy4gVGhpcyBhbGxvd3MgdXMgdG8gaW50ZXJjZXB0CgkJICoJYWxsIG1ldGhvZCBjYWxscyBhbmQgYWRkIGFkZGl0aW9uYWwgcHJvY2Vzc2luZwoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRtZXRob2QJCVRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QKCQkgKglAcGFyYW0JCWFycmF5CSRhcmd1bWVudHMJQXJyYXkgb2YgdGhlIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZCBjYWxsCgkJICoJQHJldHVybgkJbWl4ZWQJJHJlc3VsdAkJV2hhdGV2ZXIgdGhlIGludm9rZWQgd3JhcHBlciBtZXRob2QgY2FsbCByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCAkbWV0aG9kLCAkYXJndW1lbnRzICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCSRyZXN1bHQgPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAkdGhpcy0+X3phLCAkbWV0aG9kICksICRhcmd1bWVudHMgKTsKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglfX2dldCgpCgkJICoJCgkJICoJTWFnaWMgbWV0aG9kIGludGVyY2VwdGluZyBjYWxscyB0byB1bmtub3duIHByb3BlcnRpZXMuIFRoaXMgbWVhbnMgd2UgaGF2ZSB0bwoJCSAqCXByb3ZpZGUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IGJ1dCB0aGF0J3Mgb2sgYXMgdGhlcmUgYXJlbid0IG1hbnkuCgkJICoJTm90ZTogTWF5YmUgd2UgY2FuIGdldCB0aGUgb2JqZWN0IHByb3BlcnRpZXMgYW5kIGF1dG9tYXRlIHRoaXM/CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJG5hbWUJCVRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQoJCSAqCUByZXR1cm4JCW1peGVkCSRyZXN1bHQJCVdoYXRldmVyIHRoZSB3cmFwcGVkIG9iamVjdCBwcm9wZXJ0eSByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19nZXQoICRuYW1lICkgewoJCQoJCQlzd2l0Y2ggKCAkbmFtZSApIHsKCQkJCgkJCQljYXNlICJjb21tZW50IjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5jb21tZW50OwoJCQkJCWJyZWFrOwoJCQkJCgkJCQljYXNlICJudW1GaWxlcyI6CgkJCQkKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPl96YS0+bnVtRmlsZXM7CgkJCQkJYnJlYWs7CgkJCQkKCQkJCWNhc2UgImZpbGVuYW1lIjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5maWxlbmFtZTsKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSAic3RhdHVzIjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5zdGF0dXM7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQljYXNlICJzdGF0dXNTeXMiOgoJCQkJCgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5femEtPnN0YXR1c1N5czsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBIbW0sIG5vdCBxdWl0ZSBzdXJlIHdoYXQgd2Ugc2hvdWxkIHJldHVybiBoZXJlLi4uCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQoJCS8qKgoJCSAqCWVycm9ySW5mbygpCgkJICoJCgkJICoJVHJhbnNsYXRlIGEgWmlwQXJjaGl2ZSBlcnJvciBjb2RlIGludG8gYW4gaW5mb3JtYXRpdmUgc3RyaW5nIGRlc2NyaXB0aW9uCgkJICoJYW5kIHJldHVybnMgdGhlIHN0cmluZy4gQW4gZXJyb3IgbnVtYmVyIGNhbiBiZSBwYXNzZWQgaW4sIG90aGVyd2lzZSB3aWxsCgkJICoJZ2V0IHRoZSBzdGF0dXMgcHJvcGVydHkgYW5kIHVzZSB0aGF0IChpZiBub3QgaW5kaWNhdGluZyBubyBlcnJvcikgb3IgdGhlCgkJICoJc3RhdHVzU3lzIHByb3BlcnR5IGFuZCB1c2UgdGhhdCAoaWYgbm90IGluZGljYXRpbmcgbm8gZXJyb3IpLiBJbiB0aGUgY2FzZQoJCSAqCW9mIHRoZSBzdGF0dXNTeXMgcHJvcGVydHkgd2lsbCBnZXQgdGhlIGVycm9yIHN0cmluZyBmcm9tIHRoZSBnZXRTdGF0dXNTdHJpbmcoKQoJCSAqCW1ldGhvZCwgb3RoZXJ3aXNlIGZvciBzdGF0dXMgcHJvcGVydHkgb3IgcGFzc2VkIGluIHZhbHVlIHVzZSB0aGUgbWFwcGluZ3MKCQkgKgliZWxvdy4KCQkgKglOb3RlOiBUaGlzIGRvZXMgbWVhbiB0aGF0IGEgc3RhdHVzU3lzIGVycm9yIG5vIHNob3VsZCBub3QgYmUgcGFzc2VkIGluCgkJICoJcHJlc2VudGx5LiBJbiBmdXR1cmUgbWF5IGNob29zZSB0byB1c2UgYW4gb2Zmc2V0IG1hcHBpbmcgdG8gaGFuZGxlIHRoYXQuCgkJICoJCgkJICoJQHBhcmFtCQlpbnRlZ2VyCSRlcnJvcglPcHRpb25hbDogVGhlIGVycm9yIGNvZGUKCQkgKglAcGFyYW0JCWJvb2wJJGZ1bGwJT3B0aW9uYWw6IFRydWUgdG8gcHJvdmlkZSBhIG5hbWUvdmFsdWUvZGVzY3JpcHRpb24gc3RyaW5nCgkJICoJQHJldHVybgkJc3RyaW5nCQkJSW5mb3JtYXRpdmUgZXJyb3Igc3RyaW5nCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZXJyb3JJbmZvKCAkZXJyb3IgPSBQSFBfSU5UX01BWCwgJGZ1bGwgPSB0cnVlICkgewoJCQoJCQkvLyBHZXQgc3RhdHVzU3lzIHByb3BlcnR5IHZhbHVlIGluIGNhc2Ugd2UgbmVlZCBpdAoJCQkkZXJyb3Jfc3lzID0gJHRoaXMtPl96YS0+c3RhdHVzU3lzOwoJCQkKCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGJlZW4gZ2l2ZW4gb3IgbmVlZCB0byBnZXQgYSBzdGF0dXMgdmFsdWUKCQkJaWYgKCBQSFBfSU5UX01BWCA9PSAkZXJyb3IpIHsKCQkJCgkJCQkvLyBObyBlcnJvciBudW1iZXIgcGFzc2VkIGluLCBsZXRzIGdldCBvbmUKCQkJCSRlcnJvciA9ICR0aGlzLT5femEtPnN0YXR1czsKCQkJCgkJCX0KCQkJCgkJCWlmICggKCBaSVBBUkNISVZFOjpFUl9PSyA9PSAkZXJyb3IgKSAmJiAoIDAgPCAkZXJyb3Jfc3lzICkgKSB7CgkJCQoJCQkJLy8gTm8gYmFzaWMgZXJyb3IgQU5EIHdlIGhhdmUgYSBzeXN0ZW0gZXJyb3IKCQkJCSRlcnJvcl9zdHJpbmcgPSAiWkxJQiIgLiAiKCIgLiAkZXJyb3Jfc3lzIC4gIikgOiAiIC4gJHRoaXMtPl96YS0+Z2V0U3RhdHVzU3RyaW5nKCk7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSRlcnJvcl9uYW1lID0gJyc7CgkJCQkkZXJyb3JfZGVzY3JpcHRpb24gPSAnJzsKCQkJCgkJCQkvLyBJdCdzIGVpdGhlciBhIGJhc2ljIGVycm9yIE9SIG5vIHN5c3RlbSBlcnJvcgoJCQkJLy8gV2UgY2FuIGNoZWNrIHRoZSBzeW1ib2xpYyB2YWx1ZXMKCQkJCXN3aXRjaCggKGludCkgJGVycm9yICkgewoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfT0s6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9PSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJObyBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfT1BFTjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfT1BFTiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDYW4ndCBvcGVuIGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX01FTU9SWToKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTUVNT1JZIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0VYSVNUUzoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJSX0VYSVNUUyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJGaWxlIGFscmVhZHkgZXhpc3RzIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9JTkNPTlM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0lOQ09OUyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJaaXAgYXJjaGl2ZSBpbmNvbnNpc3RlbnQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0lOVkFMOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTlZBTCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJJbnZhbGlkIGFyZ3VtZW50IjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9OT0VOVDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTk9FTlQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm8gc3VjaCBmaWxlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9OT1pJUDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTk9aSVAiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm90IGEgemlwIGFyY2hpdmUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1JFQUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFQUQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUmVhZCBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfU0VFSzoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfU0VFSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJTZWVrIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9NVUxUSURJU0s6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX01VTFRJRElTSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJNdWx0aS1kaXNrIHppcCBhcmNoaXZlcyBub3Qgc3VwcG9ydGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRU5BTUU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFTkFNRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0NMT1NFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DTE9TRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfV1JJVEU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1dSSVRFIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIldyaXRlIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DUkM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0NSQyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDUkMgZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1pJUENMT1NFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfWklQQ0xPU0VEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkNvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfVE1QT1BFTjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfVE1QT1BFTiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfWkxJQjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfWkxJQiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJabGliIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DSEFOR0VEOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DSEFOR0VEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkVudHJ5IGhhcyBiZWVuIGNoYW5nZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0NPTVBOT1RTVVBQOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DT01QTk9UU1VQUCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfRU9GOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9FT0YiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUHJlbWF0dXJlIEVPRiI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfSU5URVJOQUw6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0lOVEVSTkFMIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkludGVybmFsIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRU1PVkU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFTU9WRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDYW4ndCByZW1vdmUgZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfREVMRVRFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfREVMRVRFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJFbnRyeSBoYXMgYmVlbiBkZWxldGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgZGVmYXVsdDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJSX1VOS05PV04iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiVW5rbW93biBlcnJvciI7CgkJCQl9CgkJCQkKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXJyb3JfbmFtZSAuICIoIiAuICRlcnJvciAuICIpIDogIiAuICRlcnJvcl9kZXNjcmlwdGlvbjsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmUgd2F5IG9yIGFub3RoZXIgd2UgaGF2ZSBhIHN0cmluZyB0byByZXR1cm4KCQkJcmV0dXJuICRlcnJvcl9zdHJpbmc7CgkJCgkJfQoJCQoJfQoKCWNsYXNzIHBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBleHRlbmRzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKICAgICAgICAvKioKICAgICAgICAgKiBtZXRob2QgdGFnIHVzZWQgdG8gcmVmZXIgdG8gdGhlIG1ldGhvZCBhbmQgZW50aXRpZXMgYXNzb2NpYXRlZCB3aXRoIGl0IHN1Y2ggYXMgY2xhc3MgbmFtZQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF9tZXRob2RfdGFnIAlzdHJpbmcKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX3RhZyA9ICd6aXBhcmNoaXZlJzsKCQkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIHJlZ2FyZGVkIGFzIGEgImNvbXBhdGliaWxpdHkiIG1ldGhvZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYm9vbAogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCA9IGZhbHNlOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX2RlcGVuZGVuY2llcyA9IGFycmF5KCAnY2xhc3NlcycgPT4gYXJyYXkoICdaaXBBcmNoaXZlJyApLAoJCQkJCQkJCQkJCSAgCQkgJ2Z1bmN0aW9ucycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdleHRlbnNpb25zJyA9PiBhcnJheSgpLAoJCQkJCQkJCQkJCSAgCQkgJ2ZpbGVzJyA9PiBhcnJheSgpCgkJCQkJCQkJCQkJCQkpOwoJCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBzdGF0aWMgbWV0aG9kIHRhZyBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlzdHJpbmcJVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWdfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBjb21wYXRpYmlsaXR5IG1ldGhvZCBpbmRpY2F0b3IgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYm9vbAlUcnVlIGlmIGlzIGEgY29tcGF0aWJpbGl0eSBtZXRob2QKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBtZXRob2QgZGVwZW5kZW5jaWVzIGFycmF5IGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWFycmF5CVRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlcXVpcmVzIHRvIGJlIGEgc3VwcG9ydGVkIG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF9kZXBlbmRlbmNpZXM7CgkJfQoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXJlZmVyZW5jZQkmJHBhcmVudAkJW29wdGlvbmFsXSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAmJHBhcmVudCA9IE5VTEwgKSB7CgoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAkcGFyZW50ICk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnWmlwQXJjaGl2ZSBNZXRob2QnLAoJCQkJCQkJCQkJCQkJICAJCQkgICAnY29tcGF0aWJpbGl0eScgPT4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kICkKCQkJCQkJCQkJCQkJCSAgCSAgICk7CgoJCQkvLyBObyByZWxldmFudCBwYXJhbWV0ZXJzIGZvciB0aGlzIG1ldGhvZAoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF0gPSBhcnJheSgpOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCQkKCQkJcGFyZW50OjpfX2Rlc3RydWN0KCk7CgoJCX0KCQkKCQkvKioKCQkgKglnZXRfbWV0aG9kX3RhZygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgbWV0aG9kIHRhZwoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZyBUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnKCkgewoJCQoJCQlyZXR1cm4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIGlzX2NvbXBhdGliaWxpdHlfbWV0aG9kIGJvb2xlYW4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkgewoJCQoJCQlyZXR1cm4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaXNfYXZhaWxhYmxlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHNwZWNpZmljIG1ldGhvZCBhbmQgaXRzIGF2YWlsYWJsZSBtb2Rlcy4gV2lsbCB0ZXN0IGZvcgoJCSAqICBtdWx0aXBsZSBtb2RlcyAoemlwICYgdW56aXApIGFuZCBvbmx5IHJldHVybiBmYWxzZSBpZiBuZWl0aGVyIGlzIGF2YWlsYWJsZS4gQWN0dWFsIGF2YWlsYWJsZSBtb2RlcyB3aWxsCgkJICogIGJlIGluZGljYXRlZCBpbiB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMuCgkJICoKCQkgKiAgTm90ZTogaW4gdGhpcyBjYXNlIGFzIHRoZSB6aXAgYW5kIHVuemlwIGNhcGFiaWxpdGllcyBhcmUgYWxsIHdyYXBwZWQgdXAgaW4gdGhlIHNhbWUgY2xhc3MgdGhlbiBpZiB3ZQoJCSAqICBjYW4gemlwIHRoZW4gd2UnbGwgYXNzdW1lIChmb3Igbm93KSB0aGF0IHdlIGNhbiB1bnppcCBhcyB3ZWxsIHNvIGF0dHJpYnV0ZXMgYXJlIHNldCBhY2NvcmRpbmdseS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcglUZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYW55IHRlc3QgZmlsZXMgKG11c3QgYmUgd3JpdGVhYmxlKQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3Qgb25lIG1vZGUsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGlzX2F2YWlsYWJsZSggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCSR0ZXN0X2ZpbGUgPSAkdGVtcGRpciAuICd0ZW1wX3Rlc3RfJyAuIHVuaXFpZCgpIC4gJy56aXAnOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSB0ZXN0IEZBSUxFRDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkvLyBUaGlzIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBmb3Igc29tZSBlcnJvciBzY2VuYXJpb3Mgb3IgYW4gZXJyb3IgY29kZQoJCQkJLy8gSWYgaXQgcmV0dXJuIGZhbHNlIHdlIGRvbid0IHJlYWxseSBrbm93IHdoeSAtIHRoZXJlIG1heSBoYXZlIGJlZW4gYSBXYXJuaW5nIGdlbmVyYXRlZAoJCQkJLy8gYnV0IHdlIG5lZWQgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYmVjYXVzZSBvZiB0aGUgZnJlcXVlbmN5IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCgkJCQkvLyBzbyB3ZSBjYW4gb25seSBpbmRpY2F0ZSBhIGdlbmVyYWwgZmFpbHVyZQoJCQkJJHJlcyA9ICR6YS0+b3BlbiggJHRlc3RfZmlsZSwgWklQQVJDSElWRTo6Q1JFQVRFIHwgWklQQVJDSElWRTo6T1ZFUldSSVRFICk7CgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJHJlcyApIHsKCQkJCQoJCQkJCWlmICggISR6YS0+YWRkRmlsZSggX19GSUxFX18sICd0aGlzX2lzX2FfdGVzdC50eHQnKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgX18oJ1ppcEFyY2hpdmUgdGVzdCBGQUlMRUQ6IFVuYWJsZSB0byBhZGQgZmlsZSB0byB6aXAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCWlmICggISR6YS0+Y2xvc2UoKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgX18oJ1ppcEFyY2hpdmUgdGVzdCBGQUlMRUQ6IFByb2JsZW0gY3JlYXRpbmcvY2xvc2luZyB6aXAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Vycm9yICM1NjQ2MzQuIFVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlIGAnIC4gJHRlc3RfZmlsZSAuICdgLicgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQkJLy8gVGhlIHppcCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgLSBpbXBsaWVzIGNhbiB6aXAgYW5kIHVuemlwIGFuZCBoZW5jZSBjaGVjayBhbmQgbGlzdAoJCQkJCQkvLyBOb3RlOiB3ZSBhY3R1YWxseSBkb24ndCB3YW50IHRvIGRvIGFyY2hpdmluZyB3aXRoIHRoaXMgbWV0aG9kIHlldAoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3ppcHBlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfdW56aXBwZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NoZWNrZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2xpc3RlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bmFyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19leHRyYWN0b3InIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwQXJjaGl2ZSB0ZXN0IFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXBBcmNoaXZlIHRlc3QgRkFJTEVEOiBaaXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSB0ZXN0IEZBSUxFRDogVW5hYmxlIHRvIGNyZWF0ZS9vcGVuIHppcCBmaWxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBJZiB3ZSBnb3QgYW4gZXJyb3IgY29kZSAocmF0aGVyIHRoYW4gc2ltcGx5IGEgZmFsc2UgZmFpbHVyZSBpbmRpY2F0aW9uKSB0aGVuIHRyYW5zbGF0ZSBpdAoJCQkJCS8vIEl0IHNlZW1zIHRoYXQgaW4gdGhlc2UgY2FzZXMgdGhlIGludGVybmFsIHN0YXR1cyBkb2Vzbid0IGluZGljYXRlIGFueXRoaW5nIHNvIHdlIGNhbm5vdCB1c2UgdGhhdAoJCQkJCWlmICggZmFsc2UgIT09ICRyZXMgKSB7CgkJCQkJCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlcyApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJJHphLT5jbG9zZSgpOwoJCQkJCQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJICAJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CgkJICAJCgkJICAJcmV0dXJuICRyZXN1bHQ7CgkJICAJCgkJfQoJCQoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90ZWhyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgPSBOVUxMICkgewoJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGJhY2t1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfZnVsbCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCSRzdGF0ID0gYXJyYXkoKTsKCQkJCgkJCS8vIFRoaXMgc2hvdWxkIGdpdmUgdXMgYSBuZXcgYXJjaGl2ZSBvYmplY3QsIGlmIG5vdCBjYXRjaCBpdCBhbmQgYmFpbCBvdXQKCQkJdHJ5IHsKCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfWmlwQXJjaGl2ZSgpOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCSRyZXN1bHQgPSAkemEtPm9wZW4oICR6aXBfZmlsZSApOwoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sKCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJCS8vIEhvdyBtYW55IGZpbGVzIC0gY291bGQgYmUgMCBpZiB3ZSBoYWQgYW4gZW1wdHkgemlwIGZpbGUKCQkJCQkkZmlsZV9jb3VudCA9ICR6YS0+bnVtRmlsZXM7CgkJCQkJCgkJCQkJLy8gT25seSByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3Mgb3IgZmFsc2UgZm9yIGZhaWx1cmUgLSBubyBpbmRpY2F0aW9uIG9mIHdoeSBmYWlsZWQKCQkJCQkkcmVzdWx0ID0gJHphLT5leHRyYWN0VG8oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQkJCQkJCgkJCQkJLy8gQ3VycmVudGx5IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gc3VjY2VzcyBhbmQgZmFpbHVyZSBidXQgbm8gZmluZXIgZ3JhaW4KCQkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBmYWlsZWQgdG8gZXh0cmFjdCBmaWxlIGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQoJCQkJCQkvLyBNYXkgc2VlbSByZWR1bmRhbnQgYnV0IGJlbHQnbidicmFjZXMKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCX0KCQkJCQkKCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcF9maWxlICk7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlc3VsdCApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBleHRyYWN0IGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkKCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkKCQl9CgoJCS8qKgoJCSAqCWV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPSAnJywgJGl0ZW1zICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBpZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rCgkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCQkvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGVhY2ggaXRlbSBhbmQgcnVuIGFuIHVuemlwIGZvciBpdCAtIHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gZWFzeSB3YXkgb2YgY29tYmluaW5nCgkJCQkJLy8gYXJiaXRyYXJ5IGV4dHJhY3Rpb25zIGludG8gYSBzaW5nbGUgY29tbWFuZCBpZiBzb21lIG1pZ2h0IGJlIHRvIGEgCgkJCQkJZm9yZWFjaCAoICRpdGVtcyBhcyAkd2hhdCA9PiAkd2hlcmUgKSB7CgkJCQoJCQkJCQkkcmVuYW1lX3JlcXVpcmVkID0gZmFsc2U7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJCQkvLyBEZWNpZGUgaG93IHRvIGV4dHJhY3QgYmFzZWQgb24gd2hlcmUKCQkJCQkJaWYgKCBlbXB0eSggJHdoZXJlKSApIHsKCQkJCQkKCQkJCQkJCS8vIEZpcnN0IHdlJ2xsIGV4dHJhY3QgYW5kIHRoZW4ganVuayB0aGUgcGF0aAoJCQkJCQkJJHJlc3VsdCA9ICR6YS0+ZXh0cmFjdFRvKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkd2hhdCApOwoJCQkJCQkJCQoJCQkJCQkJLy8gVW5saWtlIGV4ZWMgemlwIHdlIGhhdmUgdG8gZWZmZWN0aXZlbHkganVuayB0aGUgcGF0aCBhZnRlciB0aGUgZXh0cmFjdGlvbgoJCQkJCQkJLy8gRG8gdGhpcyBieSByZW5hbWluZyB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCB0aGVuIGdldHRpbmcgcmlkIG9mIGFueSBkaXJlY3RvcnkKCQkJCQkJCS8vIHN0cnVjdHVyZSBpdCB3YXMgdW5kZXIuIElmIGRpcm5hbWUgaXMgbm90IC4gdGhlbiB3ZSBrbm93IHRoZXJlIGlzIGEgZGlyZWN0cnkgcGF0aCBhbmQgbm90CgkJCQkJCQkvLyBqdXN0IGEgc2ltcGxlIGZpbGUgbmFtZSAocmVtZW1iZXIgdGhhdCAkd2hhdCBzaG91bGQgX25vdF8gaGF2ZSBhbnkgbGVhZGluZyBzbGFzaCB3aGV0aGVyCgkJCQkJCQkvLyBpdCBpcyBhIGZpbGVwYXRoIG9yIGEgc2ltcGxlIGZpbGVuYW1lKQoJCQkJCQkJaWYgKCAiLiIgIT0gZGlybmFtZSggJHdoYXQgKSApIHsKCQkJCQkJCQoJCQkJCQkJCXJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkd2hhdCwKCQkJCQkJCQkJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYmFzZW5hbWUoICR3aGF0KSApOwoJCQkJCQkJCQkJCgkJCQkJCQkJLy8gR2V0IHRoZSBwYXRoIGNvbXBvbmVudCBvZiAkd2hhdCAtIG5vdGUgdGhhdCBkaXJuYW1lKCkgYWRkcyBhIGxlYWRpbmcgc2xhc2gKCQkJCQkJCQkvLyBldmVuIGlmIG5vbmUgd2FzIHByZXNlbnQgb3JpZ2luYWxseS4gV2UgbXVzdCBnZXQgdGhlIGZpcnN0IGRpcmVjdG9yeSBjb21wb25lbnQgb25seQoJCQkJCQkJCS8vIHNvIHdlIGNhbiBkbyBhIHJlY3Vyc2l2ZSBkZWxldGUgb24gaXQuIFRoaXMgaXMgYSBiaXQga2x1bmt5IGJ1dCBmdW5jdGlvbmFsLgoJCQkJCQkJCSR3aGF0cGF0aCA9ICR3aGF0OwoJCQkJCQkJCWRvIHsKCQkJCQkJCQkJJHdoYXRwYXRoID0gZGlybmFtZSggJHdoYXRwYXRoICk7CgkJCQkJCQkJfSB3aGlsZSAoIDEgPCBzdHJsZW4oIGRpcm5hbWUoICR3aGF0cGF0aCApICkgKTsKCgkJCQkJCQkJLy8gTm93IHdlIGNhbiBkbyB0aGUgcmVjdXJzaXZlIGRlbGV0ZSBmcm9tIHRoYXQgdG9wIGxldmVsIGNvbXBvbmVudAoJCQkJCQkJCSR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuICR3aGF0cGF0aCApOwoKCQkJCQkJCX0KCQkJCQkJCQkJCQkJCQkJCgkJCQkJCgkJCQkJCX0gZWxzZWlmICggIWVtcHR5KCAkd2hlcmUgKSApIHsKCQkJCQkKCQkJCQkJCWlmICggJHdoYXQgPT09ICR3aGVyZSApIHsKCQkJCQkJCQoJCQkJCQkJCS8vIENoZWNrIGZvciB3aWxkY2FyZCBkaXJlY3RvcnkgZXh0cmFjdGlvbiBsaWtlIGRpci8qID0+IGRpci8qCgkJCQkJCQkJaWYgKCAiKiIgPT0gc3Vic3RyKCB0cmltKCAkd2hhdCApLCAtMSApICkgewoJCQkJCQkJCQoJCQkJCQkJCQkvLyBHZXQgb3VyIHBhdGggbWF0Y2ggc3RyaW5nIChqdXN0IGNsaXAgb2ZmIHRoZSB3aWxkY2FyZCkKCQkJCQkJCQkJJHdoYXRyb290ID0gc3Vic3RyKCB0cmltKCAkd2hhdCApLCAwLCAtMSApOwoJCQkJCQkJCQkkZmlsZV9jb3VudCA9ICR6YS0+bnVtRmlsZXM7CgkJCQkJCQkJCgkJCQkJCQkJCS8vIENyaWtleSwgaXQncyBhIGRpcmVjdG9yeSB0cmVlIGV4dHJhY3Rpb24gLSBkb24ndCBwYW5pYwoJCQkJCQkJCQkvLyBXZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHppcCBhbmQgZXh0cmFjdCBlYWNoIGZpbGUgdGhhdCBtYXRjaGVzCgkJCQkJCQkJCWZvciAoICRpID0gMDsgJGkgPCAkZmlsZV9jb3VudDsgJGkrKyApIHsKCQkJCQkJCQkJCgkJCQkJCQkJCQkvLyBHZXQgdGhlIGZpbGVuYW1lIGJ5IGluZGV4IGFuZCBzZWUgaWYgaXQncyBpbiB0aGUgdHJlZQoJCQkJCQkJCQkJJGZpbGVuYW1lID0gJHphLT5nZXROYW1lSW5kZXgoICRpICk7CgkJCQkJCQkJCQlpZiAoIDAgPT09IHN0cnBvcyggJGZpbGVuYW1lLCAkd2hhdHJvb3QgKSApIHsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCS8vICR3aGF0IG1hdGNoZWQgdGhlIHJvb3Qgb2YgdGhpcyBmaWxlbmFtZSBzbyBleHRyYWN0IGl0CgkJCQkJCQkJCQkJJHJlc3VsdCA9ICR6YS0+ZXh0cmFjdFRvKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZmlsZW5hbWUgKTsKCgkJCQkJCQkJCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCS8vIEFuIGV4dHJhY3Rpb24gZmFpbGVkIHNvIGJhaWwgb3V0IGhlcmUgLSB0aGlzIHNob3VsZCBqdXN0CgkJCQkJCQkJCQkJCS8vIGRyb3AgdXMgdGhyb3VnaCB0byB0aGUgcG9zdC1wcm9jZXNzaW5nIG9mICRyZXN1bHQgd2hpY2ggb24KCQkJCQkJCQkJCQkJLy8gYSBmYWxzZSBzaG91bGQgdGhlbiBkcm9wIHVzIG91dCBvZiB0aGUgZm9yZWFjaCBsb29wCgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQoJCQkJCQkJCQkvLyBJdCdzIGp1c3QgYSBzaW5nbGUgZmlsZSBleHRyYWN0aW9uIC0gYnJlYXRoIGEgc2lnbiBvZiByZWxpZWYKCQkJCQkJCQkJLy8gRXh0cmFjdCB0byBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgLSBkb24ndCBqdW5rIHBhdGgsIG5vIG5lZWQgdG8gYWRkIHdoZXJlIHRvIGRlc3RuYXRpb24gYXMgYXV0b21hdGljCgkJCQkJCQkJCSRyZXN1bHQgPSAkemEtPmV4dHJhY3RUbyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoYXQgKTsKCgkJCQkJCQkJfQoJCQkJCQkKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQoJCQkJCQkJCS8vIEZpcnN0IHdlJ2xsIGV4dHJhY3QgYW5kIHRoZW4ganVuayB0aGUgcGF0aAoJCQkJCQkJCSRyZXN1bHQgPSAkemEtPmV4dHJhY3RUbyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoYXQgKTsKCQkJCQkJCQkKCQkJCQkJCQkvLyBVbmxpa2UgZXhlYyB6aXAgd2UgaGF2ZSB0byBlZmZlY3RpdmVseSBqdW5rIHRoZSBwYXRoIGFmdGVyIHRoZSBleHRyYWN0aW9uCgkJCQkJCQkJLy8gRG8gdGhpcyBieSByZW5hbWluZyB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCB0aGVuIGdldHRpbmcgcmlkIG9mIGFueSBkaXJlY3RvcnkKCQkJCQkJCQkvLyBzdHJ1Y3R1cmUgaXQgd2FzIHVuZGVyLiBJZiBkaXJuYW1lIGlzIG5vdCAuIHRoZW4gd2Uga25vdyB0aGVyZSBpcyBhIGRpcmVjdHJ5IHBhdGggYW5kIG5vdAoJCQkJCQkJCS8vIGp1c3QgYSBzaW1wbGUgZmlsZSBuYW1lIChyZW1lbWJlciB0aGF0ICR3aGF0IHNob3VsZCBfbm90XyBoYXZlIGFueSBsZWFkaW5nIHNsYXNoIHdoZXRoZXIKCQkJCQkJCQkvLyBpdCBpcyBhIGZpbGVwYXRoIG9yIGEgc2ltcGxlIGZpbGVuYW1lKQoJCQkJCQkJCWlmICggIi4iICE9IGRpcm5hbWUoICR3aGF0ICkgKSB7CgkJCQkJCQkJCgkJCQkJCQkJCXJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkd2hhdCwKCQkJCQkJCQkJCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGJhc2VuYW1lKCAkd2hhdCkgKTsKCQkJCQkJCQkJCQkKCQkJCQkJCQkJLy8gR2V0IHRoZSBwYXRoIGNvbXBvbmVudCBvZiAkd2hhdCAtIG5vdGUgdGhhdCBkaXJuYW1lKCkgYWRkcyBhIGxlYWRpbmcgc2xhc2gKCQkJCQkJCQkJLy8gZXZlbiBpZiBub25lIHdhcyBwcmVzZW50IG9yaWdpbmFsbHkuIFdlIG11c3QgZ2V0IHRoZSBmaXJzdCBkaXJlY3RvcnkgY29tcG9uZW50IG9ubHkKCQkJCQkJCQkJLy8gc28gd2UgY2FuIGRvIGEgcmVjdXJzaXZlIGRlbGV0ZSBvbiBpdC4gVGhpcyBpcyBhIGJpdCBrbHVua3kgYnV0IGZ1bmN0aW9uYWwuCgkJCQkJCQkJCSR3aGF0cGF0aCA9ICR3aGF0OwoJCQkJCQkJCQlkbyB7CgkJCQkJCQkJCQkkd2hhdHBhdGggPSBkaXJuYW1lKCAkd2hhdHBhdGggKTsKCQkJCQkJCQkJfSB3aGlsZSAoIDEgPCBzdHJsZW4oIGRpcm5hbWUoICR3aGF0cGF0aCApICkgKTsKCgkJCQkJCQkJCS8vIE5vdyB3ZSBjYW4gZG8gdGhlIHJlY3Vyc2l2ZSBkZWxldGUgZnJvbSB0aGF0IHRvcCBsZXZlbCBjb21wb25lbnQKCQkJCQkJCQkJJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gJHdoYXRwYXRoICk7CgoJCQkJCQkJCX0KCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJLy8gV2lsbCBuZWVkIHRvIHJlbmFtZSBpZiB0aGUgZXh0cmFjdCBpcyBvawoJCQkJCQkJCSRyZW5hbWVfcmVxdWlyZWQgPSB0cnVlOwoJCQkJCQkKCQkJCQkJCX0KCQkJCQkKCQkJCQkJfQoJCQkJCgkJCQkJCS8vIE5vdGU6IHdlIGRvbid0IG9wZW4gdGhlIGZpbGUgYW5kIHRoZW4gZG8gc3R1ZmYgYnV0IGl0J3MgYWxsIGRvbmUgaW4gb25lIGFjdGlvbgoJCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCQkJLy8gQ3VycmVudGx5IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gc3VjY2VzcyBhbmQgZmFpbHVyZSBidXQgbm8gZmluZXIgZ3JhaW4KCQkJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBleHRyYWN0ZWQgZmlsZSBjb250ZW50cyAoJTEkcyBmcm9tICUyJHMgdG8gJTMkcyU0JHMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlICkgKTsKCgkJCQkJCQkvLyBSZW5hbWUgaWYgd2UgaGF2ZSB0bwoJCQkJCQkJaWYgKCB0cnVlID09PSAkcmVuYW1lX3JlcXVpcmVkKSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBOb3RlOiB3ZSBqdW5rZWQgdGhlIHBhdGggb24gdGhlIGV4dHJhY3Rpb24gc28ganVzdCB0aGUgZmlsZW5hbWUgb2YgJHdoYXQgaXMgdGhlIHNvdXJjZSBidXQKCQkJCQkJCQkvLyAkd2hlcmUgY291bGQgYmUgYSBzaW1wbGUgZmlsZSBuYW1lIG9yIGEgZmlsZSBwYXRoIAoJCQkJCQkJCSRyZXN1bHQgPSAkcmVzdWx0ICYmIHJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBiYXNlbmFtZSggJHdoYXQgKSwKCQkJCQkJCQkJCQkJCQkJICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHdoZXJlICk7CgkJCQkJCQkKCQkJCQkJCX0KCgkJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCQkvLyBGb3Igbm93IGxldCdzIGp1c3QgcHJpbnQgdGhlIGVycm9yIGNvZGUgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCk7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGZhaWxlZCB0byBvcGVuL3Byb2Nlc3MgZmlsZSB0byBleHRyYWN0IGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKSAtIEVycm9yIEluZm86ICU1JHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCQkJCS8vIE1heSBzZWVtIHJlZHVuZGFudCBidXQgYmVsdCduJ2JyYWNlcwoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQkJLy8gSWYgdGhlIGV4dHJhY3Rpb24gZmFpbGVkIChvciByZW5hbWUgYWZ0ZXIgZXh0cmFjdGlvbikgdGhlbiBicmVhayBvdXQgb2YgdGhlIGZvcmVhY2ggYW5kIHNpbXBseSByZXR1cm4gZmFsc2UKCQkJCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gZXh0cmFjdCBjb250ZW50cyAoJTEkcyB0byAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkJfQoJCQkJCgkJCQkkemEtPmNsb3NlKCk7CgkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sL2FycmF5CQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBhbmQgZmFsc2UgaWYgbm90LCBhcnJheSBmb3Igb3RoZXIgcHJvYmxlbQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkKCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiR2VuZXJpYyBmYWlsdXJlIGluZGljYXRpb24iICk7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiQ2xhc3Mgbm90IGF2YWlsYWJsZSB0byBtYXRjaCBtZXRob2QiICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rCgkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCQkvLyBOb3cgdHJ5IGFuZCBmaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlsZQoJCQkJCSRpbmRleCA9ICR6YS0+bG9jYXRlTmFtZSggJGxvY2F0ZV9maWxlICk7CgkJCQkJCgkJCQkJLy8gSWYgd2UgZ290IGFuIGluZGV4IHdlIGZvdW5kIGl0IG90aGVyd2lzZSBub3QgZm91bmQKCQkJCQlpZiAoIGZhbHNlICE9PSAkaW5kZXggKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgZm91bmQgKHppcGFyY2hpdmUpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kICh6aXBhcmNoaXZlKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHMgKGxvb2tpbmcgZm9yICUxJHMgaW4gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRsb2NhdGVfZmlsZSAsICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJGYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUiICk7CgoJCQkJfQoJCQkKCQkJCS8vIFdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGUgYXJjaGl2ZSAobGVhdmVfb3BlbiBpZ25vcmVkIGZvciBub3cpCgkJCQkkemEtPmNsb3NlKCk7CgkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkKCQl9CgkJCgkJLyoJZ2V0X2ZpbGVfbGlzdCgpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3QoICR6aXBfZmlsZSApIHsKCQkKCQkJJGZpbGVfbGlzdCA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJJHN0YXQgPSBhcnJheSgpOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvawoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkJaWYgKCAoICRmaWxlX2NvdW50ID0gJHphLT5udW1GaWxlcyApID4gMCApIHsKCQkJCQoJCQkJCQkvLyBHZXQgZWFjaCBmaWxlIGluIHNlcXVlbmNlIGJ5IGluZGV4IGFuZCBnZXQgdGhlIHByb3BlcnRpZXMKCQkJCQkJZm9yKCAkaSA9IDA7ICRpIDwgJGZpbGVfY291bnQ7ICRpKysgKXsKCQkJCQkJCgkJCQkJCQkkc3RhdCA9ICR6YS0+c3RhdEluZGV4KCAkaSApOwoJCQkJCQkJCgkJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQkkZmlsZV9saXN0W10gPSBhcnJheSgKCQkJCQkJCQkkc3RhdFsnbmFtZSddLAoJCQkJCQkJCSRzdGF0WydzaXplJ10sCgkJCQkJCQkJJHN0YXRbJ2NvbXBfc2l6ZSddLAoJCQkJCQkJCSRzdGF0WydtdGltZSddLAoJCQkJCQkJKTsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGxpc3RlZCBmaWxlIGNvbnRlbnRzICglMSRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsJCgoJCQkJCSRyZXN1bHQgPSAmJGZpbGVfbGlzdDsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSB3aWxsIHJldHVybiBmb3IgbWF5YmUgYW5vdGhlciBtZXRob2QgdG8gdHJ5CgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCAkcmVzdWx0ICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGxpc3QgY29udGVudHMgKCUxJHMpIC0gRXJyb3IgSW5mbzogJTIkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkKCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJGNvbW1lbnQgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCS8vIFRoaXMgc2hvdWxkIGdpdmUgdXMgYSBuZXcgYXJjaGl2ZSBvYmplY3QsIG9mIG5vdCBjYXRjaCBpdCBhbmQgYmFpbCBvdXQKCQkJdHJ5IHsKCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfWmlwQXJjaGl2ZSgpOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCSRyZXN1bHQgPSAkemEtPm9wZW4oICR6aXBfZmlsZSApOwoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkJLy8gU2V0IHRoZSBjb21tZW50IC0gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJJHJlc3VsdCA9ICR6YS0+c2V0QXJjaGl2ZUNvbW1lbnQoICRjb21tZW50ICk7CgkJCQkJCgkJCQkJLy8gSWYgd2UgZ290IGJhY2sgdHJ1ZSB0aGVuIGFsbCBpcyB3ZWxsIHdpdGggdGhlIHdvcmxkCgkJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIHNldCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gc2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gSWYgd2UgY291bGRuJ3Qgb3BlbiB0aGUgemlwIGZpbGUgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCQkJCgkJCQl9CgkJCQkJCQkJCgkJCQkkemEtPmNsb3NlKCk7CgkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIGF0IGxlYXN0IHRoZSB6aXAgZmlsZSBvcGVuZWQgb2sKCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJCS8vIEdldCB0aGUgY29tbWVudCBvciBmYWxzZSBvbiBmYWlsdXJlIGZvciBzb21lIHJlYXNvbgoJCQkJCS8vIE5vdGU6IEN1cnJlbnRseSwgZHVlIHRvIGEgYnVnIGluIFppcEFyY2hpdmUsIGdldEFyY2hpdmVDb21tZW50KCkKCQkJCQkvLyByZXR1cm5zIGZhbHNlIGZvciBhbiBlbXB0eSBjb21tZW50IHdoZXJlYXMgaXQgc2hvdWxkIGp1c3QgcmV0dXJuIGFuCgkJCQkJLy8gZW1wdHkgc3RyaW5nLiBXZSdsbCBsaXZlIHdpdGggdGhpcyBmb3Igbm93IGFzIGl0IHNob3VsZCBvbmx5IGhhcHBlbgoJCQkJCS8vIHdoZW4gYW4gYXJjaGl2ZSBpcyBmcmVzaCBhbmQgaGFzIHRoZSBJbnRlZ3JpdHkgQ2hlY2sgcnVuIChvciB3aGVuIHRoZQoJCQkJCS8vIGNoZWNrIGlzIHJlcnVuKS4gT25jZSBhIGNvbW1lbnQgaXMgYWRkZWQgdGhlIGZ1bmN0aW9uIGJlaGF2ZXMuCgkJCQkJLy8gSWYgYW55IHByb2JsZW1zIGFyZSB0aHJvd24gdXAgdGhlbiB0aGVyZSBpcyB0aGUgb3B0aW9uIHRvIHVzZSB0aGUKCQkJCQkvLyBhcmNoaXZlIHByb3BlcnR5IGJ1dCB0aGF0IGhhcyBhIGRvd25zaWRlIGluIHRoYXQgaXQgY2FuIG9ubHkgZXZlcgoJCQkJCS8vIHJldHVybiBhIHN0cmluZyBzbyBpZiB0aGVyZSByZWFsbHkgaXMgYW4gZXJyb3IgaW4gcmVhZGluZyB0aGUgY29tbWVudAoJCQkJCS8vIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBrbm93IChBRkFJSykuIFBlcmhhcHMgYW4gZXJyb3Igc3RhdHVzIHZhbHVlIG1pZ2h0CgkJCQkJLy8gYmUgc2V0IHNvbWV3aGVyZT8KCQkJCQkvLyBUaGUgYnVnIHdpbGwgYmUgcmVwb3J0ZWQgdG8gUEhQIGRldmVsb3BlcnMgYnV0IHdlIHdpbGwgc3RpbGwgaGF2ZSB0bwoJCQkJCS8vIGxpdmUgd2l0aCB0aGlzIGZvciBhIHdoaWxlIGJlY2F1c2UgaXQgdGFrZXMgaG9zdHMgYWdlcyB0byBjYXRjaCB1cCB0bwoJCQkJCS8vIHVwZGF0ZWQgUEhQIHZlcnNpb25zLgoJCQkJCSRjb21tZW50ID0gJHphLT5nZXRBcmNoaXZlQ29tbWVudCggWklQQVJDSElWRTo6RkxfVU5DSEFOR0VEICk7CgkJCQkJLy8kY29tbWVudCA9ICR6YS0+Y29tbWVudDsKCQkJCQkKCQkJCQkvLyBJZiB3ZSBoYXZlIGEgY29tbWVudCAoZXZlbiBpZiBlbXB0eSkgdGhlbiByZXR1cm4gaXQKCQkJCQlpZiAoIGZhbHNlICE9PSAkY29tbWVudCApIHsKCgkJCQkJCS8vIE5vdGU6IG5ldyBhcmNoaXZlcyB3aWxsIHJldHVybiBhbiBlbXB0eSBjb21tZW50IGlmIG9uZSB3YXMgbm90IGFkZGVkIGF0IGNyZWF0aW9uCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkJJHJlc3VsdCA9ICRjb21tZW50OwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byByZXRyaWV2ZSBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlc3VsdCApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBnZXQgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJJHphLT5jbG9zZSgpOwoJCQkJCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCX0gLy8gZW5kIHBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBjbGFzcy4JCgkKfQo/Pgo= ###PACKDATA,FILE_END,/lib/zipbuddy/zbzipziparchive.php,importbuddy/lib/zipbuddy/zbzipziparchive.php ###PACKDATA,FILE_START,/lib/zipbuddy/zipbuddy.php,importbuddy/lib/zipbuddy/zipbuddy.php PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IENsYXNzIChFeHBlcmltZW50YWwpCiAqCiAqCUhhbmRsZXMgemlwcGluZyBhbmQgdW56aXBwaW5nLCB1c2luZyB0aGUgYmVzdCBtZXRob2RzIGF2YWlsYWJsZSBhbmQgZmFsbGluZyBiYWNrIHRvIHdvcnNlIG1ldGhvZHMKICoJYXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5LiBBbGxvd3MgZm9yIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2Rlcy4KICoJCiAqCVZlcnNpb246IDEuMC4wCiAqCUF1dGhvcjogCiAqCUF1dGhvciBVUkk6IAogKgogKgogKi8KCi8vIFRlc3QgaWYgd2UgYXJlIGxvYWRpbmcgYXMgc3RhbmRhcmQgb3IgZXhwZXJpbWVudGFsIC0gaWYgZXhwZXJpbWVudGFsIGp1c3QgZHJvcCB0aHJvdWdoCmlmICggMCA9PT0gc3RyY21wKCBiYXNlbmFtZSggZGlybmFtZSggX19GSUxFX18gKSApLCAnemlwYnVkZHknICkgKSB7CgkKCS8vIExlZ2FjeSB6aXAuCglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8xJ10gKSAmJiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8xJ10gKSApIHsKCiAgICAgICAgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhbHRlcm5hdGl2ZV96aXBfMSddID0gMDsKICAgICAgICBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8yJ10gPSAwOwogICAgICAgIHBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkKCQkvKgoJCS8vIFVzZXIgZW5hYmxlZCBleHBlcmltZW50YWwgc28gbG9vayBmb3IgaXQgYW5kIGxvYWQgaXQgaXMgZm91bmQsIG90aGVyd2lzZSBsb2cKCQkkbGVnYWN5X3ppcGJ1ZGR5ID0gZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy96aXBidWRkeS9sZWdhY3kuemlwYnVkZHkucGhwJzsKCQlpZiAoIEBpc19yZWFkYWJsZSggJGxlZ2FjeV96aXBidWRkeSApICkgewoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBsZWdhY3kgemlwYnVkZHkuJyApOwoJCQlyZXF1aXJlX29uY2UoICRsZWdhY3lfemlwYnVkZHkgKTsKCQkJcmV0dXJuOwoJCQkKCQl9IGVsc2UgewoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnTGVnYWN5IFppcCBTeXN0ZW0gZW5hYmxlZCBidXQgbm90IGZvdW5kL3JlYWRhYmxlIGF0OiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJCRsZWdhY3lfemlwYnVkZHkgKSApOwoJCQkKCQkKCQl9CgkJKi8KCQoJfQoJCgkKCS8vIEN1cnJlbnRseSBsb2FkaW5nIGFzIHN0YW5kYXJkIHNvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGxvYWQgZXhwZXJpbWVudGFsCglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8yJ10gKSAmJiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcF8yJ10gKSApIHsKCQoJCS8vIFVzZXIgZW5hYmxlZCBleHBlcmltZW50YWwgc28gbG9vayBmb3IgaXQgYW5kIGxvYWQgaXQgaXMgZm91bmQsIG90aGVyd2lzZSBsb2cKCQkkZXhwZXJpbWVudGFsX3ppcGJ1ZGR5ID0gZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy94emlwYnVkZHkvemlwYnVkZHkucGhwJzsKCQlpZiAoIEBpc19yZWFkYWJsZSggJGV4cGVyaW1lbnRhbF96aXBidWRkeSApICkgewoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBleHBlcmltZW50YWwgemlwYnVkZHkuJyApOwoJCQlyZXF1aXJlX29uY2UoICRleHBlcmltZW50YWxfemlwYnVkZHkgKTsKCQkJCgkJfSBlbHNlIHsKCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnQWx0ZXJuYXRlIFppcCBTeXN0ZW0gZW5hYmxlZCBidXQgbm90IGZvdW5kL3JlYWRhYmxlIGF0OiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGV4cGVyaW1lbnRhbF96aXBidWRkeSApICk7CgoJCQoJCX0KCQoJfQoKfSAKCmlmICggIWNsYXNzX2V4aXN0cyggInBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IiApICkgewoKCWNsYXNzIHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IHsKCQoJCWNvbnN0IFpJUF9NRVRIT0RTX1RSQU5TSUVOVCA9ICdwYl9iYWNrdXBidWRkeV9hdmFpbF96aXBfbWV0aG9kcyc7CgkJY29uc3QgWklQX01FVEhPRFNfVFJBTlNJRU5UX0VYUEVSSU1FTlRBTCA9ICdwYl9iYWNrdXBidWRkeV9hdmFpbF94emlwX21ldGhvZHMnOwoJCWNvbnN0IFpJUF9NRVRIT0RTX1RSQU5TSUVOVF9MSUZFID0gNDMyMDA7IC8vIDEyIEhvdXJzIC0gcmVhbGx5IHNob3VsZG4ndCBjaGFuZ2UgdW5sZXNzIHNlcnZlciBwcm9ibGVtCgkJY29uc3QgTk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SID0gJy8nOwoJCWNvbnN0IERJUkVDVE9SWV9TRVBBUkFUT1JTID0gJy9cXCc7CgoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGx1Z2luIHBhdGggZm9yIHRoaXMgcGx1Z2luCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgJF9wbHVnaW5QYXRoID0gJyc7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwYXRoIG9mIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNyZWF0aW5nIGZpbGVzIGFuZCBzdHVmZgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfdGVtcGRpciA9ICIiOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsaXN0IG9mIHppcCBtZXRob2RzIHRoYXQgYXJlIHJlcXVlc3RlZCB0byBiZSB1c2VkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwcm90ZWN0ZWQgJF9yZXF1ZXN0ZWRfemlwX21ldGhvZHMgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbW9kZSB3aGljaCB0aGUgb2JqZWN0IGlzIGJlaW5nIGNyZWF0ZWQgZm9yCiAgICAgICAgICogTm90ZTogVGhpcyBpcyBub3cgaWdub3JlZCBhcyBhbiBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGZvciBib3RoIHppcCAmIHVuemlwIHNlcnZpY2VzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwcm90ZWN0ZWQgJF9tb2RlID0gIiI7CgogICAgICAgIC8qKgogICAgICAgICAqIFN0YXR1cyBtZXNzYWdlIGFycmF5IHVzZWQgd2hlbiBjYWxsaW5nIG90aGVyIG1ldGhvZHMgdG8gZ2V0IHN0YXR1cyBpbmZvcm1hdGlvbiBiYWNrCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgJF9zdGF0dXMgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGlzdCBvZiB6aXAgbWV0aG9kcyB0aGF0IGFyZSB0byBiZSB1c2VkIG9yIGFyZSBhdmFpbGFibGUKICAgICAgICAgKiBIYWQgdG8gbWFrZSB0aGlzIHB1YmxpYyBmb3Igbm93IGJlY2F1c2Ugc29tZXRoaW5nIGFjY2Vzc2VzIGl0IGRpcmVjdGx5IC0gYmFkIGthcm1hCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgJF96aXBfbWV0aG9kcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRldGFpbHMgb2YgdGhlIHZhcmlvdXMgemlwIG1ldGhvZHMgdGhhdCBhcmUgYXZhaWxhYmxlCiAgICAgICAgICogSGF2ZSB0byBtYWtlIHRoaXMgYSBzZXBhcmF0ZSBhcnJheSBpbmRleGVkIGJ5IHRoZSBtZXRob2QgdGFnLiBJZGVhbGx5IHdvdWxkIGJlIGNvbWJpbmVkCiAgICAgICAgICogd2l0aCB0aGUgemlwIG1ldGhvZHMgYXJyYXkgYnV0IHRoYXQgd291bGQgaW52b2x2ZSBtb3JlIGdlbmVyYWwgY2hhbmdlcyBlbHNld2hlcmUgc28gdGhhdAogICAgICAgICAqIHJlZmFjdG9yaW5nIGNhbiBiZSBkb25lIGxhdGVyIC0gbWFpbiBwcm9ibGVtIGlzIHRoZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSB6aXAgbWV0aG9kcwogICAgICAgICAqIGFycmF5IHRoYXQgaXMgbWFkZSByYXRoZXIgdGhhbiB0aHJvdWdoIGEgZnVuY3Rpb24uCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheSBvZiBhcnJheSBvZiBhcnJheQogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3ppcF9tZXRob2RzX2RldGFpbHMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsaXN0IG9mIHppcCBtZXRob2RzIHRoYXQgYXJlIHN1cHBvcnRlZCwgaS5lLiwgdGhlcmUgaXMgYSBzdXBwb3J0aW5nIGNsYXNzIGRlZmluZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3N1cHBvcnRlZF96aXBfbWV0aG9kcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3Qgd2UgYXJlIGZvcmNlIG92ZXJyaWRpbmcgemlwIG1ldGhvZCBjYWNoaW5nIGZvciB0aGlzIGluc3RhbmNlIG9mIHppcGJ1ZGR5CiAgICAgICAgICogCiAgICAgICAgICogQHZhciBib29sZWFuCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkID0gZmFsc2U7CgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHdlIGNhbiBjYWxsIGEgc3RhdHVzIGNhbGJhY2sKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9oYXZlX3N0YXR1c19jYWxsYmFjayA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIE9iamVjdC0+bWV0aG9kIGFycmF5IGZvciBzdGF0dXMgZnVuY3Rpb24KICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzX2NhbGxiYWNrID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGlyZWN0b3J5IG5hbWUgdGhhdCB3ZSBhcmUgbG9hZGVkIGZyb20gKG5vdDogbm90IHBhdGgpCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF93aGVyZWFtaSA9ICIiOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgd2UgYXJlIGxvYWRlZCBhcyB0aGUgZXhwZXJpbWVudGFsIHppcGJ1ZGR5CiAgICAgICAgICogCiAgICAgICAgICogQHZhciBib29sCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfaXNfZXhwZXJpbWVudGFsID0gZmFsc2U7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHppcCBtZXRob2RzIHRyYW5zaWVudCB3aWxsIGJlIGRlcGVuZGVudCBvbiBpZiB3ZSBhcmUgc3RhbmRhcmQgb3IgZXhwZXJpbWVudGFsCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF96aXBfbWV0aG9kc190cmFuc2llbnQgPSAiIjsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIFNlcnZlciBBUEkgdGhhdCBpcyBpbiB1c2UKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX3NhcGlfbmFtZSA9ICIiOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgV2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaWdub3JlX3dhcm5pbmdzCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9pZ25vcmVfd2FybmluZ3MgPSBudWxsOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBzeW1saW5rcyBzaG91bGQgYmUgaWdub3JlZC9ub3QtZm9sbG93ZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaWdub3JlX3N5bWxpbmtzCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9pZ25vcmVfc3ltbGlua3MgPSBudWxsOwoJCQogICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgY29tcHJlc3Npb24gc2hvdWwgZGJlIHVzZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgY29tcHJlc3Npb24JYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2NvbXByZXNzaW9uID0gbnVsbDsKCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfdHJhbnNpZW50X25hbWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIHRyYW5zaWVudCBuYW1lKHMpIHRoYXQgbWF5IGJlIGluIHVzZQoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIHRyYW5zaWVudCBuYW1lKHMpCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF90cmFuc2llbnRfbmFtZXNfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gYXJyYXkoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCwKCQkJCQkJICBzZWxmOjpaSVBfTUVUSE9EU19UUkFOU0lFTlRfRVhQRVJJTUVOVEFMICk7CgkJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0ZW1wX2RpcgkJVGhlIHBhdGggb2YgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlCgkJICoJQHBhcmFtCQlhcnJheQkJJHppcF9tZXRob2RzCU9wdGlvbmFsOiBUaGUgc2V0IG9mIHppcCBtZXRob2RzIHJlcXVlc3RlZCB0byB1c2UKCQkgKglAcGFyYW0JCXN0cmluZwkJJG1vZGUJCQlPcHRpb25hbDogVGhlIHppcCBtb2RlIGZvciB0aGUgb2JqZWN0IChpZ25vcmVkIGN1cnJlbnRseSAtIG1heSBiZSByZXVzZWQ/KQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHRlbXBfZGlyLCAkemlwX21ldGhvZHMgPSBhcnJheSgpLCAkbW9kZSA9ICd6aXAnICkgewoKCQkJLy8gTm9ybWFsaXplIHRoZSB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9yIG9uIHRoZSBwYXRoCgkJCSR0ZW1wX2RpciA9IHJ0cmltKCAkdGVtcF9kaXIsIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCQoJCQkvLyBOb3JtYWxpemUgcGxhdGZvcm0gc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgaW4gcGF0aAoJCQkkdGhpcy0+X3RlbXBkaXIgPSBzdHJfcmVwbGFjZSggRElSRUNUT1JZX1NFUEFSQVRPUiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLCAkdGVtcF9kaXIgKTsKCQkJCgkJCS8vIE5vdGU6IHRoaXMgd2lsbCBiZSByZW1vdmVkIGFuZCBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgLSBhbiBvYmplY3QgaXMgaW5zdGFudGlhdGVkIGZvcgoJCQkvLyBib3RoIHppcCAmIHVuemlwIHNlcnZpY2VzCgkJCSR0aGlzLT5fbW9kZSA9ICRtb2RlOwoJCQkKCQkJLy8gUmVjb3JkIHdoZXJlIHdlIGFyZSBsb2NhdGVkICh0aGUgZGlyZWN0b3J5IG5hbWUpCgkJCSR0aGlzLT5fd2hlcmVhbWkgPSBiYXNlbmFtZSggZGlybmFtZSggX19GSUxFX18gKSApOwoJCQkKCQkJLy8gVXNlIG91ciBsb2NhdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggemlwIG1ldGhvZHMgdHJhbnNpZW50IHdlIHNob3VsZCBiZSB1c2luZwoJCQkkdGhpcy0+X3ppcF9tZXRob2RzX3RyYW5zaWVudCA9ICggMCA9PT0gc3RyY21wKCAkdGhpcy0+X3doZXJlYW1pLCAnemlwYnVkZHknICkgKSA/IHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCA6IHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVF9FWFBFUklNRU5UQUwgOwoKCQkJLy8gU2V0IGEgZmxhZyBmb3IgZWFzeSBjb25kaXRpb25hbCB0ZXN0aW5nCgkJCSR0aGlzLT5faXNfZXhwZXJpbWVudGFsID0gKCAwID09PSBzdHJjbXAoICR0aGlzLT5fd2hlcmVhbWksICd6aXBidWRkeScgKSApID8gZmFsc2UgOiB0cnVlIDsKCgkJCS8vIFNldCB0aGUgc2FwaSBuYW1lIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIJCQkKCQkJJHRoaXMtPnNldF9zYXBpX25hbWUoKTsKCQkJCgkJCS8vIERlcml2ZSB3aGV0aGVyIHdlIGFyZSBpZ25vcmluZyBXYXJuaW5ncyBvciBub3QgKGNhbiBiZSBvdmVycmlkZGVuIGJ5IG1ldGhvZCBjYWxsKQoJCQkkdGhpcy0+c2V0X2lnbm9yZV93YXJuaW5ncygpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nL25vdC1mb2xsb3dpbmcgc3ltbGlua3Mgb3Igbm90IChjYW4gYmUgb3ZlcnJpZGRlbiBieSBtZXRob2QgY2FsbCkKCQkJJHRoaXMtPnNldF9pZ25vcmVfc3ltbGlua3MoKTsKCQkJCgkJCS8vIERlcml2ZSB3aGV0aGVyIGNvbXByZXNzaW9uIHNob3VsZCBiZSB1c2VkIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBtZXRob2QgY2FsbCkKCQkJJHRoaXMtPnNldF9jb21wcmVzc2lvbigpOwoJCQkJCQkKCQkJLy8gTWFrZSBzdXJlIHdlIGxvYWQgdGhlIGNvcmUgYWJzdHJhY3QgY2xhc3MgYXMgdGhpcyB3aWxsIGFsd2F5cyBiZSBuZWVkZWQKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliLycgLiAkdGhpcy0+X3doZXJlYW1pIC4gJy96YnppcGNvcmUucGhwJyApOwoJCQkKCQkJLy8gSWYgd2UgbG9hZGVkIHRoYXQgb2sgdGhlbiB0cnkgdGhlIG1ldGhvZCBzcGVjaWZpYyBjbGFzc2VzCgkJCS8vIENvdWxkIG1ha2UgdGhpcyBtb3JlIGdlbmVyaWMgYmFzZWQgb24gY29uZmlnIG9yIHNvbWVzdWNoCgkJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfemJ6aXBjb3JlJyApICkgewovLyAJCQkKLy8gCQkJCS8vIE9ubHkgcHJvdmlkZSBwcm9jIG1vZGUgd2hlbiBleHBlcmltZW50YWwgemlwIGVuYWJsZWQKLy8gCQkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPl9pc19leHBlcmltZW50YWwgKSB7Ci8vIAkJCQkKLy8gCQkJCQlpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvJyAuICR0aGlzLT5fd2hlcmVhbWkgLiAnL3piemlwcHJvYy5waHAnICk7Ci8vIAkJCQkJCi8vIAkJCQkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV96YnppcHByb2MnICkgKSB7Ci8vIAkJCQkJCi8vIAkJCQkJCWlmICggJHRoaXMtPmNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICdwbHVnaW5idWRkeV96YnppcHByb2MnICkgKSB7Ci8vIAkJCQkJCQovLyAJCQkJCQkJJHRoaXMtPnNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoIHBsdWdpbmJ1ZGR5X3piemlwcHJvYzo6Z2V0X21ldGhvZF90YWdfc3RhdGljKCkgKTsKLy8gCQkJCQkJCQovLyAJCQkJCQl9Ci8vIAkJCQkJCQovLyAJCQkJCX0KLy8gCQkJCQovLyAJCQkJfQovLyAJCQkJCgkJCQlpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvJyAuICR0aGlzLT5fd2hlcmVhbWkgLiAnL3piemlwZXhlYy5waHAnICk7CgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3piemlwZXhlYycgKSApIHsKCQkJCQoJCQkJCWlmICggJHRoaXMtPmNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICdwbHVnaW5idWRkeV96YnppcGV4ZWMnICkgKSB7CgkJCQkJCgkJCQkJCSR0aGlzLT5zZXRfc3VwcG9ydGVkX3ppcF9tZXRob2RzKCBwbHVnaW5idWRkeV96YnppcGV4ZWM6OmdldF9tZXRob2RfdGFnX3N0YXRpYygpICk7CgkJCQkJCQoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJCWluY2x1ZGVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi8nIC4gJHRoaXMtPl93aGVyZWFtaSAuICcvemJ6aXB6aXBhcmNoaXZlLnBocCcgKTsKCQkJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlJyApICkgewoJCQkJCgkJCQkJaWYgKCAkdGhpcy0+Y2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llcyggJ3BsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZScgKSApIHsKCQkJCQkKCQkJCQkJJHRoaXMtPnNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoIHBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZTo6Z2V0X21ldGhvZF90YWdfc3RhdGljKCkgKTsKCQkJCQkJCgkJCQkJfQoKCQkJCX0KCQkJCQoJCQkJaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliLycgLiAkdGhpcy0+X3doZXJlYW1pIC4gJy96YnppcHBjbHppcC5waHAnICk7CgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3piemlwcGNsemlwJyApICkgewoJCQkJCgkJCQkJaWYgKCAkdGhpcy0+Y2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llcyggJ3BsdWdpbmJ1ZGR5X3piemlwcGNsemlwJyApICkgewoJCQkJCQoJCQkJCQkkdGhpcy0+c2V0X3N1cHBvcnRlZF96aXBfbWV0aG9kcyggcGx1Z2luYnVkZHlfemJ6aXBwY2x6aXA6OmdldF9tZXRob2RfdGFnX3N0YXRpYygpICk7CgkJCQkJCQoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJfQoJCQkKIAkJCS8vIFdvcmsgb3V0IHRoZSBsaXN0IG9mIHppcCBtZXRob2RzIGZyb20gdGhlIHJlcXVlc3RlZCBhbmQgYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlaXIgZGV0YWlscwoJCQkkdGhpcy0+c2V0X3ppcF9tZXRob2RzKCAkemlwX21ldGhvZHMgKTsKCQkJCgkJfQoJCQoJCQoJCS8qKgoJCSAqCV9fZGVzdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgZGVzdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCggKSB7CgoJCX0KCQkKCQkvKioKCQkgKglzZXRfc2FwaV9uYW1lKCkKCQkgKgoJCSAqCVNldHMgdGhlIHNhcGkgbmFtZSB0byB0aGF0IGdpdmVuIG9yIHJldHJpZXZlcyBmcm9tIFBIUAoJCSAqCVRPRE86IEV4dGVuZCB0byBhbHNvIHNldCBhIHNhcGkgaWQgY29uc3RhbnQgYmFzZWQgb24gdGhlIG5hbWU/CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCSRuYW1lCUEgc2FwaSBuYW1lIHRvIHNldCAoZGVmYXVsdCBlbXB0eSkKCQkgKglAcmV0dXJuCW9iamVjdAkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zYXBpX25hbWUoICRzYXBpX25hbWUgPSAiIiApIHsKCQkKCQkJaWYgKCBlbXB0eSggJHNhcGlfbmFtZSApICkgewoJCQkJCgkJCQkkc2FwaV9uYW1lID0gcGhwX3NhcGlfbmFtZSgpOwoJCQkJCgkJCX0KCQkJCgkJCSR0aGlzLT5fc2FwaV9uYW1lID0gJHNhcGlfbmFtZTsKCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCgkJfQoKCQkvKioKCQkgKglnZXRfc2FwaV9uYW1lKCkKCQkgKgoJCSAqCVJldHVybnMgdGhlIHByZXZpb3VzbHkgc2V0IHNhcGkgbmFtZQoJCSAqCgkJICoJQHJldHVybglzdHJpbmcJCQlUaGUgc3RvcmVkIHNhcGkgbmFtZQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2FwaV9uYW1lKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5fc2FwaV9uYW1lOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWRlcml2ZV9vcHRpb25hbF9ib29sKCkKCQkgKgoJCSAqCVV0aWxpdHkgZnVuY3Rpb24gdG8gZGVyaXZlIHRoZSB2YWx1ZSBvZiBhbiBvcHRpb25hbCBib29sZWFuIGZsYWcgYmFzZWQgb24gZWl0aGVyCgkJICoJYSBzcGVjaWZjIHZhbHVlIGJlaW5nIGdpdmVuIG9yIHRoZSByZWxhdGVkIGdsb2JhbCBvcHRpb24gYmVpbmcgc2V0IG9yIGEgZ2l2ZW4KCQkgKglkZWZhdXRsIHZhbHVlIG90aGVyaXNlLiBJZiB0aGUgcHJvdmlkZWQgJHZhbHVlIGlzIG51bGwgdGhlbiB0aGlzIGZvcmNlcyB0aGUgdXNlCgkJICoJb2YgdGhlIGdsb2JhbCBvcHRpb24gaWYgaXQgaXMgc2V0IG9yIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZSBnaXZlbgoJCSAqCgkJICoJQHBhcmFtCQlzdHJpbmcJCSRvcHRpb24JCVRoZSBvcHRpb24gbmFtZSBpbiB0aGUgZ2xvYmFsIG9wdGlvbnMgYXJyYXkKCQkgKglAcGFyYW0JCWJvb2wJCSR2YWx1ZQkJU2hvdWxkIGJlIGJvb2wgdHJ1ZXxmYWxzZSBidXQgY291bGQgYmUgbnVsbAoJCSAqCUByZXR1cm4JCWJvb2wJCVZhbHVlIG9mICRfaWdub3JlX3dhcm5pbmdzCgkJICoKCQkgKi8KCQkgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlcml2ZV9vcHRpb25hbF9ib29sKCAkb3B0aW9uLCAkdmFsdWUsICRkZWZhdWx0ICkgewoJCSAJJHJlc3VsdCA9IGZhbHNlOwoJCSAJaWYgKCBpc19ib29sKCAkdmFsdWUgKSkgewoJCSAJCSRyZXN1bHQgPSAkdmFsdWU7CgkJIAl9IGVsc2VpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICRvcHRpb24gXSApICkgewoJCSAJCSggKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICRvcHRpb24gXSA9PSAnMScgKSB8fCAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sgJG9wdGlvbiBdID09IHRydWUgKSApID8gJHJlc3VsdCA9IHRydWUgOiAkcmVzdWx0ID0gZmFsc2UgOwoJCSAJfSBlbHNlIHsKCQkgCQkkcmVzdWx0ID0gJGRlZmF1bHQ7CgkJIAl9CgkJIAlyZXR1cm4gJHJlc3VsdDsKCQkgfQoJCSAKCQkvKioKCQkgKglzZXRfaWdub3JlX3dhcm5pbmdzKCkKCQkgKgoJCSAqCUBwYXJhbQltaXhlZAkkaWdub3JlCQl0cnVlfGZhbHNlIGZvciBzcGVjaWZpYyBzZXR0aW5nIG9yIG51bGwgZm9yIGNob2ljZQkKCQkgKglAcmV0dXJuCW9iamVjdAkJCQlUaGlzIG9iamVjdAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfaWdub3JlX3dhcm5pbmdzKCAkaWdub3JlID0gbnVsbCApIHsKCQkKCQkgCSR0aGlzLT5faWdub3JlX3dhcm5pbmdzID0gJHRoaXMtPmRlcml2ZV9vcHRpb25hbF9ib29sKCAnaWdub3JlX3ppcF93YXJuaW5ncycsICRpZ25vcmUsIGZhbHNlICk7CgkJIAkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWdldF9pZ25vcmVfd2FybmluZ3MoKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgaWdub3JlIHdhcm5pbmdzIGZsYWcKCQkgKgoJCSAqCUByZXR1cm4JbWl4ZWQJCQlUaGUgc3RvcmVkIGlnbm9yZSB3YXJuaW5ncyBmbGFnIHRydWV8ZmFsc2V8bnVsbAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfaWdub3JlX3dhcm5pbmdzKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5faWdub3JlX3dhcm5pbmdzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9pZ25vcmVfc3ltbGlua3MoKQoJCSAqCgkJICoJQHBhcmFtCW1peGVkCSRpZ25vcmUJCXRydWV8ZmFsc2UgZm9yIHNwZWNpZmljIHNldHRpbmcgb3IgbnVsbCBmb3IgY2hvaWNlCQoJCSAqCUByZXR1cm4Jb2JqZWN0CQkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9pZ25vcmVfc3ltbGlua3MoICRpZ25vcmUgPSBudWxsICkgewoJCQoJCSAJJHRoaXMtPl9pZ25vcmVfc3ltbGlua3MgPSAkdGhpcy0+ZGVyaXZlX29wdGlvbmFsX2Jvb2woICdpZ25vcmVfemlwX3N5bWxpbmtzJywgJGlnbm9yZSwgdHJ1ZSApOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWdldF9pZ25vcmVfc3ltbGlua3MoKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgaWdub3JlIHN5bWxpbmtzIGZsYWcKCQkgKgoJCSAqCUByZXR1cm4JbWl4ZWQJCQlUaGUgc3RvcmVkIGlnbm9yZSBzeW1saW5rcyBmbGFnIHRydWV8ZmFsc2V8bnVsbAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfaWdub3JlX3N5bWxpbmtzKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5faWdub3JlX3N5bWxpbmtzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9jb21wcmVzc2lvbigpCgkJICoKCQkgKglAcGFyYW0JbWl4ZWQJJGNvbXByZXNzaW9uCXRydWV8ZmFsc2UgZm9yIHNwZWNpZmljIHNldHRpbmcgb3IgbnVsbCBmb3IgY2hvaWNlCQoJCSAqCUByZXR1cm4Jb2JqZWN0CQkJCQlUaGlzIG9iamVjdAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tcHJlc3Npb24oICRjb21wcmVzc2lvbiA9IG51bGwgKSB7CgkJCgkJIAkkdGhpcy0+X2NvbXByZXNzaW9uID0gJHRoaXMtPmRlcml2ZV9vcHRpb25hbF9ib29sKCAnY29tcHJlc3Npb24nLCAkY29tcHJlc3Npb24sIHRydWUgKTsKCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCgkJfQoKCQkvKioKCQkgKglnZXRfY29tcHJlc3Npb24oKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgY29tcHJlc3Npb24gZmxhZwoJCSAqCgkJICoJQHJldHVybgltaXhlZAkJCVRoZSBzdG9yZWQgY29tcHJlc3Npb24gZmxhZyB0cnVlfGZhbHNlfG51bGwKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbXByZXNzaW9uKCkgewoJCQkKCQkJcmV0dXJuICR0aGlzLT5fY29tcHJlc3Npb247CgkJCQoJCX0KCgkJLyoqCgkJICoJc2V0X3N1cHBvcnRlZF96aXBfbWV0aG9kcygpCgkJICoKCQkgKglBcHBlbmRzIG9yIHByZXBlbmRzIHRoZSBtZXRob2Qgb3IgbWV0aG9kcyBwYXNzZWQgdG8gdGhlIGV4aXN0aW5nIHN1cHBvcnRlZCBtZXRob2RzIGFycmF5CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nL2FycmF5CSRtZXRob2RzCUVpdGhlciBhIChjb21tYSBzZXBhcmF0ZWQpIHN0cmluZyBvZiBtZXRob2RzIG9yIGFuIGFycmF5CgkJICoJQHBhcmFtCWJvb2wJCQkkYXBwZW5kCQlUcnVlIGlmICRtZXRob2RzIHNob3VsZCBiZSBhcHBlbmRlZCB0byBleGlzdGluZyBzdXBwb3J0ZWQgbWV0aG9kcwoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCVRydWUgaWYgc2V0IHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIGZhbHNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoICRtZXRob2RzLCAkYXBwZW5kID0gdHJ1ZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQoJCQkvLyBJZiAkbWV0aG9kcyBpcyBhIHN0cmluZyB3ZSBuZWVkIHRvIHR1cm4gaXQgaW50byBhbiBhcnJheSAob2Ygb25lIG9yIG1vcmUgZWxlbWVudHMpIG9yCgkJCS8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYW4gYXJyYXkgYWxyZWFkeSAoYnV0IHdlIGRvdWJsZSBjaGVjayBpbiBhIG1vKQoJCQkoIGlzX3N0cmluZyggJG1ldGhvZHMgKSApID8gJG1ldGhvZHNfdG9fYWRkID0gZXhwbG9kZSggIiwiLCAkbWV0aG9kcyApIDogJG1ldGhvZHNfdG9fYWRkID0gJG1ldGhvZHM7CgoJCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBhcnJheSBhbmQgaWYgc28gdGhlbiBlaXRoZXIgYXBwZW5kIG9yIHByZXBlbmQgdG8gZXhpc3Rpbmcgc3VwcG9ydGVkIG1ldGhvZHMKCQkJaWYgKCBpc19hcnJheSggJG1ldGhvZHNfdG9fYWRkICkgKSB7CgkJCQoJCQkJKCAkYXBwZW5kICkgPyAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcywgJG1ldGhvZHNfdG9fYWRkICkgOgoJCQkJCQkJICAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcyA9IGFycmF5X21lcmdlKCAkbWV0aG9kc190b19hZGQsICR0aGlzLT5fc3VwcG9ydGVkX3ppcF9tZXRob2RzICk7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CQkJCgkJCQoJCQl9CgkJCQoJCQkvLyBXaWxsIHJldHVybiBmYWxzZSBpZiB3ZSBzb21laG93IGRpZG4ndCBlbmQgdXAgd2l0aCBhbiBhcnJheSB0byBtZXJnZQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkJCgkJLyoqCgkJICoJY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llcygpCgkJICoKCQkgKglDaGVja3MgdGhlIGRlcGVuZGVuY2llcyB0aGF0IGEgbWV0aG9kIGRlZmluZXMgZm9yIGl0c2VsZiAtIHRoaXMgbWF5IG9wdGlvbmFsbHkgYWxzbyBtZWFuCgkJICoJY2FsbGluZyBhIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRoZSBtZXRob2QgdG8gYWRkIGl0J3Mgb3duIHZlcnkgc3BlY2lmaWMgY2hlY2tzCgkJICoJYmV5b25kIHRob3NlIHRoYXQgYXJlIHJ1biBhcyBzdGFuZGFyZC4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRjbGFzc19uYW1lCQlUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2hlY2ssIG5lZWRlZCBiZWNhdXNlIHRoaXMgaXMgc3RhdGljIGNoZWNraW5nCgkJICoJQHJldHVybglib29sCQkJCQkJVHJ1ZSBpZiBkZXBlbmRlbmN5IGNoZWNrIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIGZhbHNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICRjbGFzc19uYW1lICkgewoJCQoJCQkvLyBBc3N1bWUgZGVwZW5kZW5jeSBjaGVja3Mgd2lsbCBwYXNzIC0gd2lsbCBiZSBzZXQgZmFsc2UgaWYgYSBjaGVjayBmYWlscwoJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCgkJCWlmICggIW1ldGhvZF9leGlzdHMoICRjbGFzc19uYW1lLCAnZ2V0X21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljJyApICkgewoJCQkKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCX0gZWxzZSB7CgkJCgkJCQkkbWV0aG9kX2RlcGVuZGVuY2llcyA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJGNsYXNzX25hbWUsICdnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnICkgKTsKCQkJCQoJCQl9CgkJCQoJCQlpZiAoICggJHJlc3VsdCApICYmIGlzc2V0KCAkbWV0aG9kX2RlcGVuZGVuY2llc1sgJ2NsYXNzZXMnIF0gKSAmJiAhZW1wdHkoICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnY2xhc3NlcycgXSApICkgewoJCQkKCQkJCSRjbGFzc2VzID0gJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjbGFzc2VzJyBdOwoJCQkKCQkJCSRkaXNhYmxlZF9jbGFzc2VzID0gYXJyYXlfbWFwKCAidHJpbSIsIGV4cGxvZGUoICcsJywgaW5pX2dldCggJ2Rpc2FibGVfY2xhc3NlcycgKSApICk7CgkJCQkKCQkJCS8vIENoZWNrIGVhY2ggZnVuY3Rpb24gZGVwZW5kZW5jeSBhbmQgYmFpbCBvdXQgb24gZmlyc3QgZmFpbHVyZQoJCQkJZm9yZWFjaCAoICRjbGFzc2VzIGFzICRjbGFzcyApIHsKCQkJCQoJCQkJCSRjbGFzcyA9IHRyaW0oICRjbGFzcyApOwoJCQkJCQoJCQkJCWlmICggISggKCBjbGFzc19leGlzdHMoICRjbGFzcyApICkgJiYgKCAhaW5fYXJyYXkoICRjbGFzcywgJGRpc2FibGVkX2NsYXNzZXMgKSApICkgKSB7CgoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKCAoICRyZXN1bHQgKSAmJiBpc3NldCggJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdmdW5jdGlvbnMnIF0gKSAmJiAhZW1wdHkoICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnZnVuY3Rpb25zJyBdICkgKSB7CgkJCQoJCQkJJGZ1bmN0aW9ucyA9ICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnZnVuY3Rpb25zJyBdOwoJCQkJCgkJCQkkZGlzYWJsZWRfZnVuY3Rpb25zID0gYXJyYXlfbWFwKCAidHJpbSIsIGV4cGxvZGUoICcsJywgaW5pX2dldCggJ2Rpc2FibGVfZnVuY3Rpb25zJyApICkgKTsKCQkJCQoJCQkJLy8gQ2hlY2sgZWFjaCBmdW5jdGlvbiBkZXBlbmRlbmN5IGFuZCBiYWlsIG91dCBvbiBmaXJzdCBmYWlsdXJlCgkJCQlmb3JlYWNoICggJGZ1bmN0aW9ucyBhcyAkZnVuY3Rpb24gKSB7CgkJCQkKCQkJCQkkZnVuY3Rpb24gPSB0cmltKCAkZnVuY3Rpb24gKTsKCQkJCQkKCQkJCQlpZiAoICEoICggZnVuY3Rpb25fZXhpc3RzKCAkZnVuY3Rpb24gKSApICYmICggIWluX2FycmF5KCAkZnVuY3Rpb24sICRkaXNhYmxlZF9mdW5jdGlvbnMgKSApICkgKSB7CgoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCS8vIE5vIGV4dGVuc2lvbiBjaGVja3MgeWV0CgkJCQoJCQkvLyBObyBmaWxlIGNoZWNrcyB5ZXQgKG5lZWQgdG8gZGV0ZXJtaW5lIGhvdyB0aGlzIG1pZ2h0IHdvcmsgYSBiaXQgYmV0dGVyKQoJCQkKCQkJaWYgKCAoICRyZXN1bHQgKSAmJiBpc3NldCggJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjaGVja19mdW5jJyBdICkgJiYgIWVtcHR5KCAkbWV0aG9kX2RlcGVuZGVuY2llc1sgJ2NoZWNrX2Z1bmMnIF0gKSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gY2FsbF91c2VyX2Z1bmMoIGFycmF5KCAkY2xhc3NfbmFtZSwgJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjaGVja19mdW5jJyBdICkgKTsKCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkJCgkJLyoqCgkJICoJZGVkdWNlX3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBhcnJheSBvZiB6aXAgbWV0aG9kcyB0aGF0IGFyZSBhdmFpbGFibGUgKG9yIGp1c3QgdGhlIGJlc3QpIGZpbHRlcmVkIGJ5IHJlcXVlc3RlZCBtZXRob2RzLgoJCSAqCUJlY2F1c2UgdGhlIGF2YWlsYWJsZSBtZXRob2RzIGRvbid0IHJlYWxseSBjaGFuZ2Ugb2Z0ZW4gKHJhcmVseSBvbmNlIHN0YWJsZSkgd2UgdXNlIGEgdHJhbnNpZW50CgkJICoJd2hpY2ggaGFzIHNvbWUgZGVmaW5lZCBsaWZldGltZSBzbyB3ZSBkb24ndCB3YXN0ZSB0aW1lIHJlcGVhdGluZyB0aGUgdGVzdGluZyB3aGljaCBpbnZvbHZlcyBjcmVhdGluZwoJCSAqCW9iamVjdHMgYW5kIHByb2Nlc3NlcyBhbmQgZmlsZXMgd2hpY2ggY2FuIGJlIHRpbWUgY29uc3VtaW5nLgoJCSAqCVRoZSB1c2luZyBzY3JpcHQgY2FuIGRlY2lkZSB0byBoYXZlIHRoZSB0cmFuc2llbnQgcmVmcmVzaGVkIGJ5IGRlbGV0aW5nIGl0IGFuZCB0aGVuIGl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQuCgkJICoJTm90ZTogVGhlcmUgaXMgYW4gaW5jbHVkZWQgInNpZ25hdHVyZSIgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHNlcnZlciBvciBvdGhlciBtb3ZlcyBhbmQgcmVnZW5lcmF0ZS4KCQkgKglOb3RlOiBmaWxlbXRpbWUoKSBpcyB1c2VkIGJlY2F1c2UgdGhpcyB3aWxsIChzaG91bGQpIGZvcmNlIHRoZSB0cmFuc2llbnQgdG8gdXBkYXRlIGlmIHRoZSBwbHVnaW4gaXMKCQkgKgl1cGRhdGVkIGJlY2F1c2UgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUgd2lsbCBjaGFuZ2UgYmVjYXVzZSB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZCBpbiBhCgkJICoJZGlmZmVyZW50IGRpc2sgbG9jYXRpb24gd2l0aCBuZXdseSB3cml0dGVuIGZpbGVzIC0gdGhlIHNhbWUgc2hvdWxkIGFwcGx5IGlmIHRoZSBzaXRlIGlzIHJlc3RvcmVkL21pZ3JhdGVkLgoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJQXJyYXkgcmVmZXJlbmNlIGZvciB0aGUgZGVkdWNlZCB6aXAgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYXJyYXkJQXJyeSByZWZlcmVuY2UgZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBkZWR1Y2VkIG1ldGhvZHMKCQkgKglAcGFyYW0JCWFycmF5CUZsYXQgYXJyYXkgb2YgcmVxdWVzdGVkIChwcmVmZXJyZWQpIHppcCBtZXRob2RzCgkJICoJQHBhcmFtCQlib29sCVRydWUgaWYgb25seSB0aGUgYmVzdCBhdmFpbGFibGUgbWV0aG9kIHdhbnRlZAoJCSAqCUBwYXJhbQkJc3RyaW5nCVdoaWNoIHppcCBtb2RlIGJlaW5nIHRlc3RlZAoJCSAqCUByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBtZXRob2RzIGFyZSBhdmFpbGFibGUsIEZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGRlZHVjZV96aXBfbWV0aG9kcyggYXJyYXkgJiRtZXRob2RzLCBhcnJheSAmJG1ldGhvZHNfZGV0YWlscywgYXJyYXkgJHJlcXVlc3RlZCwgJGJlc3Rfb25seSApIHsKCQkJCgkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGFycmF5KCk7CgkJCSRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzID0gYXJyYXkoKTsKCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kcyA9IGFycmF5KCk7CgkJCSRzZXJ2ZXJfc2lnbmF0dXJlX3N0cmluZyA9ICIiOwoJCQkkc2VydmVyX3NpZ25hdHVyZSA9ICIiOwoKCQkJLy8gRGVjaWRlIGlmIHdlIHNob3VsZCB0cnkgZm9yIGNhY2hlZCBtZXRob2RzIG9yIG5vdAkJCQoJCQlpZiAoICR0aGlzLT51c2VfY2FjaGVkX21ldGhvZHMoKSApIHsKCgkJCQkkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzID0gZ2V0X3RyYW5zaWVudCggJHRoaXMtPl96aXBfbWV0aG9kc190cmFuc2llbnQgKTsKCQkJCQoJCQkJLy8gRHJvcCB0aHJvdWdoIGlmIHdlIGRpZG4ndCBnZXQgYSB0cmFuc2llbnQgb3RoZXJ3aXNlIHdlJ2xsIHRlc3QgaXQgZm9yIHZhbGlkaXR5CgkJCQlpZiAoIGZhbHNlICE9PSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzICkgewoJCQkJCgkJCQkJLy8gR2VuZXJhdGUgc2VydmVyIHNpZ25hdHVyZSBhbmQgY2hlY2sgaXQgbWF0Y2hlcyB0aGUgY2FjaGVkIHNpZ25hdHVyZQoJCQkJCSRzZXJ2ZXJfc2lnbmF0dXJlX3N0cmluZyA9IF9fRklMRV9fIC4gIiA6ICIgLiAoICggJGZpbGVtb2R0aW1lID0gZmlsZW10aW1lKCBfX0ZJTEVfXyApICkgPyAoc3RyaW5nKSAkZmlsZW1vZHRpbWUgOiAnMScgKTsKCQkJCQkkc2VydmVyX3NpZ25hdHVyZSA9IG1kNSggJHNlcnZlcl9zaWduYXR1cmVfc3RyaW5nICk7CgkJCQkJCgkJCQkJaWYgKCAoIGZhbHNlID09PSBpc3NldCggJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kc1sgJ2NvbnRyb2wnIF1bICdzaWduYXR1cmUnIF0gKSApIHx8CgkJCQkJCSAoICRzZXJ2ZXJfc2lnbmF0dXJlICE9PSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnY29udHJvbCcgXVsgJ3NpZ25hdHVyZScgXSApICkgewoKCQkJCQkJLy8gRWl0aGVyIG5vIHNpZ25hdHVyZSBwcmV2aW91c2x5IHNldCBvciBpdCBoYXMgY2hhbmdlZCAtIGVpdGhlciB3YXkgd2UgbmVlZCB0byByZWV2YWx1YXRlIGF2YWlsYWJsZSBtZXRob2RzCgkJCQkJCSRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHMgPSBmYWxzZTsKCQkJCQkJIAoJCQkJCX0KCQkJCQoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdaaXAgbWV0aG9kIGNhY2hpbmcgZGlzYWJsZWQgYmFzZWQgb24gc2V0dGluZ3Mgb3IgdW5hdmFpbGFibGUuJyApOwoJCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kcyA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIENyZWF0ZSBuZXcgdHJhbnNpZW50IGlmIHdlIGRpZG4ndCBoYXZlIG9uZSwgaXQgd2FzIGV4cGlyZWQgb3Igd2UgbnVrZWQgaXQgYmVjYXVzZSBpbnZhbGlkCgkJCWlmICggZmFsc2UgPT09ICRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHMgKSB7CgoJCQkJLy8gR2V0IGFsbCBhdmFpbGFibGUgbWV0aG9kcyBpbiAkYXZhaWxhYmxlX21ldGhvZHMgLSBtdXN0IHJldHVybiB0aGVtIGluIG9yZGVyIGJlc3QgLT4gd29yc3QKCQkJCS8vIEFsc28gZ2V0dGluZyB0aGUgbWV0aG9kIGRldGFpbHMgYXJyYXkgd2hpY2ggaXMga2V5ZWQgYnkgbWV0aG9kIHRhZwoJCQkJJHRoaXMtPmdldF9hdmFpbGFibGVfemlwX21ldGhvZHMoICR0aGlzLT5fc3VwcG9ydGVkX3ppcF9tZXRob2RzLCAkYXZhaWxhYmxlX21ldGhvZHMsICRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzICk7CgkJCQkKCQkJCS8vIE5vdyB3ZSBoYXZlIHRvIGNvbWJpbmUgdGhlIHR3byBhcnJheXMgaW50byBhbiBhZ2dyZWdhdGUgdG8gc2F2ZQoJCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kc1sgJ21ldGhvZHMnIF0gPSAkYXZhaWxhYmxlX21ldGhvZHM7CgkJCQkkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnZGV0YWlscycgXSA9ICRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzOwoJCQkJCgkJCQkvLyBPbmx5IHNhdmUgaWYgd2UgYXJlIHVzaW5nIGNhY2hpbmcKCQkJCWlmICggJHRoaXMtPnVzZV9jYWNoZWRfbWV0aG9kcygpICkgewoJCQkJCgkJCQkJLy8gQWRkIHRoZSBzZXJ2ZXIgc2lnbmF0dXJlIGZvciBkZXRlY3RpbmcgaW52YWxpZGF0ZWQgbWV0aG9kcyBkZXRhaWxzIG9uIGEgbWlncmF0aW9uIG9yIHNvbWUgb3RoZXIgY2hhbmdlCgkJCQkJLy8gTm90ZTogU2VlIGRpc2N1c3Npb24gYWJvdmUgb24gZGVyaXZhdGlvbiBvZiBzaWduYXR1cmUKCQkJCQkvLyBUT0RPOiBDaGVjaywgcHJvYmFibHkgY2FuIHVzZSB0aGUgc2VydmVyIHNpZ25hdHVyZSBjYWxjdWxhdGVkIGFib3ZlCgkJCQkJJHNlcnZlcl9zaWduYXR1cmVfc3RyaW5nID0gX19GSUxFX18gLiAiIDogIiAuICggKCAkZmlsZW1vZHRpbWUgPSBmaWxlbXRpbWUoIF9fRklMRV9fICkgKSA/IChzdHJpbmcpICRmaWxlbW9kdGltZSA6ICcxJyApOwoJCQkJCSRzZXJ2ZXJfc2lnbmF0dXJlID0gbWQ1KCAkc2VydmVyX3NpZ25hdHVyZV9zdHJpbmcgKTsKCQkJCQkkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnY29udHJvbCcgXVsgJ3NpZ25hdHVyZScgXSA9ICRzZXJ2ZXJfc2lnbmF0dXJlOwoJCQkJCQoJCQkJCXNldF90cmFuc2llbnQoICR0aGlzLT5femlwX21ldGhvZHNfdHJhbnNpZW50LCAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzLCBzZWxmOjpaSVBfTUVUSE9EU19UUkFOU0lFTlRfTElGRSApOwoJCQkJCQoJCQkJfQoJCQkJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gV2UgZ290IGEgdmFsaWQgdHJhbnNpZW50IHZhbHVlIHNvIG5vdyBzZXBhcmF0ZSB0aGUgYWdncmVnYXRlIGludG8gdHdvCgkJCQkkYXZhaWxhYmxlX21ldGhvZHMgPSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnbWV0aG9kcycgXTsKCQkJCSRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzID0gJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kc1sgJ2RldGFpbHMnIF07CgkJCQoJCQl9CgkJCQoJCQkvLyBDaGVjayB3aGV0aGVyIHRoZXNlIG5lZWQgdG8gYmUgZmlsdGVyZWQgYnkgcmVxdWVzdGVkIG1ldGhvZHMKCQkJaWYgKCAhZW1wdHkoICRyZXF1ZXN0ZWQgKSApIHsKCQkJCgkJCQkvLyBGaWx0ZXIgdGhlIGF2YWlsYWJsZSBtZXRob2RzIC0gcmVzdWx0IGNvdWxkIGJlIGVtcHR5CgkJCQkvLyBPcmRlciB3aWxsIGJlIHJldGFpbmVkIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIgb2YgcmVxdWVzdGVkIG1ldGhvZHMKCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGFycmF5X2ludGVyc2VjdCggJGF2YWlsYWJsZV9tZXRob2RzLCAkcmVxdWVzdGVkICk7CgkJCQkKCQkJfQoKCQkJLy8gSWYganVzdCB0aGUgYmVzdCBhdmFpbGFibGUgcmVxdWVzdGVkIHRoZW4gc2xpY2UgaXQgb2ZmCgkJCWlmICggKCB0cnVlID09PSAkYmVzdF9vbmx5ICkgJiYgKCAhZW1wdHkoICRhdmFpbGFibGVfbWV0aG9kcyApICkgKSB7CgkJCQoJCQkJJG1ldGhvZHMgPSBhcnJheV9zbGljZSggJGF2YWlsYWJsZV9tZXRob2RzLCAwLCAxICk7CgkJCQkkbWV0aG9kc19kZXRhaWxzID0gJGF2YWlsYWJsZV9tZXRob2RzX2RldGFpbHM7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkbWV0aG9kcyA9ICRhdmFpbGFibGVfbWV0aG9kczsKCQkJCSRtZXRob2RzX2RldGFpbHMgPSAkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlsczsKCQkJCgkJCX0KCQkJCgkJCWlmICggIWVtcHR5KCAkbWV0aG9kcyApICkgewoJCQkKCQkJCXJldHVybiB0cnVlOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkKCQl9CgkJCQkKCQkvKioKCQkgKglzZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCkKCQkgKgkKCQkgKglTZXQgd2hldGhlciBvciBub3QgemlwIG1ldGhvZCBjYWNoaW5nIHNob3VsZCBiZSBmb3JjZSBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB6aXBidWRkeQoJCSAqCQoJCSAqCUBwYXJhbQkJYm9vbAkkZGlzYWJsZWQJT3B0aW9uYWw6IFRydWUgdG8gZGlzYWJsZTsgZmFsc2UgKGRlZmF1bHQpIHRvIG5vdCBkaXNhYmxlCgkJICoJQHJldHVybgkJb2JqZWN0CQkJCVRoaXMgb2JqZWN0CgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X3ppcF9tZXRob2RfY2FjaGluZ19mb3JjZV9kaXNhYmxlZCggJGRpc2FibGVkID0gZmFsc2UgKSB7CgkJCgkJCSR0aGlzLT5femlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkID0gJGRpc2FibGVkOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBib29sZWFuIG9mIHdoZXRoZXIgemlwIG1ldGhkIGNhY2hpbmcgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgemlwYnVkZHkgaXMgZGlzYWJsZWQgb3Igbm90CgkJICoJCgkJICoJQHJldHVybgkJYm9vbGVhbgkJVHJ1ZSBpZiBjYWNoaW5nIGZvcmNlIGRpc2FibGVkLCBGYWxzZSBpZiBub3QKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl96aXBfbWV0aG9kX2NhY2hpbmdfZm9yY2VfZGlzYWJsZWQ7CgkJCgkJfQoJCQkJCgkJLyoqCgkJICoJdXNlX2NhY2hlZF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHdoZXRoZXIgY29uZGl0aW9ucy9jb25maWd1cmF0aW9uIGluZGljYXRlIGNhY2hlZCBtZXRob2RzIHNob3VsZCBiZSB1c2VkCgkJICoJTm90ZTogVGVtcG9yYXJpbHkgYWRkIHRoZSBjb25kaXRpb24gZm9yIHdoZXRoZXIgZ2V0Xy9zZXRfdHJhbnNpZW50IGZ1bmN0aW9ucwoJCSAqCWV4aXN0IC0gaWYgbm90IChtZWFuaW5nIHdlIGFyZSBwcm9iYWJseSBydW5uaW5nIHVuZGVyIGltcG9ydGJ1ZGR5KSB0aGVuIHdlIGFsc28KCQkgKglza2lwIGNhY2hpbmcuIFRoaXMgYWRkcyBhIGxpdHRsZSB0aW1lIHdoZW4gaW5zdGFudGlhdGluZyBiZWNhdXNlIHdlIGhhdmUgdG8gdGVzdAoJCSAqCWV2ZXJ5IHRpbWUgYnV0IGl0J3MgYWNjZXB0YWJsZSBmb3Igbm93LiBJbiB0aGUgbG9uZ2VyIHRlcm0gd2Ugd2lsbCBoYXZlIGFuCgkJICoJYWx0ZXJuYXRpdmUgd2F5IHRvIGhhbmRsZSB0aGUgdHJhbnNpZW50IGRhdGEgb3V0c2lkZSBvZiBXb3JkUHJlc3MuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAl0cnVlIGlmIHVzZSBjYWNoZWQgbWV0aG9kcywgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gdXNlX2NhY2hlZF9tZXRob2RzKCkgewoJCQoJCQkvLyBCeSBkZWZhdWx0IHdlJ2xsIGJlIHVzaW5nIGNhY2hpbmcKCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQkvLyBIYXMgY2FjaGluZyBiZWVuIGV4cGxpY2l0bHkgZGlzYWJsZWQKCQkJJGNhY2hpbmdfZGlzYWJsZWQgPSAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FibGVfemlwbWV0aG9kX2NhY2hpbmcnXSApICYmCgkJCQkJCQkJICAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGlzYWJsZV96aXBtZXRob2RfY2FjaGluZyddID09ICcxJykgKTsKCgkJCS8vIERvIHdlIGhhdmUgdGhlIG1lYW5zIHRvIGNhY2hlCgkJCSRjYWNoaW5nX3VuYXZhaWxhYmxlID0gKCAhKCBmdW5jdGlvbl9leGlzdHMoICdnZXRfdHJhbnNpZW50JyApICYmIGZ1bmN0aW9uX2V4aXN0cyggJ3NldF90cmFuc2llbnQnICkgKSApOwkKCgkJCS8vIEhhcyBjYWNoaW5nIGJlZW4gZm9yY2UgZGlzYWJsZWQgZm9yIHRoaXMgcGFydGljdWxhciBpbnN0YW5jZSBvZiB6aXBidWRkeQoJCQkkY2FjaGluZ19mb3JjZV9kaXNhYmxlZCA9ICR0aGlzLT5nZXRfemlwX21ldGhvZF9jYWNoaW5nX2ZvcmNlX2Rpc2FibGVkKCk7CgoJCQlpZiAoICRjYWNoaW5nX2Rpc2FibGVkIHx8ICRjYWNoaW5nX3VuYXZhaWxhYmxlIHx8ICRjYWNoaW5nX2ZvcmNlX2Rpc2FibGVkICkgewoJCQkKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkJCQkKCQkvKioKCQkgKglnZXRfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGFycmF5IG9mIHppcCBtZXRob2RzIHByZXZpb3VzbHkgZGVkdWNlZAoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5CUZsYXQgYXJyYXkgb2YgemlwIG1ldGhvZHMgKGNvdWxkIGJlIGVtcHR5KQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF96aXBfbWV0aG9kcygpIHsKCQkJCgkJCXJldHVybiAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQoJCX0KCQkJCQoJCS8qKgoJCSAqCXNldF96aXBfbWV0aG9kcygpCgkJICoJCgkJICoJUmVzZXRzIHRoZSB6aXAgbWV0aG9kcyBiYXNlZCBvbiBuZXcgY3JpdGVyaWEgYW5kIHJldHVybnMgdGhlIGFycmF5IG9mIHppcCBtZXRob2RzCgkJICoJSWYgdGhlIGZpcnN0IGF0dGVtcHQgdG8gZGVkdWNlIG1ldGhvZHMgcmV0dXJucyBhbiBlbXB0eSByZXN1bHQgdGhlbiBmb3JjZSBkaXNhYmxlCgkJICoJdXNlIG9mIGNhY2hlZCB6aXAgbWV0aG9kcyBhbmQgdHJ5IGFnYWluLgoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJJHJlcXVlc3RlZAlGbGF0IGFycmF5IG9mIHJlcXVlc3RlZCAocHJlZmVycmVkKSB6aXAgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYm9vbAkkYmVzdF9vbmx5CU9wdGlvbmFsOiBUcnVlIGlmIG9ubHkgdGhlIGJlc3QgYXZhaWxhYmxlIG1ldGhvZCB3YW50ZWQKCQkgKglAcmV0dXJuCQlvYmplY3QJCQkJVGhpcyBvYmplY3QKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfemlwX21ldGhvZHMoIGFycmF5ICRyZXF1ZXN0ZWQsICRiZXN0X29ubHkgPSBmYWxzZSApIHsKCQkJCgkJCSRtZXRob2RzX2F2YWlsYWJsZSA9IGZhbHNlOwoKCQkJLy8gVXBkYXRlIHRoZSBtZW1vcnkgb2Ygd2hhdCB6aXAgbWV0aG9kcyB3ZXJlIHJlcXVlc3RlZCAtIG1ha2UgaXQgY2xlYW4KCQkJJHRoaXMtPl9yZXF1ZXN0ZWRfemlwX21ldGhvZHMgPSBhcnJheV9tYXAoICd0cmltJywgJHJlcXVlc3RlZCApOwoJCQkKCQkJLy8gV29yayBvdXQgdGhlIGxpc3Qgb2YgemlwIG1ldGhvZHMgZnJvbSB0aGUgcmVxdWVzdGVkIGFuZCBhdmFpbGFibGUKCQkJJG1ldGhvZHNfYXZhaWxhYmxlID0gJHRoaXMtPmRlZHVjZV96aXBfbWV0aG9kcyggJHRoaXMtPl96aXBfbWV0aG9kcywgJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzLCAkdGhpcy0+X3JlcXVlc3RlZF96aXBfbWV0aG9kcywgJGJlc3Rfb25seSApOwoJCQkKCQkJLy8gSWYgd2UgZW5kIHVwIHdpdGggbm8gemlwIG1ldGhvZHMgY291bGQgYmUgdGhhdCBjYWNoaW5nIG5vdCBmdW5jdGlvbmFsIG9uIHRoaXMKCQkJLy8gc2VydmVyIHNvIHdlJ2xsIGZvcmNlIG92ZXJyaWRlIGFuZCB0cnkgYWdhaW4gZm9yIGx1Y2sKCQkJaWYgKCB0cnVlICE9PSAkbWV0aG9kc19hdmFpbGFibGUgKSB7CgkJCQoJCQkJLy8gTG9nIHRoYXQgd2UgYXJlIG92ZXJyaWRpbmcgY2FjaGluZwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwIG1ldGhvZCBjYWNoaW5nIGZvcmNlIGRpc2FibGVkLicgKTsKCQkJCgkJCQkkdGhpcy0+c2V0X3ppcF9tZXRob2RfY2FjaGluZ19mb3JjZV9kaXNhYmxlZCggdHJ1ZSApOwoJCQkJJHRoaXMtPmRlZHVjZV96aXBfbWV0aG9kcyggJHRoaXMtPl96aXBfbWV0aG9kcywgJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzLCAkdGhpcy0+X3JlcXVlc3RlZF96aXBfbWV0aG9kcywgJGJlc3Rfb25seSApOwoKCQkJfQoKCQkJcmV0dXJuICR0aGlzOwoJCQoJCX0KCQkJCQkJCQkKCQkvKioKCQkgKglyZWZyZXNoX3ppcF9tZXRob2RzKCkKCQkgKgoJCSAqCVJlZnJlc2ggdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBhdmFpbGFibGUgemlwIG1ldGhvZHMKCQkgKglUT0RPOiBQZXJoYXBzIHRoZSB0cmFuc2llbnQgY291bGQgYmUgZGVsZXRlZCBoZXJlIHJhdGhlciB0aGFuIGJ5IHRoZSBjYWxsZXI/CgkJICoKCQkgKglAcGFyYW0JCWFycmF5CQkkemlwX21ldGhvZHMJT3B0aW9uYWw6IFRoZSBzZXQgb2YgemlwIG1ldGhvZHMgcmVxdWVzdGVkIHRvIHVzZQoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHJlZnJlc2hfemlwX21ldGhvZHMoICR6aXBfbWV0aG9kcyA9IGFycmF5KCkgKSB7CgkJCgkJCSR0aGlzLT5zZXRfemlwX21ldGhvZHMoICR6aXBfbWV0aG9kcyApOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNhbml0aXplX2V4Y2x1ZGVzKCkKCQkgKgoJCSAqCVRha2UgYW4gZXhjbHVzaW9uIGxpc3Qgb2YgZGlyZWN0b3JpZXMgYW5kL29yIGZpbGVzIGFuZCBwcm9kdWNlIGEgc2FuaXRpemVkIGV4Y2x1c2lvbiBsaXN0CgkJICoJRGlyZWN0b3JpZXMgd2lsbCBiZSByZWNvZ25pemVkIGJ5IGhhdmluZyBhIHRyYWlsaW5nIGRpcmVjdG9yeSBzZXBhcmF0b3Igb3RoZXJ3aXNlIHdpbGwgYmUKCQkgKgl0cmVhdGVkIGFzIGEgZmlsZSAobm90ZSB0aGF0IGhlcmUgd2UgYXJlIHdvcmtpbmcgd2l0aCBwYXR0ZXJucyBhbmQgbm90IHRlc3RpbmcgdG8gc2VlCgkJICoJd2hldGhlciBzb21ldGhpbmcgX2lzXyBhIGRpcmVjdG9yeSBvciBub3QgYmVjYXVzZSB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIHRoZSBmdWxsCgkJICoJZGlyZWN0b3J5IHBhdGgpLgoJCSAqCU5vdGU6IEFueXRoaW5nIHRoYXQgY29udGFpbnMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIgKCogb3IgPykgaXMgaWdub3JlZCBhcyB0aGVzZSBhcmUgbm90CgkJICoJY3VycmVudGx5IHN1cHBvcnRlZCAoYW5kIG1heWJlIG5ldmVyIHdpbGwgYWNyb3NzIHRoZSBib2FyZCkuIEZvciBjb21tYW5kIHppcCB6aXAgd2UgY2FuCgkJICoJY29uc2lkZXIgYW4gb3B0aW9uIHRvIGhhdmUgdGhlc2UgYXMgc2VwYXJhdGUgZXhjbHVzaW9ucyAoYW5kIGN1cnJlbnRseSB3ZSBjYW4gYWNjb21vZGF0ZQoJCSAqCXRoZW4gdGhyb3VnaCBzcGVjaWZ5aW5nIGVudmlyb25tZW50IFpJUE9QVFMuCgkJICoKCQkgKglAcGFyYW0JYXJyYXkJCUxpc3Qgb2YgcHJpbWFyeSBleGNsdXNpb25zIC0gbWF5IGJlIGVtcHR5CgkJICoJQHBhcmFtCWFycmF5CQlMaXN0IG9mIHNlY29uZGFyeSBleGNsdXNpb25zIC0gbWF5IGJlIGVtcHR5CgkJICoJQHBhcmFtCXN0cmluZwkJVGhlIGJhc2UgZGlyZWN0b3J5IHRvIGJlIHVzZWQgaWYgbm9ybWFsaXppbmcKCQkgKgoJCSAqCUByZXR1cm4JbWl4ZWQJCWFycmF5IG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzYW5pdGl6ZV9leGNsdWRlcyggJHByaW1hcnksICRzZWNvbmRhcnksICRiYXNlID0gJycgKSB7CgoJCQkkc2FuaXRpemVkID0gYXJyYXkoKTsKCQkJCgkJCSRiYXNlZGlyID0gdHJpbSggJGJhc2UgKTsKCQkJJG5vcm1hbGl6ZSA9ICFlbXB0eSggJGJhc2VkaXIgKTsKCQkJCgkJCS8vIE5vcm1hbGl6ZSB0aGUgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBvbiB0aGUgcGF0aAoJCQkkYmFzZWRpciA9IHJ0cmltKCAkYmFzZWRpciwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCgkJCS8vIE5vcm1hbGl6ZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBpbiBwYXRoCgkJCSRiYXNlZGlyID0gc3RyX3JlcGxhY2UoIERJUkVDVE9SWV9TRVBBUkFUT1IsIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiwgJGJhc2VkaXIgKTsKCQkKCQkJLy8gJHByaW1hcnkgaXMgY29uc2lkZXJlZCB0byBiZSB1bmNsZWFuCgkJCWZvcmVhY2ggKCAkcHJpbWFyeSBhcyAkZXhjbHVkZSApIHsKCQkJCgkJCQkvLyBSZXNldCBmbGFnIGZvciB3aGV0aGVyIHRoaXMgZXhjbHVkZSBpcyBhIGRpcmVjdG9yeS1saWtlIGV4Y2x1ZGUKCQkJCSRpc19kaXJlY3RvcnlfcGF0aCA9IGZhbHNlOwoJCQkJCgkJCQkvLyBHZXQgcmlkIG9mIHN0YW5kYXJkIHByZWZpeC9zdWZmaXggZGV0cml0dXMKCQkJCSRleGNsdWRlID0gdHJpbSggJGV4Y2x1ZGUgKTsKCQkJCQoJCQkJLy8gUG9zc2libGUgdGhhdCB3ZSBjb3VsZCBlbmQgdXAgd2l0aCBhbiBlbXB0eSBlbnRyeQoJCQkJLy8gQWxzbyBpZ25vcmUgaWYgYW55IHdpbGRjYXJkIGNoYXJhY3RlcnMgcHJlc2VudAoJCQkJaWYgKCAhZW1wdHkoICRleGNsdWRlICkgJiYgKCAhcHJlZ19tYXRjaCggJ3xbPypdfCcsICRleGNsdWRlICkgKSApIHsKCQkJCQoJCQkJCS8vIFJlbWVtYmVyIGlmIGl0IGhhcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3Igc3VmZml4CgkJCQkJaWYgKCBwcmVnX21hdGNoKCAnfFsnIC4gYWRkc2xhc2hlcyggc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuICddJHwnLCAkZXhjbHVkZSApICkgewoJCQkJCQoJCQkJCQkkaXNfZGlyZWN0b3J5X3BhdGggPSB0cnVlOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBSZW1vdmUgd2hhdCBjb3VsZCBiZSBtdWx0aXBsZSBwcmVmaXggb3Igc3VmZml4IGRpcmVjdG9yeSBzZXBhcmF0b3JzCgkJCQkJJGV4Y2x1ZGUgPSB0cmltKCAkZXhjbHVkZSwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgcGxhdGZvcm0gc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgaW4gcGF0aCBiZWNvbWUgbm9ybWFsaXplZAoJCQkJCSRleGNsdWRlID0gc3RyX3JlcGxhY2UoIERJUkVDVE9SWV9TRVBBUkFUT1IsIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiwgJGV4Y2x1ZGUgKTsKCQkJCQkKCQkJCQkvLyBBbmQgYWRkIGJhY2sgYSBzaW5nbGUgaW5zdGFuY2UgcHJlZml4CgkJCQkJJGV4Y2x1ZGUgPSBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZXhjbHVkZTsKCQkJCQkKCQkJCQkvLyBBbmQgb3B0aW9uYWxseSBhIHNpbmdsZSBpbnN0YW5jZSBzdWZmaXgKCQkJCQlpZiAoICRpc19kaXJlY3RvcnlfcGF0aCApIHsKCQkJCQkKCQkJCQkJJGV4Y2x1ZGUgLj0gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkJCQkKCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQkkc2FuaXRpemVkW10gPSAkZXhjbHVkZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyAkc2Vjb25kYXJ5IGlzIGNvbnNpZGVyZWQgdG8gYmUgY2xlYW4KCQkJaWYgKCAhZW1wdHkoICRzZWNvbmRhcnkgKSApIHsKCQkJCgkJCQkkc2FuaXRpemVkID0gYXJyYXlfbWVyZ2UoICRzYW5pdGl6ZWQsICRzZWNvbmRhcnkgKTsgCgkJCQoJCQl9CgkJCQoJCQkvLyBHZXQgdW5pcXVlIGVudHJpZXMgYW5kIHJlbnVtYmVyIG51bWVyaWMga2V5cwoJCQkkc2FuaXRpemVkID0gYXJyYXlfbWVyZ2UoIGFycmF5X3VuaXF1ZSggJHNhbml0aXplZCApICk7CgkJCQoJCQlpZiAoIHRydWUgPT0gJG5vcm1hbGl6ZSApIHsKCQkJCgkJCQkvLyBNYWtlIHN1cmUgdGhlIG5vcm1hbGl6ZSBiYXNlIGhhcyBhIHRyYWlsaW5nIGRpcmVjdG9yeSBzZXBhcmF0b3IKCQkJCSRiYXNlZGlyID0gKCBydHJpbSggJGJhc2VkaXIsIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApICkgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCQoJCQkJZm9yZWFjaCAoICRzYW5pdGl6ZWQgYXMgJiRleGNsdXNpb24gKSB7CgkJCQkKCQkJCQkvLyBNdXN0IHJlbW92ZSBhbnkgbGVhZGluZyBESVJFQ1RPUllfU0VQQVJBVE9SIGJlY2F1c2UgJGJhc2VkaXIgYWx3YXlzIGhhcyB0cmFpbGluZwoJCQkJCSRleGNsdXNpb24gPSBsdHJpbSggJGV4Y2x1c2lvbiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SICk7CgkJCQkJJGV4Y2x1c2lvbiA9ICggJGJhc2VkaXIgLiAkZXhjbHVzaW9uICk7CgkJCQkJCgkJCQl9CgkJCQkJCQkJCgkJCX0KCQkJCQkKCQkJcmV0dXJuICRzYW5pdGl6ZWQ7CgkJCgkJfQoKCQkvKioKCQkgKglnZXRfYXZhaWxhYmxlX3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBhcnJheSBvZiB6aXAgbWV0aG9kcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoZSBtb2RlIG9mIHRoaXMgb2JqZWN0CgkJICoJTGlicmFyaWVzIG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBhbHJlYWR5CgkJICoJCgkJICoJQHBhcmFtCQlhcnJheQlUaGUgc3VwcG9ydGVkIHppcCBtZXRob2RzCgkJICoJQHBhcmFtCQlhcnJheQlUaGUgYXJyYXkgd2hpY2ggd2lsbCBob2xkIHRoZSBhdmFpbGFibGUgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYXJyYXkJVGhlIGFycmF5IHRoYXQgd2lsbCBob2xkIHRoZSBhdmFpbGFibGUgbWV0aG9kcyBhdHRyaWJ1dGVzIChtZXRob2QgdGFnIGlzIGtleSkKCQkgKglAcmV0dXJuCQlib29sCVRydWUgaWYgbWV0aG9kcyBhdmFpbGFibGUsIEZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF9hdmFpbGFibGVfemlwX21ldGhvZHMoIGFycmF5ICRzdXBwb3J0ZWRfemlwX21ldGhvZHMsICYkYXZhaWxhYmxlX21ldGhvZHMsICYkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlscyApIHsKCQkKCQkJLy8gTWFrZSBzdXJlIHRoZXNlIGFyZSBjbGVhcmVkIGFzIHRoZSBjYWxsZXIgbWlnaHQgbm90IGhhdmUgZG9uZSBzbwoJCQkkYXZhaWxhYmxlX21ldGhvZHMgPSBhcnJheSgpOwoJCQkkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlscyA9IGFycmF5KCk7CgkJCQoJCQkvLyBUcnkgZWFjaCBzdXBwb3J0ZWQgemlwIG1ldGhvZCB0byBzZWUgd2hhdCBpdCBjYW4gZG8gb24gdGhpcyBzeXN0ZW0JCQoJCQlmb3JlYWNoICggJHN1cHBvcnRlZF96aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCgkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQoJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQoJCQkJaWYgKCB0cnVlID09PSAkemlwcGVyLT5pc19hdmFpbGFibGUoICR0aGlzLT5fdGVtcGRpciApICkgewoJCQkJCgkJCQkJJGF2YWlsYWJsZV9tZXRob2RzW10gPSAkbWV0aG9kX3RhZzsKCQkJCQkkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSA9ICR6aXBwZXItPmdldF9tZXRob2RfZGV0YWlscygpOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQl1bnNldCggJHppcHBlciApOwoJCQl9CgkJCQkJCQoJCQlyZXR1cm4gKCAhZW1wdHkoICRhdmFpbGFibGVfbWV0aG9kcyApICk7CgoJCX0KCQkJCQkJCgkJLyoqCgkJICoJZ2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGFycmF5IG9mIHppcCBtZXRob2RzIHRoYXQgYXJlIHJlZ2FyZGVkIGFzICJjb21wYXRpYmlsaXR5IiBtZXRob2RzCgkJICoJTGlicmFyaWVzIG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBhbHJlYWR5CgkJICoJCgkJICoJQHJldHVybgkJYXJyYXkJRmxhdCBhcnJheSBvZiB6aXAgbWV0aG9kcyAoY291bGQgYmUgZW1wdHkpCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKSB7CgkJCgkJCSRjb21wYXRpYmlsaXR5X21ldGhvZHMgPSBhcnJheSgpOwoJCQkKCQkJZm9yZWFjaCAoICR0aGlzLT5femlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgoJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkKCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkKCQkJCWlmICggJHppcHBlci0+Z2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkgPT09IHRydWUgKSB7CgkJCQkKCQkJCQkkY29tcGF0aWJpbGl0eV9tZXRob2RzW10gPSAkbWV0aG9kX3RhZzsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJfQoJCQkKCQkJcmV0dXJuICRjb21wYXRpYmlsaXR5X21ldGhvZHM7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfYmVzdF96aXBfbWV0aG9kcygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgYmVzdCB6aXAgbWV0aG9kKHMpCgkJICoJRm9yIG5vdyB3ZSBhc3N1bWUgb25seSBvbmUgImJlc3QiIG1ldGhvZCBhcyBiZWluZyB0aGUgZmlyc3QgbWV0aG9kIGluIHRoZSBsaXN0CgkJICoJdGhhdCBoYXMgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUocykuCgkJICoJTGlicmFyaWVzIG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBhbHJlYWR5CgkJICoJCgkJICoJQHBhcmFtCQlhcnJheQkkYXR0cmlidXRlcwlBcnJheSBvZiBhdHRyaWJ1dGVzIHRvIGNoZWNrIG1ldGhvZCBzdXBwb3J0cwoJCSAqCUByZXR1cm4JCWFycmF5CQkJCUZsYXQgYXJyYXkgb2YgemlwIG1ldGhvZHMgKGNvdWxkIGJlIGVtcHR5KQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF9iZXN0X3ppcF9tZXRob2RzKCAkYXR0cmlidXRlcyA9IGFycmF5KCkgKSB7CgkJCgkJCSRiZXN0X21ldGhvZHMgPSBhcnJheSgpOwoJCQkKCQkJaWYgKCAhZW1wdHkoICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQlpZiAoIGVtcHR5KCAkYXR0cmlidXRlcyApICkgewoJCQkJCgkJCQkJLy8gTm8gYXR0cmlidXRlcyB0byB0ZXN0IGZvciBzbyBqdXN0IHRha2UgdGhlIGZpcnN0IGluIHRoZSBsaXN0CgkJCQkJJGJlc3RfbWV0aG9kc1tdID0gJHRoaXMtPl96aXBfbWV0aG9kc1sgMCBdOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCgkJCQkJLy8gSGF2ZSBzb21lIGF0dHJpYnV0ZXMgdG8gdGVzdCBzbyB3b3JrIGFsb25nIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYSBtYXRjaCBvciBlbmQgb2YgbGlzdAoJCQkJCWZvcmVhY2ggKCAkdGhpcy0+X3ppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkJCgkJCQkJCS8vIFN0YXJ0IGFmcmVzaCBlYWNoIHRpbWUgLSBhc3N1bWUgc3VjY2VzcwoJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQlmb3JlYWNoICggJGF0dHJpYnV0ZXMgYXMgJGF0dHJpYnV0ZSApIHsKCQkJCQkJCgkJCQkJCQkvLyBDaGVjayBlYWNoIGF0dHJpYnV0ZSBpbiB0dXJuIChwcmVjb25kaXRpb24gdGhhdCBhbGwgYXR0cmlidXRlcyBzZXQgdHJ1ZS9mYWxzZSkKCQkJCQkJCSRtYXRjaCA9ICggJG1hdGNoICYmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJGF0dHJpYnV0ZSBdID09PSB0cnVlICkgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmICggdHJ1ZSA9PT0gJG1hdGNoICkgewoJCQkJCQkKCQkJCQkJCS8vIEZvdW5kIG91ciBtYXRjaGluZyBtZXRob2Qgc28gYnJlYWsgb3V0IG9mIHRoZSB0ZXN0IGxvb3AgdG8gcmV0dXJuCgkJCQkJCQkkYmVzdF9tZXRob2RzW10gPSAkbWV0aG9kX3RhZzsKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQkJCQkJCQoKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCgkJCQoJCQl9CgkJCQkJCQoJCQlyZXR1cm4gJGJlc3RfbWV0aG9kczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWFkZF9kaXJlY3RvcnlfdG9femlwKCkKCQkgKgoJCSAqCUFkZHMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgb3IgZXhpc3RpbmcgKFRPRE86IG5vdCB5ZXQgYXZhaWxhYmxlKSBaSVAgZmlsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gY3JlYXRlLgoJCSAqCUBwYXJhbQlzdHJpbmcJCQkJRnVsbCBkaXJlY3RvcnkgdG8gYWRkIHRvIHppcCBmaWxlLgoJCSAqCUBwYXJhbQlhcnJheSggc3RyaW5nICkJCUFycmF5IG9mIHN0cmluZ3Mgb2YgcGF0aHMvZmlsZXMgdG8gZXhjbHVkZSBmcm9tIHppcHBpbmcKCQkgKglAcGFyYW0Jc3RyaW5nCQkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZGlyZWN0b3J5IHRvIHRlbXBvcmFyaWx5IHBsYWNlIFpJUAoJCSAqCUBwYXJhbQlib29sZWFuCQkJCVRydWU6IG9ubHkgdXNlIFBDTFppcC4gRmFsc2U6IHRyeSBhbGwgYXZhaWxhYmxlCgkJICoKCQkgKglAcmV0dXJuCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBhZGRfZGlyZWN0b3J5X3RvX3ppcCggJHppcF9maWxlLCAkYWRkX2RpcmVjdG9yeSwgJGV4Y2x1ZGVzID0gYXJyYXkoKSwgJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ID0gJycgKSB7CgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPl9pc19leHBlcmltZW50YWwgKSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnUnVubmluZyBhbHRlcm5hdGl2ZSBaSVAgc3lzdGVtIChCRVRBKSBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1J1bm5pbmcgc3RhbmRhcmQgWklQIHN5c3RlbSBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQl9CgkJCQoJCQkvLyBMZXQncyBqdXN0IGxvZyBpZiB0aGlzIGlzIGEgMzIgb3IgNjQgYml0IHN5c3RlbQoJCQkkcGhwX3NpemUgPSAoIHBsdWdpbmJ1ZGR5X3N0YXQ6OmlzX3BocCggcGx1Z2luYnVkZHlfc3RhdDo6VEhJUlRZX1RXT19CSVQgKSApID8gIjMyIiA6ICI2NCIgOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnUnVubmluZyB1bmRlciAlMSRzLWJpdCBQSFAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHBocF9zaXplICkgKTsKCQkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSB0ZWxsIHdoYXQgdGhlIHNhcGkgaXMKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1NlcnZlciBBUEk6ICUxJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHRoaXMtPmdldF9zYXBpX25hbWUoKSApICk7CQkJCgkJCQkJCgkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCk7CgkJCSRzYW5pdGl6ZWRfZXhjbHVkZXMgPSBhcnJheSgpOwoJCQkkbGlzdG1ha2VyID0gTlVMTDsKCQkJCgkJCS8vIFNldCBzb21lIGFkZGl0aW9uYWwgc3lzdGVtIGV4Y2x1ZGVzIGhlcmUgZm9yIG5vdyAtIHRoZXNlIGFyZSBhbGwgZnJvbSB0aGUgc2l0ZSBpbnN0YWxsIHJvb3QKCQkJJGFkZGl0aW9uYWxfZXhjbHVkZXMgPSBhcnJheSgpOwoJCQkKCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCB6aXAgbWV0aG9kIHN0cmF0ZWd5IHNldHRpbmcgdG8gdXNlIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gZW1lcmdlbmN5IGNvbXBhdGliaWxpdHkKCQkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyAnemlwX21ldGhvZF9zdHJhdGVneScgXSApICYmIAkoICcwJyAhPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyAnemlwX21ldGhvZF9zdHJhdGVneScgXSApICkgewoJCQkKCQkJCSR6aXBfbWV0aG9kX3N0cmF0ZWd5ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyAnemlwX21ldGhvZF9zdHJhdGVneScgXTsKCQkJCXN3aXRjaCAoICR6aXBfbWV0aG9kX3N0cmF0ZWd5ICkgewoJCQkJCWNhc2UgIjEiOgoJCQkJCQkvLyBCZXN0IEF2YWlsYWJsZQoJCQkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+Z2V0X2Jlc3RfemlwX21ldGhvZHMoIGFycmF5KCAnaXNfYXJjaGl2ZXInICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgQmVzdCBBdmFpbGFibGUgemlwIG1ldGhvZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIjIiOgoJCQkJCQkvLyBBbGwgQXZhaWxhYmxlCgkJCQkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5femlwX21ldGhvZHM7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1VzaW5nIEFsbCBBdmFpbGFibGUgemlwIG1ldGhvZHMgaW4gcHJlZmVycmVkIG9yZGVyIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiMyI6CgkJCQkJCS8vIEZvcmNlIENvbXBhdGliaWxpdHkKCQkJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPmdldF9jb21wYXRpYmlsaXR5X3ppcF9tZXRob2RzKCk7CQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdVc2luZyBGb3JjZWQgQ29tcGF0aWJpbGl0eSB6aXAgbWV0aG9kIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gSG1tLi4udW5yZWNvZ25pemVkIHZhbHVlIC0gZW1lcmdlbmN5IGNvbXBhdGliaWxpdHkKCQkJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPmdldF9jb21wYXRpYmlsaXR5X3ppcF9tZXRob2RzKCk7CQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIHNwcmludGYoIF9fKCdGb3JjZWQgQ29tcGF0aWJpbGl0eSBNb2RlIGFzIFppcCBNZXRob2QgU3RyYXRlZ3kgc2V0dGluZyBub3QgcmVjb2duaXplZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfbWV0aG9kX3N0cmF0ZWd5ICkgKTsKCQkJCX0KCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFdlIGdvdCBubyBvciBhbiBpbnZhbGlkIHppcCBtZXRob2Qgc3RyYXRlZ3kgd2hpY2ggaXMgYSBiYWQgc2l0dWF0aW9uIC0gZW1lcmdlbmN5IGNvbXBhdGliaWxpdHkgaXMgdGhlIG9yZGVyIG9mIHRoZSBkYXkKCQkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5nZXRfY29tcGF0aWJpbGl0eV96aXBfbWV0aG9kcygpOwkJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ0ZvcmNlZCBDb21wYXRpYmlsaXR5IE1vZGUgYXMgWmlwIE1ldGhvZCBTdHJhdGVneSBub3Qgc2V0IG9yIHNldHRpbmcgbm90IHJlY29nbml6ZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJfQoJCQkKCQkJLy8gQmV0dGVyIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJaWYgKCBlbXB0eSggJHppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gSG1tLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYW55IGF2YWlsYWJsZSBtZXRob2RzLCBvb3BzLCBiZXN0IGdvIG5vIGZ1cnRoZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBjcmVhdGUgYSBaaXAgQXJjaGl2ZSBmaWxlIC0gbm8gYXZhaWxhYmxlIG1ldGhvZHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQkvLyBXZSBzaG91bGQgaGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIG11c3QgZ2V0IHJpZCBvZiBpdCwgY2FuIHNpbXBseSBybWRpciBpdCBhcyBpdCB3aWxsIChzaG91bGQpIGJlIGVtcHR5CgkJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgJiYgZmlsZV9leGlzdHMoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgewoJCQkJCQoJCQkJCWlmICggIXJtZGlyKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGVtcG9yYXJ5IGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgZGVsZXRlZDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApOwoJCQkJCQoJCQkJCX0KCQkJCQkJCgkJCQl9CgoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0NyZWF0aW5nIFpJUCBmaWxlJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgYCcgLiAkemlwX2ZpbGUgLiAnYC4gJyAuIF9fKCdBZGRpbmcgZGlyZWN0b3J5JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgYCcgLiAkYWRkX2RpcmVjdG9yeSAuICdgLiAnIC4gX18oJ0V4Y2x1ZGVzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiBpbXBsb2RlKCAnLCcsICRleGNsdWRlcyApICk7CgkJCQoJCQkvLyBXZSdsbCB0cnkgYW5kIGFsbG93IGV4Y2x1c2lvbnMgZm9yIHBjbHppcCBpZiB3ZSBjYW4KCQkJaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliLycgLiAkdGhpcy0+X3doZXJlYW1pIC4gJy96YmRpci5waHAnICk7CgkJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfemJkaXInICkgKSB7CgkJCQoJCQkJLy8gR2VuZXJhdGUgb3VyIHNhbml0aXplZCBsaXN0IG9mIGRpcmVjdG9yaWVzL2ZpbGVzIHRvIGV4Y2x1ZGUgYXMgYWJzb2x1dGUgcGF0aHMgKG5vcm1hbGl6ZWQpIGZvciB6YmRpcgoJCQkJJHNhbml0aXplZF9leGNsdWRlcyA9ICR0aGlzLT5zYW5pdGl6ZV9leGNsdWRlcyggJGV4Y2x1ZGVzLCAkYWRkaXRpb25hbF9leGNsdWRlcywgJGFkZF9kaXJlY3RvcnkgKTsKCgkJCQkvLyBOb3cgbGV0J3MgY3JlYXRlIHRoZSBsaXN0IG9mIGl0ZW1zIHRvIGFkZCB0byB0aGUgemlwIC0gZmlyc3QgYnVpbGQgdGhlIHRyZWUKCQkJCSRsaXN0bWFrZXIgPSBuZXcgcGx1Z2luYnVkZHlfemJkaXIoICRhZGRfZGlyZWN0b3J5LCAkc2FuaXRpemVkX2V4Y2x1ZGVzICk7CgkJCQkKCQkJCS8vIFJlLWdlbmVyYXRlIG91ciBzYW5pdGl6ZWQgbGlzdCBvZiBkaXJlY3Rvcmllcy9maWxlcyB0byBleGNsdWRlIGFzIHJlbGF0aXZlIHBhdGhzCgkJCQkvLyBTbGlnaHQga2x1ZGdlIHRvIGRlYWwgd2l0aCBiZWluZyBhYmxlIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBpbmNsdXNpb24gcHJvY2Vzc2luZwoJCQkJLy8gKGN1cnJlbnRseSBjb25maWd1cmVkIGluIHdwLWNvbmZpZy5waHApIHNvIGFsd2F5cyBuZWVkIHRvIHByb3ZpZGUgdGhlIGV4Y2x1ZGVzIGFzCgkJCQkvLyByZWxhdGl2ZSBwYXRoIGZvciBub3cuIFRoaXMgbmVlZHMgdG8gYmUgdGlkaWVkIHVwIGluIGZ1dHVyZSBpZi93aGVuIHRoZSBjYXBhYmlsaXR5CgkJCQkvLyBpcyBlc3RhYmxpc2hlZCBhcyBzdGFuZGFyZAoJCQkJJHNhbml0aXplZF9leGNsdWRlcyA9ICR0aGlzLT5zYW5pdGl6ZV9leGNsdWRlcyggJGV4Y2x1ZGVzLCAkYWRkaXRpb25hbF9leGNsdWRlcyApOwkJCQkKCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gR2VuZXJhdGUgb3VyIHNhbml0aXplZCBsaXN0IG9mIGRpcmVjdG9yaWVzL2ZpbGVzIHRvIGV4Y2x1ZGUgYXMgcmVsYXRpdmUgcGF0aHMKCQkJCSRzYW5pdGl6ZWRfZXhjbHVkZXMgPSAkdGhpcy0+c2FuaXRpemVfZXhjbHVkZXMoICRleGNsdWRlcywgJGFkZGl0aW9uYWxfZXhjbHVkZXMgKTsKCQkJCgkJCX0KCQkJCgkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWV0aG9kcyAtIG9uY2Ugd2Ugc3VjY2VlZCBqdXN0IHJldHVybiBkaXJlY3RseSBvdGhlcndpc2UgZHJvcCB0aHJvdWdoCgkJCWZvcmVhY2ggKCAkemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgkJCQoJCQkJLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBhcmNoaXZlIHdpdGggdGhpcyBtZXRob2QKCQkJCWlmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX2FyY2hpdmVyJyBdID09PSB0cnVlICkgewoKCQkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQkKCQkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCQoJCQkJCS8vIFNldCB0aGVzZSBvbiBzcGVjaWZpYyB6aXBwZXIgYmFzZWQgb24gdGhlIHZhbHVlcyB3ZSBkZXJpdmVkIGF0IGNvbnN0cnVuY3Rpb24gb3IKCQkJCQkvLyBvdmVycmlkZGVuIGJ5IHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzCgkJCQkJJHppcHBlci0+c2V0X2NvbXByZXNzaW9uKCAkdGhpcy0+Z2V0X2NvbXByZXNzaW9uKCkgKTsKCQkJCQkkemlwcGVyLT5zZXRfaWdub3JlX3N5bWxpbmtzKCAkdGhpcy0+Z2V0X2lnbm9yZV9zeW1saW5rcygpICk7CgkJCQkJJHppcHBlci0+c2V0X2lnbm9yZV93YXJuaW5ncyggJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApOwoJCQkJCQoJCQkJCS8vIFdlIG5lZWQgdG8gdGVsbCB0aGUgbWV0aG9kIHdoYXQgZGV0YWlscyBiZWxvbmcgdG8gaXQKCQkJCQkkemlwcGVyLT5zZXRfbWV0aG9kX2RldGFpbHMoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSApOwoJCQkJCQoJCQkJCS8vIFRlbGwgdGhlIG1ldGhvZCB0aGUgc2VydmVyIGFwaSBpbiB1c2UKCQkJCQkkemlwcGVyLT5zZXRfc2FwaV9uYW1lKCAkdGhpcy0+Z2V0X3NhcGlfbmFtZSgpICk7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVHJ5aW5nICcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJG1ldGhvZF90YWcgLiBfXygnIG1ldGhvZCBmb3IgWklQLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBBcyB3ZSBhcmUgbG9vcGluZyBtYWtlIHN1cmUgd2UgaGF2ZSBubyBzdGFsZSBmaWxlIGluZm9ybWF0aW9uCgkJCQkJY2xlYXJzdGF0Y2FjaGUoKTsKCQkJCQkKCQkJCQkvLyBUaGUgdGVtcG9yYXJ5IHppcCBkaXJlY3RvcnkgX211c3RfIGV4aXN0CgkJCQkJaWYgKCAhZW1wdHkoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgewoJCQkJCQoJCQkJCQlpZiAoICFmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7IC8vIENyZWF0ZSB0ZW1wIGRpciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KCQkJCQkJCgkJCQkJCQlta2RpciggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gTm93IHdlIGFyZSByZWFkeSB0byB0cnkgYW5kIHByb2R1Y2UgdGhlIGJhY2t1cAoJCQkJCWlmICggJHppcHBlci0+Y3JlYXRlKCAkemlwX2ZpbGUsICRhZGRfZGlyZWN0b3J5LCAkc2FuaXRpemVkX2V4Y2x1ZGVzLCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnksICRsaXN0bWFrZXIgKSA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJLy8gR290IGEgdmFsaWQgemlwIGZpbGUgc28gd2UgY2FuIGp1c3QgcmV0dXJuIC0gbWV0aG9kIHdpbGwgaGF2ZSBjbGVhbmVkIHVwIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RoZSAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRtZXRob2RfdGFnIC4gX18oJyBtZXRob2QgZm9yIFpJUCB3YXMgc3VjY2Vzc2Z1bC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIHRvIHJldHVybiBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IGJyZWFrIG91dCBvZiBmb3JlYWNoCgkJCQkJCXJldHVybiB0cnVlOwoJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gTWV0aG9kIHdpbGwgaGF2ZSBjbGVhbmVkIHVwIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5CQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbWV0aG9kX3RhZyAuIF9fKCcgbWV0aG9kIGZvciBaSVAgd2FzIHVuc3VjY2Vzc2Z1bC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkJCQkJCQkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gVGhpcyBtZXRob2QgaXMgbm90IGNvbnNpZGVyZWQgc3VpdGFibGUgKHJlbGlhYmxlIGVub3VnaCkgZm9yIGNyZWF0aW5nIGFyY2hpdmVzIG9yIGxhY2tlZCB6aXAgY2FwYWJpbGl0eQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RoZSAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJG1ldGhvZF90YWcgLiBfXygnIG1ldGhvZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgYmFja3VwLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsJCQkJCQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBoYXZlIGZhaWxlZCBpbiBhbGwgYXR0ZW1wdHMKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmFpbGVkIHRvIGNyZWF0ZSBhIFppcCBBcmNoaXZlIGZpbGUgd2l0aCBhbnkgbm9taW5hdGVkIG1ldGhvZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQlyZXR1cm4gZmFsc2U7CgkKCQl9CgoJCS8qKgoJCSAqCXVuemlwKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcGFyYW0JYm9vbHxzdHJpbmcgJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZQlGYWxzZTogdXNlIGFsbCBhdmFpbGFibGUsIFN0cmluZzogdXNlIHRoYXQgbWV0aG9kCgkJICoKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiB1bnppcCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID0gZmFsc2UgKSB7CgoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkKCQkJLy8gVGhlIGZvbGxvd2luZyBpcyBqdXN0IHRvIG1hdGNoIGN1cnJlbnQgZnVuY3Rpb25hbGl0eSBmb3IgaW1wb3J0YnVkZHkgLSBpZGVhbGx5IHdvdWxkIHJhdGhlcgoJCQkvLyBkbyBpdCBieSBzZWxlY3RpbmcgYXZhaWxhYmxlIGNvbXBhdGliaWxpdHkgbWV0aG9kcyBiYXNlZCBvbiBtZXRob2QgYXR0cmlidXRlcyAtIG1heSBkbyB0aGF0IGxhdGVyCgkJCS8vICh3b3VsZCBhbHNvIG5lZWQgZ2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKSB0byBiZSB1cGRhdGVkIHRvIHRha2UgcGFyYW1ldGVyIHRvIGNoZWNrCgkJCS8vIHdoZXRoZXIgY29tcGF0aWJpbGl0eSBtZXRob2QgZm9yIHRoYXQgcGFydGljdWxhciBmdW5jdGlvbi4KCQkJCQkJCgkJCS8vIERlY2lkZSB3aGljaCBtZXRob2RzIHdlIGFyZSBnb2luZyB0byB0cnkKCQkJaWYgKCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID09ICd6aXBhcmNoaXZlJyApIHsKCgkJCQkkemlwX21ldGhvZHMgPSBhcnJheSggJ3ppcGFyY2hpdmUnICk7CQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnRm9yY2VkIGNvbXBhdGliaWxpdHkgdW56aXAgbWV0aG9kIChaaXBBcmNoaXZlOyBtZWRpdW0gc3BlZWQpIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQl9IGVsc2VpZiAoICRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUgPT0gJ3BjbHppcCcgKSB7CgkJCQoJCQkJJHppcF9tZXRob2RzID0gYXJyYXkoICdwY2x6aXAnICk7CQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnRm9yY2VkIGNvbXBhdGliaWxpdHkgdW56aXAgbWV0aG9kIChQQ0xaaXA7IHNsb3cgc3BlZWQpIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsJCQkKCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1VzaW5nIGFsbCBhdmFpbGFibGUgdW56aXAgbWV0aG9kcyBpbiBwcmVmZXJyZWQgb3JkZXIuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9CgkJCQkJCQoJCQkvLyBCZXR0ZXIgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhdmFpbGFibGUgbWV0aG9kcwoJCQlpZiAoIGVtcHR5KCAkemlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBIbW0sIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgYXZhaWxhYmxlIG1ldGhvZHMsIG9vcHMsIGJlc3QgZ28gbm8gZnVydGhlcgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGV4dHJhY3QgYmFja3VwIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyk6IE5vIGF2YWlsYWJsZSB1bnppcCBtZXRob2RzIGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICk7CgkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgoJCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvciBzdWZmaXgJCgkJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPSBydHJpbSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsJCQoKCQkJLy8gSXRlcmF0ZSBvdmVyIHRoZSBtZXRob2RzIC0gb25jZSB3ZSBzdWNjZWVkIGp1c3QgcmV0dXJuIGRpcmVjdGx5IG90aGVyd2lzZSBkcm9wIHRocm91Z2gKCQkJZm9yZWFjaCAoICR6aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCgkJCQkvLyBGaXJzdCBtYWtlIHN1cmUgd2UgY2FuIGNoZWNrIGZpbGUgZXhpc3RlbmNlIHdpdGggdGhpcyBtZXRob2QgKGlnbm9yZSBzaWxlbnRseSBpZiBub3QpCgkJCQkvLyBOb3RlOiBoYXMgdG8gYmUgYWJsZSB0byB1bnppcCBhcyB3ZWxsIGJ1dCBpZiB0aGF0IGZ1bmN0aW9uYWxpdHkgd2Fzbid0IGF2YWlsYWJsZSBpbgoJCQkJLy8gdGhlIG1ldGhvZCB0aGUgaXNfY2hlY2tlciBhdHRyaWJ1dGUgd2lsbCBoYXZlIGJlZW4gc2V0IGZhbHNlCgkJCQlpZiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICdpc191bmFyY2hpdmVyJyBdID09PSB0cnVlICkgewoKCQkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQkKCQkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCQoJCQkJCS8vIFdlIG5lZWQgdG8gdGVsbCB0aGUgbWV0aG9kIHdoYXQgZGV0YWlscyBiZWxvbmcgdG8gaXQKCQkJCQkkemlwcGVyLT5zZXRfbWV0aG9kX2RldGFpbHMoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSApOwoJCQkJCQkJCQkJCgkJCQkJLy8gTm93IHdlIGFyZSByZWFkeSB0byB0cnkgYW5kIGV4dHJhY3QgdGhlIGJhY2t1cAoJCQkJCSRyZXN1bHQgPSAkemlwcGVyLT5leHRyYWN0KCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQkKCQkJCQkvLyBXaWxsIGJlIGZhbHNlIGlmIHdlIGNvdWxkbid0IGV4dHJhY3QgdGhlIGJhY2t1cAoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJLy8gTXVzdCBhc3N1bWUgdGhhdCB3ZSBleHRyYWN0ZWQgb2sKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuIHRydWU7CgkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBUaGUgemlwcGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHNvIHdlIG5lZWQgdG8gZHJvcCB0aHJvdWdoIGFuZCBsb29wIHJvdW5kIHRvIHRyeSBhbm90aGVyCgkJCQkJCS8vIFdlJ2xsIG5vdCBwcm9jZXNzIHRoZSByZXN1bHQgaGVyZSwganVzdCBkcm9wIHRocm91Z2ggc2lsZW50bHkgKHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBpdCkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gbm8gbWV0aG9kIHRvIGV4dHJhY3QgYmFja3VwIGNvbnRlbnQgd2FzIGF2YWlsYWJsZSBvciB3b3JrZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGV4dHJhY3QgYmFja3VwIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyk6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglleHRyYWN0KCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBzcGVjaWZpZWQgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoJVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBfbXVzdF8gYWxyZWFkeSBleGlzdCBhbmQgYmUgd3JpdGFibGUgLSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNyZWF0ZSBpdAoJCSAqCVRoZSBpdGVtcyBhcmUgYW4gYXJyYXkgb2YgbWFwcGluZyBvZiB3aGF0ID0+IHdoZXJlLCBlLmcuCgkJICoJYXJyYXkoICJkaXIvbXlmaWxlLnR4dCIgPT4gIiIsICJkaXIvbXlmaWxlLnR4dCIgPT4gInRtcGZpbGVuYW1lIiwgImRpci9teWZpbGUudHh0IiA9PiAiZGlyL215ZmlsZS50eHQiICkKCQkgKglJbiB0aGUgZmlyc3QgY2FzZSB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgdG8gJGRlc3RpbmF0aW9uX2RpcmVjdG9yeS9teWZpbGUudHh0CgkJICoJSW4gdGhlIHNlY29uZCBjYXNlIHRoZSBmaWxlIGlzIGV4dHJhY3RlZCB0byAkZGVzdGluYXRpb25fZGlyZWN0b3J5L3RtcGZpbGVuYW1lCgkJICoJSW4gdGhlIHRoaXJkIGNhc2UgdGhlIGZpbGUgaXMgZXh0cmFjdGVkIHRvICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkvZGlyL215ZmlsZS50eHQKCQkgKglOb3RlOiBpbiB0aGUgc2Vjb25kIGNhc2UgdGhlIGZpbGUgaXMgaW5pdGlhbGx5IGV4dHJjYXRlZCBhcyBteWZpbGUudHh0IGFuZCB0aGVuIHJlbmFtZSB0byB0bXBmaWxlbmFtZQoJCSAqCUFub3RoZXIgZXhhbXBsZSBpcyBmb3IgZGlyZWN0b3J5IGV4dHJhY3Rpb246CgkJICoJYXJyYXkoICJkaXIvKiIgPT4gImRpci8qIiApCgkJICoJV2hlcmVieSB0aGUgZGlyZWN0b3J5IGRpciBhbmQgYWxsIGl0J3MgY29udGVudCAocmVjdXJzaXZlbHkpIGlzIGV4dHJhY3RlZCB0byAkZGVzdGluYXRpb24vZGlyCgkJICoJTm90ZTogdGhlICogaXMgcmVxdWlyZWQgb3RoZXJ3aXNlIHlvdSBqdXN0IGdldCBhbiBlbXB0eSBkaXJlY3RvcnkKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJJHppcF9maWxlCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IHRvCgkJICoJQHBhcmFtCWFycmF5CSRpdGVtcwkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKgoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICkgewoKCQkJJHppcF9tZXRob2RzID0gYXJyYXkoKTsKCQkJCgkJCS8vIFRoZSBmb2xsb3dpbmcgaXMganVzdCB0byBtYXRjaCBjdXJyZW50IGZ1bmN0aW9uYWxpdHkgZm9yIGltcG9ydGJ1ZGR5IC0gaWRlYWxseSB3b3VsZCByYXRoZXIKCQkJLy8gZG8gaXQgYnkgc2VsZWN0aW5nIGF2YWlsYWJsZSBjb21wYXRpYmlsaXR5IG1ldGhvZHMgYmFzZWQgb24gbWV0aG9kIGF0dHJpYnV0ZXMgLSBtYXkgZG8gdGhhdCBsYXRlcgoJCQkvLyAod291bGQgYWxzbyBuZWVkIGdldF9jb21wYXRpYmlsaXR5X3ppcF9tZXRob2RzKCkgdG8gYmUgdXBkYXRlZCB0byB0YWtlIHBhcmFtZXRlciB0byBjaGVjawoJCQkvLyB3aGV0aGVyIGNvbXBhdGliaWxpdHkgbWV0aG9kIGZvciB0aGF0IHBhcnRpY3VsYXIgZnVuY3Rpb24uCgkJCQkJCQoJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkJCQkKCQkJLy8gQmV0dGVyIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJaWYgKCBlbXB0eSggJHppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gSG1tLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYW55IGF2YWlsYWJsZSBtZXRob2RzLCBvb3BzLCBiZXN0IGdvIG5vIGZ1cnRoZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBleHRyYWN0IGZyb20gYmFja3VwIGZpbGUgKCUxJHMgdG8gJTIkcyk6IE5vIGF2YWlsYWJsZSB1bnppcCBtZXRob2RzIGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uICkgKTsKCQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCWlmICggISggZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSAmJiBpc19kaXIoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSAmJiBpc193cml0YWJsZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICkgKSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGV4dHJhY3QgZnJvbSBiYWNrdXAgZmlsZSAoJTEkcyB0byAlMiRzKTogJTIkcyBkb2VzIG5vdCBleGlzdCwgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGlzIG5vdCB3cml0ZWFibGUnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvciBzdWZmaXgJCgkJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPSBydHJpbSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsJCQoKCQkJLy8gSXRlcmF0ZSBvdmVyIHRoZSBtZXRob2RzIC0gb25jZSB3ZSBzdWNjZWVkIGp1c3QgcmV0dXJuIGRpcmVjdGx5IG90aGVyd2lzZSBkcm9wIHRocm91Z2gKCQkJZm9yZWFjaCAoICR6aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCgkJCQkvLyBGaXJzdCBtYWtlIHN1cmUgd2UgY2FuIGNoZWNrIGZpbGUgZXhpc3RlbmNlIHdpdGggdGhpcyBtZXRob2QgKGlnbm9yZSBzaWxlbnRseSBpZiBub3QpCgkJCQkvLyBOb3RlOiBoYXMgdG8gYmUgYWJsZSB0byB1bnppcCBhcyB3ZWxsIGJ1dCBpZiB0aGF0IGZ1bmN0aW9uYWxpdHkgd2Fzbid0IGF2YWlsYWJsZSBpbgoJCQkJLy8gdGhlIG1ldGhvZCB0aGUgaXNfY2hlY2tlciBhdHRyaWJ1dGUgd2lsbCBoYXZlIGJlZW4gc2V0IGZhbHNlCgkJCQlpZiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICdpc19leHRyYWN0b3InIF0gPT09IHRydWUgKSB7CgoJCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCQoJCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkJCgkJCQkJLy8gV2UgbmVlZCB0byB0ZWxsIHRoZSBtZXRob2Qgd2hhdCBkZXRhaWxzIGJlbG9uZyB0byBpdAoJCQkJCSR6aXBwZXItPnNldF9tZXRob2RfZGV0YWlscyggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdICk7CgkJCQkJCQkJCQkKCQkJCQkvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHRyeSBhbmQgZXh0cmFjdCBmcm9tIHRoZSBiYWNrdXAKCQkJCQkkcmVzdWx0ID0gJHppcHBlci0+ZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsKCQkJCQkKCQkJCQkvLyBXaWxsIGJlIGZhbHNlIGlmIHdlIGNvdWxkbid0IGV4dHJhY3QgZnJvbSB0aGUgYmFja3VwCgkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQoJCQkJCQkvLyBNdXN0IGFzc3VtZSB0aGF0IHdlIGV4dHJhY3RlZCBvawoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQkJLy8gV2UgaGF2ZSB0byByZXR1cm4gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBicmVhayBvdXQgb2YgZm9yZWFjaAoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIFRoZSB6aXBwZXIgZW5jb3VudGVyZWQgYW4gZXJyb3Igc28gd2UgbmVlZCB0byBkcm9wIHRocm91Z2ggYW5kIGxvb3Agcm91bmQgdG8gdHJ5IGFub3RoZXIKCQkJCQkJLy8gV2UnbGwgbm90IHByb2Nlc3MgdGhlIHJlc3VsdCBoZXJlLCBqdXN0IGRyb3AgdGhyb3VnaCBzaWxlbnRseSAodGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGl0KQkJCQoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gZXh0cmFjdCBmcm9tIGJhY2t1cCBjb250ZW50IHdhcyBhdmFpbGFibGUgb3Igd29ya2VkCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBleHRyYWN0IGZyb20gYmFja3VwIGZpbGUgKCUxJHMgdG8gJTIkcyk6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglmaWxlX2V4aXN0cygpCgkJICoJCgkJICoJVGVzdHMgd2hldGhlciBhIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBnaXZlbiB6aXAgZmlsZQoJCSAqCUlmIGxlYXZlX29wZW4gaXMgdHJ1ZSB0aGVuIHRoZSB6aXAgb2JqZWN0IHdpbGwgYmUgbGVmdCBvcGVuIGZvciBmYXN0ZXIgY2hlY2tpbmcgZm9yIHN1YnNlcXVlbnQgZmlsZXMgd2l0aGluIHRoaXMgemlwCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcF9maWxlCQlUaGUgemlwIGZpbGUgdG8gY2hlY2sKCQkgKglAcGFyYW0JCXN0cmluZwkkbG9jYXRlX2ZpbGUJVGhlIGZpbGUgdG8gdGVzdCBmb3IKCQkgKglAcGFyYW0JCWJvb2wJJGxlYXZlX29wZW4JCU9wdGlvbmFsOiBUcnVlIGlmIHRoZSB6aXAgZmlsZSBzaG91bGQgYmUgbGVmdCBvcGVuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBmb3VuZCBpbiB0aGUgemlwIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkJCQkKCQkJJHppcF9tZXRob2RzID0gYXJyYXkoKTsKCQkJCQkJCgkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5femlwX21ldGhvZHM7CgkJCQoJCQkvLyBCZXR0ZXIgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhdmFpbGFibGUgbWV0aG9kcwoJCQlpZiAoIGVtcHR5KCAkemlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBIbW0sIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgYXZhaWxhYmxlIG1ldGhvZHMsIG9vcHMsIGJlc3QgZ28gbm8gZnVydGhlcgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmFpbGVkIHRvIGNoZWNrIGZpbGUgZXhpc3RzIC0gbm8gYXZhaWxhYmxlIG1ldGhvZHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkJCQkKCQkJLy8gSXRlcmF0ZSBvdmVyIHRoZSBtZXRob2RzIC0gb25jZSB3ZSBzdWNjZWVkIGp1c3QgcmV0dXJuIGRpcmVjdGx5IG90aGVyd2lzZSBkcm9wIHRocm91Z2gKCQkJZm9yZWFjaCAoICR6aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCgkJCQkvLyBGaXJzdCBtYWtlIHN1cmUgd2UgY2FuIGNoZWNrIGZpbGUgZXhpc3RlbmNlIHdpdGggdGhpcyBtZXRob2QgKGlnbm9yZSBzaWxlbnRseSBpZiBub3QpCgkJCQkvLyBOb3RlOiBoYXMgdG8gYmUgYWJsZSB0byB1bnppcCBhcyB3ZWxsIGJ1dCBpZiB0aGF0IGZ1bmN0aW9uYWxpdHkgd2Fzbid0IGF2YWlsYWJsZSBpbgoJCQkJLy8gdGhlIG1ldGhvZCB0aGUgaXNfY2hlY2tlciBhdHRyaWJ1dGUgd2lsbCBoYXZlIGJlZW4gc2V0IGZhbHNlCgkJCQlpZiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICdpc19jaGVja2VyJyBdID09PSB0cnVlICkgewoKCQkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQkKCQkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCQoJCQkJCS8vIFdlIG5lZWQgdG8gdGVsbCB0aGUgbWV0aG9kIHdoYXQgZGV0YWlscyBiZWxvbmcgdG8gaXQKCQkJCQkkemlwcGVyLT5zZXRfbWV0aG9kX2RldGFpbHMoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSApOwoJCQkJCQkJCQkJCgkJCQkJLy8gTm93IHdlIGFyZSByZWFkeSB0byB0cnkgYW5kIHRlc3QgZm9yIHRoZSBmaWxlIGV4aXN0ZW5jZQoJCQkJCSRyZXN1bHQgPSAkemlwcGVyLT5maWxlX2V4aXN0cyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUsICRsZWF2ZV9vcGVuICk7CgkJCQkJCgkJCQkJLy8gV2lsbCBiZSB0cnVlL2ZhbHNlIGlmIGZpbGUgZm91bmQvbm90LWZvdW5kIG90aGVyd2lzZSBlcnJvciBpbmZvcm1hdGlvbiBhcnJheQoJCQkJCWlmICggIWlzX2FycmF5KCAkcmVzdWx0ICkgKSB7CgkJCQkJCgkJCQkJCS8vIEVpdGhlciB3ZSBmb3VuZCB0aGUgZmlsZSBvciB3ZSBkaWRuJ3QgYnV0IHdlIGhhdmUgYSB2YWxpZCByZXN1bHQKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuICRyZXN1bHQ7CgkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBUaGUgemlwcGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHNvIHdlIG5lZWQgdG8gZHJvcCB0aHJvdWdoIGFuZCBsb29wIHJvdW5kIHRvIHRyeSBhbm90aGVyCgkJCQkJCS8vIFdlJ2xsIG5vdCBwcm9jZXNzIHRoZSByZXN1bHQgaGVyZSwganVzdCBkcm9wIHRocm91Z2ggc2lsZW50bHkgKHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBpdCkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gbm8gbWV0aG9kIHRvIGNoZWNrIGJhY2t1cCBjb250ZW50IHdhcyBhdmFpbGFibGUgb3Igd29ya2VkCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0cyAobG9va2luZyBmb3IgJTEkcyBpbiAlMiRzKTogTm8gY29tcGF0aWJsZSB6aXAgbWV0aG9kIGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRsb2NhdGVfZmlsZSwgJHppcF9maWxlICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9CgkJCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoKCQkJJHppcF9tZXRob2RzID0gYXJyYXkoKTsKCQkJCQkJCgkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5femlwX21ldGhvZHM7CgkJCQoJCQkvLyBCZXR0ZXIgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhdmFpbGFibGUgbWV0aG9kcwoJCQlpZiAoIGVtcHR5KCAkemlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBIbW0sIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgYXZhaWxhYmxlIG1ldGhvZHMsIG9vcHMsIGJlc3QgZ28gbm8gZnVydGhlcgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmFpbGVkIHRvIGxpc3QgYmFja3VwIGZpbGUgY29udGVudHMgLSBubyBhdmFpbGFibGUgbWV0aG9kcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQkJCQoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gbGlzdCBiYWNrdXAgZmlsZSBjb250ZW50IHdpdGggdGhpcyBtZXRob2QgKGlnbm9yZSBzaWxlbnRseSBpZiBub3QpCgkJCQkvLyBOb3RlOiBoYXMgdG8gYmUgYWJsZSB0byB1bnppcCBhcyB3ZWxsIGJ1dCBpZiB0aGF0IGZ1bmN0aW9uYWxpdHkgd2Fzbid0IGF2YWlsYWJsZSBpbgoJCQkJLy8gdGhlIG1ldGhvZCB0aGUgaXNfbGlzdGVyIGF0dHJpYnV0ZSB3aWxsIGhhdmUgYmVlbiBzZXQgZmFsc2UKCQkJCWlmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX2xpc3RlcicgXSA9PT0gdHJ1ZSApIHsKCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCB0ZXN0IGZvciB0aGUgZmlsZSBleGlzdGVuY2UKCQkJCQkkcmVzdWx0ID0gJHppcHBlci0+Z2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gV2lsbCBiZSBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBsaXN0IGNvbnRlbnRzIG9yIGZpbGUgbGlzdCBhcnJheSBvdGhlcndpc2UKCQkJCQlpZiAoIGlzX2FycmF5KCAkcmVzdWx0ICkgKSB7CgkJCQkJCgkJCQkJCS8vIFdlIGdvdCBhIGxpc3Qgc28gYmV0dGVyIGFzc3VtZSBpdCBpcyBvawoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQkJLy8gV2UgaGF2ZSB0byByZXR1cm4gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBicmVhayBvdXQgb2YgZm9yZWFjaAoJCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIFRoZSB6aXBwZXIgZW5jb3VudGVyZWQgYW4gZXJyb3Igc28gd2UgbmVlZCB0byBkcm9wIHRocm91Z2ggYW5kIGxvb3Agcm91bmQgdG8gdHJ5IGFub3RoZXIKCQkJCQkJLy8gV2UnbGwgbm90IHByb2Nlc3MgdGhlIHJlc3VsdCBoZXJlLCBqdXN0IGRyb3AgdGhyb3VnaCBzaWxlbnRseSAodGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGl0KQkJCQoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gbGlzdCBiYWNrdXAgZmlsZSBjb250ZW50IHdhcyBhdmFpbGFibGUgb3Igd29ya2VkCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBjaGVjayBmaWxlIGNvbnRlbnQgb2YgYmFja3VwICglMSRzKTogTm8gY29tcGF0aWJsZSB6aXAgbWV0aG9kIGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qCXNldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmd8YXJyYXkJJGNvbW1lbnQJCUNvbW1lbnQgdG8gYXBwbHkgdG8gYXJjaGl2ZS4gSWYgYXJyYXksIGpzb24gZW5jb2RlZC4gRGVsaW1pbmF0ZWQgd2l0aCBNZXRhRGF0YTogYW5kIE1ldGFEYXRhLUVuZDouCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkJCgkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCk7CgkJCQkJCQoJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkKCQkJLy8gQmV0dGVyIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJaWYgKCBlbXB0eSggJHppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gSG1tLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYW55IGF2YWlsYWJsZSBtZXRob2RzLCBvb3BzLCBiZXN0IGdvIG5vIGZ1cnRoZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBzZXQgY29tbWVudCBpbiBiYWNrdXAgZmlsZSAtIG5vIGF2YWlsYWJsZSBtZXRob2RzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIEVuY29kZSAkY29tbWVudCBpZiBhbiBhcnJheS4gSGFuZGxlIGRlbGltaW5hdGlvbi4KCQkJaWYgKCBpc19hcnJheSggJGNvbW1lbnQgKSApIHsKCQkJCSRjb21tZW50ID0ganNvbl9lbmNvZGUoICRjb21tZW50ICk7CgkJCX0KCQkJJGNvbW1lbnQgPSAnTWV0YURhdGE6JyAuICRjb21tZW50IC4gJ01ldGFEYXRhLUVuZDonOwoJCQkKCQkJLy8gSXRlcmF0ZSBvdmVyIHRoZSBtZXRob2RzIC0gb25jZSB3ZSBzdWNjZWVkIGp1c3QgcmV0dXJuIGRpcmVjdGx5IG90aGVyd2lzZSBkcm9wIHRocm91Z2gKCQkJZm9yZWFjaCAoICR6aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gbWFuYWdlIGNvbW1lbnRzIHdpdGggdGhpcyBtZXRob2QgKGlnbm9yZSBzaWxlbnRseSBpZiBub3QpCgkJCQlpZiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICdpc19jb21tZW50ZXInIF0gPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCQkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCB0ZXN0IGZvciB0aGUgZmlsZSBleGlzdGVuY2UKCQkJCQkkcmVzdWx0ID0gJHppcHBlci0+c2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJGNvbW1lbnQgKTsKCQkJCQkKCQkJCQkvLyBXaWxsIGJlIGZhbHNlIGlmIHdlIGNvdWxkbid0IHNldCB0aGUgY29tbWVudAoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJLy8gTXVzdCBhc3N1bWUgdGhhdCBjb21tZW50IHdhcyBzZXQgb2sKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuIHRydWU7CgkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBUaGUgemlwcGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHNvIHdlIG5lZWQgdG8gZHJvcCB0aHJvdWdoIGFuZCBsb29wIHJvdW5kIHRvIHRyeSBhbm90aGVyCgkJCQkJCS8vIFdlJ2xsIG5vdCBwcm9jZXNzIHRoZSByZXN1bHQgaGVyZSwganVzdCBkcm9wIHRocm91Z2ggc2lsZW50bHkgKHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBpdCkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gY291bGRuJ3Qgc2V0IGEgY29tbWVudCBhdCBhbGwgLSBlaXRoZXIgbm8gYXZhaWxhYmxlIG1ldGhvZCBvciBhbGwgbWV0aG9kIGZhaWxlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQgb3IgYWxsIG1ldGhvZHMgZmFpbGVkIC0gbm90ZSBzdG9yZWQgaW50ZXJuYWxseSBvbmx5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkvLyBSZXR1cm4gbWVzc2FnZSBmb3IgZGlzcGxheSAtIG1heWJlIHNob3VsZCByZXR1cm4gZmFsc2UgYW5kIGhhdmUgY2FsbGVyIGRpc3BsYXkgaXQncyBvd24gbWVzc2FnZT8KCQkJJG1lc3NhZ2UgPSAiXG5cblVuYWJsZSB0byBzZXQgbm90ZSBpbiBmaWxlLlxuVGhlIG5vdGUgd2lsbCBvbmx5IGJlIHN0b3JlZCBpbnRlcm5hbGx5IGluIHlvdXIgc2V0dGluZ3MgYW5kIG5vdCBpbiB0aGUgemlwIGZpbGUgaXRzZWxmLiI7CgkJCXJldHVybiAkbWVzc2FnZTsKCQkJCgkJfQoJCQoJCS8qCWdldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcGFyYW0JCWJvb2wJCQkJJHJhd19jb21tZW50CUlmIHRydWUgdGhlbiByYXcgY29tbWVudCBmaWVsZCBkYXRhIHJldHVybmVkIHdpdGhvdXQgcHJvY2Vzc2luZyBkZWxpbWluYXRvcnMgbm9yIGpzb24uIERlZmF1bHRzIGZhbHNlLgoJCSAqCUByZXR1cm4JCWJvb2x8c3RyaW5nfGFycmF5CQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBaaXAgY29tbWVudCBvdGhlcndpc2UuIElmIGNvbW1lbnQgaXMganNvbiBlbmNvZGVkIGFycmF5IHJldHVybnMgYXJyYXkuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9jb21tZW50KCAkemlwX2ZpbGUsICRyYXdfY29tbWVudCA9IGZhbHNlICkgewoJCQkKCQkJJHppcF9tZXRob2RzID0gYXJyYXkoKTsKCQkJCQkJCgkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5femlwX21ldGhvZHM7CgkJCQoJCQkvLyBCZXR0ZXIgbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBhdmFpbGFibGUgbWV0aG9kcwoJCQlpZiAoIGVtcHR5KCAkemlwX21ldGhvZHMgKSApIHsKCQkJCQoJCQkJLy8gSG1tLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYW55IGF2YWlsYWJsZSBtZXRob2RzLCBvb3BzLCBiZXN0IGdvIG5vIGZ1cnRoZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBnZXQgY29tbWVudCBmcm9tIGJhY2t1cCBmaWxlIC0gbm8gYXZhaWxhYmxlIG1ldGhvZHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gSXRlcmF0ZSBvdmVyIHRoZSBtZXRob2RzIC0gb25jZSB3ZSBzdWNjZWVkIGp1c3QgcmV0dXJuIGRpcmVjdGx5IG90aGVyd2lzZSBkcm9wIHRocm91Z2gKCQkJZm9yZWFjaCAoICR6aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCgkJCQkvLyBGaXJzdCBtYWtlIHN1cmUgd2UgY2FuIG1hbmFnZSBjb21tZW50cyB3aXRoIHRoaXMgbWV0aG9kIChpZ25vcmUgc2lsZW50bHkgaWYgbm90KQoJCQkJaWYgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID09PSB0cnVlICkgewoJCQkJCQoJCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCQkJCQoJCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkJCgkJCQkJLy8gV2UgbmVlZCB0byB0ZWxsIHRoZSBtZXRob2Qgd2hhdCBkZXRhaWxzIGJlbG9uZyB0byBpdAoJCQkJCSR6aXBwZXItPnNldF9tZXRob2RfZGV0YWlscyggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdICk7CgkJCQkJCQkJCQkKCQkJCQkvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHRyeSBhbmQgdGVzdCBmb3IgdGhlIGZpbGUgZXhpc3RlbmNlCgkJCQkJJHJlc3VsdCA9ICR6aXBwZXItPmdldF9jb21tZW50KCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBXaWxsIGJlIGZhbHNlIGlmIHdlIGNvdWxkbid0IHNldCB0aGUgY29tbWVudAoJCQkJCWlmICggaXNfc3RyaW5nICggJHJlc3VsdCApICkgewoJCQkJCQoJCQkJCQkvLyBGb3JtYXQgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciBlbmNvZGluZyBhcyBodG1sZW10aXRpZXMgd2hlbiBzZXR0aW5nIGNvbW1lbnQKCQkJCQkJLy8gRm9yIG9sZGVyIGJhY2t1cHMgbWF5IG5lZWQgdG8gcmVtb3ZlIGVuY29kaW5nIC0gYWN0aW9uIF9zaG91bGRfIGJlIG51bGwgaWYgTi9BCgkJCQkJCS8vIE9ubHkgc3Bhbm5lciB3b3VsZCBiZSBpZiBzb21lb25lIGhhZCBwdXQgYW4gZW50aXR5IGluIHRoZWlyIGNvbW1lbnQgYnV0IHRoYXQgaXMKCQkJCQkJLy8gcmVhbGx5IGFuIG91dHNpZGVyIGFuZCBpbiBhbnkgY2FzZSB0aGUgY29ycmVjdGlvbiBpcyBzaW1wbHkgdG8gZWRpdCBhbmQgcmVzYXZlCgkJCQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gbmV3IGZvcm1hdCBoYXMgYmVlbiBpbiB1c2UgZm9yIHNvbWUgdGltZQoJCQkJCQkkcmVzdWx0ID0gaHRtbF9lbnRpdHlfZGVjb2RlKCAkcmVzdWx0ICk7CgkJCQkJCgkJCQkJCS8vIE11c3QgYXNzdW1lIHRoYXQgY29tbWVudCB3YXMgcmV0cmlldmVkIG9rCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCQkvLyBSZXR1cm4gcmF3IGNvbW1lbnQgYXMtaXMgd2l0aCBubyBwcm9jZXNzaW5nIGlmIHNwZWNpZmllZC4KCQkJCQkJaWYgKCB0cnVlID09PSAkcmF3X2NvbW1lbnQgKSB7CgkJCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJLy8gSGFuZGxlIGRlbGltaW5hdGlvbi4gRGVjb2RlICRyZXN1bHQgaWYganNvbiBkZWNvZGVkIChhc3NvY2lhdGl2ZSBhcnJheSBtb2RlKS4KCQkJCQkJJHN0YXJ0X2RlbGltaW5hdG9yID0gc3RycG9zKCAkcmVzdWx0LCAnTWV0YURhdGE6JyApOwoJCQkJCQkkZW5kX2RlbGltaW5hdG9yID0gc3RycG9zKCAkcmVzdWx0LCAnTWV0YURhdGEtRW5kOicgKTsKCQkJCQkJaWYgKCAoIGZhbHNlICE9PSAkc3RhcnRfZGVsaW1pbmF0b3IgKSAmJiAoIGZhbHNlICE9PSAkZW5kX2RlbGltaW5hdG9yICkgKSB7IC8vIEZvdW5kIGJvdGggZGVsaW1pbmF0b3JzLgoJCQkJCQkJJHJlc3VsdCA9IHN1YnN0ciggJHJlc3VsdCwgJHN0YXJ0X2RlbGltaW5hdG9yKzksICRlbmRfZGVsaW1pbmF0b3ItOSApOwoJCQkJCQkJaWYgKCBOVUxMID09PSAoICRkZWNvZGVkX3Jlc3VsdCA9IGpzb25fZGVjb2RlKCAkcmVzdWx0LCB0cnVlICkgKSApIHsgLy8gSnNvbiBkZWNvZGUgZmFpbGVkIHNvIHJldHVybiBzdHJpbmcuCgkJCQkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQl9IGVsc2UgeyAvLyBKc29uIGRlY29kZSBzdWNjZXNzIHNvIHJldHVybmluZyB2YXJpYWJsZSAoc2hvdWxkIGJlIGFuIGFycmF5IG1vc3QgbGlrZWx5KS4KCQkJCQkJCQlyZXR1cm4gJGRlY29kZWRfcmVzdWx0OwoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIE5vIGRlbGltaW5hdG9ycyBmb3VuZCBpZiBtYWRlIGl0IHRvIHRoaXMgcG9pbnQgc28gYXNzdW1pbmcgcGxhaW4gdGV4dCBsZWdhY3kgY29tbWVudCAob3IgZGVsaW1pbmF0b3JzIG1pc3NpbmcvY29ycnVwdCkuCgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIHRvIHJldHVybiBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IGJyZWFrIG91dCBvZiBmb3JlYWNoCgkJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBUaGUgemlwcGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHNvIHdlIG5lZWQgdG8gZHJvcCB0aHJvdWdoIGFuZCBsb29wIHJvdW5kIHRvIHRyeSBhbm90aGVyCgkJCQkJCS8vIFdlJ2xsIG5vdCBwcm9jZXNzIHRoZSByZXN1bHQgaGVyZSwganVzdCBkcm9wIHRocm91Z2ggc2lsZW50bHkgKHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBpdCkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gY291bGRuJ3QgZ2V0IGEgY29tbWVudCBhdCBhbGwgLSBlaXRoZXIgbm8gYXZhaWxhYmxlIG1ldGhvZCBvciBhbGwgbWV0aG9kIGZhaWxlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gZ2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQgb3IgYWxsIG1ldGhvZHMgZmFpbGVkLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCQkJCQoJCS8vIEZPUiBGVVRVUkUgVVNFOyBOT1QgWUVUIElNUExFTUVOVEVELiBVc2UgdG8gY2hlY2sgLnNxbCBmaWxlIGlzIG5vbi1lbXB0eS4KCQlmdW5jdGlvbiBmaWxlX3N0YXRzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkJaWYgKCBpbl9hcnJheSggJ3ppcGFyY2hpdmUnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQkkdGhpcy0+X3ppcCA9IG5ldyBaaXBBcmNoaXZlOwoJCQkJaWYgKCAkdGhpcy0+X3ppcC0+b3BlbiggJHppcF9maWxlICkgPT09IHRydWUgKSB7CgkJCQkJaWYgKCAoICRzdGF0cyA9ICR0aGlzLT5femlwLT5zdGF0TmFtZSggJGxvY2F0ZV9maWxlICkgKSA9PT0gZmFsc2UgKSB7IC8vIEZpbGUgbm90IGZvdW5kIGluIHppcC4KCQkJCQkJJHRoaXMtPl96aXAtPmNsb3NlKCk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kICh6aXBhcmNoaXZlKSBmb3Igc3RhdHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCSR0aGlzLT5femlwLT5jbG9zZSgpOwoJCQkJCXJldHVybiAkc3RhdHM7CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBjaGVjayBzdGF0cyAobG9va2luZyBpbiAlMSRzKS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gSWYgd2UgbWFkZSBpdCB0aGlzIGZhciB0aGVuIHppcGFyY2hpdmUgbm90IGF2YWlsYWJsZS9mYWlsZWQuCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQlyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKTsKCQkJCSR0aGlzLT5femlwID0gbmV3IFBjbFppcCggJHppcF9maWxlICk7CgkJCQlpZiAoICggJGZpbGVfbGlzdCA9ICR0aGlzLT5femlwLT5saXN0Q29udGVudCgpICkgPT0gMCApIHsgLy8gSWYgemVybywgemlwIGlzIGNvcnJ1cHQgb3IgZW1wdHkuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkdGhpcy0+X3ppcC0+ZXJyb3JJbmZvKCB0cnVlICkgKTsKCQkJCX0gZWxzZSB7CgkJCQkJZm9yZWFjaCggJGZpbGVfbGlzdCBhcyAkZmlsZSApIHsKCQkJCQkJaWYgKCAkZmlsZVsnZmlsZW5hbWUnXSA9PSAkbG9jYXRlX2ZpbGUgKSB7IC8vIEZvdW5kIGZpbGUuCgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAocGNsemlwKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVW5hYmxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJCQkKCX0gLy8gRW5kIGNsYXNzCgkKCS8vJHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5ID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCAkdGhpcy0+X29wdGlvbnNbJ2JhY2t1cF9kaXJlY3RvcnknXSApOwoKfQo= ###PACKDATA,FILE_END,/lib/zipbuddy/zipbuddy.php,importbuddy/lib/zipbuddy/zipbuddy.php ###PACKDATA,FILE_START,/lib/mysqlbuddy/index.php,importbuddy/lib/mysqlbuddy/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/lib/mysqlbuddy/index.php,importbuddy/lib/mysqlbuddy/index.php ###PACKDATA,FILE_START,/lib/mysqlbuddy/mysqlbuddy.php,importbuddy/lib/mysqlbuddy/mysqlbuddy.php PD9waHAKLyoJcGJfYmFja3VwYnVkZHlfbXlzcWxidWRkeSBjbGFzcwogKgkKICoJQHNpbmNlIDMuMC4wCiAqCiAqCUhlbHBzIGJhY2t1cCBhbmQgcmVzdG9yZSBkYXRhYmFzZSB0YWJsZXMuCiAqCUR1bXBzIGEgbXlzcWwgZGF0YWJhc2UgKGFsbCB0YWJsZXMsIHRhYmxlcyB3aXRoIGEgY2VydGFpbiBwcmVmaXgsIG9yIG5vbmUpIHdpdGggYWRkaXRpb25hbCBpbmNsdXNpb25zL2V4Y2x1c2lvbnMgb2YgdGFibGVzIHBvc3NpYmxlLgogKglBdXRvbWF0aWNhbGx5IGRldGVybWluZXMgYXZhaWxhYmxlIGR1bXAgbWV0aG9kcyAodW5sZXNzIG1ldGhvZCBpcyBmb3JjZWQpLiBSdW5zIG1ldGhvZHMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gRmFsbHMgYmFjayBhdXRvbWF0aWNhbGx5CiAqCXRvIGFueSBgbGVzc2VyYCBtZXRob2RzIGlmIGFueSBmYWlsLgogKglCb3RoIGR1bXAgYW5kIGltcG9ydCBzdXBwb3J0IGJvdGggUEhQLWJhc2VkIGFuZCBjb21tYW5kIGxpbmUgbWV0aG9kcy4gUEhQLWJhc2VkIGlzIHByZWZlcnJlZCBzaW5jZSBpdCBzdXBwb3J0cyBjaHVua2luZyBhbmQgYnVyc3RpbmcuCiAqCiAqCVJlcXVpcmVtZW50czoKICoKICoJCUV4cGVjdHMgbXlzcWwgdG8gYWxyZWFkeSBiZSBzZXQgdXAgYW5kIGNvbm5lY3RlZC4KICoKICoJR2VuZXJhbCBwcm9jZXNzIG9yZGVyOgogKgogKgkJQ29uc3RydWN0aW9uOiBfX2NvbnN0cnVjdCgpIC0+IFthdmFpbGFibGVfemlwX21ldGhvZHMoKV0KICoJCUR1bXA6IGR1bXAoKSAtPiBfY2FsY3VsYXRlX3RhYmxlcygpIC0+IFtfbXlzcWwgYW5kL29yIF9waHBdCiAqCiAqCQlNZXRob2QgcHJvY2VzczoKICoJCQlfbXlzcWwgbWV0aG9kIChGQVNUKToKICoJCQkJQnVpbGRzIHRoZSBjb21tYW5kIGxpbmUgLT4gcnVucyBjb21tYW5kIHZpYSBleGVjKCkgLT4gY2hlY2tzIGV4aXQgY29kZSAtPiB2ZXJpZmllcyAuc3FsIGZpbGUgd2FzIGNyZWF0ZWQ7IGZhbGxzIHRvIG5leHQgbWV0aG9kIGlmIGV4aXQgY29kZSBpcyBiYWQgb3IgLnNxbCBmaWxlIGlzIG1pc3NpbmcuCiAqCQkJX3BocCBtZXRob2QgKFNMT1c7IGNvbXBhdGliaWxpdHkgbW9kZTsgb25seSBtb2RlIHByZS0zLjApOgogKgkJCQlJdGVyYXRlcyB0aHJvdWdoIGFsbCB0YWJsZXMgaXNzdWluZyBTUUwgY29tbWFuZHMgdG8gc2VydmVyIHRvIGdldCBjcmVhdGUgc3RhdGVtZW50cyBhbmQgYWxsIGRhdGFiYXNlIGNvbnRlbnQuIFZlcnkgYnJ1dGUgZm9yY2UgbWV0aG9kLgogKgogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X215c3FsYnVkZHkgewoJCgkKCWNvbnN0IENPTU1BTkRfTElORV9MRU5HVEhfQ0hFQ0tfVEhSRVNIT0xEID0gMjUwOwkJCQkJCQkJCQkJCQkvLyBJZiBjb21tYW5kIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhpcyB0aGVuIHdlIHdpbGwgdHJ5IHRvIGRldGVybWluZSBtYXggY29tbWFuZCBsaW5lIGxlbmd0aC4KCWNvbnN0IFRJTUVfV0lHR0xFX1JPT00gPSA0OwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBOdW1iZXIgb2Ygc2Vjb25kcyB0byBmdWRnZSB1cCB0aGUgdGltZSBlbGFwc2VkIHRvIGdpdmUgYSBsaXR0bGUgd2lnZ2xlIHJvb20gc28gd2UgZG9uJ3QgYWNjaWRlbnRseSBoaXQgdGhlIGVkZ2UgYW5kIHRpbWUgb3V0LgoJY29uc3QgSEVBUlRCRUFUX0NPVU5UX0xJTUlUID0gMjAwMDsJCQkJCQkJCQkJCQkJCQkJCS8vIE51bWJlciBvZiByb3dzL3F1ZXJpZXMgdG8gaGVhcnRiZWF0IGFmdGVyLCBsb2dnaW5nIG51bWJlciBvZiByb3dzIGhhbmRsZWQuCgkKCS8qKioqKioqKioqIFByb3BlcnRpZXMgKioqKioqKioqKi8KCQoJCglwcml2YXRlICRfdmVyc2lvbiA9ICcwLjAuMSc7CQkJCQkJCQkJCQkJCQkJCQkJLy8gSW50ZXJuYWwgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgbGlicmFyeS4KCQoJcHJpdmF0ZSAkX2RhdGFiYXNlX2hvc3QgPSAnJzsJCQkJCQkJCQkJCQkJCQkJCQkvLyBEYXRhYmFzZSBob3N0L3NlcnZlci4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJcHJpdmF0ZSAkX2RhdGFiYXNlX3NvY2tldCA9ICcnOwkJCQkJCQkJCQkJCQkJCQkJCS8vIElmIHVzaW5nIHNvY2tldHMsIHBvaW50cyB0byBzb2NrZXQgZmlsZS4gTGVmdCBibGFuayBpZiBzb2NrZXRzIG5vdCBpbiB1c2UuIEBzZWUgX19jb25zdHJ1Y3QoKS4KCXByaXZhdGUgJF9kYXRhYmFzZV9uYW1lID0gJyc7CQkJCQkJCQkJCQkJCQkJCQkJLy8gRGF0YWJhc2UgbmFtZS4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJcHJpdmF0ZSAkX2RhdGFiYXNlX3VzZXIgPSAnJzsJCQkJCQkJCQkJCQkJCQkJCQkvLyBEYXRhYmFzZSB1c2VybmFtZS4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJcHJpdmF0ZSAkX2RhdGFiYXNlX3Bhc3MgPSAnJzsJCQkJCQkJCQkJCQkJCQkJCQkvLyBEYXRhYmFzZSBwYXNzd29yZC4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJcHJpdmF0ZSAkX2RhdGFiYXNlX3ByZWZpeCA9ICcnOwkJCQkJCQkJCQkJCQkJCQkJCS8vIERhdGFiYXNlIHRhYmxlIHByZWZpeCB0byBiYWNrdXAgd2hlbiBpbiBwcmVmaXggbW9kZS4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJcHJpdmF0ZSAkX2RhdGFiYXNlX3BvcnQgPSAnJzsJCQkJCQkJCQkJCQkJCQkJCQkvLyBEYXRhYmFzZSBwb3J0IHRvIEZPUkNFLiBEZWZhdWx0IGJsYW5rLiBJZiBzZXQgdGhlbiB0aGlzIHBvcnQgd2lsbCBiZSBzcGVjaWZpZWQgaW4gY29ubmVjdGlvbi4gTGVhdmUgYmxhbmsgdG8gdXNlIGRlZmF1bHQgZm9yIHNlcnZlci4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJCglwcml2YXRlICRfYmFzZV9kdW1wX21vZGUgPSAnJzsJCQkJCQkJCQkJCQkJCQkJCQkvLyBEZXRlcm1pbmVzIGJhc2UgdGFibGVzIHRvIGluY2x1ZGUgaW4gYmFja3VwLiBFeDogbm9uZSwgYWxsLCBvciBieSBwcmVmaXguIEBzZWUgX19jb25zdHJ1Y3QoKS4KCXByaXZhdGUgJF9hZGRpdGlvbmFsX2luY2x1ZGVzID0gYXJyYXkoKTsJCQkJCQkJCQkJCQkJCQkvLyBBZGRpdGlvbmFsIHRhYmxlcyB0byBiYWNrdXAgaW4gYWRkaXRpb24gdG8gdGhvc2UgZGV0ZXJtaW5lZCBieSBiYXNlIG1vZGUuCglwcml2YXRlICRfYWRkaXRpb25hbF9leGNsdWRlcyA9IGFycmF5KCk7CQkJCQkJCQkJCQkJCQkJLy8gVGFibGVzIHRvIGV4Y2x1ZGUgZnJvbSAoICRfYWRkaXRpb25hbF9pbmNsdWRlcyArIHRob3NlIGRldGVybWluZWQgYnkgYmFzZSBtb2RlICkuCglwcml2YXRlICRfbWV0aG9kcyA9IGFycmF5KCk7CQkJCQkJCQkJCQkJCQkJCQkJLy8gQXZhaWxhYmxlIG1lY2hhbmlzbXMgZm9yIGR1bXBpbmcgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KCXByaXZhdGUgJF9teXNxbF9kaXJlY3RvcmllcyA9IGFycmF5KCk7CQkJCQkJCQkJCQkJCQkJCS8vIFBvcHVsYXRlZCBieSBfY2FsY3VsYXRlX215c3FsX2RpcmVjdG9yeSgpLgoJcHJpdmF0ZSAkX2RlZmF1bHRfbXlzcWxfZGlyZWN0b3JpZXMgPSBhcnJheSggJy91c3IvYmluLycsICcvdXNyL2Jpbi9teXNxbC8nLCAnL3Vzci9sb2NhbC9iaW4vJyApOwkvLyBJZiBteXNxbCB0ZWxscyB1cyB3aGVyZSBpdHMgaW5zdGFsbGVkIHdlIHByZXBlbmQgdG8gdGhpcy4gQmVnaW5uaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLgoJcHJpdmF0ZSAkX215c3FsX2RpcmVjdG9yeSA9ICcnOwkJCQkJCQkJCQkJCQkJCQkJCS8vIFRlc3RlZCB3b3JraW5nIG15c3FsIGRpcmVjdG9yeSB0byB1c2UgZm9yIGFjdHVhbCBkdW1wLgoJcHJpdmF0ZSAkX2NvbW1hbmRidWRkeTsKCQoJcHJpdmF0ZSAkX2luY29taW5nX3NxbF92ZXJzaW9uID0gJyc7CQkJCQkJCQkJCQkJCQkJCS8vIFZlcnNpb24gb2YgdGhlIG15c3FsIHNlcnZlciB0aGF0IGR1bXBlZCB0aGlzIFNRTC4gSGFuZGxlIHdvcmthcm91bmRzIG9mIFNRTCBzeW50YXggY2hhbmdlcy4KCXByaXZhdGUgJF9jdXJyZW50X3NxbF92ZXJzaW9uID0gJyc7CQkJCQkJCQkJCQkJCQkJCQkvLyBWZXJzaW9uIG9mIHRoZSBteXNxbCBzZXJ2ZXIgcnVubmluZyBsb2NhbGx5LCBjYWxjdWxhdGVkIG9uIGNvbnN0cnVjdC4KCXByaXZhdGUgJF9ob3RmaXhfNzAwMSA9IGZhbHNlOwkJCQkJCQkJCQkJCQkJCQkJCS8vIFdoZXRoZXIgb3Igbm90IHRvIG1pZ3JhdGUgU1FMIHN5bnRheCBmb3IgaW5jb21pbmcgbXlzcWwgPCB2NS4xIHdoZW4gaW1wb3J0aW5nIHRvIG15c3FsIDUuMSsuCgkKCXByaXZhdGUgJF9tYXhFeGVjdXRpb25UaW1lID0gJyc7Cglwcml2YXRlICRfbWF4X3Jvd3NfcGVyX3NlbGVjdCA9IDEwMDA7Cglwcml2YXRlICRfOTAxMHNfZW5jb3VudGVyZWQgPSAwOwoJcHJpdmF0ZSAkX21heF85MDEwc19hbGxvd2VkID0gOTsgLy8gQWZ0ZXIgdGhpcyBwb2ludCBhbiBlcnJvciB3aWxsIGJlIHNob3duIGluZGljYXRpbmcgc3Vic2VxdWVudCBlcnJvcnMgd2lsbCBiZSBoaWRkZW4uIEFsbCA5MDEwIGxvZyB0bzogQUJTUEFUSCAuICdpbXBvcnRidWRkeS9teXNxbF85MDEwX2xvZy0nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCcKCQoJcHJpdmF0ZSAkX2ZvcmNlX3NpbmdsZV9kYl9maWxlID0gZmFsc2U7IC8vIFdoZW4gZW5hYmxlZCwgQmFja3VwQnVkZHkgd2lsbCBkdW1wIGluZGl2aWR1YWwgdGFibGVzIHRvIHRoZWlyIG93biBkYXRhYmFzZSBmaWxlIChlZyB3cF9vcHRpb25zLnNxbCwgd3BfcG9zdHMuc3FsLCBldGMpIHdoZW4gcG9zc2libGUgYmFzZWQgb24gb3RoZXIgY3JpdGVyaWEgc3VjaCBhcyB0aGUgZHVtcCBtZXRob2QgYW5kIHdoZXRoZXIgYnJlYWtpbmcgb3V0IGJpZyB0YWJsZXMgaXMgZW5hYmxlZC4KCXByaXZhdGUgJF9jdXJyZW50X3NxbF9maWxlID0gJyc7IC8vIEN1cnJlbnQgU1FMIGZpbGUgb3BlcmF0ZWQgb24uIFVzZWQgZm9yIGxvZ2dpbmcuCgkKCS8qKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKi8KCQoJCgkvKglfX2NvbnN0cnVjdCgpCgkgKgkKCSAqCURlZmF1bHQgcm93cyBwZXIgc2VsZWN0IGlzIGRldGVybWluZWQgYnkgZGVmYXVsdCBwcml2YXRlIHZhciBhYm92ZSBpZiBub25lIHBhc3NlZC4gT3ZlcnJpZGVuIGJ5IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwbXlzcWxkdW1wX21heHJvd3MnXSBpZiBub3QgYmxhbmsgYW5kIGlzIG51bWVyaWMgYW5kIG92ZXJyaWRlbiBieSBwYXNzZWQgcGFyYW1ldGVyIGlmIGRlZmluZWQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkZGF0YWJhc2VfaG9zdAkJCUhvc3QgLyBzZXJ2ZXIgb2YgZGF0YWJhc2UgdG8gcHVsbCBmcm9tLiBNYXkgYmUgaW4gdGhlIGZvcm1hdDogYGxvY2FsaG9zdGAgZm9yIG5vcm1hbDsgYGxvY2FsaG9zdDovcGF0aC90by9teXNxbC5zb2NrYCBmb3Igc29ja2V0cy4gSWYgc29ja2V0cyB0aGVuIHBhcmFzZWQgYW5kIGludGVybmFsIGNsYXNzIHZhcmlhYmxlcyBzZXQgYXBwcm9wcmlhdGVseS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkZGF0YWJhc2VfbmFtZQkJCU5hbWUgb2YgZGF0YWJhc2UgdG8gcHVsbCBmcm9tLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRkYXRhYmFzZV91c2VyCQkJVXNlciBvZiBkYXRhYmFzZSB0byBwdWxsIGZyb20uCgkgKglAcGFyYW0JCXN0cmluZwkJJGRhdGFiYXNlX3Bhc3MJCQlQYXNzIG9mIGRhdGFiYXNlIHRvIHB1bGwgZnJvbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkZGF0YWJhc2VfcHJlZml4CQlQcmVmaXggb2YgdGFibGVzIGluIGRhdGFiYXNlIHRvIHB1bGwgZnJvbSAvIGluc2VydCBpbnRvIChvbmx5IHVzZWQgaWYgYmFzZSBtb2RlIGlzIGBwcmVmaXhgKS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRmb3JjZV9tZXRob2RzCQkJT3B0aW9uYWwuIE92ZXJyaWRlIGF1dG9tYXRpYyBtZXRob2QgZGV0ZWN0aW9uLiBTa2lwcyB0ZXN0IGFuZCBydW5zIGZpcnN0IG1ldGhvZCBmaXJzdC4gIEZhbGxzIGJhY2sgdG8gb3RoZXIgbWV0aG9kcyBpZiBhbnkgZmFpbHVyZS4gUG9zc2libGUgbWV0aG9kczogIGNvbW1hbmRsaW5lLCBwaHAKCSAqCUBwYXJhbQkJaW50CQkJJG1heEV4ZWN1dGlvbgkJCU9wdGlvbmFsLiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIHRvIHJ1biBmb3IgYmVmb3JlIHN0b3BwaW5nIHRvIGFsbG93IGZvciBjb250aW51aW5nIHRoZSBuZXh0IGltcG9ydCBwaWNraW5nIHVwIHdoZXJlIHdlIGxlZnQgb2ZmLiBJZiBibGFuayB3ZSB0cnkgYW5kIGRlZHVjZSBpdC4gSWYgLTEgdGhlbiB3ZSBkbyBOT1QgdXNlIGNodW5raW5nLiBVc2VmdWwgZm9yIGNsYXNzaWMgbW9kZS4KCSAqCUBwYXJhbQkJaW50CQkJJG1heF9yb3dzX3Blcl9zZWxlY3QJT3B0aW9uYWwuIEZvciBQSFAtYmFzZWQgbXlzcWwgZHVtcCwgbWF4IG51bWJlciBvZiByb3dzIHBlciBzZWxlY3QgdG8gZ3JhYi4KCSAqCUByZXR1cm4JCQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRkYXRhYmFzZV9ob3N0LCAkZGF0YWJhc2VfbmFtZSwgJGRhdGFiYXNlX3VzZXIsICRkYXRhYmFzZV9wYXNzLCAkZGF0YWJhc2VfcHJlZml4LCAkZm9yY2VfbWV0aG9kcyA9IGFycmF5KCksICRtYXhFeGVjdXRpb24gPSAnJywgJG1heF9yb3dzX3Blcl9zZWxlY3QgPSAnJyApIHsKCQkKCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocG15c3FsZHVtcF9tYXhyb3dzJ10gKSAmJiAoICcnICE9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwbXlzcWxkdW1wX21heHJvd3MnXSApICYmICggaXNfbnVtZXJpYyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBteXNxbGR1bXBfbWF4cm93cyddICkgKSApIHsKCQkJJHRoaXMtPl9tYXhfcm93c19wZXJfc2VsZWN0ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBteXNxbGR1bXBfbWF4cm93cyddOwoJCX0KCQlpZiAoICggJycgIT0gJG1heF9yb3dzX3Blcl9zZWxlY3QgKSAmJiAoIGlzX251bWVyaWMoICRtYXhfcm93c19wZXJfc2VsZWN0ICkgKSApIHsKCQkJJHRoaXMtPl9tYXhfcm93c19wZXJfc2VsZWN0ID0gJG1heF9yb3dzX3Blcl9zZWxlY3Q7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BIUC1iYXNlZCBteXNxbGR1bXAgKGlmIGFwcGxpY2FibGUpIG1heCByb3dzIHBlciBzZWxlY3Qgc2V0IHRvICcgLiAkdGhpcy0+X21heF9yb3dzX3Blcl9zZWxlY3QgLiAnLicgKTsKCQkKCQkvLyBIYW5kbGVzIGNvbW1hbmQgbGluZSBleGVjdXRpb24uCgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL2NvbW1hbmRidWRkeS9jb21tYW5kYnVkZHkucGhwJyApOwoJCSR0aGlzLT5fY29tbWFuZGJ1ZGR5ID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2NvbW1hbmRidWRkeSgpOwoJCQoJCS8vIENoZWNrIGZvciB1c2Ugb2Ygc29ja2V0cyBpbiBob3N0LiBIYW5kbGUgaWYgdXNpbmcgc29ja2V0cy4KCQkvLyRkYXRhYmFzZV9ob3N0ID0gJ2xvY2FsaG9zdDovQXBwbGljYXRpb25zL1hBTVBQL3hhbXBwZmlsZXMvdmFyL215c3FsL215c3FsLnNvY2snOwoJCWlmICggc3RycG9zKCAkZGF0YWJhc2VfaG9zdCwgJzonICkgPT09IGZhbHNlICkgeyAvLyBOb3JtYWwgaG9zdC4gTm8gc29ja2V0IG9yIHBvcnQgc3BlY2lmaWVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBob3N0IGZvciBkdW1waW5nOiBgJyAuICRkYXRhYmFzZV9ob3N0IC4gJ2AnICk7CgkJCSR0aGlzLT5fZGF0YWJhc2VfaG9zdCA9ICRkYXRhYmFzZV9ob3N0OwoJCX0gZWxzZSB7IC8vIE5vbi1ub3JtYWwgaG9zdCBzcGVjaWZpY2F0aW9uLiBFaXRoZXIgc29ja2V0IG9yIHBvcnQgbnVtYmVyIGlzIHNwZWNpZmllZC4KCQkJJGhvc3Rfc3BsaXQgPSBleHBsb2RlKCAnOicsICRkYXRhYmFzZV9ob3N0ICk7CgkJCWlmICggISBpc19udW1lcmljKCAkaG9zdF9zcGxpdFsxXSApICkgeyAvLyBTdHJpbmcgc28gYXNzdW1lIGEgc29ja2V0LgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgaG9zdCAoc29ja2V0KSBmb3IgZHVtcGluZy4gSG9zdDogYCcgLiAkaG9zdF9zcGxpdFswXSAuICdgOyBTb2NrZXQ6IGAnIC4gJGhvc3Rfc3BsaXRbMV0gLiAnYC4nICk7CgkJCQkkdGhpcy0+X2RhdGFiYXNlX2hvc3QgPSAkaG9zdF9zcGxpdFswXTsKCQkJCSR0aGlzLT5fZGF0YWJhc2Vfc29ja2V0ID0gJGhvc3Rfc3BsaXRbMV07CgkJCX0gZWxzZWlmICggaXNfbnVtZXJpYyggJGhvc3Rfc3BsaXRbMV0gKSApIHsgLy8gUG9ydCBudW1iZXIgc3BlY2lmaWVkLgoJCQkJJHRoaXMtPl9kYXRhYmFzZV9ob3N0ID0gJGhvc3Rfc3BsaXRbMF07CgkJCQkkdGhpcy0+X2RhdGFiYXNlX3BvcnQgPSAkaG9zdF9zcGxpdFsxXTsKCQkJfSBlbHNlIHsgLy8gVWtub3duLiBMZWF2ZSBhcyBvbmUgcGllY2UuCgkJCQkkdGhpcy0+X2RhdGFiYXNlX2hvc3QgPSAkZGF0YWJhc2VfaG9zdDsKCQkJfQoJCX0KCQl1bnNldCggJGhvc3Rfc3BsaXQgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2FkaW5nIG15c3FsYnVkZHkgbGlicmFyeS4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTXlzcWwgc2VydmVyIGRlZmF1bHQgZGlyZWN0b3JpZXM6IGAnIC4gaW1wbG9kZSggJywnLCAkdGhpcy0+X2RlZmF1bHRfbXlzcWxfZGlyZWN0b3JpZXMgKSAuICdgJyApOwoJCQoJCSR0aGlzLT5fZGF0YWJhc2VfbmFtZSA9ICRkYXRhYmFzZV9uYW1lOwoJCSR0aGlzLT5fZGF0YWJhc2VfdXNlciA9ICRkYXRhYmFzZV91c2VyOwoJCSR0aGlzLT5fZGF0YWJhc2VfcGFzcyA9ICRkYXRhYmFzZV9wYXNzOwoJCSR0aGlzLT5fZGF0YWJhc2VfcHJlZml4ID0gJGRhdGFiYXNlX3ByZWZpeDsKCQkKCQlpZiAoIGlzX2FycmF5KCAkZm9yY2VfbWV0aG9kcyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBGb3JjZSBtZXRob2Qgb2YgYCcgLiBjb3VudCggJGZvcmNlX21ldGhvZHMgKSAuICdgIHBhc3NlZC4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRm9yY2UgbWV0aG9kIG5vdCBhbiBhcnJheS4nICk7CgkJfQoJCQoJCS8vIFNldCBtZWNoYW5pc20gZm9yIGR1bXBpbmcgLyByZXN0b3JpbmcuCgkJaWYgKCBjb3VudCggJGZvcmNlX21ldGhvZHMgKSA+IDAgKSB7IC8vIE1lY2hhbmlzbSBmb3JjZWQuIE92ZXJyaWRpbmcgYXV0b21hdGljIGNoZWNrLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdteXNxbGJ1ZGR5OiBTZXR0aW5ncyBvdmVycmlkaW5nIGF1dG9tYXRpYyBkZXRlY3Rpb24gb2YgYXZhaWxhYmxlIGRhdGFiYXNlIGR1bXAgbWV0aG9kcy4gVXNpbmcgZm9yY2VkIG92ZXJyaWRlIG1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkZm9yY2VfbWV0aG9kcyApIC4gJ2AuJyApOwoJCQlpZiAoIGluX2FycmF5KCAnY29tbWFuZGxpbmUnLCAkZm9yY2VfbWV0aG9kcyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm9yY2VkIG1ldGhvZHMgaW5jbHVkZSBjb21tYW5kbGluZSBzbyBjYWxjdWxhdGluZyBteXNxbCBkaXJlY3RvcnkuJyApOwoJCQkJJHRoaXMtPl9teXNxbF9kaXJlY3RvcmllcyA9ICR0aGlzLT5fY2FsY3VsYXRlX215c3FsX2RpcigpOyAvLyBUcnkgdG8gZGV0ZXJtaW5lIG15c3FsIGxvY2F0aW9uIC8gcG9zc2libGUgbG9jYXRpb25zLgoJCQkJJHRoaXMtPl9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV9kdW1wX21ldGhvZHMoKTsgLy8gUnVuIGFmdGVyIF9jYWxjdWxhdGVfbXlzcWxfZGlyKCkuCgkJCX0KCQkJJHRoaXMtPl9tZXRob2RzID0gJGZvcmNlX21ldGhvZHM7CgkJfSBlbHNlIHsgLy8gTm8gbWV0aG9kIGRlZmluZWQ7IGF1dG8tZGV0ZWN0IHRoZSBiZXN0LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdteXNxbGJ1ZGR5OiBNZXRob2Qgbm90IGZvcmNlZC4gQWJvdXQgdG8gZGV0ZWN0IGRpcmVjdG9yeSBhbmQgYXZhaWxhYmxlIG1ldGhvZHMuJyApOwoJCQkKCQkJJHRoaXMtPl9teXNxbF9kaXJlY3RvcmllcyA9ICR0aGlzLT5fY2FsY3VsYXRlX215c3FsX2RpcigpOyAvLyBUcnkgdG8gZGV0ZXJtaW5lIG15c3FsIGxvY2F0aW9uIC8gcG9zc2libGUgbG9jYXRpb25zLgoJCQkkdGhpcy0+X21ldGhvZHMgPSAkdGhpcy0+YXZhaWxhYmxlX2R1bXBfbWV0aG9kcygpOyAvLyBSdW4gYWZ0ZXIgX2NhbGN1bGF0ZV9teXNxbF9kaXIoKS4KCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnbXlzcWxidWRkeTogRGV0ZWN0ZWQgZGF0YWJhc2UgZHVtcCBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9tZXRob2RzICkgLiAnYC4nICk7CgkJCgkJLy8gRmlndXJlIG91dCBtYXggZXhlY3V0aW9uIHRpbWUgYWxsb3dlZC4KCQlpZiAoICggJycgIT0gJG1heEV4ZWN1dGlvbiApICYmICggaXNfbnVtZXJpYyggJG1heEV4ZWN1dGlvbiApICkgKSB7CgkJCSR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSA9ICRtYXhFeGVjdXRpb247CgkJfSBlbHNlIHsgLy8gTm90IHBhc3NlZC4gRGVkdWNlLgoJCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddICkgKSB7CgkJCQkkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddOwoJCQl9IGVsc2UgewoJCQkJLy8gRGV0ZWN0IG1heCBleGVjdXRpb24gdGltZS4KCQkJCSR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmRldGVjdE1heEV4ZWN1dGlvblRpbWUoKTsKCQkJfQoJCX0KCQlpZiAoICctMScgPT0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNYXggZXhlY3V0aW9uIHRpbWUgY2h1bmtpbmcgZGlzYWJsZWQgYnkgcGFzc2luZyAtMSB0byBjb25zdHJ1Y3Rvci4gTm8gY2h1bmtpbmcgd2lsbCBiZSB1c2VkIGZvciB0aGUgZGF0YWJhc2UgZHVtcC4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnSWYgYXBwbGljYWJsZSwgYnJlYWtpbmcgdXAgd2l0aCBtYXggZXhlY3V0aW9uIHRpbWUgYCcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnYCBzZWNvbmRzLicgKTsKCQl9CgkJCgkJZ2xvYmFsICR3cGRiOwoJCSR0aGlzLT5fY3VycmVudF9zcWxfdmVyc2lvbiA9ICR3cGRiLT5kYl92ZXJzaW9uKCk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGhpcyBzZXJ2ZXJcJ3MgbXlzcWwgdmVyc2lvbjogYCcgLiAkdGhpcy0+X2N1cnJlbnRfc3FsX3ZlcnNpb24gLiAnYC4nICk7CgkJCgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoJCgkKCQoJLyogc2V0X2luY29taW5nX3NxbF92ZXJzaW9uKCkKCSAqCgkgKiBTZXQgdGhlIG15c3FsIHZlcnNpb24gd2hpY2ggY3JlYXRpbmcgdGhlIFNRTCBmaWxlKHMpIHdlIHdpbGwgYmUgaW1wb3J0aW5nLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9pbmNvbWluZ19zcWxfdmVyc2lvbiggJHZlcnNpb24gKSB7CgkJJHRoaXMtPl9pbmNvbWluZ19zcWxfdmVyc2lvbiA9ICR2ZXJzaW9uOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NldCBpbmNvbWluZyBTUUwgbXlzcWwgdmVyc2lvbiB0byBgJyAuICR0aGlzLT5faW5jb21pbmdfc3FsX3ZlcnNpb24gLiAnYC4nICk7CgkJCgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR0aGlzLT5faW5jb21pbmdfc3FsX3ZlcnNpb24sICc1LjEuMCcsICc8JyApICYmIHZlcnNpb25fY29tcGFyZSggJHRoaXMtPl9jdXJyZW50X3NxbF92ZXJzaW9uLCAnNS4xLjAnLCAnPj0nICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ0Vycm9yICM3MDAxOiBUaGlzIHNlcnZlclwncyBteXNxbCB2ZXJzaW9uLCBgJyAuICR0aGlzLT5fY3VycmVudF9zcWxfdmVyc2lvbiAuICdgIG1heSBoYXZlIFNRTCBxdWVyeSBpbmNvbXBhdGliaWxpdGllcyB3aXRoIHRoZSBiYWNrdXAgbXlzcWwgdmVyc2lvbiBgJyAuICR0aGlzLT5faW5jb21pbmdfc3FsX3ZlcnNpb24gLiAnYC4gVGhpcyBtYXkgcmVzdWx0IGluICM5MDEwIGVycm9ycyBkdWUgdG8gc3ludGF4IG9mIFRZUEU9IGNoYW5naW5nIHRvIEVOR0lORT0uIElmIG5vbmUgb2NjdXIgeW91IG1heSBpZ25vcmUgdGhpcyBlcnJvci4nICk7CgkJCSR0aGlzLT5faG90Zml4XzcwMDEgPSB0cnVlOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFbmFibGluZyBob3RmaXggIzcwMDEgdG8gcmVwbGFjZSBUWVBFPSB3aXRoIEVOR0lORT0gaW4gU1FMIHN5bnRheC4nICk7CgkJfQoJfSAvLyBFbmQgc2V0X2luY29taW5nX3NxbF92ZXJzaW9uKCkuCgkKCQoJLyogZm9yY2Vfc2luZ2xlX2RiX2ZpbGUoKQoJICoKCSAqIFdoZW4gZW5hYmxlZCBieSBwYXNzaW5nIHRydWUsIEJhY2t1cEJ1ZGR5IHdpbGwgZHVtcCBpbmRpdmlkdWFsIHRhYmxlcyB0byB0aGVpciBvd24gZGF0YWJhc2UgZmlsZSAoZWcgd3Bfb3B0aW9ucy5zcWwsIHdwX3Bvc3RzLnNxbCwgZXRjKSB3aGVuIHBvc3NpYmxlIGJhc2VkIG9uIG90aGVyIGNyaXRlcmlhIHN1Y2ggYXMgdGhlIGR1bXAgbWV0aG9kIGFuZCB3aGV0aGVyIGJyZWFraW5nIG91dCBiaWcgdGFibGVzIGlzIGVuYWJsZWQuCgkgKgoJICogQHBhcmFtCWJvb2wJJGZvcmNlCQlXaGV0aGVyIG9yIG5vdCB0byBmb3JjZSB0byBzaW5nbGUgZmlsZS4gRGVmYXVsdHMgdG8gVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KCSAqIEByZXR1cm4JbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZm9yY2Vfc2luZ2xlX2RiX2ZpbGUoICRmb3JjZSA9IHRydWUgKSB7CgkJaWYgKCB0cnVlID09PSAkZm9yY2UgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvcmNpbmcgZGF0YWJhc2UgYmFja3VwcyB0byBnbyBpbnRvIGEgc2luZ2xlIGRiXzEuc3FsIGZpbGUgZGVzcGl0ZSBvdGhlciBzZXR0aW5ncy4nICk7CgkJCSR0aGlzLT5fZm9yY2Vfc2luZ2xlX2RiX2ZpbGUgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0VuYWJsaW5nIGRhdGFiYXNlIGJhY2t1cHMgdG8gZ28gaW50byBpbmRpdmlkdWFsIHRhYmxlbmFtZS5zcWwgZmlsZXMgYXMgcG9zc2libGUuJyApOwoJCQkkdGhpcy0+X2ZvcmNlX3NpbmdsZV9kYl9maWxlID0gZmFsc2U7CgkJfQoJCXJldHVybjsKCX0gLy8gRW5kIGZvcmNlX3NpbmdsZV9kYl9maWxlKCkuCgkKCQoJLyoJYXZhaWxhYmxlX2R1bXBfbWV0aG9kcygpCgkgKgkKCSAqCWZ1bmN0aW9uIGRlc2NyaXB0aW9uCgkgKgkKCSAqCUBwYXJhbQkJCgkgKglAcmV0dXJuCQlzdHJpbmcJCQkJUG9zc2libGUgcmV0dXJuczogIG15c3FsZHVtcCwgcGhwCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhdmFpbGFibGVfZHVtcF9tZXRob2RzKCkgewoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsZHVtcCB0ZXN0OiBUZXN0aW5nIGF2YWlsYWJsZSBteXNxbCBkYXRhYmFzZSBkdW1wIG1ldGhvZHMuJyApOwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsgLy8gRXhlYyBpcyBhdmFpbGFibGUgc28gdGVzdCBteXNxbGR1bXAgZnJvbSBoZXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGR1bXAgdGVzdDogZXhlYygpIGZ1bmN0aW9uIGV4aXN0cy4gVGVzdGluZyBydW5uaW5nIG15c3FsZHVtcCB2aWEgZXhlYygpLicgKTsKCQkJCgkJCQoJCQkvKioqKioqKioqKiBCZWdpbiBwcmVwYXJpbmcgY29tbWFuZCAqKioqKioqKioqLwoJCQkvLyBIYW5kbGUgV2luZG93cyB3YW50aW5nIC5leGUuCgkJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCQkkY29tbWFuZCA9ICdtc3FsZHVtcC5leGUnOwoJCQl9IGVsc2UgewoJCQkJJGNvbW1hbmQgPSAnbXlzcWxkdW1wJzsKCQkJfQoJCQkKCQkJJGNvbW1hbmQgLj0gIiAtLXZlcnNpb24iOwoJCQkKCQkJLy8gUmVkaXJlY3QgU1RERVJSIHRvIFNURE9VVC4KCQkJJGNvbW1hbmQgLj0gJyAgMj4mMSc7CgkJCQoJCQkvKioqKioqKioqKiBFbmQgcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkJCgkJCS8vIExvb3AgdGhyb3VnaCBhbGwgcG9zc2libGUgZGlyZWN0b3JpZXMgdG8gcnVuIGNvbW1hbmQgdGhyb3VnaC4KCQkJZm9yZWFjaCggJHRoaXMtPl9teXNxbF9kaXJlY3RvcmllcyBhcyAkbXlzcWxfZGlyZWN0b3J5ICkgeyAvLyBUcnkgZWFjaCBwb3NzaWJsZSBkaXJlY3RvcnkuIG15c3FsIGRpcmVjdG9yeSBpbmNsdWRlZCB0cmFpbGluZyBzbGFzaC4KCQkJCQoJCQkJLy8gUnVuIGNvbW1hbmQuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGR1bXAgdGVzdCBydW5uaW5nIG5leHQuJyApOwoJCQkJbGlzdCggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKSA9ICR0aGlzLT5fY29tbWFuZGJ1ZGR5LT5leGVjdXRlKCAkbXlzcWxfZGlyZWN0b3J5IC4gJGNvbW1hbmQgKTsKCQkJCQoJCQkJaWYgKCBzdHJpc3RyKCBpbXBsb2RlKCAnICcsICRleGVjX291dHB1dCApLCAnVmVyJyApICE9PSBmYWxzZSApIHsgLy8gU3RyaW5nIFZlciBhcHBlYXJlZCBpbiByZXNwb25zZSAoZXhwZWN0ZWQgcmVzcG9uc2UgdG8gbXlzcWxkdW1wIC0tdmVyc2lvbgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsZHVtcCB0ZXN0OiBDb21tYW5kIGFwcGVhcnMgdG8gYmUgYWNjZXNzaWJsZSBhbmQgcmV0dXJucyBleHBlY3RlZCByZXNwb25zZS4nICk7CgkJCQkJJHRoaXMtPl9teXNxbF9kaXJlY3RvcnkgPSAkbXlzcWxfZGlyZWN0b3J5OyAvLyBTZXQgdG8gdXNlIHRoaXMgZGlyZWN0b3J5IGZvciB0aGUgcmVhbCBkdW1wLgoJCQkJCXJldHVybiBhcnJheSggJ3BocCcsICdjb21tYW5kbGluZScgKTsgLy8gbXlzcWxkdW1wIGJlc3QsIHBocCBuZXh0LgoJCQkJfQoJCQl9CgkJCQoJCQkKCQl9IGVsc2UgeyAvLyBObyBleGVjKCkgc28gbXVzdCBmYWxsIGJhY2sgdG8gUEhQIG1ldGhvZCBvbmx5LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGR1bXAgdGVzdDogZXhlYygpIHVuYXZhaWxhYmxlIHNvIHNraXBwaW5nIGNvbW1hbmQgbGluZSBteXNxbGR1bXAgY2hlY2suJyApOwoJCQlyZXR1cm4gYXJyYXkoICdwaHAnICk7CgkJfQoJCQoJCXJldHVybiBhcnJheSggJ3BocCcgKTsKCQkKCX0gLy8gRW5kIGF2YWlsYWJsZV9kdW1wX21ldGhvZCgpLgoJCgkKCQoJLyoJX2NhbGN1bGF0ZV9teXNxbF9kaXIoKQoJICoJCgkgKglUcmllcyB0byBkZXRlcm1pbmUgdGhlIHBhdGggdG8gd2hlcmUgbXlzcWwgaXMgaW5zdGFsbGVkLiAgTmVlZGVkIGZvciBydW5uaW5nIGJ5IGNvbW1hbmQgbGluZS4gIFByZXBlbmRzIGZvdW5kIGxvY2F0aW9uIHRvIGxpc3Qgb2YgcG9zc2libGUgZGVmYXVsdCBteXNxbCBkaXJlY3Rvcmllcy4KCSAqCQoJICoJQHJldHVybgkJYXJyYXkJCQlBcnJheSBvZiBkaXJlY3RvcmllcyBpbiBwcmVmZXJyZWQgb3JkZXIuCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2NhbGN1bGF0ZV9teXNxbF9kaXIoKSB7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQXR0ZW1wdGluZyB0byBjYWxjdWxhdGUgZXhhY3QgbXlzcWwgZGlyZWN0b3J5LicgKTsKCQkkZmFpbGVkID0gdHJ1ZTsKCQkkbXlzcWxfZGlyZWN0b3JpZXMgPSAkdGhpcy0+X2RlZmF1bHRfbXlzcWxfZGlyZWN0b3JpZXM7CgkJCgkJZ2xvYmFsICR3cGRiOwoJCSRiYXNlZGlyID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0hPVyBWQVJJQUJMRVMgTElLRSAnYmFzZWRpciciLCBBUlJBWV9OICk7CgkJaWYgKCAkYmFzZWRpciAhPT0gZmFsc2UgKSB7CgkJCSRiYXNlZGlydHJpbSA9IHJ0cmltKCAkYmFzZWRpclswXVsxXSwgJy9cXCcgKTsgLy8gVHJpbSB0cmFpbGluZyBzbGFzaGVzLgoJCQkkbXlzcWxkaXIgPSAkYmFzZWRpcnRyaW0gLiAnL2Jpbi8nOwoJCQlhcnJheV91bnNoaWZ0KCAkbXlzcWxfZGlyZWN0b3JpZXMsICRteXNxbGRpciApOyAvLyBQcmVwZW5kcyB0aGUganVzdCBmb3VuZCBkaXJlY3RvcnkgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogTXlzcWwgcmVwb3J0ZWQgaXRzIGRpcmVjdG9yeS4gUmVwb3J0ZWQ6IGAnIC4gJGJhc2VkaXJbMF1bMV0gLiAnYDsgQWRkaW5nIGJpbmFyeSBsb2NhdGlvbiB0byBiZWdpbm5pbmcgb2YgbXlzcWwgZGlyZWN0b3J5IGxpc3Q6IGAnIC4gJG15c3FsZGlyIC4gJ2AnICk7CgkJCSRmYWlsZWQgPSBmYWxzZTsKCQl9CgkJCgkJaWYgKCAkZmFpbGVkID09PSB0cnVlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBNeXNxbCB3b3VsZCBub3QgcmVwb3J0IGl0cyBkaXJlY3RvcnkuJyApOwoJCX0KCQkKCQlyZXR1cm4gJG15c3FsX2RpcmVjdG9yaWVzOwoJCQoJfSAvLyBFbmQgX2NhbGN1bGF0ZV9teXNxbF9kaXIoKS4KCQoJCgkKCS8qCWR1bXAoKQoJICoJCgkgKglmdW5jdGlvbiBkZXNjcmlwdGlvbgoJICoKCSAqCUBzZWUgX215c3FsZHVtcCgpLgoJICoJQHNlZSBfcGhwZHVtcCgpLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG91dHB1dF9kaXJlY3RvcnkJCURpcmVjdG9yeSB0byBvdXRwdXQgdG8uIE1heSBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmlsZSBsb2NhdGlvbi4gVHJhaWxpbmcgc2xhc2ggYXV0by1hZGRlZCBpZiBtaXNzaW5nLgoJICoJQHBhcmFtCQlhcnJheQkJJHRhYmxlcwkJCQkJQXJyYXkgb2YgdGFibGVzIHRvIGR1bXAuCgkgKglAcGFyYW0JCWludAkJCSRyb3dzX3N0YXJ0CQkJCVN0YXJ0aW5nIHJvdywgaWYgYW55LiBPbmx5IHdvcmtzIHdpdGggUEhQIG1vZGUuIFVzZWQgd2l0aCBjaHVua2luZy4KCSAqCUByZXR1cm4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGR1bXAoICRvdXRwdXRfZGlyZWN0b3J5LCAkdGFibGVzID0gYXJyYXkoKSwgJHJvd3Nfc3RhcnQgPSAwICkgeyAvLywgJGJhc2VfZHVtcF9tb2RlLCAkYWRkaXRpb25hbF9pbmNsdWRlcyA9IGFycmF5KCksICRhZGRpdGlvbmFsX2V4Y2x1ZGVzID0gYXJyYXkoKSApIHsKCQkKCQkkb3V0cHV0X2RpcmVjdG9yeSA9IHJ0cmltKCAkb3V0cHV0X2RpcmVjdG9yeSwgJy8nICkgLiAnLyc7IC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHRyYWlsaW5nIHNsYXNoLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtaWxlc3RvbmUnLCAnc3RhcnRfZGF0YWJhc2UnICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgZGF0YWJhc2UgZHVtcCBwcm9jZWR1cmUuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgIm15c3FsYnVkZHk6IE91dHB1dCBkaXJlY3Rvcnk6IGB7JG91dHB1dF9kaXJlY3Rvcnl9YC4iICk7CgkJaWYgKCBjb3VudCggJHRhYmxlcyApID09IDEgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0R1bXBpbmcgc2luZ2xlIHRhYmxlIGAnIC4gJHRhYmxlc1swXSAuICdgLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUYWJsZSBkdW1wIGNvdW50OiBgJyAuIGNvdW50KCAkdGFibGVzICkgLiAnYC4nICk7CgkJfQoJCWlmICggZmlsZV9leGlzdHMoICRvdXRwdXRfZGlyZWN0b3J5IC4gJ2RiXzEuc3FsJyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBTUUwgZmlsZSBleGlzdHMuIEl0IHdpbGwgYmUgYXBwZW5kZWQgdG8uJyApOwoJCX0KCQkKCQkvLyBBdHRlbXB0IGVhY2ggbWV0aG9kIGluIG9yZGVyLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ByZXBhcmluZyB0byBkdW1wIHVzaW5nIGF2YWlsYWJsZSBtZXRob2QocykgYnkgcHJpb3JpdHkuIE1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkdGhpcy0+X21ldGhvZHMgKSAuICdgJyApOwoJCWZvcmVhY2goICR0aGlzLT5fbWV0aG9kcyBhcyAkbWV0aG9kICkgewoJCQkkcmV0dXJuID0gZmFsc2U7CgkJCWlmICggbWV0aG9kX2V4aXN0cyggJHRoaXMsICJfZHVtcF97JG1ldGhvZH0iICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBBdHRlbXB0aW5nIGR1bXAgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgLicgKTsKCQkJCSRyZXN1bHQgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICR0aGlzLCAiX2R1bXBfeyRtZXRob2R9IiApLCAkb3V0cHV0X2RpcmVjdG9yeSwgJHRhYmxlcywgJHJvd3Nfc3RhcnQgKTsKCQkJCQoJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBEdW1wIGNvbXBsZXRlZCBzdWNjZXNmdWxseSB3aXRoIHRoaXMgbWV0aG9kLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IER1bXAgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyApOwoJCQkJCSRyZXR1cm4gPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfSBlbHNlaWYgKCAkcmVzdWx0ID09PSBmYWxzZSApIHsgLy8gRHVtcCBmYWlsZWQgdGhpcyBtZXRob2QuIFdpbGwgdHJ5IGNvbXBhdGliaWxpdHkgZmFsbGJhY2sgdG8gbmV4dCBtb2RlIGlmIGFibGUuCgkJCQkJLy8gRG8gbm90aGluZy4gV2lsbCB0cnkgbmV4dCBtb2RlIG5leHQgbG9vcC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1wIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBmYWlsZWQuIFRyeWluZyBhbm90aGVyIGNvbXBhdGliaWxpdHkgbW9kZSBuZXh0IGlmIGFibGUuJyApOwoJCQkJfSBlbHNlaWYgKCBpc19hcnJheSggJHJlc3VsdCApICkgeyAvLyBDaHVua2luZy4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1wIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBpcyB1c2luZyBjaHVua2luZy4nICk7CgkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQl9IGVsc2UgeyAvLyBTb21ldGhpbmcgZWxzZSByZXR1cm5lZDsgbmVlZCB0byByZXN1bWU/IFRPRE86IHRoaXMgaXMgZm9yIGZ1dHVyZSB1c2UgZm9yIHJlc3VtaW5nIGR1bXAuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVW5leGVwZWN0ZWQgcmVzcG9uc2U6IGAnIC4gaW1wbG9kZSggJywnLCAkcmVzdWx0ICkgLiAnYCcgKTsKCQkJCQkkcmV0dXJuID0gZmFsc2U7CgkJCQl9CgkJCX0KCQl9IC8vIGVuZCBmb3JlYWNoLgoJCQoJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3N0YXR1cycsICdkYXRhYmFzZV9lbmQnICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21pbGVzdG9uZScsICdmaW5pc2hfZGF0YWJhc2UnICk7CgkJCgkJaWYgKCAkcmV0dXJuID09PSB0cnVlICkgeyAvLyBTdWNjZXNzLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdEYXRhYmFzZSBkdW1wIHByb2NlZHVyZSBzdWNjZWVkZWQuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgeyAvLyBPdmVyYWxsIGZhaWx1cmUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdEYXRhYmFzZSBkdW1wIHByb2NlZHVyZSBmYWlsZWQuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJfSAvLyBFbmQgZHVtcCgpLgoJCgkKCQoJLyoJX2R1bXBfY29tbWFuZGxpbmUoKQoJICoJCgkgKglmdW5jdGlvbiBkZXNjcmlwdGlvbgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG91dHB1dF9kaXJlY3RvcnkJCURpcmVjdG9yeSB0byBvdXRwdXQgdG8uIE1heSBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmlsZSBsb2NhdGlvbi4gVHJhaWxpbmcgc2xhc2ggcmVxdWlyZWQuIGR1bXAoKSBhdXRvLWFkZHMgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIHBhc3NpbmcuCgkgKglAcGFyYW0JCWFycmF5CQkkdGFibGVzCQkJCQlBcnJheSBvZiB0YWJsZXMgdG8gZHVtcC4gSWYgb25seSBvbmUgdGFibGUgaW4gYXJyYXkgdGhlbiB3aWxsIHVzZSBUQUJMRU5BTUUuc3FsIGluc3RlYWQgb2YgZGJfMS5zcWwuCgkgKglAcGFyYW0JCWludAkJCSRyb3dzX3N0YXJ0CQkJCU4vQS4gTm90IHVzZWQgYnkgdGhpcyBtZXRob2QuCgkgKglAcmV0dXJuCQkKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfZHVtcF9jb21tYW5kbGluZSggJG91dHB1dF9kaXJlY3RvcnksICR0YWJsZXMsICRyb3dzX3N0YXJ0ID0gMCApIHsgLy8sICRiYXNlX2R1bXBfbW9kZSwgJGFkZGl0aW9uYWxfZXhjbHVkZXMgKSB7CgkJCgkJaWYgKCAoIGNvdW50KCAkdGFibGVzICkgPT0gMSApICYmICggZmFsc2UgPT09ICR0aGlzLT5fZm9yY2Vfc2luZ2xlX2RiX2ZpbGUgKSApIHsgLy8gSWYgb25seSBvbmUgdGFibGUgdGhlbiBuYW1lIC5zcWwgZmlsZSBhZnRlciBpdC4KCQkJJG91dHB1dF9maWxlID0gJG91dHB1dF9kaXJlY3RvcnkgLiAkdGFibGVzWzBdIC4gJy5zcWwnOwoJCX0gZWxzZSB7IC8vIE11bHRpcGxlIHRhYmxlcyBzbyB1c2UgZ2VuZXJhaWMgZGJfMS5zcWwgZmlsZSB0byBkdW1wIGludG8uCgkJCSRvdXRwdXRfZmlsZSA9ICRvdXRwdXRfZGlyZWN0b3J5IC4gJ2RiXzEuc3FsJzsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3NxbEZpbGUnLCBiYXNlbmFtZSggJG91dHB1dF9maWxlICkgKTsgLy8gVGVsbHMgc3RhdHVzIGNoZWNrZXIgd2hpY2ggZmlsZSB0byByZXF1ZXN0IHNpemUgZGF0YSBmb3Igd2hlbiBwb2xsaW5nIHNlcnZlci4KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBQcmVwYXJpbmcgdG8gcnVuIGNvbW1hbmQgbGluZSBteXNxbGR1bXAgdmlhIGV4ZWMoKS4nICk7CgkJJGV4Y2x1ZGVfY29tbWFuZCA9ICcnOwoJCQoJCS8qCgkJaWYgKCAoICRiYXNlX2R1bXBfbW9kZSA9PSAnYWxsJyApICYmICggY291bnQoICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICkgPT0gMCApICkgeyAvLyBEdW1waW5nIEFMTCB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlIHNvIGRvIG5vdCBzcGVjaWZ5IHRhYmxlcyBpbiBjb21tYW5kIGxpbmUuCgkJCS8vIERvIG5vdGhpbmcuIEp1c3QgZHVtcCBmdWxsIGRhdGFiYXNlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1waW5nIGVudGlyZSBkYXRhYmFzZSB3aXRoIG5vIGV4Y2x1c2lvbnMuJyApOwoJCX0gZWxzZWlmICggKCAkYmFzZV9kdW1wX21vZGUgPT0gJ2FsbCcgKSAmJiAoIGNvdW50KCAkYWRkaXRpb25hbF9leGNsdWRlcyApID4gMCApICkgeyAvLyBEdW1waW5nIGFsbCB0YWJsZXMgYnkgZGVmYXVsdCBCVVQgYWxzbyBleGNsdWRpbmcgY2VydGFpbiBvbmVzLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1waW5nIGVudGlyZSBkYXRhYmFzZSB3aXRoIGFkZGl0aW9uYWwgZXhjbHVzaW9ucy4nICk7CgkJCS8vIEhhbmRsZSBhZGRpdGlvbmFsIGV4Y2x1c2lvbnMuCgkJCSRhZGRpdGlvbmFsX2V4Y2x1ZGVzID0gYXJyYXlfZmlsdGVyKCAkYWRkaXRpb25hbF9leGNsdWRlcyApOyAvLyBpZ25vcmUgYW55IHBoYW50b20gZXhjbHVkZXMuCgkJCWZvcmVhY2goICRhZGRpdGlvbmFsX2V4Y2x1ZGVzIGFzICRhZGRpdGlvbmFsX2V4Y2x1ZGUgKSB7CgkJCQkkZXhjbHVkZV9jb21tYW5kIC49ICIgLS1pZ25vcmUtdGFibGU9eyR0aGlzLT5fZGF0YWJhc2VfbmFtZX0ueyRhZGRpdGlvbmFsX2V4Y2x1ZGV9IjsKCQkJfQoJCX0gZWxzZSB7IC8vIE9ubHkgZHVtcGluZyBjZXJ0YWluIAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1waW5nIHNwZWNpZmljIHRhYmxlcy4nICk7CgkJCSR0YWJsZXNfc3RyaW5nID0gaW1wbG9kZSggJyAnLCAkdGFibGVzICk7IC8vIFNwZWNpZmljIHRhYmxlcyBsaXN0ZWQgdG8gZHVtcC4KCQl9CgkJKi8KCQkKCQkkdGFibGVzX3N0cmluZyA9IGltcGxvZGUoICcgJywgJHRhYmxlcyApOyAvLyBTcGVjaWZpYyB0YWJsZXMgbGlzdGVkIHRvIGR1bXAuCgkJCgkJCgkJLyoqKioqKioqKiogQmVnaW4gcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkvLyBIYW5kbGUgV2luZG93cyB3YW50aW5nIC5leGUuCgkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikKCQkJJGNvbW1hbmQgPSAkdGhpcy0+X215c3FsX2RpcmVjdG9yeSAuICdtc3FsZHVtcC5leGUnOwoJCX0gZWxzZSB7CgkJCSRjb21tYW5kID0gJHRoaXMtPl9teXNxbF9kaXJlY3RvcnkgLiAnbXlzcWxkdW1wJzsKCQl9CgkJCgkJLy8gSGFuZGxlIHBvc3NpYmxlIHNvY2tldHMuCgkJaWYgKCAnJyAhPSAkdGhpcy0+X2RhdGFiYXNlX3NvY2tldCApIHsKCQkJJGNvbW1hbmQgLj0gIiAtLXNvY2tldD17JHRoaXMtPl9kYXRhYmFzZV9zb2NrZXR9IjsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVXNpbmcgc29ja2V0cyBpbiBjb21tYW5kLicgKTsKCQl9CgkJCgkJLy8gSGFuZGxlIG92ZXJyaWRpbmcgcG9ydC4KCQlpZiAoICcnICE9ICR0aGlzLT5fZGF0YWJhc2VfcG9ydCApIHsKCQkJJGNvbW1hbmQgLj0gIiAtLXBvcnQ9eyR0aGlzLT5fZGF0YWJhc2VfcG9ydH0iOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBVc2luZyBjdXN0b20gcG9ydCBgJyAuICR0aGlzLT5fZGF0YWJhc2VfcG9ydCAuICdgIGJhc2VkIG9uIERCX0hPU1Qgc2V0dGluZy4nICk7CgkJfQoJCQoJCS8vIFNldCBkZWZhdWx0IGNoYXJzZXQgaWYgYXZhaWxhYmxlLgoJCWdsb2JhbCAkd3BkYjsKCQlpZiAoIGlzc2V0KCAkd3BkYiApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cGRiIGNoYXJzZXQgb3ZlcnJpZGUgZm9yIGNvbW1hbmRsaW5lOiAnIC4gJHdwZGItPmNoYXJzZXQgKTsKCQkJJGNvbW1hbmQgLj0gIiAtLWRlZmF1bHQtY2hhcmFjdGVyLXNldD0iIC4gJHdwZGItPmNoYXJzZXQ7CgkJfQoJCQoJCS8vIFRPRE8gV0lORE9XUyBOT1RFOiBpbmZvcm1hdGlvbiBpbiB0aGUgTXlTUUwgZG9jdW1lbnRhdGlvbiBhYm91dCBteXNxbGR1bXAgbmVlZGluZyB0byB1c2UgLS1yZXN1bHQtZmlsZT0gb24gV2luZG93cyB0byBhdm9pZCBzb21lIGlzc3VlIHdpdGggbGluZSBlbmRpbmdzLgoJCS8qCgkJTm90ZXM6CgkJCS0tc2tpcC1vcHQJCQkJU2tpcHMgc29tZSBkZWZhdWx0IG9wdGlvbnMuIE1VU1QgYWRkIGJhY2sgaW4gY3JlYXRlLW9wdGlvbnMgZWxzZSBhdXRvaW5jcmVtZW50IHdpbGwgYmUgbG9zdCEgU2VlIGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS41L2VuL215c3FsZHVtcC5odG1sI29wdGlvbl9teXNxbGR1bXBfb3B0CgkJCS0tcXVpY2sKCQkJLS1za2lwLWNvbW1lbnRzCQkJRG9udCBib3RoZXIgd2l0aCBleHRyYSBjb21tZW50cy4KCQkJLS1jcmVhdGUtb3B0aW9ucwkJUmVxdWlyZWQgdG8gYWRkIGluIGF1dG8gaW5jcmVtZW50IG9wdGlvbi4KCQkJLS1kaXNhYmxlLWtleXMJCQlQcmV2ZW50IHJlLWluZGV4aW5nIHRoZSBkYXRhYmFzZSBhZnRlciBlYWNoIGFuZCBldmVyeSBpbnNlcnQgdW50aWwgdGhlIGVudGlyZSB0YWJsZSBpcyBpbnNlcnRlZC4gUHJldmVudHMgdGltZW91dHMgd2hlbiBhIGRiIHRhYmxlIGhhcyBmdWxsdGV4dCBrZXlzIGVzcGVjaWFsbHkuCgkJKi8KCQkkY29tbWFuZCAuPSAiIC0taG9zdD0iIC4gZXNjYXBlc2hlbGxhcmcoICR0aGlzLT5fZGF0YWJhc2VfaG9zdCApIC4gIiAtLXVzZXI9IiAuIGVzY2FwZXNoZWxsYXJnKCAkdGhpcy0+X2RhdGFiYXNlX3VzZXIgKSAuICIgLS1wYXNzd29yZD0iIC4gZXNjYXBlc2hlbGxhcmcoICR0aGlzLT5fZGF0YWJhc2VfcGFzcyApIC4gIiAtLXNraXAtb3B0IC0tcXVpY2sgLS1kaXNhYmxlLWtleXMgLS1za2lwLWNvbW1lbnRzIC0tY3JlYXRlLW9wdGlvbnMgeyRleGNsdWRlX2NvbW1hbmR9ICIgLiBlc2NhcGVzaGVsbGFyZyggJHRoaXMtPl9kYXRhYmFzZV9uYW1lICkgLiAiIHskdGFibGVzX3N0cmluZ30gMj4mMSA+PiB7JG91dHB1dF9maWxlfSI7IC8vIDI+JjEgcmVkaXJlY3QgU1RERVJSIHRvIFNURE9VVC4KCQkvKioqKioqKioqKiBFbmQgcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkKCQkKCQkvKioqKioqKioqKiBCZWdpbiBjb21tYW5kIGxpbmUgbGVuZ3RoIGNoZWNrICoqKioqKioqKiovCgkJLy8gU2ltcGxlIGNoZWNrIGNvbW1hbmQgbGluZSBsZW5ndGguIElmIGl0IGFwcGVhcnMgbG9uZyB0aGVuIGRvIGFkdmFuY2VkIGNoZWNrIHZpYSBjb21tYW5kIGxpbmUgdG8gc2VlIHdoYXQgYWN0dWFsIGxpbWl0IGlzLiBGYWxscyBiYWNrIGlmIHRvbyBsb25nIHRvIGV4ZWN1dGUgb3VyIHByb2Nlc3MgaW4gb25lIGdvLgoJCS8vIFRPRE86IEluIHRoZSBmdXR1cmUgaGFuZGxlIGZhbGxiYWNrIGJldHRlciBieSBwb3NzaWJseSBicmVha2luZyB0aGUgY29tbWFuZCB1cCBpZiBwb3NzaWJsZSByYXRoZXIgdGhhbiBzdHJpY3QgZmFsbGJhY2sgdG8gUEhQIGR1bXBpbmcuCgkJJGNvbW1hbmRfbGVuZ3RoID0gc3RybGVuKCAkY29tbWFuZCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IENvbW1hbmQgbGVuZ3RoOiBgJyAuICRjb21tYW5kX2xlbmd0aCAuICdgLicgKTsKCQlpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2lnbm9yZV9jb21tYW5kX2xlbmd0aF9jaGVjayddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBBZHZhbmNlZCBvcHRpb24gdG8gc2tpcCBjb21tYW5kIGxpbmUgbGVuZ3RoIGNoZWNrIHJlc3VsdHMgaW4gZW5hYmxlZC4gU2tpcHBpbmcuJyApOwoJCX0gZWxzZSB7CgkJCWlmICggJGNvbW1hbmRfbGVuZ3RoID4gc2VsZjo6Q09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgKSB7IC8vIEFyYml0cmFyeSBsZW5ndGguIFNlZW1zIHN0YW5kYXJkIG1heCBsZW5ndGhzIGFyZSA+IDIwMDAwMCBvbiBMaW51eC4gfjg2MDAgb24gV2luZG93cz8KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IENvbW1hbmQgbGluZSBsZW5ndGggb2YgYCcgLiAkY29tbWFuZF9sZW5ndGggLiAnYCAoYnl0ZXMpIGlzIGxhcmdlIGVub3VnaCAoID4nIC4gc2VsZjo6Q09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgLiAnICkgdG8gdmVyaWZ5IGNvbXBhdGliaWxpdHkuIENoZWNraW5nIG1heGltdW0gYWxsb3dlZCBjb21tYW5kIGxpbmUgbGVuZ3RoIGZvciB0aGlzIHN5dGVtLicgKTsKCQkJCQoJCQkJLy8gQ2hlY2sgbWF4IGNvbW1hbmQgbGVuZ3RoIHN1cHBvcnRlZCBieSBzZXJ2ZXIuCgkJCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICdlY2hvICQoKCAkKGdldGNvbmYgQVJHX01BWCkgLSAkKGVudiB8IHdjIC1jKSApKScgKTsgLy8gVmFsdWUgd2lsbCBiZSBhIG51bWJlci4gVGhpcyBpcyB0aGUgbWF4aW11bSBieXRlIHNpemUgb2YgdGhlIGNvbW1hbmQgbGluZS4KCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBvdXRwdXQ6IGAnIC4gaW1wbG9kZSggJywnLCAkZXhlY19vdXRwdXQgKSAuICdgOyBFeGl0IGNvZGU6IGAnIC4gJGV4ZWNfZXhpdF9jb2RlIC4gJ2A7IEV4aXQgY29kZSBkZXNjcmlwdGlvbjogYCcgLiBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmV4aXRfY29kZV9sb29rdXAoICRleGVjX2V4aXRfY29kZSApIC4gJ2AnICk7CgkJCQlpZiAoIGlzX2FycmF5KCAkZXhlY19vdXRwdXQgKSAmJiBpc19udW1lcmljKCAkZXhlY19vdXRwdXRbMF0gKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEZXRlY3RlZCBtYXhpbXVtIGNvbW1hbmQgbGluZSBsZW5ndGggZm9yIHRoaXMgc3lzdGVtOiBgJyAuICRleGVjX291dHB1dFswXSAuICdgLicgKTsKCQkJCQlpZiAoICRjb21tYW5kX2xlbmd0aCA+ICggJGV4ZWNfb3V0cHV0WzBdIC0gMTAwICkgKSB7IC8vIENoZWNrIGlmIHdlIGV4Y2VlZCBtYXhpbXVtIGxlbmd0aC4gU3VidHJhY3QgMTAwIHRvIG1ha2Ugcm9vbSBmb3IgcGF0aCBkZWZpbml0aW9uLgoJCQkJCQlpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2lnbm9yZV9jb21tYW5kX2xlbmd0aF9jaGVjayddICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgc2hvcnRlciB0aGFuIGNvbW1hbmQgbGVuZ3RoIG9mIGAnIC4gJGNvbW1hbmRfbGVuZ3RoIC4gJ2AuIEhvd2V2ZXIsIHRoZSBvcHRpb24gdG8gaWdub3JlIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgaXMgZW5hYmxlZCBiYXNlZCBvbiBzZXR0aW5ncyBzbyBjb250aW51aW5nIGFueXdheXMuJyApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaWYgKCAkZXhlY19vdXRwdXRbMF0gPCAwICkgewoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ215c3FsYnVkZHk6IFRoaXMgc3lzdGVtIHJlcG9ydGVkIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoLiBUaGlzIG1lYW5zIHRoYXQgQmFja3VwQnVkZHkgY2Fubm90IHNhZmVseSBkZXRlY3QgdGhpcyBzeXN0ZW1cJ3MgbGltaXQuICBUaGlzIGNoZWNrIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGVuYWJsaW5nIHRoZSAiU2tpcCBjb21tYW5kIGxpbmUgbGVuZ3RoIGNoZWNrIiBhZHZhbmNlZCBvcHRpb24gb24gdGhlIFNldHRpbmdzIHBhZ2UgaW4gQmFja3VwQnVkZHkgYXMgYSB3b3JrYXJvdW5kLiBnZXRfY29uZiBBUkdfTUFYIGxpa2VseSBmYWlsZWQuJyApOwoJCQkJCQkJfQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgc2hvcnRlciB0aGFuIGNvbW1hbmQgbGVuZ3RoIG9mIGAnIC4gJGNvbW1hbmRfbGVuZ3RoIC4gJ2AuIEZhbGxpbmcgYmFjayBpbnRvIGNvbXBhdGliaWxpdHkgbW9kZSB0byBpbnN1cmUgZGF0YWJhc2UgZHVtcCBpbnRlZ3JpdHkuJyApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgbG9uZ2VyIHRoYW4gY29tbWFuZCBsZW5ndGggb2YgYCcgLiAkY29tbWFuZF9sZW5ndGggLiAnYC4gQ29udGludWluZy4nICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBVbmFibGUgdG8gZGV0ZXJtaW5lIG1heGltdW0gY29tbWFuZCBsaW5lIGxlbmd0aC4gRmFsbGluZyBiYWNrIGludG8gY29tcGF0aWJpbGl0eSBtb2RlIHRvIGluc3VyZSBkYXRhYmFzZSBkdW1wIGludGVncml0eS4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOyAvLyBGYWxsIGJhY2sgdG8gY29tcGF0aWJpbHR5IG1vZGUganVzdCBpbiBjYXNlLgoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBsaW5lIGxlbmd0aCBsZW5ndGggY2hlY2sgc2tpcHBlZCBzaW5jZSBpdCBpcyBsZXNzIHRoYW4gY2hlY2sgdGhyZXNob2xkIGAnIC4gc2VsZjo6Q09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgLiAnYC4nICk7CgkJCX0KCQl9CgkJLyoqKioqKioqKiogRW5kIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgKioqKioqKioqKi8KCQkKCQkKCQkvLyBSdW4gY29tbWFuZC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBSdW5uaW5nIGR1bXAgdmlhIGNvbW1hbmRsaW5lIG5leHQuJyApOwoJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJGNvbW1hbmQgKTsKCQkKCQkvLyBDaGVjayBmb3IgdW5leHBlY3RlZCBteXNxbCBjb21tYW5kIGxpbmUgcmVzcG9uc2UgdGV4dC4uLgoJCWlmICggaXNfYXJyYXkoICRleGVjX291dHB1dCApICkgewoJCQlmb3JlYWNoKCAkZXhlY19vdXRwdXQgYXMgJGV4ZWNfb3V0cHV0X2xpbmUgKSB7CgkJCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkZXhlY19vdXRwdXRfbGluZSwgJ3VucmVjb2duaXplZCBvcHRpb24nICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsZHVtcCBkaWQgbm90IHJlY29nbml6ZSBvbmUgb3IgbW9yZSBvcHRpb25zLiBWZXJpZnkgbXlzcWxkdW1wIHZlcnNpb24gaXMgdXAgdG8gZGF0ZS4gRmFsbGluZyBiYWNrIHRvIGNvbXBhdGliaWxpdHkgbW9kZS4gRXJyb3I6IGAnIC4gJGV4ZWNfb3V0cHV0X2xpbmUgLiAnYC4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoJCQoJCUBpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvd3BkYnV0aWxzL3dwZGJ1dGlscy5waHAnICk7CgkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV93cGRidXRpbHMnICkgKSB7CgkJCWdsb2JhbCAkd3BkYjsKCQkJJGRiaGVscGVyID0gbmV3IHBsdWdpbmJ1ZGR5X3dwZGJ1dGlscyggJHdwZGIgKTsKCQkJaWYgKCAhICRkYmhlbHBlci0+a2ljaygpICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oJ0RhdGFiYXNlIFNlcnZlciBoYXMgZ29uZSBhd2F5LCB1bmFibGUgdG8gc2NoZWR1bGUgbmV4dCBiYWNrdXAgc3RlcC4gVGhlIGJhY2t1cCBjYW5ub3QgY29udGludWUuIFRoaXMgaXMgbW9zdCBvZnRlbiBjYXVzZWQgYnkgbXlzcWwgcnVubmluZyBvdXQgb2YgbWVtb3J5IG9yIHRpbWluZyBvdXQgZmFyIHRvbyBlYXJseS4gUGxlYXNlIGNvbnRhY3QgeW91ciBob3N0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnaGFsdFNjcmlwdCcsICcnICk7IC8vIEhhbHQgSlMgb24gcGFnZS4KCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0RhdGFiYXNlIFNlcnZlciBjb25uZWN0aW9uIHN0YXR1cyB1bnZlcmlmaWVkLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJfQoJCQoJCS8vIENoZWNrIHRoZSByZXN1bHQgb2YgdGhlIAoJCWlmICggJGV4ZWNfZXhpdF9jb2RlID09ICcwJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBhcHBlYXJzIHRvIHN1Y2NlZWRlZCBhbmQgcmV0dXJuZWQgcHJvcGVyIHJlc3BvbnNlLicgKTsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJG91dHB1dF9maWxlICkgKSB7IC8vIFNRTCBmaWxlIGZvdW5kLiBTVUNDRVNTIQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnbXlzcWxidWRkeTogRGF0YWJhc2UgZHVtcCBTUUwgZmlsZSBleGlzdHMuJyApOwoJCQkJCgkJCQkvLyBEaXNwbGF5IGZpbmFsIFNRTCBmaWxlIHNpemUuCgkJCQkkc3FsX2ZpbGVzaXplID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggZmlsZXNpemUoICRvdXRwdXRfZmlsZSApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5hbCBTUUwgZGF0YWJhc2UgZHVtcCBmaWxlIHNpemUgb2YgYCcgLiBiYXNlbmFtZSggJG91dHB1dF9maWxlICkgLiAnYDogJyAuICRzcWxfZmlsZXNpemUgLiAnLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdmaW5pc2hUYWJsZUR1bXAnLCAnJyApOwoJCQkJCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsgLy8gU1FMIGZpbGUgTUlTU0lORy4gRkFJTFVSRSEKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbGJ1ZGR5OiBUaG91Z2ggY29tbWFuZCByZXBvcnRlZCBzdWNjZXNzIGRhdGFiYXNlIGR1bXAgU1FMIGZpbGUgaXMgbWlzc2luZzogYCcgLiAkb3V0cHV0X2ZpbGUgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBXYXJuaW5nICM5MDMwLiBDb21tYW5kIGRpZCBub3QgZXhpdCBub3JtYWxseS4gVGhpcyBpcyBub3JtYWwgaXMgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kIGxpbmUgbXlzcWwgZnVuY3Rpb25hbGl0eS4gRmFsbGluZyBiYWNrIHRvIGRhdGFiYXNlIGR1bXAgY29tcGF0aWJpbGl0eSBtb2Rlcy4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJCgkJLy8gU2hvdWxkIG5ldmVyIGdldCB0byBoZXJlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbGJ1ZGR5OiBVbmNhdWdodCBleGNlcHRpb24gIzQ1Mzg5MC4nICk7CgkJcmV0dXJuIGZhbHNlOwoJCQoJfSAvLyBFbmQgX2R1bXBfY29tbWFuZGxpbmUoKS4KCQoJCgkKCS8qCV9waHBkdW1wKCkKCSAqCQoJICoJUEhQLWJhc2VkIGR1bXBpbmcgb2YgU1FMIGRhdGEuIENvbXBhdGliaWxpdHkgbW9kZS4gV2FzIG9ubHkgbW9kZSBwcmUtMy4wLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG91dHB1dF9kaXJlY3RvcnkJCURpcmVjdG9yeSB0byBvdXRwdXQgdG8uIE1heSBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmlsZSBsb2NhdGlvbi4gVHJhaWxpbmcgc2xhc2ggcmVxdWlyZWQuIGR1bXAoKSBhdXRvLWFkZHMgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIHBhc3NpbmcuCgkgKglAcGFyYW0JCWFycmF5CQkkdGFibGVzCQkJCQlBcnJheSBvZiB0YWJsZXMgdG8gZHVtcC4KCSAqCUByZXR1cm4JCW1peGVkCQkJCQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbCwgYXJyYXkoIHJlbWFpbmluZ190YWJsZXMsIHJvd19zdGFydCApIG9uIGNodW5raW5nLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9kdW1wX3BocCggJG91dHB1dF9kaXJlY3RvcnksICR0YWJsZXMsICRyZXN1bWVfc3RhcnRpbmdfcm93ID0gMCApIHsgLy8sICRiYXNlX2R1bXBfbW9kZSwgJGFkZGl0aW9uYWxfZXhjbHVkZXMgKSB7CgkJCgkJJHRoaXMtPnRpbWVfc3RhcnQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkkbGFzdF9maWxlX3NpemVfb3V0cHV0ID0gbWljcm90aW1lKCB0cnVlICk7CgkJJG91dHB1dF9maWxlX3NpemVfZXZlcnlfbWF4ID0gNTsgLy8gT3V0cHV0IGN1cnJlbnQgU1FMIGZpbGUgc2l6ZSBubyBtb3JlIG9mdGVuIHRoYW4gdGhpcy4gT25seSBjaGVja3MgaWYgaXQgaGFzIGJlZW4gZW5vdWdoIHRpbWUgb25jZSBlYWNoIGJ1cnN0IG9mIG1heCByb3dzIHBlciBzZWxlY3QgaXMgcHJvY2Vzc2VkLgoJCQoJCSRtYXhfcm93c19wZXJfc2VsZWN0ID0gJHRoaXMtPl9tYXhfcm93c19wZXJfc2VsZWN0OwoJCQoJCWlmICggJHJlc3VtZV9zdGFydGluZ19yb3cgPiAwICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXN1bWluZyBjaHVua2VkIGR1bXAgYXQgcm93IGAnIC4gJHJlc3VtZV9zdGFydGluZ19yb3cgLiAnYC4nICk7CgkJfQoJCQoJCWdsb2JhbCAkd3BkYjsKCQlpZiAoICFpc19vYmplY3QoICR3cGRiICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdXb3JkUHJlc3MgZGF0YWJhc2Ugb2JqZWN0ICR3cGRiIGRpZCBub3QgZXhpc3QuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uJyApOwoJCQllcnJvcl9sb2coICdXb3JkUHJlc3MgZGF0YWJhc2Ugb2JqZWN0ICR3cGRiIGRpZCBub3QgZXhpc3QuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uIEJhY2t1cEJ1ZGR5IEVycm9yICM4OTQ1NTg3OTczLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBDb25uZWN0IGlmIG5vdCBjb25uZWN0ZWQgZm9yIGltcG9ydGJ1ZGR5LgoJCS8qCgkJaWYgKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkJCWlmICggIW15c3FsX3BpbmcoICR3cGRiLT5kYmggKSApIHsKCQkJCSRtYXliZVBvcnQgPSAnJzsKCQkJCWlmICggJycgIT0gJHRoaXMtPl9kYXRhYmFzZV9wb3J0ICkgewoJCQkJCSRtYXliZVBvcnQgPSAnOicgLiAkdGhpcy0+X2RhdGFiYXNlX3BvcnQ7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgY3VzdG9tIHNwZWNpZmllZCBwb3J0IGAnIC4gJHRoaXMtPl9kYXRhYmFzZV9wb3J0IC4gJ2AgaW4gREJfSE9TVC4nICk7CgkJCQl9CgkJCQkkd3BkYi0+ZGJoID0gbXlzcWxfY29ubmVjdCggJHRoaXMtPl9kYXRhYmFzZV9ob3N0IC4gJG1heWJlUG9ydCwgJHRoaXMtPl9kYXRhYmFzZV91c2VyLCAkdGhpcy0+X2RhdGFiYXNlX3Bhc3MgKTsKCQkJCW15c3FsX3NlbGVjdF9kYiggJHRoaXMtPl9kYXRhYmFzZV9uYW1lLCAkd3BkYi0+ZGJoICk7CgkJCX0KCQl9CgkJKi8KCQkKCQkkaW5zZXJ0X3NxbCA9ICcnOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgREIga2lja2VyIGZvciB1c2UgbGV0ZXIgaW4gY2FzZSBkYXRhYmFzZSBnb2VzIGF3YXkuJyApOwoJCUBpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvd3BkYnV0aWxzL3dwZGJ1dGlscy5waHAnICk7CgkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV93cGRidXRpbHMnICkgKSB7CgkJCWdsb2JhbCAkd3BkYjsKCQkJJGRiaGVscGVyID0gbmV3IHBsdWdpbmJ1ZGR5X3dwZGJ1dGlscyggJHdwZGIgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdEYXRhYmFzZSBTZXJ2ZXIgY29ubmVjdGlvbiBzdGF0dXMgd2lsbCBub3QgYmUgdmVyaWZpZWQgYXMga2lja2VyIGlzIG5vdCBhdmFpbGFibGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQl9CgkJCgkJZ2xvYmFsICR3cGRiOyAvLyBVc2VkIGxhdGVyIGZvciBjaGVja2luZyB0aGF0IHdlIGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gREIuCgkJCgkJLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgdGFibGVzIHRvIGJhY2t1cC4KCQkvLyBUT0RPOiBGdXR1cmUgYWJpbGl0eSB0byBicmVhayB1cCBEQiBleHBvcnRpbmcgdG8gbXVsdGlwbGUgcGFnZSBsb2FkcyBpZiBuZWVkZWQuCgkJJHJlbWFpbmluZ1RhYmxlcyA9ICR0YWJsZXM7CgkJZm9yZWFjaCggJHRhYmxlcyBhcyAkdGFibGVfa2V5ID0+ICR0YWJsZSApIHsKCQkJJF9jb3VudCA9IDA7CgkJCSRpbnNlcnRfc3FsID0gJyc7CgkJCQoJCQlpZiAoICRyZXN1bWVfc3RhcnRpbmdfcm93ID4gMCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoJ2RldGFpbHMnLCAnQ2h1bmtlZCByZXN1bWUgb24gZHVtcGluZyBgJyAuICR0YWJsZSAuICdgLiBSZXN1bWluZyB3aGVyZSBsZWZ0IG9mZiBhdCBgJyAuICRyZXN1bWVfc3RhcnRpbmdfcm93IC4gJ2AuJyApOwoJCQkJJHJvd3Nfc3RhcnQgPSAkcmVzdW1lX3N0YXJ0aW5nX3JvdzsKCQkJCSRyZXN1bWVfc3RhcnRpbmdfcm93ID0gMDsgLy8gRG9uJ3Qgd2FudCB0byBza2lwIGFueXRoaW5nIG9uIG5leHQgdGFibGUuCgkJCX0gZWxzZSB7CgkJCQkkcm93c19zdGFydCA9IDA7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHVtcGluZyBkYXRhYmFzZSB0YWJsZSBgJyAuICR0YWJsZSAuICdgLiBNYXggcm93cyBwZXIgc2VsZWN0OiAnIC4gJG1heF9yb3dzX3Blcl9zZWxlY3QgLiAnLiBTdGFydGluZyBhdCByb3cgYCcgLiAkcmVzdW1lX3N0YXJ0aW5nX3JvdyAuICdgLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3N0YXJ0VGFibGVEdW1wJywgJHRhYmxlICk7CgkJCQoJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+X2ZvcmNlX3NpbmdsZV9kYl9maWxlICkgewoJCQkJJG91dHB1dF9maWxlID0gJG91dHB1dF9kaXJlY3RvcnkgLiAkdGFibGUgLiAnLnNxbCc7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBZHZhbmNlZCBvcHRpb24gdG8gZm9yY2UgdG8gc2luZ2xlIC5zcWwgZmlsZSBlbmFibGVkLicgKTsKCQkJCSRvdXRwdXRfZmlsZSA9ICRvdXRwdXRfZGlyZWN0b3J5IC4gJ2RiXzEuc3FsJzsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTUUwgZHVtcCBmaWxlIGAnIC4gJG91dHB1dF9maWxlIC4gJ2AuJyApOwoJCQlpZiAoICctMScgPT0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWF4IGV4ZWN1dGlvbiB0aW1lIGNodW5raW5nIGRpc2FibGVkIGJhc2VkIG9uIC0xIHBhc3NlZC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBQSFAtYmFzZWQgZGF0YWJhc2UgZHVtcCB3aXRoIG1heCBleGVjdXRpb24gdGltZSBmb3IgdGhpcyBydW46ICcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnIHNlY29uZHMuJyApOwoJCQl9CgkJCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gZm9wZW4oICRvdXRwdXRfZmlsZSwgJ2EnICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAxODogRGF0YWJhc2UgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zIGZvciBmaWxlIGAnIC4gJG91dHB1dF9maWxlIC4gJ2AgaW4gZGlyZWN0b3J5IGAnIC4gJG91dHB1dF9kaXJlY3RvcnkgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdzcWxGaWxlJywgYmFzZW5hbWUoICRvdXRwdXRfZmlsZSApICk7IC8vIFRlbGxzIHN0YXR1cyBjaGVja2VyIHdoaWNoIGZpbGUgdG8gcmVxdWVzdCBzaXplIGRhdGEgZm9yIHdoZW4gcG9sbGluZyBzZXJ2ZXIuCgkJCQoJCQlpZiAoIDAgPT0gJHJvd3Nfc3RhcnQgKSB7CgkJCQkKCQkJCSRjcmVhdGVfdGFibGUgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIENSRUFURSBUQUJMRSBgeyR0YWJsZX1gIiwgQVJSQVlfTiApOwoJCQkJaWYgKCAkY3JlYXRlX3RhYmxlID09PSBmYWxzZSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGFjY2VzcyBhbmQgZHVtcCBkYXRhYmFzZSB0YWJsZSBgJyAuICR0YWJsZSAuICdgLiBUYWJsZSBtYXkgbm90IGV4aXN0LiBTa2lwcGluZyBiYWNrdXAgb2YgdGhpcyB0YWJsZS4nICk7CgkJCQkJLy9iYWNrdXBidWRkeV9jb3JlOjptYWlsX2Vycm9yKCAnRXJyb3IgIzQ1MzczODQ6IFVuYWJsZSB0byBhY2Nlc3MgYW5kIGR1bXAgZGF0YWJhc2UgdGFibGUgYCcgLiAkdGFibGUgLiAnYC4gVGFibGUgbWF5IG5vdCBleGlzdC4gU2tpcHBpbmcgYmFja3VwIG9mIHRoaXMgdGFibGUuJyApOwoJCQkJCWNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgaXRlcmF0aW9uIGFzIGFjY2Vzc2luZyB0aGlzIHRhYmxlIGZhaWxlZC4KCQkJCX0KCQkJCS8vIFRhYmxlIGNyZWF0aW9uIHRleHQKCQkJCWlmICggISBpc3NldCggJGNyZWF0ZV90YWJsZVswXSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODU3ODM1OiBVbmFibGUgdG8gZ2V0IHRhYmxlIGNyZWF0aW9uIFNRTCBmb3IgdGFibGUgYCcgLiAkdGFibGUgLiAnYC4gUmVzdWx0OiBgJyAuIHByaW50X3IoICRjcmVhdGVfdGFibGUgKSAuICdgLiBWZXJpZnkgdGhhdCBpdCBleGlzdHMgYW5kIG15c3FsIHBlcm1pc3Npb25zIGFsbG93IHRoaXMuIElmIHlvdSBtYW51YWxseSBpbmNsdWRlZCB0aGlzIGFzIGFuIGFkZGl0aW9uYWwgdGFibGUsIG1ha2Ugc3VyZSBpdCBpcyB0aGUgY29ycmVjdCB0YWJsZSBuYW1lLicgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkY3JlYXRlX3RhYmxlX2FycmF5ID0gJGNyZWF0ZV90YWJsZVswXTsKCQkJCXVuc2V0KCAkY3JlYXRlX3RhYmxlICk7CgkJCQkkaW5zZXJ0X3NxbCAuPSBzdHJfcmVwbGFjZSggIlxuIiwgJycsICRjcmVhdGVfdGFibGVfYXJyYXlbMV0gKSAuICI7XG4iOyAvLyBSZW1vdmUgaW50ZXJuYWwgbGluZWJyZWFrczsgb25seSBwdXQgb25lIGF0IGVuZC4KCQkJCXVuc2V0KCAkY3JlYXRlX3RhYmxlX2FycmF5ICk7CgkJCQkKCQkJCS8vIERpc2FibGUga2V5cyBmb3IgdGhpcyB0YWJsZS4KCQkJCSRpbnNlcnRfc3FsIC49ICIvKiE0MDAwMCBBTFRFUiBUQUJMRSBgeyR0YWJsZX1gIERJU0FCTEUgS0VZUyAqLztcbiI7CgkJCQkKCQkJCS8vIERpc2FibGUgZm9yZWlnbiBrZXkgYW5kIHVuaXF1ZSBjaGVja3MgdGVtcG9yYXJpbHkgdG8gaGVscCBhdm9pZCBlcnJvcnMuCgkJCQkkaW5zZXJ0X3NxbCAuPSAiU0VUIEZPUkVJR05fS0VZX0NIRUNLUyA9IDA7XG4iOwoJCQkJJGluc2VydF9zcWwgLj0gIlNFVCBVTklRVUVfQ0hFQ0tTID0gMDtcbiI7CgkJCQkKCQkJfQoKCQkJJHF1ZXJ5Q291bnQgPSAwOwoJCQkkcm93c19yZW1haW4gPSB0cnVlOwoJCQl3aGlsZSAoIHRydWUgPT09ICRyb3dzX3JlbWFpbiApIHsKCQkJCS8vIFJvdyBjcmVhdGlvbiB0ZXh0IGZvciBhbGwgcm93cyB3aXRoaW4gdGhpcyB0YWJsZS4KCQkJCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGAkdGFibGVgIExJTUlUICIgLiAkcm93c19zdGFydCAuICcsJyAuICRtYXhfcm93c19wZXJfc2VsZWN0OwoJCQkJJHRhYmxlX3F1ZXJ5ID0gJHdwZGItPmdldF9yZXN1bHRzKCAkcXVlcnksIEFSUkFZX04gKTsKCQkJCSRyb3dzX3N0YXJ0ICs9ICRtYXhfcm93c19wZXJfc2VsZWN0OyAvLyBOZXh0IGxvb3Agd2Ugd2lsbCBiZWdpbiBhdCB0aGlzIG9mZnNldC4KCQkJCWlmICggJHRhYmxlX3F1ZXJ5ID09PSBmYWxzZSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1IgIzg1NDQ5NzQ1LiBVbmFibGUgdG8gcmV0cmlldmUgZGF0YSBmcm9tIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuIFRoaXMgdGFibGUgbWF5IGJlIGNvcnJ1cHQgKHRyeSByZXBhaXJpbmcgdGhlIGRhdGFiYXNlKSBvciB0b28gbGFyZ2UgdG8gaG9sZCBpbiBtZW1vcnkgKGluY3JlYXNlIG15c3FsIGFuZC9vciBQSFAgbWVtb3J5KS4gQ2hlY2sgeW91ciBQSFAgZXJyb3IgbG9nIGZvciBmdXJ0aGVyIGVycm9ycyB3aGljaCBtYXkgcHJvdmlkZSBmdXJ0aGVyIGluZm9ybWF0aW9uLiBOb3QgY29udGludWluZyBkYXRhYmFzZSBkdW1wIHRvIGluc3VyZSBiYWNrdXAgaW50ZWdyaXR5LicgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkdGFibGVDb3VudCA9IGNvdW50KCAkdGFibGVfcXVlcnkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dvdCBgJyAuICR0YWJsZUNvdW50IC4gJ2Agcm93cyBmcm9tIGAnIC4gJHRhYmxlIC4gJ2Agb2YgYCcgLiAkbWF4X3Jvd3NfcGVyX3NlbGVjdCAuICdgIG1heC4nICk7CgkJCQlpZiAoICggMCA9PSAkdGFibGVDb3VudCApIHx8ICggJHRhYmxlQ291bnQgPCAkbWF4X3Jvd3NfcGVyX3NlbGVjdCApICkgewoJCQkJCSRyb3dzX3JlbWFpbiA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCQkkY29sdW1ucyA9ICR3cGRiLT5nZXRfY29sX2luZm8oKTsKCQkJCSRudW1fZmllbGRzID0gY291bnQoICRjb2x1bW5zICk7CgkJCQlmb3JlYWNoKCAkdGFibGVfcXVlcnkgYXMgJGZldGNoX3JvdyApIHsKCQkJCQkkaW5zZXJ0X3NxbCAuPSAiSU5TRVJUIElOVE8gYCR0YWJsZWAgVkFMVUVTKCI7CgkJCQkJZm9yICggJG49MTsgJG48PSRudW1fZmllbGRzOyAkbisrICkgewoJCQkJCQkkbSA9ICRuIC0gMTsKCQkJCQkJCgkJCQkJCWlmICggJGZldGNoX3Jvd1skbV0gPT09IE5VTEwgKSB7CgkJCQkJCQkkaW5zZXJ0X3NxbCAuPSAiTlVMTCwgIjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRpbnNlcnRfc3FsIC49ICInIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZmV0Y2hfcm93WyRtXSApIC4gIicsICI7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJGluc2VydF9zcWwgPSBzdWJzdHIoICRpbnNlcnRfc3FsLCAwLCAtMiApOwoJCQkJCSRpbnNlcnRfc3FsIC49ICIpO1xuIjsKCQkJCQkKCQkJCQkkd3JpdGVSZXR1cm4gPSBmd3JpdGUoICRmaWxlX2hhbmRsZSwgJGluc2VydF9zcWwgKTsKCQkJCQlpZiAoICggZmFsc2UgPT09ICR3cml0ZVJldHVybiApIHx8ICggMCA9PSAkd3JpdGVSZXR1cm4gKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NDM5NDg6IFVuYWJsZSB0byB3cml0ZSB0byBTUUwgZmlsZS4gUmV0dXJuIGVycm9yL2J5dGVzIHdyaXR0ZW46IGAnIC4gJHdyaXRlUmV0dXJuIC4gJ2AuJyApOwoJCQkJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQkkaW5zZXJ0X3NxbCA9ICcnOwoJCQkJCQoJCQkJCSRfY291bnQrKzsKCQkJCQkKCQkJCQkvLyBTaG93IGEgaGVhcnRiZWF0IHRvIGtlZXAgdXNlciB1cCB0byBkYXRlIFthbmQgZW50ZXJ0YWluZWQgOyldLgoJCQkJCWlmICggKCAwID09PSAoICRfY291bnQgJSBzZWxmOjpIRUFSVEJFQVRfQ09VTlRfTElNSVQgKSApIHx8ICggMCA9PT0gKCAkX2NvdW50ICUgY2VpbCggJG1heF9yb3dzX3Blcl9zZWxlY3QgLyAyICkgKSApICkgeyAvLyBEaXNwbGF5IGV2ZXJ5IFggcXVlcmllcyBiYXNlZCBvbiBoZWFydGJlYXQgT1IgYXQgbGVhc3QgZGlzcGxheSBldmVyeSBoYWxmIG1heCByb3dzIHBlciBzZWxlY3QuCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dvcmtpbmcuLi4gRHVtcGVkIGAnIC4gJF9jb3VudCAuICdgIHJvd3MgZnJvbSBgJyAuICR0YWJsZSAuICdgIHNvIGZhci4nICk7CgkJCQkJfQoJCQkJfSAvLyBlbmQgZm9yZWFjaCB0YWJsZSByb3cuCgkJCQkKCQkJCWlmICggZmFsc2UgPT09ICRyb3dzX3JlbWFpbiApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEdW1wZWQgYCcgLiAkX2NvdW50IC4gJ2Agcm93cyB0b3RhbCBmcm9tIGAnIC4gJHRhYmxlIC4gJ2AuIE5vIHJvd3MgcmVtYWluLicgKTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJGxhc3RfZmlsZV9zaXplX291dHB1dCApID4gJG91dHB1dF9maWxlX3NpemVfZXZlcnlfbWF4ICkgeyAvLyBJdCdzIGJlZW4gbG9uZyBlbm91Z2ggdG8gZ2V0IHRoZSBjdXJyZW50IGZpbGUgc2l6ZSBvZiBTUUwgZmlsZS4KCQkJCQkJLy8gRGlzcGxheSBmaW5hbCBTUUwgZmlsZSBzaXplLgoJCQkJCQkkc3FsX2ZpbGVzaXplID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggZmlsZXNpemUoICRvdXRwdXRfZmlsZSApICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0N1cnJlbnQgZGF0YWJhc2UgZHVtcCBmaWxlIGAnIC4gYmFzZW5hbWUoICRvdXRwdXRfZmlsZSApIC4gJ2Agc2l6ZTogJyAuICRzcWxfZmlsZXNpemUgLiAnLicgKTsKCQkJCQkJJGxhc3RfZmlsZV9zaXplX291dHB1dCA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCQkJCX0KCQkJCQkKCQkJCQkvLyBJZiB3ZSBhcmUgd2l0aGluIFggc2Vjb25kcyAoc2VsZjo6VElNRV9XSUdHTEVfUk9PTSkgb2YgcmVhY2hpbmcgbWF4aW11bSBQSFAgcnVudGltZSBBTkQgcm93cyByZW1haW4gdGhlbiBzdG9wIGhlcmUgYW5kIENIVU5LIHNvIHRoYXQgaXQgY2FuIGJlIHBpY2tlZCB1cCBpbiBhbm90aGVyIFBIUCBwcm9jZXNzLi4uCgkJCQkJaWYgKCAnLTEnICE9ICR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSApIHsKCQkJCQkJaWYgKCAoICggbWljcm90aW1lKCB0cnVlICkgLSBwYl9iYWNrdXBidWRkeTo6JHN0YXJ0X3RpbWUgKSArIHNlbGY6OlRJTUVfV0lHR0xFX1JPT00gKSA+PSAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgKSB7IC8vIHVzZWQgdG8gdXNlICR0aGlzLT50aW1lX3N0YXJ0IGJ1dCB0aGlzIGRpZCBub3QgdGFrZSBpbnRvIGFjY291bnQgdGltZSB1c2VkIHByaW9yIHRvIGRiIHN0ZXAuCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBcHByb2FjaGluZyBsaW1pdCBvZiBhdmFpbGFibGUgUEhQIGNodW5raW5nIHRpbWUgb2YgYCcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnYCBzZWMuIFBIUCByYW4gZm9yICcgLiByb3VuZCggbWljcm90aW1lKCB0cnVlICkgLSBwYl9iYWNrdXBidWRkeTo6JHN0YXJ0X3RpbWUsIDMgKSAuICcgc2VjLCBkYXRhYmFzZSBkdW1waW5nIHJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0LCAzICkgLiAnIHNlYyBoYXZpbmcgZHVtcGVkIGAnIC4gJF9jb3VudCAuICdgIHJvd3MuIFByb2NlZWRpbmcgdG8gdXNlIGNodW5raW5nIG9uIHJlbWFpbmluZyB0YWJsZXM6ICcgLiBpbXBsb2RlKCAnLCcsICRyZW1haW5pbmdUYWJsZXMgKSApOwoJCQkJCQkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJCQkJCQlyZXR1cm4gYXJyYXkoICRyZW1haW5pbmdUYWJsZXMsICRyb3dzX3N0YXJ0ICk7CgkJCQkJCX0gLy8gRW5kIGlmLgoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJLy8gVmVyaWZ5IGRhdGFiYXNlIGlzIHN0aWxsIGNvbm5lY3RlZCBhbmQgd29ya2luZyBwcm9wZXJseS4gU29tZXRpbWVzIG15c3FsIHJ1bnMgb3V0IG9mIG1lbW9yeSBhbmQgZGllcyBpbiB0aGUgYWJvdmUgZm9yZWFjaC4KCQkJCS8vIE5vIHBvaW50IGluIHJlY29ubmVjdGluZyBhcyB3ZSBjYW4gTk9UIHRydXN0IHRoYXQgb3VyIGR1bXAgd2FzIHN1Y2Nlc2Z1bCBhbnltb3JlIChpdCBtb3N0IGxpa2VseSB3YXMgbm90KS4KCQkJCWlmICggaXNzZXQoICRkYmhlbHBlciApICkgewoJCQkJCWlmICggISAkZGJoZWxwZXItPmtpY2soKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oICdFUlJPUiAjOTAyNjogVGhlIG15U1FMIHNlcnZlciB3ZW50IGF3YXkgdW5leHBlY3RlZGx5IGR1cmluZyBkYXRhYmFzZSBkdW1wIG9mIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBjYXVzZWQgYnkgbXlTUUwgcnVubmluZyBvdXQgb2YgbWVtb3J5LiBUaGUgYmFja3VwIGludGVncml0eSBjYW4gbm8gbG9uZ2VyIGJlIGd1YXJhbnRlZWQgc28gdGhlIGJhY2t1cCBoYXMgYmVlbiBoYWx0ZWQuJyApIC4gJyAnIC4gX18oICdMYXN0IHRhYmxlIGR1bXBlZCBiZWZvcmUgZGF0YWJhc2Ugc2VydmVyIHdlbnQgYXdheTogJyApIC4gJ2AnIC4gJHRhYmxlIC4gJ2AuJyApOwoJCQkJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2Uga2lja2VyIHVuYXZhaWxhYmxlIHNvIGNvbm5lY3Rpb24gc3RhdHVzIHVudmVyaWZpZWQuJyApOwoJCQkJfQoJCQkJCgkJCX0gLy8gRW5kIHdoaWxlIHJvd3MgcmVtYWluLgoJCQkKCQkJLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHRhYmxlIGZyb20gdGhlIGxpc3Qgb2YgdGFibGVzIHRvIGR1bXAgYXMgaXQgaXMgZG9uZS4KCQkJdW5zZXQoICRyZW1haW5pbmdUYWJsZXNbICR0YWJsZV9rZXkgXSApOwoJCQkKCQkJLy8gUmUtZW5hYmxlIGtleXMgZm9yIHRoaXMgdGFibGUuCgkJCSRpbnNlcnRfc3FsIC49ICIvKiE0MDAwMCBBTFRFUiBUQUJMRSBgeyR0YWJsZX1gIEVOQUJMRSBLRVlTICovO1xuIjsKCQkJJGluc2VydF9zcWwgLj0gIlNFVCBGT1JFSUdOX0tFWV9DSEVDS1MgPSAxO1xuIjsKCQkJJGluc2VydF9zcWwgLj0gIlNFVCBVTklRVUVfQ0hFQ0tTID0gMTtcbiI7CgkJCSR3cml0ZVJldHVybiA9IGZ3cml0ZSggJGZpbGVfaGFuZGxlLCAkaW5zZXJ0X3NxbCApOwoJCQlpZiAoICggZmFsc2UgPT09ICR3cml0ZVJldHVybiApIHx8ICggMCA9PSAkd3JpdGVSZXR1cm4gKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODQzOTQ4OiBVbmFibGUgdG8gd3JpdGUgdG8gU1FMIGZpbGUuIFJldHVybiBlcnJvci9ieXRlcyB3cml0dGVuOiBgJyAuICR3cml0ZVJldHVybiAuICdgLicgKTsKCQkJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCSRpbnNlcnRfc3FsID0gJyc7CgkJCQoJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGR1bXBpbmcgZGF0YWJhc2UgdGFibGUgYCcgLiAkdGFibGUgLiAnYC4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdmaW5pc2hUYWJsZUR1bXAnLCAkdGFibGUgKTsKCQkJaWYgKCBpc3NldCggJG91dHB1dF9maWxlICkgKSB7CgkJCQkkc3RhdHMgPSBzdGF0KCAkb3V0cHV0X2ZpbGUgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIFNRTCBkdW1wIGZpbGUgKCcgLiBiYXNlbmFtZSggJG91dHB1dF9maWxlICkgLicpIHNpemU6ICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkc3RhdHNbJ3NpemUnXSApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3FsU2l6ZScsICRzdGF0c1snc2l6ZSddICk7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gZmx1c2guLi4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJCQkKCQkJLy91bnNldCggJHRhYmxlc1skdGFibGVfa2V5XSApOwoJCX0gLy8gZW5kIGZvcmVhY2ggdGFibGUuCgkJCgkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJdW5zZXQoICRmaWxlX2hhbmRsZSApOwoJCQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbmlzaGVkIFBIUCBiYXNlZCBTUUwgZHVtcCBtZXRob2QuIFJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0LCAzICkgLiAnIHNlYy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCXJldHVybiB0cnVlOwoJCQoJfSAvLyBFbmQgX3BocGR1bXAoKS4KCQoJCgkKCS8qCWdldF9tZXRob2RzKCkKCSAqCQoJICoJR2V0IGFuIGFycmF5IG9mIG1ldGhvZHMuIE5vdGU6IElmIGZvcmNlIG92ZXJyaWRpbmcgbWV0aG9kcyB0aGVuIGRldGVjdGVkIG1ldGhvZHMgd2lsbCBub3QgYmUgYWJsZSB0byBkaXNwbGF5LgoJICoJCgkgKglAcmV0dXJuCQlhcnJheQkJCQlBcnJheSBvZiBtZXRob2RzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZHMoKSB7CgkJcmV0dXJuICR0aGlzLT5fbWV0aG9kczsKCX0KCQoJCgkKCS8qCWltcG9ydCgpCgkgKgkKCSAqCUltcG9ydCBTUUwgY29udGVudHMgb2YgYSAuc3FsIGZpbGUgaW50byB0aGUgZGF0YWJhc2UuIE9ubHkgbW9kaWZpY2F0aW9uIGlzIHRvIHRhYmxlIHByZWZpeCBpZiBuZWVkZWQuIFByZWZpeGVzIChuZXcgYW5kIG9sZCkgcHJvdmlkZWQgaW4gY29uc3RydWN0b3IuCgkgKglBdXRvbWF0aWNhbGx5IGhhbmRsZXMgZmFsbGJhY2sgYmFzZWQgb24gYmVzdCBhdmFpbGFibGUgbWV0aG9kcy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzcWxfZmlsZQkJCQlGdWxsIGFic29sdXRlIHBhdGggdG8gLnNxbCBmaWxlIHRvIGltcG9ydCBmcm9tLgogCSAqCUBwYXJhbQkJc3RyaW5nCQkkb2xkX3ByZWZpeAkJCQlPbGQgZGF0YWJhc2UgcHJlZml4LiBOZXcgcHJlZml4IHByb3ZpZGVkIGluIGNvbnN0cnVjdG9yLgogCSAqCUBwYXJhbQkJaW50CQkJJHF1ZXJ5X3N0YXJ0CQkJUXVlcnkgbnVtYmVyIChha2EgbGluZSBudW1iZXIpIHRvIHJlc3VtZSBpbXBvcnQgYXQuCiAJICoJQHBhcmFtCQlib29sZWFuCQkkaWdub3JlX2V4aXN0aW5nCQlOT1RFOiBCYXNpY2FsbHkgaWdub3JlcyBteXNxbCBlcnJvcnMgdGhlc2UgZGF5cy4gUGFzdCBwdXJwb3NlOiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBpbXBvcnQgaWYgdGFibGVzIGV4aXN0IGFscmVhZHkuIERlZmF1bHQ6IGZhbHNlLgoJICoJQHJldHVybgkJbWl4ZWQJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYm9vbGVhbikKCSAqCQkJCQkJCQkJCQkJCWZhbHNlIG9uIGZhaWx1cmUgKGJvb2xlYW4pCgkgKgkJCQkJCQkJCQkJCQlpbnRlZ2VyIChpbnQpIG9uIG5lZWRpbmcgYSByZXN1bXNlIChpbnRlZ2VyIGlzIHJlc3VtZSBudW1iZXIgZm9yIG5leHQgcGFnZSBsb2FkcyAkcXVlcnlfc3RhcnQpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpbXBvcnQoICRzcWxfZmlsZSwgJG9sZF9wcmVmaXgsICRxdWVyeV9zdGFydCA9IDAsICRpZ25vcmVfZXhpc3RpbmcgPSBmYWxzZSApIHsKCQkkcmV0dXJuID0gZmFsc2U7CgkJJHRoaXMtPl9jdXJyZW50X3NxbF9maWxlID0gJHNxbF9maWxlOwoJCQoJCS8vIFJlcXVpcmUgYSBuZXcgdGFibGUgcHJlZml4LgoJCWlmICggJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXggPT0gJycgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFUlJPUiA5MDA4OiBBIGRhdGFiYXNlIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgaW1wb3J0aW5nLicgKTsKCQl9CgkJCgkJaWYgKCAkcXVlcnlfc3RhcnQgPiAwICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdDb250aW51aW5nIHRvIHJlc3RvcmUgZGF0YWJhc2UgZHVtcCBzdGFydGluZyBhdCBmaWxlIGxvY2F0aW9uIGAnIC4gJHF1ZXJ5X3N0YXJ0IC4gJ2AuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1Jlc3RvcmluZyBkYXRhYmFzZSBkdW1wLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50Li4uJyApOwoJCX0KCQkKCQlpZiAoIHRydWUgPT09ICRpZ25vcmVfZXhpc3RpbmcgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09wdGlvbiBzZXQgdG8gaWdub3JlIG15c3FsIGVycm9ycy9leGlzdGluZyB0YWJsZXMuJyApOwoJCX0KCQkKCQlnbG9iYWwgJHdwZGI7CgkJCgkJLy8gQ2hlY2sgd2hldGhlciBvciBub3QgdGFibGVzIGFscmVhZHkgZXhpc3QgdGhhdCBtaWdodCBjb2xsaWRlLgoJCS8qCgkJaWYgKCAkaWdub3JlX2V4aXN0aW5nID09PSBmYWxzZSApIHsKCQkJaWYgKCAkcXVlcnlfc3RhcnQgPT0gMCApIHsgLy8gQ2hlY2sgbnVtYmVyIG9mIHRhYmxlcyBhbHJlYWR5IGV4aXN0aW5nIHdpdGggdGhpcyBwcmVmaXguIFNraXBzIHRoaXMgY2hlY2sgb24gc3Vic3RlcHMgb2YgREIgaW1wb3J0LgoJCQkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoIHN0cl9yZXBsYWNlKCAnXycsICdcXycsICR0aGlzLT5fZGF0YWJhc2VfcHJlZml4ICkgKSAuICIlJyBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSIsIEFSUkFZX0EgKTsKCQkJCWlmICggY291bnQoICRyb3dzICkgPiAwICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAxNDogRGF0YWJhc2UgaW1wb3J0IGhhbHRlZCB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIGV4aXN0aW5nIFdvcmRQcmVzcyBkYXRhLicsICdUaGUgZGF0YWJhc2UgYWxyZWFkeSBjb250YWlucyBhIFdvcmRQcmVzcyBpbnN0YWxsYXRpb24gd2l0aCB0aGlzIHByZWZpeCAoJyAuIGNvdW50KCAkcm93cyApIC4gJyB0YWJsZXMpLiBSZXN0b3JlIGhhcyBiZWVuIHN0b3BwZWQgdG8gcHJldmVudCBvdmVyd3JpdGluZyBleGlzdGluZyBkYXRhLiAqKiogUGxlYXNlIGdvIGJhY2sgYW5kIGVudGVyIGEgbmV3IGRhdGFiYXNlIG5hbWUgYW5kL29yIHByZWZpeCBPUiBzZWxlY3QgdGhlIG9wdGlvbiB0byB3aXBlIHRoZSBkYXRhYmFzZSBwcmlvciB0byBpbXBvcnQgZnJvbSB0aGUgYWR2YW5jZWQgc2V0dGluZ3Mgb24gdGhlIGZpcnN0IGltcG9ydCBzdGVwLiAqKionICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJdW5zZXQoICRyb3dzICk7CgkJCX0KCQl9CgkJKi8KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdTdGFydGluZyBkYXRhYmFzZSBpbXBvcnQgcHJvY2VkdXJlLicgKTsKCQlpZiAoICctMScgPT0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtYXggZXhlY3V0aW9uIHRpbWUgY2h1bmtpbmcgZGlzYWJsZWQgYmFzZWQgb24gLTEgcGFzc2VkLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIGZvciB0aGlzIHJ1bjogJyAuICR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSAuICcgc2Vjb25kcy4nICk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IE9sZCBwcmVmaXg6IGAnIC4gJG9sZF9wcmVmaXggLiAnYDsgTmV3IHByZWZpeDogYCcgLiAkdGhpcy0+X2RhdGFiYXNlX3ByZWZpeCAuICdgLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICJteXNxbGJ1ZGR5OiBJbXBvcnRpbmcgU1FMIGZpbGU6IGB7JHNxbF9maWxlfWAuIE9sZCBwcmVmaXg6IGB7JG9sZF9wcmVmaXh9YC4gUXVlcnkgc3RhcnQ6IGB7JHF1ZXJ5X3N0YXJ0fWAuIiApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIGZsdXNoLi4uJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJCQoJCS8vIEF0dGVtcHQgZWFjaCBtZXRob2QgaW4gb3JkZXIuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJlcGFyaW5nIHRvIGltcG9ydCB1c2luZyBhdmFpbGFibGUgbWV0aG9kKHMpIGJ5IHByaW9yaXR5LiBCYXNpbmcgaW1wb3J0IG1ldGhvZHMgb2ZmIGR1bXAgbWV0aG9kczogYCcgLiBpbXBsb2RlKCAnLCcsICR0aGlzLT5fbWV0aG9kcyApIC4gJ2AnICk7CgkJZm9yZWFjaCggJHRoaXMtPl9tZXRob2RzIGFzICRtZXRob2QgKSB7CgkJCWlmICggbWV0aG9kX2V4aXN0cyggJHRoaXMsICJfaW1wb3J0X3skbWV0aG9kfSIgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEF0dGVtcHRpbmcgaW1wb3J0IG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYC4nICk7CgkJCQkkcmVzdWx0ID0gY2FsbF91c2VyX2Z1bmMoIGFycmF5KCAkdGhpcywgIl9pbXBvcnRfeyRtZXRob2R9IiApLCAkc3FsX2ZpbGUsICRvbGRfcHJlZml4LCAkcXVlcnlfc3RhcnQsICRpZ25vcmVfZXhpc3RpbmcgKTsKCQkJCQoJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBEdW1wIGNvbXBsZXRlZCBzdWNjZXNmdWxseSB3aXRoIHRoaXMgbWV0aG9kLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEltcG9ydCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4nICk7CgkJCQkJJHJldHVybiA9IHRydWU7CgkJCQkJYnJlYWs7CgkJCQl9IGVsc2VpZiAoICRyZXN1bHQgPT09IGZhbHNlICkgeyAvLyBEdW1wIGZhaWxlZCB0aGlzIG1ldGhvZC4gV2lsbCB0cnkgY29tcGF0aWJpbGl0eSBmYWxsYmFjayB0byBuZXh0IG1vZGUgaWYgYWJsZS4KCQkJCQkvLyBEbyBub3RoaW5nLiBXaWxsIHRyeSBuZXh0IG1vZGUgbmV4dCBsb29wLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEltcG9ydCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AgZmFpbGVkLiBUcnlpbmcgYW5vdGhlciBjb21wYXRpYmlsaXR5IG1vZGUgbmV4dCBpZiBhYmxlLicgKTsKCQkJCX0gZWxzZSB7IC8vIFNvbWV0aGluZyBlbHNlIHJldHVybmVkOyB1c2VkIGZvciByZXN1bWluZyAoaW50ZWdlcikgb3IgYSBtZXNzYWdlIChzdHJpbmcpLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IE5vbi1ib29sZWFuIHJlc3BvbnNlICh1c3VhbGx5IG1lYW5zIHJlc3VtZSBpcyBuZWVkZWQpOiBgJyAuIGltcGxvZGUoICcsJywgJHJlc3VsdCApIC4gJ2AnICk7CgkJCQkJcmV0dXJuICRyZXN1bHQ7IC8vIERvbnQgZmFsbGJhY2sgaWYgdGhpcyBoYXBwZW5zLiBVc3VhbGx5IG1lYW5zIHJlc3VtZSBpcyBuZWVkZWQgdG8gZmluaXNoLgoJCQkJfQoJCQl9CgkJfQoJCQkJCgkJaWYgKCAkcmV0dXJuID09PSB0cnVlICkgeyAvLyBTdWNjZXNzLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdEYXRhYmFzZSBpbXBvcnQgb2YgYCcgLiBiYXNlbmFtZSggJHNxbF9maWxlICkgLiAnYCBzdWNjZWVkZWQuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgeyAvLyBPdmVyYWxsIGZhaWx1cmUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdEYXRhYmFzZSBpbXBvcnQgcHJvY2VkdXJlIGRpZCBub3QgY29tcGxldGUgb3IgZmFpbGVkLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCX0gLy8gRW5kIGltcG9ydCgpLgoJCgkKCQoJcHVibGljIGZ1bmN0aW9uIF9pbXBvcnRfY29tbWFuZGxpbmUoICRzcWxfZmlsZSwgJG9sZF9wcmVmaXgsICRxdWVyeV9zdGFydCA9IDAsICRpZ25vcmVfZXhpc3RpbmcgPSBmYWxzZSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBQcmVwYXJpbmcgdG8gcnVuIGNvbW1hbmQgbGluZSBteXNxbCBpbXBvcnQgdmlhIGV4ZWMoKS4nICk7CgkJCgkJCgkJLy8gSWYgcHJlZml4IGhhcyBjaGFuZ2VkIHRoZW4gbmVlZCB0byB1cGRhdGUgdGhlIGZpbGUuCgkJaWYgKCAkb2xkX3ByZWZpeCAhPSAkdGhpcy0+X2RhdGFiYXNlX3ByZWZpeCApIHsKCQkJaWYgKCAhaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1sndGV4dHJlcGxhY2VidWRkeSddICkgKSB7CgkJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvdGV4dHJlcGxhY2VidWRkeS90ZXh0cmVwbGFjZWJ1ZGR5LnBocCcgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1sndGV4dHJlcGxhY2VidWRkeSddID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X3RleHRyZXBsYWNlYnVkZHkoKTsKCQkJfTsKCQkJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd0ZXh0cmVwbGFjZWJ1ZGR5J10tPnNldF9tZXRob2RzKCBhcnJheSggJ2NvbW1hbmRsaW5lJyApICk7IC8vIGRvbnQgZmFsbGJhY2sgaW50byB0ZXh0IHZlcnNpb24gaGVyZS4KCQkJCgkJCSRyZWdleF9jb25kaXRpb24gPSAiKElOU0VSVCBJTlRPfENSRUFURSBUQUJMRXxSRUZFUkVOQ0VTfENPTlNUUkFJTlR8QUxURVIgVEFCTEUpIChgPyl7JG9sZF9wcmVmaXh9KGA/KSI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1sndGV4dHJlcGxhY2VidWRkeSddLT5zdHJpbmdfcmVwbGFjZSggJHNxbF9maWxlLCAkb2xkX3ByZWZpeCwgJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXgsICRyZWdleF9jb25kaXRpb24gKTsKCQkJCgkJCSRzcWxfZmlsZSA9ICRzcWxfZmlsZSAuICcudG1wJzsgLy8gTmV3IFNRTCBmaWxlIGNyZWF0ZWQgYnkgdGV4dHJlcGxhY2VidWRkeS4KCQl9CgkJCgkJCgkJLyoqKioqKioqKiogQmVnaW4gcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkvLyBIYW5kbGUgV2luZG93cyB3YW50aW5nIC5leGUuIE5vdGU6IGV4ZWN1dGFibGUgZGlyZWN0b3J5IHBhdGggaXMgcHJlcGVuZGVkIG9uIGV4ZWMoKSBsaW5lIG9mIGNvZGUuCgkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikKCQkJJGNvbW1hbmQgPSAnbXNxbC5leGUnOwoJCX0gZWxzZSB7CgkJCSRjb21tYW5kID0gJ215c3FsJzsKCQl9CgkJCgkJLy8gSGFuZGxlIHBvc3NpYmxlIHNvY2tldHMuCgkJaWYgKCAkdGhpcy0+X2RhdGFiYXNlX3NvY2tldCAhPSAnJyApIHsKCQkJJGNvbW1hbmQgLj0gIiAtLXNvY2tldD17JHRoaXMtPl9kYXRhYmFzZV9zb2NrZXR9IjsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVXNpbmcgc29ja2V0cyBpbiBjb21tYW5kLicgKTsKCQl9CgkJCgkJLy8gU2V0IGRlZmF1bHQgY2hhcnNldCBpZiBhdmFpbGFibGUuCgkJZ2xvYmFsICR3cGRiOwoJCWlmICggaXNzZXQoICR3cGRiICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3dwZGIgY2hhcnNldCBvdmVycmlkZSBmb3IgY29tbWFuZGxpbmU6ICcgLiAkd3BkYi0+Y2hhcnNldCApOwoJCQkkY29tbWFuZCAuPSAiIC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0PSIgLiAkd3BkYi0+Y2hhcnNldDsKCQl9CgkJCgkJLy8kY29tbWFuZCAuPSAiIC0taG9zdD17JHRoaXMtPl9kYXRhYmFzZV9ob3N0fSAtLXVzZXI9eyR0aGlzLT5fZGF0YWJhc2VfdXNlcn0gLS1wYXNzd29yZD17JHRoaXMtPl9kYXRhYmFzZV9wYXNzfSAtLWRlZmF1bHRfY2hhcmFjdGVyX3NldCB1dGY4IHskdGhpcy0+X2RhdGFiYXNlX25hbWV9IDwgeyRzcWxfZmlsZX0iOwoJCSRjb21tYW5kIC49ICIgLS1ob3N0PSIgLiBlc2NhcGVzaGVsbGFyZygkdGhpcy0+X2RhdGFiYXNlX2hvc3QpIC4gIiAtLXVzZXI9IiAuIGVzY2FwZXNoZWxsYXJnKCR0aGlzLT5fZGF0YWJhc2VfdXNlcikgLiAiIC0tcGFzc3dvcmQ9IiAuIGVzY2FwZXNoZWxsYXJnKCR0aGlzLT5fZGF0YWJhc2VfcGFzcykgLiAiICIgLiBlc2NhcGVzaGVsbGFyZygkdGhpcy0+X2RhdGFiYXNlX25hbWUpIC4gIiAyPiYxIDwgeyRzcWxfZmlsZX0iOyAvLyAyPiYxIHJlZGlyZWN0IFNUREVSUiB0byBTVERPVVQuCgkJLyoqKioqKioqKiogRW5kIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJCgkJLy8gUnVuIGNvbW1hbmQuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogUnVubmluZyBpbXBvcnQgdmlhIGNvbW1hbmQgbGluZSBuZXh0LicgKTsKCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICR0aGlzLT5fbXlzcWxfZGlyZWN0b3J5IC4gJGNvbW1hbmQgKTsKCQkKCQkKCQkvLyBUT0RPOiBSZW1vdmVkIG15c3FsIHBpbmdpbmcgaGVyZS4gRG8gd2UgbmVlZCAob3IgZXZlbiB3YW50KSB0aGF0IGhlcmU/CgkJCgkJCgkJLy8gQ2hlY2sgdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uLgoJCWlmICggJGV4ZWNfZXhpdF9jb2RlID09ICcwJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBhcHBlYXJzIHRvIHN1Y2NlZWRlZCBhbmQgcmV0dXJuZWQgcHJvcGVyIHJlc3BvbnNlLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsYnVkZHk6IENvbW1hbmQgZGlkIG5vdCBleGl0IG5vcm1hbGx5LiBGYWxsaW5nIGJhY2sgdG8gZGF0YWJhc2UgZHVtcCBjb21wYXRpYmlsaXR5IG1vZGVzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkKCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IHRvIGhlcmUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsYnVkZHk6IFVuY2F1Z2h0IGV4Y2VwdGlvbiAjNDMzMDUzODkwLicgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9IC8vIEVuZCBfaW1wb3J0X2NvbW1hbmRsaW5lKCkuCgkKCQoJCglmdW5jdGlvbiBzdHJpbmdfYmVnaW5zX3dpdGgoICRzdHJpbmcsICRzZWFyY2ggKSB7CgkJcmV0dXJuICggc3RybmNtcCggJHN0cmluZywgJHNlYXJjaCwgc3RybGVuKCRzZWFyY2gpICkgPT0gMCApOwoJfQoJCgkKCQoJLyoJX2ltcG9ydF9waHAoKQoJICoJCgkgKglJbXBvcnQgZnJvbSAuU1FMIGZpbGUgaW50byBkYXRhYmFzZSB2aWEgUEhQIGJ5IHJlYWRpbmcgaW4gZmlsZSBsaW5lIGJ5IGxpbmUuCgkgKglVc2luZyBjb2RlYmFzZSBmcm9tIEJhY2t1cEJ1ZGR5IC8gaW1wb3J0YnVkZHkgMi54LgoJICoJQHNlZSBpbXBvcnQoKS4KCSAqCUBzaW5jZSAyLnguCgkgKgkKCSAqCUBwYXJhbQkJU0VFIGltcG9ydCgpIFBBUkFNRVRFUlMhIQoJICoJQHJldHVybgkJbWl4ZWQJCQlUcnVlIG9uIHN1Y2Nlc3MgKGFuZCBjb21wbGV0aW9uKSwgaW5jb21wbGV0ZS9jaHVua2luZyByZXF1aXJlZD0gYXJyYXkoIGZpbGUgcG9pbnRlcltmb3IgcmVzdW1pbmddLCBxdWVyaWVzIHNvIGZhcltpbmZvcm1hdGl2ZSBvbmx5XSApLCBmYWxzZSBvbiBmYWlsdXJlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX2ltcG9ydF9waHAoICRzcWxfZmlsZSwgJG9sZF9wcmVmaXgsICRyZXN1bWVQb2ludCA9ICcnLCAkaWdub3JlX2V4aXN0aW5nID0gZmFsc2UgKSB7CgkJJHRoaXMtPnRpbWVfc3RhcnQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdTdGFydGluZyBpbXBvcnQgb2YgU1FMIGRhdGEuLi4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzICgnZGV0YWlscycsICdMb2FkaW5nIFNRTCBmcm9tIGZpbGUgYCcgLiAkc3FsX2ZpbGUgLiAnYC4nICk7CgkJCgkJCgkJLy8gT3BlbiBTUUwgZmlsZSBmb3IgcmVhZGluZy4KCQlpZiAoIEZBTFNFID09PSAoICRmcyA9IEBmb3BlbiggJHNxbF9maWxlLCAncicgKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkwMDk6IFVuYWJsZSB0byBmaW5kIGFueSBkYXRhYmFzZSBiYWNrdXAgZGF0YSBpbiB0aGUgc2VsZWN0ZWQgYmFja3VwIG9yIGNvdWxkIG5vdCBvcGVuIGZpbGUgKHBvc3NpYmx5IGR1ZSB0byBwZXJtaXNzaW9ucykuIFRyaWVkIG9wZW5pbmcgZmlsZSBgJyAuICRzcWxfZmlsZSAuICdgLiBFcnJvciAjOTAwOS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gSWYgY2h1bmtlZCByZXN1bWluZyB0aGVuIHNlZWsgdG8gdGhlIGNvcnJlY3QgcGxhY2UgaW4gdGhlIGZpbGUuCgkJaWYgKCAoICcnICE9ICRyZXN1bWVQb2ludCApICYmICggJHJlc3VtZVBvaW50ID4gMCApICkgeyAKCQkJaWYgKCAwICE9PSBmc2VlayggJGZzLCAkcmVzdW1lUG9pbnQgKSApIHsgLy8gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzk0ODM0NTM6IEZhaWxlZCB0byBzZWVrIFNRTCBmaWxlIHRvIHJlc3VtZSBwb2ludCBgJyAuICRyZXN1bWVQb2ludCAuICdgIHZpYSBmc2VlaygpLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkKCQlnbG9iYWwgJHdwZGI7CgkJCgkJLy8gVHVybiBvZmYgZm9yZWlnbiBrZXkgY2hlY2tzLgoJCSRyZXN1bHRzID0gJHdwZGItPnF1ZXJ5KCAnU0VUIEZPUkVJR05fS0VZX0NIRUNLUz0wOycgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0cyApIHsKCQkJaWYgKCBlbXB0eSggJHdwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzg0OTM4NDQ6ICcgLiBAbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjODQ5Mzg0NDogJyAuIEBteXNxbGlfZXJyb3IoKSApOwoJCQl9CgkJfQoJCQoJCS8vIExvb3AgdGhyb3VnaCBmaWxlIGxpbmUtYnktbGluZSwgZXhlY3V0aW5nIHRoZSBTUUwgYXMgd2UgZ28uIFByZWZpeCB3aWxsIGJlIGNoYW5nZWQgbGluZSBieSBsaW5lIGFzIG5lZWRlZC4KCQkkcXVlcnlDb3VudCA9IDA7CgkJJGZhaWxlZFF1ZXJpZXMgPSAwOwoJCSRwcmV2UXVlcnlEYXRhID0gJyc7CgkJd2hpbGUgKCBGQUxTRSAhPT0gKCAkcXVlcnkgPSBmZ2V0cyggJGZzICkgKSApIHsgLy8gR3JhYiBsaW5lIGJ5IGxpbmUgYXMgbG9uZyBhcyBmZ2V0cyBkb2Vzbid0IHJldHVybiBGQUxTRS4KCQkJCgkJCS8vIENsZWFuIHVwIFNRTCBhbmQgaWdub3JlIGFueSBjb21tZW50IGxpbmVzLgoJCQkvLyRxdWVyeSA9IHRyaW0oICRxdWVyeSApOwoJCQlpZiAoIGVtcHR5KCAkcXVlcnkgKSB8fCAoICR0aGlzLT5zdHJpbmdfYmVnaW5zX3dpdGgoICRxdWVyeSwgJy8qITQwMTAzJyApICkgKSB7IC8vIElmIGJsYW5rIGxpbmUgb3Igc3RhcnRzIHdpdGggLyohNDAxMDMgKG15c3FsZHVtcCBmaWxlIGhhcyB0aGlzIGp1bmsgaW4gaXQpLgoJCQkJY29udGludWU7CgkJCX0KCQkJCgkJCWlmICggRkFMU0UgPT09IHN0cnBvcyggJHF1ZXJ5LCAnOycgKSApIHsgLy8gRG9uJ3QgaGF2ZSB0aGUgZnVsbCBxdWVyeSB5ZXQuIE5lZWQgdG8gZ3JhYiBtb3JlIGxpbmVzLgoJCQkJJHByZXZRdWVyeURhdGEgLj0gJHF1ZXJ5OwoJCQkJY29udGludWU7IC8vIEdvIGdyYWIgbW9yZS4KCQkJfQoJCQkKCQkJLy8gRXhlY3V0ZSB0aGUgU1FMIGxpbmUuCgkJCWlmICggRkFMU0UgPT09ICggJHJlc3VsdCA9ICR0aGlzLT5faW1wb3J0X3NxbF9kdW1wX2xpbmUoIHRyaW0oICRwcmV2UXVlcnlEYXRhIC4gJHF1ZXJ5ICksICRvbGRfcHJlZml4LCAkaWdub3JlX2V4aXN0aW5nICkgKSApIHsgLy8gQWRkZWQgdHJpbSgpIGFzIG9mIEJCIHY1IHRvIHJpcCBvZmYgc29tZXRpbWVzLWxlYWRpbmcgbmV3bGluZSBjaGFyLgoJCQkJLy8gR290IEZBTFNFIGFzIHJlc3BvbnNlLi4uIFNraXBwZWQgcXVlcnkgc28gY29udGludWUgdG8gdGhlIG5leHQuCgkJCQkkZmFpbGVkUXVlcmllcysrOwoJCQkJY29udGludWU7CgkJCX0KCQkJJHByZXZRdWVyeURhdGEgPSAnJzsgLy8gQ2xlYXIgb3V0IGFueSBwcmV2aW91cyBxdWVyeSBkYXRhIHRoYXQgd2FzIG5vdCB1c2VkIGR1ZSB0byBub3QgaGF2aW5nIHRoZSBmdWxsIHN0YXRlbWVudC4KCQkJJHF1ZXJ5Q291bnQrKzsKCQkJCgkJCS8vIFNob3cgYSBoZWFydGJlYXQgdG8ga2VlcCB1c2VyIHVwIHRvIGRhdGUgW2FuZCBlbnRlcnRhaW5lZCA7KV0uCgkJCWlmICggMCA9PT0gKCAkcXVlcnlDb3VudCAlIHNlbGY6OkhFQVJUQkVBVF9DT1VOVF9MSU1JVCApICkgeyAvLyBEaXNwbGF5IGV2ZXJ5IFggcXVlcmllcy4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1dvcmtpbmcuLi4gSW1wb3J0ZWQgJyAuICRxdWVyeUNvdW50IC4gJyBxdWVyaWVzIHNvIGZhci4nICk7CgkJCX0KCQkJCgkJCS8vIElmIHdlIGFyZSB3aXRoaW4gMSBzZWNvbmQgb2YgcmVhY2hpbmcgbWF4aW11bSBQSFAgcnVudGltZSB0aGVuIHN0b3AgaGVyZSBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgaW4gYW5vdGhlciBQSFAgcHJvY2Vzcy4uLgoJCQlpZiAoICctMScgIT0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgeyAvLyAtMSBkaXNhYmxlZCBjaHVua2luZy4KCQkJCWlmICggKCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gcGJfYmFja3VwYnVkZHk6OiRzdGFydF90aW1lICkgKyBzZWxmOjpUSU1FX1dJR0dMRV9ST09NICkgPj0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgeyAvLyB3YXMgJHRoaXMtPnRpbWVfc3RhcnQgYnV0IGRpZCBub3QgdGFrZSBpbnRvIGFjY291bnQgdGltZSB1c2VkIHVwIGJlZm9yZSBkYiBzdHVmZi4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdBcHByb2FjaGluZyBsaW1pdCBvZiBhdmFpbGFibGUgUEhQIGNodW5raW5nIHRpbWUgb2YgYCcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnYCBzZWMuIFBIUCByYW4gZm9yICcgLiByb3VuZCggbWljcm90aW1lKCB0cnVlICkgLSBwYl9iYWNrdXBidWRkeTo6JHN0YXJ0X3RpbWUsIDMgKSAuICcsIGRhdGFiYXNlIGltcG9ydCByYW4gZm9yICcgLiByb3VuZCggbWljcm90aW1lKCB0cnVlICkgLSAkdGhpcy0+dGltZV9zdGFydCwgMyApIC4gJyBzZWMuIFByb2NlZWRpbmcgdG8gdXNlIGNodW5raW5nLicgKTsKCQkJCQlpZiAoIEZBTFNFID09PSAoICRmc1BvaW50ZXIgPSBmdGVsbCggJGZzICkgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMzMjg5MjM4OiBVbmFibGUgdG8gZ2V0IGZ0ZWxsIHBvaW50ZXIgb2YgU1FMIGZpbGUgaGFuZGxlLicgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlAZmNsb3NlKCAkZnMgKTsKCQkJCQkKCQkJCQkvLyBUdXJuIGJhY2sgb24gZm9yZWlnbiBrZXkgY2hlY2tzLgoJCQkJCSRyZXN1bHRzID0gJHdwZGItPnF1ZXJ5KCAnU0VUIEZPUkVJR05fS0VZX0NIRUNLUz0xOycgKTsKCQkJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0cyApIHsKCQkJCQkJaWYgKCBlbXB0eSggJHdwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzM5Mzc5NzkyNDM0OiAnIC4gQG15c3FsX2Vycm9yKCAkd3BkYi0+ZGJoICkgKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzg5NDc3NDQ3ODU0OTogJyAuIEBteXNxbGlfZXJyb3IoKSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCXJldHVybiBhcnJheSggJGZzUG9pbnRlciwgJHF1ZXJ5Q291bnQsICRmYWlsZWRRdWVyaWVzLCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnRpbWVfc3RhcnQgKSApOyAvLyBmaWxlcG9pbnRlciBsb2NhdGlvbiwgbnVtYmVyIG9mIHF1ZXJpZXMgZG9uZSB0aGlzIHBhc3MsIG51bWJlciBvZiBzcWwgcWV1cmllcyB0aGF0IGZhaWxlZCwgZWxhcHNlZCB0aW1lIGR1cmluZyB0aGUgaW1wb3J0CgkJCQl9IC8vIEVuZCBpZi4KCQkJfQoJCQkKCQl9IC8vIGVuZCB3aGlsZS4KCQkKCQlpZiAoICEgZmVvZiggJGZzICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODk0NDM6IGZnZXRzIGZhaWxlZCBwcmVtYXR1cmVseS4gTm90IGF0IEVPRi4nICk7CgkJCXJldHVybiBGQUxTRTsKCQl9CgkJZmNsb3NlKCAkZnMgKTsKCQkKCQkvLyBUdXJuIGJhY2sgb24gZm9yZWlnbiBrZXkgY2hlY2tzLgoJCSRyZXN1bHRzID0gJHdwZGItPnF1ZXJ5KCAnU0VUIEZPUkVJR05fS0VZX0NIRUNLUz0xOycgKTsKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0cyApIHsKCQkJaWYgKCBlbXB0eSggJHdwZGItPnVzZV9teXNxbGkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzM0MzQzMzQ6ICcgLiBAbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjODU4NTU4NTQ5OiAnIC4gQG15c3FsaV9lcnJvcigpICk7CgkJCX0KCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnSW1wb3J0IG9mIFNRTCBkYXRhIGluIFBIUCBtb2RlIGNvbXBsZXRlLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdUb29rICcgLiByb3VuZCggbWljcm90aW1lKCB0cnVlICkgLSAkdGhpcy0+dGltZV9zdGFydCwgMyApIC4gJyBzZWNvbmRzIG9uICcgLiAkcXVlcnlDb3VudCAuICcgcXVlcmllcy4gJyApOwoJCQoJCXJldHVybiB0cnVlOwoJCQoJfSAvLyBFbmQgX2ltcG9ydF9waHAoKS4KCQoJCgkKCS8qKgoJICoJX2ltcG9ydF9zcWxfZHVtcF9saW5lKCkKCSAqCgkgKglJbXBvcnRzIGEgbGluZS9xdWVyeSBpbnRvIHRoZSBkYXRhYmFzZS4KCSAqCUhhbmRsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCB0YWJsZSBwcmVmaXguCgkgKglAc2luY2UgMi54LgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkcXVlcnkJCQlRdWVyeSBzdHJpbmcgdG8gcnVuIGZvciBpbXBvcnRpbmcuCgkgKglAcGFyYW0JCXN0cmluZwkJJG9sZF9wcmVmaXgJCU9sZCBwcmVmaXguIChuZXcgcHJlZml4IHdhcyBwYXNzZWQgaW4gY29uc3RydWN0b3IpLgoJICoJQHBhcmFtCQlib29sCQkJJGlnbm9yZV9leGlzdGluZwlJZiB0cnVlIHN1cHByZXNzIG15c3FsIGVycm9ycy4KCSAqCUByZXR1cm4JCWJvb2xlYW4JCQkJCQlUcnVlPXN1Y2Nlc3MsIEZhbHNlPWZhaWxlZC4KCSAqCgkgKi8KCWZ1bmN0aW9uIF9pbXBvcnRfc3FsX2R1bXBfbGluZSggJHF1ZXJ5LCAkb2xkX3ByZWZpeCwgJGlnbm9yZV9leGlzdGluZyA9IGZhbHNlICkgewoJCSRuZXdfcHJlZml4ID0gJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXg7CgkJCgkJJHF1ZXJ5X29wZXJhdG9ycyA9ICdJTlNFUlQgSU5UT3xDUkVBVEUgVEFCTEV8UkVGRVJFTkNFU3xDT05TVFJBSU5UfEFMVEVSIFRBQkxFfFwvXCohXGQrXHMrQUxURVIgVEFCTEUnOwoJCQoJCS8vIFJlcGxhY2UgZGF0YWJhc2UgcHJlZml4IGluIHF1ZXJ5LgoJCWlmICggJG9sZF9wcmVmaXggIT09ICRuZXdfcHJlZml4ICkgewoJCQkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoICIvXigkcXVlcnlfb3BlcmF0b3JzKShccytgPykkb2xkX3ByZWZpeC9pIiwgIlwkezF9XCR7Mn0kbmV3X3ByZWZpeCIsICRxdWVyeSApOyAvLyA0LTI5LTExCgkJfQoJCQoJCS8vIFRoaXMgaXMgYSB0YWJsZSBjcmVhdGlvbiBsaW5lLiBPdXRwdXQgd2hpY2ggdGFibGUgd2UgYXJlIGFibGUgdG8gY3JlYXRlIHRvIGhlbHAgZ2V0IGFuIGlkZWEgd2hlcmUgd2UgYXJlIGluIHRoZSBpbXBvcnQuIEFsc28gcG9zc2libHkgaGFuZGxlIGhvdGZpeCBFcnJvciAjNzAwMS4KCQlpZiAoIDEgPT0gcHJlZ19tYXRjaCggIi9eQ1JFQVRFIFRBQkxFIGA/KChcd3wtKSspYD8vaSIsICRxdWVyeSwgJG1hdGNoZXMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgdGFibGUgYCcgLiAkbWF0Y2hlc1sxXSAuICdgLicgKTsKCQkJaWYgKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2ltcG9ydGluZ1RhYmxlJywgJyIgLiAkbWF0Y2hlc1sxXSAuICInICk7PC9zY3JpcHQ+IjsKCQkJfQoJCQkKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+X2hvdGZpeF83MDAxICkgewoJCQkJJHF1ZXJ5ID0gc3RyX2lyZXBsYWNlKCAnVFlQRT0nLCAnRU5HSU5FPScsICRxdWVyeSApOwoJCQl9CgkJfQoJCQoJCWdsb2JhbCAkd3BkYjsKCQkKCQkvLyBSdW4gdGhlIHF1ZXJ5CgkJJHJlc3VsdHMgPSAkd3BkYi0+cXVlcnkoICRxdWVyeSApOwoJCQoJCS8vIEhhbmRsZSByZXN1bHRzIG9mIHJ1bm5pbmcgcXVlcnkuCgkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdHMgKSB7CgkJCWlmICggJGlnbm9yZV9leGlzdGluZyAhPT0gdHJ1ZSApIHsKCgkJCQlpZiAoIGVtcHR5KCAkd3BkYi0+dXNlX215c3FsaSApICkgewoJCQkJCSRteXNxbF9lcnJvciA9IEBteXNxbF9lcnJvciggJHdwZGItPmRiaCApOwoJCQkJfSBlbHNlIHsKCQkJCQkkbXlzcWxfZXJyb3IgPSBAbXlzcWxpX2Vycm9yKCk7CgkJCQl9CgoJCQkJaWYgKCAnJyA9PSAkbXlzcWxfZXJyb3IgKSB7CgkJCQkJJG15c3FsX2Vycm9yID0gJHdwZGItPmxhc3RfZXJyb3I7CgkJCQl9CgkJCQkKCQkJCWlmICggZW1wdHkoICR3cGRiLT51c2VfbXlzcWxpICkgKSB7CgkJCQkJJG15c3FsX2Vycm5vID0gQG15c3FsX2Vycm5vKCAkd3BkYi0+ZGJoICk7CgkJCQl9IGVsc2UgewoJCQkJCSRteXNxbF9lcnJubyA9IEBteXNxbGlfZXJybm8oICR3cGRiLT5kYmggKTsKCQkJCX0KCQkJCQoJCQkJJG15c3FsXzkwMTBfbG9nID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS9teXNxbF85MDEwX2xvZy0nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJCQlpZiAoIDAgPT0gJHRoaXMtPl85MDEwc19lbmNvdW50ZXJlZCApIHsgLy8gUGxhY2UgYSBoZWFkZXIgYXQgdGhlIHRvcCBvZiB0aGlzIGxvZyB3aXRoIHNvbWUgZGVidWdnaW5nIGluZm8uCgkJCQkJLy9AdW5saW5rKCAkbXlzcWxfOTAxMF9sb2cgKTsgLy8gRGVsZXRlIGlmIGFscmVhZHkgZXhpc3RzIHRvIGF2b2lkIG11bHRpcGxlIGxvZ2dpbmcgb2YgZW50aXJlIHByb2Nlc3MuIE5PIExPTkdFUiBERUxFVEVEIHNpbmNlIHRoaXMgbWF5IGJlIG11bHRpcGFydCBjaHVua2VkLgoJCQkJCUBmaWxlX3B1dF9jb250ZW50cyggJG15c3FsXzkwMTBfbG9nLAoJCQkJCQkiIyMjIyNcbiMgVGhpcyBsb2cgY29udGFpbnMgYWxsIDkwMTAgZXJyb3JzIGVuY291bnRlcmVkLlxuIyBPbGQgcHJlZml4OiBgeyRvbGRfcHJlZml4fWAuXG4jIE5ldyBwcmVmaXg6IGB7JG5ld19wcmVmaXh9YC5cbiMgVGltZTogYCIgLiB0aW1lKCkgLiAiYC5cbiMjIyMjXG57JHRlc3R9XG4iLAoJCQkJCQlGSUxFX0FQUEVORAoJCQkJCSk7CgkJCQl9CgkJCQkKCQkJCUBmaWxlX3B1dF9jb250ZW50cyggJG15c3FsXzkwMTBfbG9nLAoJCQkJCSJRVUVSWSBmcm9tIGZpbGUgYCIgLiAkdGhpcy0+X2N1cnJlbnRfc3FsX2ZpbGUgLiAiYDpcbiIgLiAkcXVlcnkgLiAiXG5FUlJPUjpcbiIgLiAkbXlzcWxfZXJyb3IgLiAiXG5cbiIsCgkJCQkJRklMRV9BUFBFTkQKCQkJCSk7CgkJCQkKCQkJCSR0aGlzLT5fOTAxMHNfZW5jb3VudGVyZWQrKzsKCQkJCWlmICggJHRoaXMtPl85MDEwc19lbmNvdW50ZXJlZCA+ICR0aGlzLT5fbWF4XzkwMTBzX2FsbG93ZWQgKSB7IC8vIFRvbyBtYW55LCBkb24ndCBzaG93IG1vcmUuCgkJCQkJaWYgKCAkdGhpcy0+XzkwMTBzX2VuY291bnRlcmVkID09ICggJHRoaXMtPl9tYXhfOTAxMHNfYWxsb3dlZCArIDEgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0FkZGl0aW9uYWwgOTAxMCBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZCBidXQgaGF2ZSBub3QgYmVlbiBkaXNwbGF5ZWQgdG8gYXZvaWQgZmxvb2RpbmcgdGhlIHNjcmVlbi4gQWxsIDkwMTAgZXJyb3JzIGFyZSBsb2dnZWQgdG8gYCcgLiAkbXlzcWxfOTAxMF9sb2cgLiAnYCBpZiBwb3NzaWJsZS4nICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gU2hvdyBlcnJvci4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkwMTA6IFVuYWJsZSB0byBpbXBvcnQgU1FMIHF1ZXJ5LiBFcnJvcjogYCcgLiAkbXlzcWxfZXJyb3IgLiAnYCBFcnJubzogYCcgLiAkbXlzcWxfZXJybm8gLiAnYC4nICk7CgkJCQkJaWYgKCBmYWxzZSAhPT0gc3RyaXN0ciggJG15c3FsX2Vycm9yLCAnc2VydmVyIGhhcyBnb25lIGF3YXknICkgKSB7IC8vIGlmIHN0cmluZyBkZW5vdGVzIHRoYXQgbXlzcWwgc2VydmVyIGhhcyBnb25lIGF3YXkgYmFpbCBzaW5jZSBpdCB3aWxsIGxpa2VseSBqdXN0IGZsb29kIHVzZXIgd2l0aCBlcnJvcnMuLi4KCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM5MDEwYjogSGFsdGluZyBiYWNrdXAgcHJvY2VzcyBhcyBteXNxbCBzZXJ2ZXIgaGFzIGdvbmUgYXdheSBhbmQgZGF0YWJhc2UgZGF0YSBjb3VsZCBub3QgYmUgaW1wb3J0ZWQuIFR5cGljYWxseSB0aGUgcmVzdG9yZSBjYW5ub3QgY29udGludWUgc28gdGhlIHByb2Nlc3MgaGFzIGJlZW4gaGFsdGVkLiBUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IGEgcHJvYmxlbWF0aWMgbXlzcWwgc2VydmVyIGF0IHlvdXIgaG9zdGluZyBwcm92aWRlciwgbG93IG15c3FsIHRpbWVvdXRzLCBldGMuIENvbnRhY3QgeW91ciBob3N0aW5nIGNvbXBhbnkgZm9yIHN1cHBvcnQuJyApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMYXN0IHF1ZXJ5IGF0dGVtcHRlZDogYCcgLiAkcXVlcnkgLiAnYC4nICk7CgkJCQkJCWRpZSggJ0Vycm9yICM5NDgzNDM6IEZBVEFMIEVSUk9SIC0gSU1QT1JUIEhBTFRFRCcgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCX0gLy8gRW5kIF9pbXBvcnRfc3FsX2R1bXBfbGluZSgpLgoJCgkKCQp9IC8vIEVuZCBwYl9iYWNrdXBidWRkeV9teXNxbGJ1ZGR5IGNsYXNzLgo= ###PACKDATA,FILE_END,/lib/mysqlbuddy/mysqlbuddy.php,importbuddy/lib/mysqlbuddy/mysqlbuddy.php ###PACKDATA,FILE_START,/lib/textreplacebuddy/index.php,importbuddy/lib/textreplacebuddy/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/lib/textreplacebuddy/index.php,importbuddy/lib/textreplacebuddy/index.php ###PACKDATA,FILE_START,/lib/textreplacebuddy/textreplacebuddy.php,importbuddy/lib/textreplacebuddy/textreplacebuddy.php PD9waHAKLyoJcGJfYmFja3VwYnVkZHlfdGV4dHJlcGxhY2VidWRkeSBjbGFzcwogKgkKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqCUBzaW5jZSAzLjAuMAogKgogKglUZXh0IHJlcGxhY2VtZW50cyB1c2luZyBjb21tYW5kIGxpbmUgaWYgYXZhaWxhYmxlLiBUaGVyZSBpcyBubyBnb29kIHdheSB0byBkbyB0ZXh0IHJlcGxhY2VtZW50cwogKglvbiBhIGxhcmdlIHNjYWxlIGluIFBIUCBlZmZpY2llbnRseS4KICoKICoJUmVzdWx0aW5nIGZpbGUgc3RvcmVkIGF0ICRmaWxlIC4gJy50bXAnLiBPcmlnaW5hbCBmaWxlIGlzIE5PVCByZXBsYWNlZC4KICoKICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3RleHRyZXBsYWNlYnVkZHkgewoJCgkKCS8qKioqKioqKioqIFByb3BlcnRpZXMgKioqKioqKioqKi8KCQoJCglwcml2YXRlICRfdmVyc2lvbiA9ICcwLjAuMic7CQkJCQkJCQkJCQkJCQkJCQkJLy8gSW50ZXJuYWwgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgbGlicmFyeS4KCQoJcHJpdmF0ZSAkX21ldGhvZHMgPSBhcnJheSgpOwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gQXZhaWxhYmxlIG1lY2hhbmlzbXMgZm9yIGR1bXBpbmcgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KCXByaXZhdGUgJF9jb21tYW5kYnVkZHk7CgkKCS8qKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKi8KCQoJCgkvKglfX2NvbnN0cnVjdCgpCgkgKgkKCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkJCSRmb3JjZV9tZXRob2RzCQkJT3B0aW9uYWwgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9tYXRpYyBtZXRob2QgZGV0ZWN0aW9uLiBTa2lwcyB0ZXN0IGFuZCBydW5zIGZpcnN0IG1ldGhvZCBmaXJzdC4gIEZhbGxzIGJhY2sgdG8gb3RoZXIgbWV0aG9kcyBpZiBhbnkgZmFpbHVyZS4KCSAqCUByZXR1cm4JCQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRmb3JjZV9tZXRob2RzID0gYXJyYXkoKSApIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBMb2FkaW5nIHRleHRyZXBsYWNlYnVkZHkgbGlicmFyeS4nICk7CgkJCgkJLy8gSGFuZGxlcyBjb21tYW5kIGxpbmUgZXhlY3V0aW9uLgoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jb21tYW5kYnVkZHkvY29tbWFuZGJ1ZGR5LnBocCcgKTsKCQkkdGhpcy0+X2NvbW1hbmRidWRkeSA9IG5ldyBwYl9iYWNrdXBidWRkeV9jb21tYW5kYnVkZHkoKTsKCQkKCQkvLyBTZXQgbWVjaGFuaXNtIGZvciBkdW1waW5nIC8gcmVzdG9yaW5nLgoJCWlmICggY291bnQoICRmb3JjZV9tZXRob2RzICkgPiAwICkgeyAvLyBNZWNoYW5pc20gZm9yY2VkLiBPdmVycmlkaW5nIGF1dG9tYXRpYyBjaGVjay4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAndGV4dHJlcGxhY2VidWRkeTogU2V0dGluZ3Mgb3ZlcnJpZGluZyBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIGF2YWlsYWJsZSBkYXRhYmFzZSBkdW1wIG1ldGhvZHMuIFVzaW5nIGZvcmNlZCBvdmVycmlkZSBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJGZvcmNlX21ldGhvZHMgKSAuICdgLicgKTsKCQkJJHRoaXMtPl9tZXRob2RzID0gJGZvcmNlX21ldGhvZHM7CgkJfSBlbHNlIHsgLy8gTm8gbWV0aG9kIGRlZmluZWQ7IGF1dG8tZGV0ZWN0IHRoZSBiZXN0LgoJCQkkdGhpcy0+X21ldGhvZHMgPSAkdGhpcy0+YXZhaWxhYmxlX3RleHRyZXBsYWNlX21ldGhvZHMoKTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAndGV4dHJlcGxhY2VidWRkeTogRGV0ZWN0ZWQgdGV4dCByZXBsYWNlbWVudCBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9tZXRob2RzICkgLiAnYC4nICk7CgkJCgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoJCgkKCQoJLyoJYXZhaWxhYmxlX2R1bXBfbWV0aG9kcygpCgkgKgkKCSAqCWZ1bmN0aW9uIGRlc2NyaXB0aW9uCgkgKgkKCSAqCUBwYXJhbQkJCgkgKglAcmV0dXJuCQlzdHJpbmcJCQkJUG9zc2libGUgcmV0dXJuczogIG15c3FsZHVtcCwgcGhwCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhdmFpbGFibGVfdGV4dHJlcGxhY2VfbWV0aG9kcygpIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZSB0ZXN0OiBUZXN0aW5nIGF2YWlsYWJsZSB0ZXh0IHJlcGxhY2VtZW50IG1ldGhvZHMuJyApOwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsgLy8gRXhlYyBpcyBhdmFpbGFibGUgc28gdGVzdCBteXNxbGR1bXAgZnJvbSBoZXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZSB0ZXN0OiBleGVjKCkgZnVuY3Rpb24gZXhpc3RzLiBUZXN0aW5nIHJ1bm5pbmcgc2VkICh0ZXh0IHJlcGxhY2UgY29tbWFuZCkgdmlhIGV4ZWMoKS4nICk7CgkJCQoJCQkKCQkJLyoqKioqKioqKiogQmVnaW4gcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkJLy8gSGFuZGxlIFdpbmRvd3Mgd2FudGluZyAuZXhlLgoJCQlpZiAoIHN0cmlzdHIoIFBIUF9PUywgJ1dJTicgKSAmJiAhc3RyaXN0ciggUEhQX09TLCAnREFSV0lOJyApICkgeyAvLyBSdW5uaW5nIFdpbmRvd3MuIChub3QgZGFyd2luKQoJCQkJcmV0dXJuIGFycmF5KCAncGhwJyApOyAvLyBOb3RoaW5nIGdvb2QgaW4gV2luZG93cyBhdmFpbGFibGUgdG8gdGV4dCByZXBsYWNlLgoJCQl9IGVsc2UgewoJCQkJJGNvbW1hbmQgPSAiZWNobyBiYWNrdXAgfCBzZWQgJ3MvYmFja3VwL2J1ZGR5LyciOyAvLyBXaWxsIGF0dGVtcHQgdG8gcmVwbGFjZSBiYWNrdXAgd2l0aCBidWRkeQoJCQl9CgkJCQoJCQkvLyBSZWRpcmVjdCBTVERFUlIgdG8gU1RET1VULgoJCQkkY29tbWFuZCAuPSAnICAyPiYxJzsKCQkJCgkJCS8qKioqKioqKioqIEVuZCBwcmVwYXJpbmcgY29tbWFuZCAqKioqKioqKioqLwoJCQkKCQkJCgkJCS8vIFJ1biBjb21tYW5kLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZSB0ZXN0OiBSdW5uaW5nIHRlc3QgY29tbWFuZCBuZXh0LicgKTsKCQkJbGlzdCggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKSA9ICR0aGlzLT5fY29tbWFuZGJ1ZGR5LT5leGVjdXRlKCAkY29tbWFuZCApOwoJCQkKCQkJaWYgKCBzdHJpc3RyKCBpbXBsb2RlKCAnICcsICRleGVjX291dHB1dCApLCAnYnVkZHknICkgIT09IGZhbHNlICkgeyAvLyBTdHJpbmcgVmVyIGFwcGVhcmVkIGluIHJlc3BvbnNlIG9yIHVzYWdlIGV4cGxhbmF0aW9ucy4gU29tZSB2ZXJzaW9uIGRvbnQgZ2l2ZSB2ZXJzaW9uLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2UgdGVzdDogQ29tbWFuZCBhcHBlYXJzIHRvIGJlIGFjY2Vzc2libGUgYW5kIHJldHVybnMgZXhwZWN0ZWQgcmVzcG9uc2UuJyApOwoJCQkJcmV0dXJuIGFycmF5KCAnY29tbWFuZGxpbmUnLCAncGhwJyApOyAvLyBteXNxbGR1bXAgYmVzdCwgcGhwIG5leHQuCgkJCX0KCQkJCgkJCQoJCX0gZWxzZSB7IC8vIE5vIGV4ZWMoKSBzbyBtdXN0IGZhbGwgYmFjayB0byBQSFAgbWV0aG9kIG9ubHkuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3RleHRyZXBsYWNlIHRlc3Q6IEZhbGxpbmcgYmFjayB0byB0ZXh0cmVwbGFjZSBjb21wYXRpYmlsaXR5IG1vZGUgKFBIUCByZXBsYWNlKS4gVGhpcyBpcyBzbG93ZXIgYW5kIG1vcmUgbWVtb3J5IGludGVuc2l2ZS4nICk7CgkJCXJldHVybiBhcnJheSggJ3BocCcgKTsKCQl9CgkJCgkJcmV0dXJuIGFycmF5KCAncGhwJyApOwoJCQoJfSAvLyBFbmQgYXZhaWxhYmxlX2R1bXBfbWV0aG9kKCkuCgkKCQoJCgkvKglyZXBsYWNlKCkKCSAqCQoJICoJUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIGEgc3RyaW5nIHdpdGhpbiBhIGZpbGUuIEF1dG9tYXRpY2FsbHkgZmFsbHMgYmFjay4KCSAqCVJlc3VsdGluZyBmaWxlIHN0b3JlZCBpbiAkZmlsZSAuICd0bXAnLiBPcmlnaW5hbCBmaWxlIGlzIE5PVCByZXBsYWNlZC4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQkJRnVsbCBmaWxlIHBhdGggdG8gZmlsZSB0byBzZWFyY2guIEEgLnRtcCB2ZXJzaW9uIGlzIG1hZGUgd2l0aCB0aGUgZmluYWwgcmVzdWx0cy4gT3JpZ2luYWwgZmlsZSBpcyBOT1QgcmVwbGFjZWQuCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlYXJjaAkJCQlTdHJpbmcgdG8gc2VhcmNoIGZvci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZW1lbnQJCVN0cmluZyB0byByZXBsYWNlIHdpdGguCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X2NvbmRpdGlvbglDb25kaXRpb24gd2hlbiByZXBsYWNlbWVudHMgbWF5IGhhcHBlbi4gT3B0aW9uYWwuCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X3JlcGxhY2UJCUlmIGZhbGxlbiBiYWNrIGludG8gUEhQIG1vZGUgdGhlbiB0aGlzIGlzIG5lZWRlZCBJRiAkcmVnZXhfY29uZGl0aW9uIGlzIHBhc3NlZC4gT3B0aW9uYWwuCgkgKglAcmV0dXJuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJpbmdfcmVwbGFjZSggJGZpbGUsICRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHJlZ2V4X2NvbmRpdGlvbiA9ICcnLCAkcmVnZXhfcmVwbGFjZSA9ICcnICkgewoJCSRyZXR1cm4gPSBmYWxzZTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdTdGFydGluZyB0ZXh0IHJlcGxhY2VtZW50IHByb2NlZHVyZS4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAidGV4dHJlcGxhY2UgYmVpbmcgcGVyZm9ybWVkIG9uIGZpbGUgYHskZmlsZX1gIHJlcGxhY2luZyBgeyRzZWFyY2h9YCB3aXRoIGB7JHJlcGxhY2VtZW50fWAuIiApOwoJCQoJCS8vIEF0dGVtcHQgZWFjaCBtZXRob2QgaW4gb3JkZXIuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJlcGFyaW5nIHRvIHRleHRyZXBsYWNlIHVzaW5nIGF2YWlsYWJsZSBtZXRob2QocykgYnkgcHJpb3JpdHkuIE1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkdGhpcy0+X21ldGhvZHMgKSAuICdgJyApOwoJCWZvcmVhY2goICR0aGlzLT5fbWV0aG9kcyBhcyAkbWV0aG9kICkgewoJCQlpZiAoIG1ldGhvZF9leGlzdHMoICR0aGlzLCAiX3N0cmluZ3JlcGxhY2VfeyRtZXRob2R9IiApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogQXR0ZW1wdGluZyByZXBsYWNlIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYC4nICk7CgkJCQkkcmVzdWx0ID0gY2FsbF91c2VyX2Z1bmMoIGFycmF5KCAkdGhpcywgIl9zdHJpbmdyZXBsYWNlX3skbWV0aG9kfSIgKSwgJGZpbGUsICRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHJlZ2V4X2NvbmRpdGlvbiwgJHJlZ2V4X3JlcGxhY2UgKTsKCQkJCQoJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBEdW1wIGNvbXBsZXRlZCBzdWNjZXNmdWxseSB3aXRoIHRoaXMgbWV0aG9kLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFJlcGxhY2UgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyApOwoJCQkJCSRyZXR1cm4gPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfSBlbHNlaWYgKCAkcmVzdWx0ID09PSBmYWxzZSApIHsgLy8gRHVtcCBmYWlsZWQgdGhpcyBtZXRob2QuIFdpbGwgdHJ5IGNvbXBhdGliaWxpdHkgZmFsbGJhY2sgdG8gbmV4dCBtb2RlIGlmIGFibGUuCgkJCQkJLy8gRG8gbm90aGluZy4gV2lsbCB0cnkgbmV4dCBtb2RlIG5leHQgbG9vcC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBSZXBsYWNlIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBmYWlsZWQuIFRyeWluZyBhbm90aGVyIGNvbXBhdGliaWxpdHkgbW9kZSBuZXh0IGlmIGFibGUuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBVbmV4ZXBlY3RlZCByZXNwb25zZTogYCcgLiBpbXBsb2RlKCAnLCcsICRyZXN1bHQgKSAuICdgJyApOwoJCQkJfQoJCQl9CgkJfQoJCQoJCWlmICggJHJldHVybiA9PT0gdHJ1ZSApIHsgLy8gU3VjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnVGV4dCByZXBsYWNlIHByb2NlZHVyZSBzdWNjZWVkZWQuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgeyAvLyBPdmVyYWxsIGZhaWx1cmUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdUZXh0IHJlcGxhY2UgcHJvY2VkdXJlIGZhaWxlZC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgl9IC8vIEVuZCBkdW1wKCkuCgkKCQoJCgkvKglfc3RyaW5ncmVwbGFjZV9jb21tYW5kbGluZSgpCgkgKgkKCSAqCVBlcmZvcm1zIGFjdHVhbCBjb21tYW5kIGxpbmUgc3RyaW5nIHJlcGxhY2VtZW50LiBWSUEgc2VkIChjb21tYW5kIGxpbmUgcmVwbGFjZSkuCgkgKglDYXNlIHNlbnNpdGl2ZS4KCSAqCVJlc3VsdGluZyBmaWxlIHN0b3JlZCBpbiAkZmlsZSAuICd0bXAnLiBPcmlnaW5hbCBmaWxlIGlzIE5PVCByZXBsYWNlZC4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRmaWxlCQkJCUZ1bGwgZmlsZSBwYXRoIHRvIGZpbGUgdG8gcmVwbGFjZSBpbi4gYSAudG1wIHZlcnNpb24gaXMgdGVtcG9yYXJpbHkgbWFkZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2VhcmNoCQkJCVN0cmluZyB0byBzZWFyY2ggZm9yLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRyZXBsYWNlbWVudAkJU3RyaW5nIHRvIHJlcGxhY2Ugd2l0aC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfY29uZGl0aW9uCUNvbmRpdGlvbiB3aGVuIHJlcGxhY2VtZW50cyBtYXkgaGFwcGVuLiBPcHRpb25hbC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfcmVwbGFjZQkJTk9UIHVzZWQgaW4gY29tbWFuZGxpbmUgbW9kZS4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGdsb2JhbAkJCQlXaGV0aGVyIG9yIG5vdCB0byBnbG9iYWxseSByZXBsYWNlIGluIHJlZ2V4LiBEZWZhdWx0OiBmYWxzZSAob25seSByZXBsYWNlIGZpcnN0IGluc3RhbmNlIHBlciBsaW5lKS4KCSAqCUByZXR1cm4JCWJvb2xlYW4JCQkJCQkJVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9zdHJpbmdyZXBsYWNlX2NvbW1hbmRsaW5lKCAkZmlsZSwgJHNlYXJjaCwgJHJlcGxhY2VtZW50LCAkcmVnZXhfY29uZGl0aW9uID0gJycsICRyZWdleF9yZXBsYWNlID0gJycsICRnbG9iYWwgPSBmYWxzZSApIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBQcmVwYXJpbmcgdG8gcnVuIGNvbW1hbmQgbGluZSBzZWQgKHJlcGxhY2VtZW50IGNvbW1lbnQpIHZpYSBleGVjKCkuJyApOwoJCQoJCS8vIEhhbmRsZSBvcHRpb25hbCBnbG9iYWwgcmVwbGFjZW1lbnQuCgkJaWYgKCAkZ2xvYmFsID09PSB0cnVlICkgewoJCQkkZ2xvYmFsX2ZsYWcgPSAnZyc7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFVzaW5nIGdsb2JhbCByZXBsYWNlIHBlciBsaW5lLicgKTsKCQl9IGVsc2UgewoJCQkkZ2xvYmFsX2ZsYWcgPSAnJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogVXNpbmcgZmlyc3QgaW5zdGFuY2UgcmVwbGFjZSBwZXIgbGluZS4nICk7CgkJfQoJCQoJCS8qKioqKioqKioqIEJlZ2luIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJLy8gSGFuZGxlIFdpbmRvd3Mgd2FudGluZyAuZXhlLgoJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQlpZiAoICRyZWdleF9jb25kaXRpb24gPT0gJycgKSB7IC8vIE5vcm1hbCBzdHJpbmcgcmVwbGFjZS4KCQkJCSRjb21tYW5kID0gInNlZCBzL3skc2VhcmNofS97JHJlcGxhY2VtZW50fS97JGdsb2JhbF9mbGFnfSB7JGZpbGV9ID4geyRmaWxlfS50bXAiOwoJCQl9IGVsc2UgeyAvLyBDdXN0b20gcmVnZXggY29uZGl0aW9ucy4KCQkJCSRjb21tYW5kID0gInNlZCAtRSAnL3skcmVnZXhfY29uZGl0aW9ufS9zL3skc2VhcmNofS97JHJlcGxhY2VtZW50fS97JGdsb2JhbF9mbGFnfScgeyRmaWxlfSA+IHskZmlsZX0udG1wIjsKCQkJfQoJCX0KCQkKCQkvLyBSZWRpcmVjdCBTVERFUlIgdG8gU1RET1VULgoJCSRjb21tYW5kIC49ICcgIDI+JjEnOwoJCQoJCS8qKioqKioqKioqIEVuZCBwcmVwYXJpbmcgY29tbWFuZCAqKioqKioqKioqLwoJCQoJCS8vIFJ1biBjb21tYW5kLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFJ1bm5pbmcgcmVwbGFjZSBjb21tYW5kIHZpYSBleGVjIG5leHQuJyApOwoJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJGNvbW1hbmQgKTsKCQkKCQkvLyBDaGVjayB0aGUgcmVzdWx0LgoJCWlmICggJGV4ZWNfZXhpdF9jb2RlID09ICcwJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogQ29tbWFuZCBhcHBlYXJzIHRvIHN1Y2NlZWRlZCBhbmQgcmV0dXJuZWQgcHJvcGVyIHJlc3BvbnNlLicgKTsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGUgLiAnLnRtcCcgKSApIHsgLy8gVGVtcCByZXBsYWNlbWVudCBmaWxlIGZvdW5kLiBTVUNDRVNTIQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAndGV4dHJlcGxhY2VidWRkeTogVGVtcG9yYXJ5IHRleHQgcmVwbGFjZW1lbnQgZmlsZSBjcmVhdGlvbiB2ZXJpZmllZC4nICk7CgkJCQkvKgoJCQkJaWYgKCB0cnVlID09PSByZW5hbWUoICRmaWxlIC4gJy50bXAnLCAkZmlsZSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3RleHRyZXBsYWNlYnVkZHk6IFRlbXBvcmFyeSBtb3ZlZCBiYWNrIHRvIG9yaWdpbmFsIGZpbGUuIFN1Y2Nlc3MuJyApOwoJCQkJCXJldHVybiB0cnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogVGVtcG9yYXJ5IGNvdWxkIG5vdCBiZSBtb3ZlZCBiYWNrIHRvIG9yaWdpbmFsIGZpbGUuIEZhaWx1cmUuIFZlcmlmeSBwZXJtaXNzaW9ucy4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJKi8KCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgeyAvLyBTUUwgZmlsZSBNSVNTSU5HLiBGQUlMVVJFIQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IFRob3VnaCBjb21tYW5kIHJlcG9ydGVkIHN1Y2Nlc3MgdGVtcG9yYXJ5IHJlcGxhY2VtZW50IGZpbGUgaXMgbWlzc2luZzogYCcgLiAkb3V0cHV0X2ZpbGUgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogQ29tbWFuZCBkaWQgbm90IGV4aXQgbm9ybWFsbHkuIEZhbGxpbmcgYmFjayB0byB0ZXh0IHJlcGxhY2VtZW50IGNvbXBhdGliaWxpdHkgbW9kZXMuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCS8vIFNob3VsZCBuZXZlciBnZXQgdG8gaGVyZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogVW5jYXVnaHQgZXhjZXB0aW9uICM0NTMyMzg5MC4nICk7CgkJcmV0dXJuIGZhbHNlOwoJCQoJfSAvLyBFbmQgX3N0cmluZ3JlcGxhY2VfY29tbWFuZGxpbmUoKS4KCQoJCgkKCS8qCV9zdHJpbmdyZXBsYWNlX3BocCgpCgkgKgkKCSAqCVBlcmZvcm1zIGFjdHVhbCBjb21tYW5kIGxpbmUgc3RyaW5nIHJlcGxhY2VtZW50LiBWSUEgUEhQLgoJICoJQ2FzZSBzZW5zaXRpdmUuCgkgKglSZXN1bHRpbmcgZmlsZSBzdG9yZWQgaW4gJGZpbGUgLiAndG1wJy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRmaWxlCQkJCUZ1bGwgZmlsZSBwYXRoIHRvIGZpbGUgdG8gcmVwbGFjZSBpbi4gYSAudG1wIHZlcnNpb24gaXMgdGVtcG9yYXJpbHkgbWFkZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2VhcmNoCQkJCVN0cmluZyB0byBzZWFyY2ggZm9yLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRyZXBsYWNlbWVudAkJU3RyaW5nIHRvIHJlcGxhY2Ugd2l0aC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfY29uZGl0aW9uCUNvbmRpdGlvbiB3aGVuIHJlcGxhY2VtZW50cyBtYXkgaGFwcGVuLiBPcHRpb25hbC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVnZXhfcmVwbGFjZQkJSWYgZmFsbGVuIGJhY2sgaW50byBQSFAgbW9kZSB0aGVuIHRoaXMgaXMgbmVlZGVkIElGICRyZWdleF9jb25kaXRpb24gaXMgcGFzc2VkLiBPcHRpb25hbC4KCSAqCUByZXR1cm4JCWJvb2xlYW4JCQkJCQkJVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLgoJICovCglwcml2YXRlIGZ1bmN0aW9uIF9zdHJpbmdyZXBsYWNlX3BocCggJGZpbGUsICRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHJlZ2V4X2NvbmRpdGlvbiA9ICcnLCAkcmVnZXhfcmVwbGFjZSA9ICcnICkgewoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFN0YXJ0aW5nIGNvbXB0aWJpbGl0eSBtb2RlIFBIUCB0ZXh0IHJlcGxhY2VtZW50LicgKTsKCQkKCQkKCQkkZmlsZV9vID0gZm9wZW4oICRmaWxlLCAncicgKTsKCQkkdGVtcCA9ICRmaWxlIC4gJy50bXAnOwoJCQoJCWlmICggIWlzX3dyaXRhYmxlKCAkdGVtcCApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAndGV4dHJlcGxhY2VidWRkeTogUGVybWlzc2lvbiBkZW5pZWQgd3JpdGluZyB0ZW1wb3JhcnkgZmlsZSBgJyAuICR0ZW1wIC4gJ2AuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCWlmICggaXNfcmVzb3VyY2UoICRmaWxlX28gKSA9PT0gdHJ1ZSApIHsKCQkJd2hpbGUgKCBmZW9mKCAkZmlsZV9vICkgPT09IGZhbHNlICkgewoJCQkKCQkJCWlmICggJHJlZ2V4X2NvbmRpdGlvbiAhPSAnJyApIHsgLy8gcmVnZXgKCQkJCQkkY29udGVudCA9IHByZWdfcmVwbGFjZSggIi9eeyRyZWdleF9jb25kaXRpb259L2kiLCAkcmVnZXhfcmVwbGFjZSwgZmdldHMoICRmaWxlX28gKSApOwoJCQkJfSBlbHNlIHsgLy8gc3RhbmRhcmQgc3RyaW5nCgkJCQkJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSggJHNlYXJjaCwgJHJlcGxhY2VtZW50LCBmZ2V0cyggJGZpbGVfbyApICk7CgkJCQl9CgkJCQlmaWxlX3B1dF9jb250ZW50cyggJHRlbXAsICRjb250ZW50LCBGSUxFX0FQUEVORCApOwoJCQl9CgkJCQoJCQlmY2xvc2UoICRmaWxlX28gKTsKCQl9CgkJCgkJLy91bmxpbmsoJGZpbGUpOwoJCQoJCS8qCgkJJHJlc3VsdCA9IHJlbmFtZSggJHRlbXAsICRmaWxlICk7CgkJaWYgKCAkcmVzdWx0ID09PSBmYWxzZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IFVuYWJsZSB0byBtb3ZlIHRlbXBvcmFyeSBmaWxlIGJhY2sgdG8gb3JpZ2luYWwgZmlsZS4gRmFpbHVyZS4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogTW92ZWQgdGVtcG9yYXJ5IGZpbGUgYmFjayB0byBvcmlnaW5hbCBmaWxlLiBTdWNjZXNzLicgKTsKCQl9CgkJKi8KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCQkKCX0gLy8gRW5kIF9zdHJpbmdyZXBsYWNlX3BocCgpLgoJCgkKCQoJLyoJZ2V0X21ldGhvZHMoKQoJICoJCgkgKglHZXQgYW4gYXJyYXkgb2YgbWV0aG9kcy4gTm90ZTogSWYgZm9yY2Ugb3ZlcnJpZGluZyBtZXRob2RzIHRoZW4gZGV0ZWN0ZWQgbWV0aG9kcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGRpc3BsYXkuCgkgKgkKCSAqCUByZXR1cm4JCWFycmF5CQkJCUFycmF5IG9mIG1ldGhvZHMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kcygpIHsKCQlyZXR1cm4gJHRoaXMtPl9tZXRob2RzOwoJfSAvLyBFbmQgZ2V0X21ldGhvZHMoKS4KCQoJCgkKCS8qCXNldF9tZXRob2RzKCkKCSAqCQoJICoJU2V0IG1ldGhvZHMuIE92ZXJyaWRlcyBkZXRlY3RlZC4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJG1ldGhvZHMJCUFycmF5IG9mIG1ldGhvZHMgdG8gc2V0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZHMoICRtZXRob2RzID0gYXJyYXkoKSApIHsKCQkkdGhpcy0+X21ldGhvZHMgPSAkbWV0aG9kczsKCX0gLy8gRW5kIHNldF9tZXRob2RzKCkuCgkKCQoJCn0gLy8gRW5kIHBiX2JhY2t1cGJ1ZGR5X215c3FsYnVkZHkgY2xhc3MuCj8+ ###PACKDATA,FILE_END,/lib/textreplacebuddy/textreplacebuddy.php,importbuddy/lib/textreplacebuddy/textreplacebuddy.php ###PACKDATA,FILE_START,/lib/cpanel/cpanel.php,importbuddy/lib/cpanel/cpanel.php PD9waHAKLyoKRVhBTVBMRToKCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jcGFuZWwvY3BhbmVsLnBocCcgKTsKIAokY3BhbmVsX3VzZXIgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3VzZXInICk7CiRjcGFuZWxfcGFzc3dvcmQgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Bhc3MnICk7CiRjcGFuZWxfaG9zdCA9ICJmb28uY29tIjsKJGRiX25hbWUgPSAnYXBwbGVzJzsKJGRiX3VzZXIgPSAnb3Jhbmdlcyc7CiRkYl9wYXNzID0gJ2JhbmFuYXMnOwokY3JlYXRlX2RiX3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5X2NwYW5lbDo6Y3JlYXRlX2RiKCAkY3BhbmVsX3VzZXIsICRjcGFuZWxfcGFzc3dvcmQsICRjcGFuZWxfaG9zdCwgJGRiX25hbWUsICRkYl91c2VyLCAkZGJfcGFzcyApOwoKaWYgKCAkY3JlYXRlX2RiX3Jlc3VsdCA9PT0gdHJ1ZSApIHsKCWVjaG8gJ1N1Y2Nlc3MhIENyZWF0ZWQgZGF0YWJhc2UsIHVzZXIsIGFuZCBhc3NpZ25lZCB1c2VkIHRvIGRhdGFiYXNlLic7Cn0gZWxzZSB7CgllY2hvICdFcnJvcihzKTo8YnI+PHByZT4nIC4gcHJpbnRfciggJGNyZWF0ZV9kYl9yZXN1bHQsIHRydWUgKSAuICc8L3ByZT4nOwp9CgoqLwoKCgovKglwYl9iYWNrdXBidWRkeV9jcGFuZWwgQ2xhc3MKICoJCiAqCU1hbmFnZSBzb21lIGNwYW5lbCBzZXR0aW5ncy4KICoJCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9jcGFuZWwgewoKCgkvLyBUT0RPOiBVc2UgbW9yZSByb2J1c3QgdGhhbiBmaWxlX2dldF9jb250ZW50cygpLgoKCQoJLyoJY3JlYXRlX2RiKCkKCSAqCQoJICoJQ3JlYXRlIGEgZGF0YWJhc2UgYW5kIGFzc2lnbiBhIHVzZXIgdG8gaXQgd2l0aCBhbGwgcHJpdmlsYWdlcy4KCSAqCQoJICoJQHBhcmFtCQkKCSAqCUByZXR1cm4JCXRydWV8YXJyYXkJCUJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGFuIGFycmF5IG9mIGVycm9ycy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVfZGIoICRjcGFuZWxfdXNlciwgJGNwYW5lbF9wYXNzd29yZCwgJGNwYW5lbF9ob3N0LCAkZGJfbmFtZSwgJGRiX3VzZXIsICRkYl91c2VycGFzcywgJGNwYW5lbF9wb3J0ID0gJzIwODInLCAkY3BhbmVsX3Byb3RvY29sID0gJ2h0dHA6Ly8nICkgewoJCSRjcGFuZWxfc2tpbiA9ICJ4MyI7CgkJJGVycm9ycyA9IGFycmF5KCk7CgkJCgkJJGNwYW5lbF9wYXNzd29yZCA9IHVybGVuY29kZSggJGNwYW5lbF9wYXNzd29yZCApOyAvLyBQYXNzIG9mdGVuIGhhcyBzcGVjaWFsIGNoYXJzIHNvIGVuY29kZS4KCQkKCQkvLyBDYWxjdWxhdGUgYmFzZSBVUkwuCi8vIAkJJGJhc2VfdXJsID0gImh0dHA6Ly97JGNwYW5lbF91c2VyfTp7JGNwYW5lbF9wYXNzd29yZH1AeyRjcGFuZWxfaG9zdH06eyRjcGFuZWxfcG9ydH0vZnJvbnRlbmQveyRjcGFuZWxfc2tpbn0iOwoJCSRiYXNlX3VybCA9ICJ7Y3BhbmVsX3Byb3RvY29sfXskY3BhbmVsX3VzZXJ9OnskY3BhbmVsX3Bhc3N3b3JkfUB7JGNwYW5lbF9ob3N0fTp7JGNwYW5lbF9wb3J0fS9leGVjdXRlL015c3FsIjsKCQkKCQkvLyBHZW5lcmF0ZSBjcmVhdGUgZGF0YWJhc2UgVVJMLgovLyAJCSRjcmVhdGVfZGF0YWJhc2VfdXJsID0gJGJhc2VfdXJsIC4gIi9zcWwvYWRkYi5odG1sP2RiPXskZGJfbmFtZX0iOwoJCSRjcmVhdGVfZGF0YWJhc2VfdXJsID0gJGJhc2VfdXJsIC4gIi9jcmVhdGVfZGF0YWJhc2U/bmFtZT17JGNwYW5lbF91c2VyfV97JGRiX25hbWV9IjsKCQkvL2VjaG8gJGNyZWF0ZV9kYXRhYmFzZV91cmwgLiAnPGJyPic7CgkJCgkJCgkJLy8gQ3JlYXRlIHJlcXVlc3QgY29yZSBvYmogZm9yIGNvbm5lY3RpbmcgdG8gSFRUUC4KCQkkcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q29yZSggJGNyZWF0ZV9kYXRhYmFzZV91cmwgKTsKCQl0cnkgewoJCQkkcmVzdWx0ID0gJHJlcXVlc3QtPnNlbmRfcmVxdWVzdCggdHJ1ZSApOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQlpZiAoIHN0cmlzdHIoICRlLT5nZXRNZXNzYWdlKCksICdjb3VsZG5cJ3QgY29ubmVjdCB0byBob3N0JyApICE9PSBmYWxzZSApIHsKCQkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gY29ubmVjdCB0byBob3N0IGAnIC4gJGNwYW5lbF9ob3N0IC4gJ2Agb24gcG9ydCBgJyAuICRjcGFuZWxfcG9ydCAuICdgLiBWZXJpZnkgdGhlIGNQYW5lbCBkb21haW4vVVJMIGFuZCBtYWtlIHN1cmUgdGhlIHNlcnZlciBpcyBhYmxlIHRvIGluaXRpYXRlIG91dGdvaW5nIGh0dHAgY29ubmVjdGlvbnMgb24gcG9ydCAnIC4gJGNwYW5lbF9wb3J0IC4gJy4gU29tZSBob3N0cyBibG9jayB0aGlzLic7CgkJCQlyZXR1cm4gJGVycm9yczsKCQkJfQoJCQkkZXJyb3JzW10gPSAnQ2F1Z2h0IGV4Y2VwdGlvbjogJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnLiBGdWxsIFVSTDogJyAuICRjcmVhdGVfZGF0YWJhc2VfdXJsOwoJCQlyZXR1cm4gJGVycm9yczsKCQl9CgkJCgkJCgkJLy8gR2VuZXJhdGUgY3JlYXRlIGRhdGFiYXNlIHVzZXIgVVJMLgovLyAJCSRjcmVhdGVfdXNlcl91cmwgPSAkYmFzZV91cmwgLiAiL3NxbC9hZGR1c2VyLmh0bWw/dXNlcj17JGRiX3VzZXJ9JnBhc3M9eyRkYl91c2VycGFzc30iOwoJCSRjcmVhdGVfdXNlcl91cmwgPSAkYmFzZV91cmwgLiAiL2NyZWF0ZV91c2VyP25hbWU9eyRjcGFuZWxfdXNlcn1feyRkYl91c2VyfSZwYXNzd29yZD17JGRiX3VzZXJwYXNzfSI7CgkJLy9lY2hvICRjcmVhdGVfdXNlcl91cmwgLiAnPGJyPic7CgkJCgkJLy8gR2VuZXJhdGUgYXNzaWduIHVzZXIgZGF0YWJhc2UgYWNjZXNzIFVSTC4KLy8gCQkkYXNzaWduX3VzZXJfdXJsID0gJGJhc2VfdXJsIC4gIi9zcWwvYWRkdXNlcnRvZGIuaHRtbD91c2VyPXskY3BhbmVsX3VzZXJ9X3skZGJfdXNlcn0mZGI9eyRjcGFuZWxfdXNlcn1feyRkYl9uYW1lfSZBTEw9QUxMIjsKCQkkYXNzaWduX3VzZXJfdXJsID0gJGJhc2VfdXJsIC4gIi9zZXRfcHJpdmlsZWdlc19vbl9kYXRhYmFzZT91c2VyPXskY3BhbmVsX3VzZXJ9X3skZGJfdXNlcn0mZGF0YWJhc2U9eyRjcGFuZWxfdXNlcn1feyRkYl9uYW1lfSZwcml2aWxlZ2VzPUFMTCI7CgkJLy9lY2hvICRhc3NpZ25fdXNlcl91cmwgLiAnPGJyPic7CgkJCgkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdC0+aXNPSygpICkgewoJCQkkZXJyb3JzW10gPSAnVW5hYmxlIHRvIGNyZWF0ZSBkYXRhYmFzZSAtIHJlc3BvbnNlIHN0YXR1cyBjb2RlOiAnIC4gICRyZXN1bHQtPnN0YXR1czsKCQl9IGVsc2UgewkKCQkJJHJlc3VsdF9hcnJheSA9IGpzb25fZGVjb2RlKCAkcmVzdWx0LT5ib2R5LCB0cnVlICk7CgkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbICdzdGF0dXMnIF0gKSAmJiAoIDAgPT0gJHJlc3VsdF9hcnJheVsgJ3N0YXR1cycgXSApICkgewoJCQkJLy8gc3RhdHVzID0gMCBtZWFucyBhIGZhaWx1cmUKCQkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gY3JlYXRlIGRhdGFiYXNlOic7CgkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdICkgJiYgKCBpc19hcnJheSggJHJlc3VsdF9hcnJheVsgJ2Vycm9ycycgXSApICkgKSB7CgkJCQkJZm9yZWFjaCAoICRyZXN1bHRfYXJyYXlbICdlcnJvcnMnIF0gYXMgJGVycm9yICkgewoJCQkJCQkkZXJyb3JzW10gPSAkZXJyb3I7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCQovLyAJCWlmICggc3RyaXN0ciggJHJlc3VsdCwgJ0xvZyBpbicgKSAhPT0gZmFsc2UgKSB7IC8vIE5vIHN1Y2VzcyBhZGRpbmcgREIuCi8vIAkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gbG9nIGludG8gY1BhbmVsIHdpdGggZ2l2ZW4gdXNlcm5hbWUvcGFzc3dvcmQuIFZlcmlmeSB0aGUgY3JlZGVudGlhbHMgYXJlIGNvcnJlY3QgZm9yIHRoaXMgY1BhbmVsIGRvbWFpbi4nOwovLyAJCX0KLy8gCQlpZiAoIHN0cmlzdHIoICRyZXN1bHQsICdBZGRlZCB0aGUgRGF0YWJhc2UnICkgPT09IGZhbHNlICkgeyAvLyBObyBzdWNlc3MgYWRkaW5nIERCLgovLyAJCQkkZXJyb3JzW10gPSAnRXJyb3IgZW5jb3VudGVyZWQgYWRkaW5nIGRhdGFiYXNlLic7Ci8vIAkJfQovLyAJCWlmICggc3RyaXN0ciggJHJlc3VsdCwgJ3Byb2JsZW0gY3JlYXRpbmcgdGhlIGRhdGFiYXNlJyApICE9PSBmYWxzZSApIHsgLy8gU29tZXRoaW5nIGZhaWxlZC4KLy8gCQkJJGVycm9yc1tdID0gJ1VuYWJsZSB0byBjcmVhdGUgZGF0YWJhc2UuJzsKLy8gCQl9Ci8vIAkJaWYgKCBzdHJpc3RyKCAkcmVzdWx0LCAnZGF0YWJhc2UgbmFtZSBhbHJlYWR5IGV4aXN0cycgKSAhPT0gZmFsc2UgKSB7IC8vIERCIGFscmVhZHkgZXhpc3RzLgovLyAJCQkkZXJyb3JzW10gPSAnVGhlIGRhdGFiYXNlIG5hbWUgYWxyZWFkeSBleGlzdHMuJzsKLy8gCQl9CgkJCgkJCgkJLy8gUnVuIGNyZWF0ZSBkYXRhYmFzZSB1c2VyLgoJCWlmICggY291bnQoICRlcnJvcnMgKSA9PT0gMCApIHsKCQkJJHJlcXVlc3QgPSBuZXcgUmVxdWVzdENvcmUoICRjcmVhdGVfdXNlcl91cmwgKTsKCQkJdHJ5IHsKCQkJCSRyZXN1bHQgPSAkcmVxdWVzdC0+c2VuZF9yZXF1ZXN0KCB0cnVlICk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJJGVycm9yc1tdID0gJ0NhdWdodCBleGNlcHRpb246ICcgLiAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcmV0dXJuICRlcnJvcnM7CgkJCX0KCQkJCgkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQtPmlzT0soKSApIHsKCQkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gY3JlYWV0IHVzZXIgLSByZXNwb25zZSBzdGF0dXMgY29kZTogJyAuICAkcmVzdWx0LT5zdGF0dXM7CgkJCX0gZWxzZSB7CQoJCQkJJHJlc3VsdF9hcnJheSA9IGpzb25fZGVjb2RlKCAkcmVzdWx0LT5ib2R5LCB0cnVlICk7CgkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WyAnc3RhdHVzJyBdICkgJiYgKCAwID09ICRyZXN1bHRfYXJyYXlbICdzdGF0dXMnIF0gKSApIHsKCQkJCQkvLyBzdGF0dXMgPSAwIG1lYW5zIGEgZmFpbHVyZQoJCQkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gY3JlYXRlIHVzZXI6JzsKCQkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdICkgJiYgKCBpc19hcnJheSggJHJlc3VsdF9hcnJheVsgJ2Vycm9ycycgXSApICkgKSB7CgkJCQkJCWZvcmVhY2ggKCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdIGFzICRlcnJvciApIHsKCQkJCQkJCSRlcnJvcnNbXSA9ICRlcnJvcjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQovLyAJCQlpZiAoIHN0cmlzdHIoICRyZXN1bHQsICdBZGRlZCB1c2VyJyApID09PSBmYWxzZSApIHsgLy8gTm8gc3VjY2VzcyBhZGRpbmcgdXNlci4KLy8gCQkJCSRlcnJvcnNbXSA9ICdFcnJvciBlbmNvdW50ZXJlZCBhZGRpbmcgdXNlci4nOwovLyAJCQl9Ci8vIAkJCWlmICggc3RyaXN0ciggJHJlc3VsdCwgJ1lvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGEgTXlTUUwgdXNlcicgKSA9PT0gZmFsc2UgKSB7IC8vIE5vIHN1Y2Nlc3MgYWRkaW5nIHVzZXIuCi8vIAkJCQkkZXJyb3JzW10gPSAnRXJyb3IgZW5jb3VudGVyZWQgYWRkaW5nIHVzZXIuJzsKLy8gCQkJfQovLyAJCQlpZiAoIHN0cmlzdHIoICRyZXN1bHQsICdObyBwYXNzd29yZCBnaXZlbicgKSAhPT0gZmFsc2UgKSB7IC8vIEFscmVhZHkgZXhpc3RzLgovLyAJCQkJJGVycm9yc1tdID0gJ05vIHBhc3N3b3JkIGdpdmVuLic7Ci8vIAkJCX0KLy8gCQkJaWYgKCBzdHJpc3RyKCAkcmVzdWx0LCAnZXhpc3RzIGluIHRoZSBkYXRhYmFzZScgKSAhPT0gZmFsc2UgKSB7IC8vIEFscmVhZHkgZXhpc3RzLgovLyAJCQkJJGVycm9yc1tdID0gJ1VzZXJuYW1lIGFscmVhZHkgZXhpc3RzLic7Ci8vIAkJCX0KCQl9CgkJCgkJLy8gUnVuIGFzc2lnbiB1c2VyIHRvIGRhdGFiYXNlLgoJCWlmICggY291bnQoICRlcnJvcnMgKSA9PT0gMCApIHsKCQkJJHJlcXVlc3QgPSBuZXcgUmVxdWVzdENvcmUoICRhc3NpZ25fdXNlcl91cmwgKTsKCQkJdHJ5IHsKCQkJCSRyZXN1bHQgPSAkcmVxdWVzdC0+c2VuZF9yZXF1ZXN0KCB0cnVlICk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJJGVycm9yc1tdID0gJ0NhdWdodCBleGNlcHRpb246ICcgLiAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcmV0dXJuICRlcnJvcnM7CgkJCX0KCQkJCgkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQtPmlzT0soKSApIHsKCQkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gc2V0IHByaXZpbGVnZXMgZm9yIHVzZXIgLSByZXNwb25zZSBzdGF0dXMgY29kZTogJyAuICAkcmVzdWx0LT5zdGF0dXM7CgkJCX0gZWxzZSB7CQoJCQkJJHJlc3VsdF9hcnJheSA9IGpzb25fZGVjb2RlKCAkcmVzdWx0LT5ib2R5LCB0cnVlICk7CgkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WyAnc3RhdHVzJyBdICkgJiYgKCAwID09ICRyZXN1bHRfYXJyYXlbICdzdGF0dXMnIF0gKSApIHsKCQkJCQkvLyBzdGF0dXMgPSAwIG1lYW5zIGEgZmFpbHVyZQoJCQkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gc2V0IHByaXZpbGVnZXMgZm9yIHVzZXI6JzsKCQkJCQlpZiAoIGlzc2V0KCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdICkgJiYgKCBpc19hcnJheSggJHJlc3VsdF9hcnJheVsgJ2Vycm9ycycgXSApICkgKSB7CgkJCQkJCWZvcmVhY2ggKCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdIGFzICRlcnJvciApIHsKCQkJCQkJCSRlcnJvcnNbXSA9ICRlcnJvcjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQovLyAJCQlpZiAoIHN0cmlzdHIoICRyZXN1bHQsICd3YXMgYWRkZWQgdG8gdGhlIGRhdGFiYXNlJyApID09PSBmYWxzZSApIHsgLy8gTm8gc3VjY2VzcyBhZGRpbmcgdXNlci4KLy8gCQkJCSRlcnJvcnNbXSA9ICdFcnJvciBlbmNvdW50ZXJlZCBhc3NpZ25pbmcgdXNlciB0byBkYXRhYmFzZS4nOwovLyAJCQl9CgkJfQoJCQoJCWlmICggY291bnQoICRlcnJvcnMgKSA+IDAgKSB7IC8vIE9uZSBvciBtb3JlIGVycm9ycy4KCQkJcmV0dXJuICRlcnJvcnM7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRydWU7IC8vIFN1Y2Nlc3MhCgkJfQoJCQoJfQoKfSAvLyBlbmQgY2xhc3Mu ###PACKDATA,FILE_END,/lib/cpanel/cpanel.php,importbuddy/lib/cpanel/cpanel.php ###PACKDATA,FILE_START,/lib/cpanel/index.php,importbuddy/lib/cpanel/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/lib/cpanel/index.php,importbuddy/lib/cpanel/index.php ###PACKDATA,FILE_START,/pluginbuddy/_pluginbuddy.php,importbuddy/pluginbuddy/_pluginbuddy.php PD9waHAKCgoKLyoJcGx1Z2luYnVkZHkgY2xhc3MKICoJCiAqCUZyYW1ld29yayBmb3IgaGFuZGxpbmcgYWxsIHBsdWdpbiBmdW5jdGlvYWxpdHksIGFyY2hpdGVjdHVyZSwgZXRjLgogKgkkc2V0dGluZ3MgdmFyaWFibGUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIHNhbWUgc2NvcGUgb2YgdGhpcyBmaWxlIGFuZCBwcmV2aW91c2x5IHBvcHVsYXRlZCB3aXRoIGFsbCBwbHVnaW4gc2V0dGluZ3MuCiAqCQogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5IHsKCXByaXZhdGUgc3RhdGljICRwYmZyYW1ld29ya192ZXJzaW9uID0gJzEuMC4yOCc7CgkKCQoJLy8gKioqKioqKioqKiBQVUJMSUMgUFJPUEVSVElFUyAqKioqKioqKioqCglwdWJsaWMgc3RhdGljICRzdGFydF90aW1lOwkJCQkJLy8gbWljcm90aW1lIHdoZW4gaW5pdCgpIHdhcyBmaXJzdCBydW4uCgkKCQoJcHVibGljIHN0YXRpYyAkb3B0aW9uczsJCQkJCQkvLyBTdG9yZXMgYWxsIG9wdGlvbnMgZm9yIHBsdWdpbiB0aGF0IHdpbGwgY2hhbmdlIHN1Y2ggYXMgdXNlciBkZWZpbmVkIHNldHRpbmdzLgoJcHVibGljIHN0YXRpYyAkdWk7CQkJCQkJCS8vIFVzZXIgaW50ZXJmYWNlIGNsYXNzIGZvciByYXBpZGx5IGNvbnN0cnVjdGluZyBXUC1zdHlsZWQgR1VJcy4gUkVNT1ZFRC4gTm93IGFkZGVkIGF0IHJ1bnRpbWUgd2hlbiBpbml0X2NsYXNzX2NvbnRyb2xsZXIoKSBjYWxsZWQKCXB1YmxpYyBzdGF0aWMgJGZpbGVzeXN0ZW07CQkJCQkvLyBDbGFzcyBmb3IgbWFuaXB1bGF0aW5nICYgaW50ZXJmYWNpbmcgZmlsZSBzeXN0ZW0uCglwdWJsaWMgc3RhdGljICRmb3JtYXQ7CQkJCQkJLy8gQ2xhc3MgZm9yIGZvcm1hdHRpbmcgZGF0YSBvciB0ZXh0IGluIGh1bWFuIGZyaWVuZGx5IGZvcm1zLgoJcHVibGljIHN0YXRpYyAkY2xhc3NlcyA9IGFycmF5KCk7CQkJLy8gQXJyYXkgaG9sZGVyIGZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyBuZWVkZWQgZ2xvYmFsbHkgYnkgcGx1Z2luLiBTZXQvZ2V0IHdpdGggJGNsYXNzWydjbGFzc19zbHVnJ10uCglwdWJsaWMgc3RhdGljICR2YXJpYWJsZXMgPSBhcnJheSgpOwkJCS8vIEFycmF5IGhvbGRlciBmb3IgdXNlci1kZWZpbmVkIHZhcmlhYmxlcyBuZWVkZWQgZ2xvYmFsbHkgYnkgcGx1Z2luLiBTZXQvZ2V0IHdpdGggJHZhcmlhYmxlc1sndmFyX25hbWUnXS4gVXNlZnVsIGZvciB0aGluZ3Mgc3VjaCBhcyBhbiBpbnN0YW5jZSBjb3VudGVyIHRoYXQgaW5jcmVtZW50cy4KCQoJCgkvLyAqKioqKioqKioqIFBSSVZBVEUgUFJPUEVSVElFUyAqKioqKioqKioqCgkKCQoJCglwcml2YXRlIHN0YXRpYyAkX3NldHRpbmdzID0gYXJyYXkgKAkJCS8vIERlZmF1bHQgZnJhbWV3b3JrIHNldHRpbmdzIGZvciB0aGlzIHBsdWdpbi4gTk9UIHRoZSBzYW1lIGFzIG9wdGlvbnMuIEFjY2VzcyB2aWEgc2VsZjo6c2V0dGluZ3MoKS4KCQknc2x1ZycJCQkJPT4JCScnLAoJCSdzZXJpZXMnCQkJPT4JCScnLAoJCSdkZWZhdWx0X29wdGlvbnMnCT0+CQknJywKCQknbG9nX3NlcmlhbCcgCQk9PiAgCScnLAoJCSdpbml0JwkJCQk9PgkJJycsCgkpOwoJcHJpdmF0ZSBzdGF0aWMgJF9wYWdlX3NldHRpbmdzOwkJCQkvLyBIb2xkcyBhZG1pbiBwYWdlIHNldHRpbmdzIGZvciBhZGRpbmcgdG8gdGhlIGFkbWluIG1lbnUgb24gYSBob29rIGxhdGVyLgoJcHVibGljIHN0YXRpYyAkX3N0YXR1c19zZXJpYWwgPSAnJzsJCQkvLyBTZXJpYWwgZm9yIHdyaXRpbmcgdGhlIHN0YXR1cyBmb3IgdGhpcyBwYWdlIGxvYWQuIFN0cmluZy4KCXByaXZhdGUgc3RhdGljICRfaGFzX2ZsdXNoZWQgPSBmYWxzZTsJCS8vLyBXaGV0aGVyIG9yIG5vdCBmbHVzaCgpIGhhcyBiZWVuIGNhbGxlZCB5ZXQgb3Igbm90LgoKCS8vIENvbnRyb2xsZXIgb2JqZWN0cy4gU2VlOiAvY29udHJvbGxlcnMvIGRpcmVjdG9yeS4KCXByaXZhdGUgc3RhdGljICRfYWN0aW9uczsJCQkJCS8vIENvbnRyb2xsZXIgZm9yIFdvcmRQcmVzcyBhY3Rpb25zLgoJcHVibGljIHN0YXRpYyAkX2FqYXg7CQkJCQkJLy8gQ29udHJvbGxlciBmb3IgV29yZFByZXNzIEFKQVggYWN0aW9ucy4KCXByaXZhdGUgc3RhdGljICRfY3JvbjsJCQkJCQkvLyBDb250cm9sbGVyIGZvciBXb3JkUHJlc3Mgc2NoZWR1bGVkIGNyb25zLgoJcHJpdmF0ZSBzdGF0aWMgJF9kYXNoYm9hcmQ7CQkJCQkvLyBDb250cm9sbGVyIGZvciBXb3JkUHJlc3MgYWRtaW4gZGFzaGJvYXJkIGl0ZW1zLgoJcHJpdmF0ZSBzdGF0aWMgJF9maWx0ZXJzOwkJCQkJLy8gQ29udHJvbGxlciBmb3IgV29yZFByZXNzIGZpbHRlcnMuCglwcml2YXRlIHN0YXRpYyAkX3Nob3J0Y29kZXM7CQkJCS8vIENvbnRyb2xsZXIgZm9yIFdvcmRQcmVzcyBzaG9ydGNvZGVzLgoJLy9wcml2YXRlIHN0YXRpYyAkX3dpZGdldHM7CQkJCQkvLyBDb250cm9sbGVyIGZvciBXb3JkUHJlc3Mgd2lkZ2V0cy4KCXByaXZhdGUgc3RhdGljICRfcGFnZXM7CQkJCQkJLy8gQ29udHJvbGxlciBmb3IgV29yZFByZXNzIHBhZ2VzLiBTZWUgL2NvbnRyb2xsZXJzL3BhZ2VzLyBkaXJlY3RvcnkuCgkKCS8vIE1pc2MgdmFyaWFibGVzLgoJcHJpdmF0ZSBzdGF0aWMgJF9wbHVnaW5fcGF0aDsJCQkJLy8gTG9jYWwgcGF0aCB0byBwbHVnaW4uIEV4OiAvdXNlcnMvcGIvd3d3L3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4gKG5vIHRyYWlsaW5nIHNsYXNoKSBAc2VlIHBsdWdpbmJ1ZGR5OnBsdWdpbl9wYXRoKCkKCXByaXZhdGUgc3RhdGljICRfcGx1Z2luX3VybDsJCQkJLy8gVVJMIHRvIHBsdWdpbiBkaXJlY3RvcnkuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4vICh3aXRoIHRyYWlsaW5nIHNsYXNoKSBAc2VlIHNlbGY6OnBsdWdpbl91cmwoKQoJcHJpdmF0ZSBzdGF0aWMgJF9zZWxmX2xpbms7CQkJCQkvLyBSZXR1cm5zIFVSTCB0byB0aGUgY3VycmVudCBhZG1pbiBwYWdlIGlmIG9uIGEgcGx1Z2luIHBhZ2UuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWFkbWluL2luZGV4LnBocD9wYWdlPXBiX215cGx1Z2luIEBzZWUgc2VsZjo6cGFnZV9saW5rKCkKCS8vcHJpdmF0ZSBzdGF0aWMgJF9jYWxsYmFja3M7CQkJCS8vIERJU0FCTEVELiBVc2luZyBjcmVhdGVfZnVuY3Rpb24oKSB0byBieXBhc3MgbmVlZCBmb3IgdGhpcy4gQ3VycmVudGx5IG9ubHkgaG9sZGluZyBjYWxsYmFjayBmb3IgdGhlIGFkbWluIG1lbnUgLiBAc2VlIHBsdWdpbmJ1ZGR5X2NhbGxiYWNrcyBjbGFzcwoJcHVibGljIHN0YXRpYyAkX2Rhc2hib2FyZF93aWRnZXRzOyAgIAkJLy8gSG9sZHMgdGFnIGFuZCB0aXRsZSBmb3IgdW5jb25zdHJ1Y3RlZCBkYXNoYm9hcmQgd2lkZ2V0cyB0ZW1wb3JhcmlseS4KCXB1YmxpYyBzdGF0aWMgJF91cGRhdGVyOwkJCQkJLy8gQ29udGFpbnMgdXBkYXRlciBvYmplY3QgKGlmIGVuYWJsZWQpIG9mIHRoZSBtb3N0IHVwIHRvIGRhdGUgdXBkYXRlciBmb3VuZC4gUG9wdWxhdGVkIG9uIGluaXQgaG9vay4KCXByaXZhdGUgc3RhdGljICRfc2tpcGxvZzsJCQkJCS8vIGlmIHVuYWJsZSB0byB3cml0ZSB0byBsb2cgdGhlbiBza2lwIGFsbCBmdXR1cmUgYXR0ZW1wdHMuCgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJc2VsZjo6aW5pdCgpCgkgKgkKCSAqCUNvbnN0cnVjdG9yIGZvciB0aGlzIHN0YXRpYyBjbGFzcy4gQ2FsbGVkIGZyb20gdGhlIHBsdWdpbidzIGluaXQgKG9yIG90aGVyIGRlZmluZWQgaW4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSkgZmlsZS4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJHBsdWdpbmJ1ZGR5X3NldHRpbmdzCQlBcnJheSBvZiBwbHVnaW4gc2V0dGluZ3Mgc3VjaCBhcyBzbHVnLCBkZWZhdWx0IG9wdGlvbnMsCgkgKgkJCQkJCQkJCQkJCQkJcGx1Z2luLXNwZWNpZmljIG9wdGlvbnMsIGV0Yy4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0KCAkcGx1Z2luYnVkZHlfc2V0dGluZ3MsICRwbHVnaW5idWRkeV9pbml0ID0gJ2luaXQucGhwJyApIHsKCQlzZWxmOjokc3RhcnRfdGltZSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCXNlbGY6OiRfc2V0dGluZ3MgPSBhcnJheV9tZXJnZSggKGFycmF5KXNlbGY6OiRfc2V0dGluZ3MsIChhcnJheSkkcGx1Z2luYnVkZHlfc2V0dGluZ3MgKTsgLy8gTWVyZ2Ugc2V0dGluZ3Mgb3ZlciBmcmFtZXdvcmsgZGVmYXVsdHMuCgkJCgkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdwbHVnaW5fZGlyX3VybCcgKSApIHsgLy8gVVJMIGFuZCBwYXRoIGZ1bmN0aW9ucyBhdmFpbGFibGUgKG5vdCBpbiBJbXBvcnRCdWRkeSBidXQgaW5zaWRlIFdvcmRQcmVzcykuCgkJCXNlbGY6OiRfcGx1Z2luX3BhdGggPSBydHJpbSggcGx1Z2luX2Rpcl9wYXRoKCBkaXJuYW1lKCBfX0ZJTEVfXyApICksICcvXFwnICk7CgkJCXNlbGY6OiRfcGx1Z2luX3VybCA9IHJ0cmltKCBwbHVnaW5fZGlyX3VybCggZGlybmFtZSggX19GSUxFX18gKSApLCAnL1xcJyApOwoJCX0gZWxzZSB7IC8vIEdlbmVyYXRlIFVSTCBhbmQgcGF0aHMgb2xkIHdheSAob2xkIFdvcmRQcmVzcyB2ZXJzaW9ucyBvciBpbnNpZGUgSW1wb3J0QnVkZHkpLgoJCQlzZWxmOjokX3BsdWdpbl9wYXRoID0gZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApOwoJCQkkcmVsYXRpdmVfcGF0aCA9IGx0cmltKCBzdHJfcmVwbGFjZSggJ1xcJywgJy8nLCBzdHJfcmVwbGFjZSggcnRyaW0oIEFCU1BBVEgsICdcXFwvJyApLCAnJywgc2VsZjo6JF9wbHVnaW5fcGF0aCApICksICdcXFwvJyApOwoJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7CgkJCQlzZWxmOjokX3BsdWdpbl91cmwgPSAnaW1wb3J0YnVkZHknOyAvLyBSZWxhdGl2ZSBpbXBvcnRidWRkeSBwYXRoLgoJCQl9IGVsc2UgeyAvLyBOb3JtYWwgZnVsbCBwYXRoLgoJCQkJc2VsZjo6JF9wbHVnaW5fdXJsID0gc2l0ZV91cmwoKSAuICcvJyAuIGx0cmltKCAkcmVsYXRpdmVfcGF0aCwgJy8nICk7CgkJCQlpZiAoIGlzc2V0KCAkX1NFUlZFUlsnSFRUUFMnXSApICYmICRfU0VSVkVSWydIVFRQUyddID09ICdvbicgKSB7IC8vIEhhbmRsZSBodHRwcyBVUkxzIHByb3Blcmx5LgoJCQkJCXNlbGY6OiRfcGx1Z2luX3VybCA9IHN0cl9yZXBsYWNlKCAnaHR0cDovLycsICdodHRwczovLycsIHNlbGY6OiRfcGx1Z2luX3VybCApOwoJCQkJfQoJCQl9CgkJfQoJCQoJCWlmICggaXNzZXQoICRfR0VUWydwYWdlJ10gKSApIHsgLy8gSWYgaW4gYW4gYWRtaW4gcGFnZSB0aGVuIGFwcGVuZCBwYWdlIHF1ZXJ5c3RyaW5nLgoJCQkkYXJyID0gZXhwbG9kZSggJz8nLCAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSApOyAvLyBhdm9pZCByZWZlcmVuY2UgZXJyb3IgYnkgc2V0dGluZyBoZXJlLgoJCQlzZWxmOjokX3NlbGZfbGluayA9IGFycmF5X3NoaWZ0KCAkYXJyICkgLiAnP3BhZ2U9JyAuIGh0bWxlbnRpdGllcyggJF9HRVRbJ3BhZ2UnXSApOwoJCQl1bnNldCggJGFyciApOwoJCX0KCQkKCQkvLyBTZXQgdGhlIGluaXQgZmlsZS4KCQlzZWxmOjokX3NldHRpbmdzWydpbml0J10gPSAkcGx1Z2luYnVkZHlfaW5pdDsKCQkKCQkvLyBmaWxlc3lzdGVtIGNsYXNzIGNvbnRyb2xsZXIuCgkJaWYgKCBpc3NldCggc2VsZjo6JF9zZXR0aW5nc1snbW9kdWxlcyddWydmaWxlc3lzdGVtJ10gKSAmJiAoIHNlbGY6OiRfc2V0dGluZ3NbJ21vZHVsZXMnXVsnZmlsZXN5c3RlbSddID09PSB0cnVlICkgKSB7CgkJCXNlbGY6OmluaXRfY2xhc3NfY29udHJvbGxlciggJ2ZpbGVzeXN0ZW0nICk7CgkJfQoJCS8vIGZvcm1hdCBjbGFzcyBjb250cm9sbGVyLgoJCWlmICggaXNzZXQoIHNlbGY6OiRfc2V0dGluZ3NbJ21vZHVsZXMnXVsnZm9ybWF0J10gKSAmJiAoIHNlbGY6OiRfc2V0dGluZ3NbJ21vZHVsZXMnXVsnZm9ybWF0J10gPT09IHRydWUgKSApIHsKCQkJc2VsZjo6aW5pdF9jbGFzc19jb250cm9sbGVyKCAnZm9ybWF0JyApOwoJCX0KCQkKCQlpZiAoIGlzX2FkbWluKCkgKSB7CgkJCQoJCQkvLyBMb2FkIFVJIHN5c3RlbS4KCQkJc2VsZjo6aW5pdF9jbGFzc19jb250cm9sbGVyKCAndWknICk7CgkJCQoJCQkvLyBMb2FkIGFjdGl2YXRpb24gaG9vayBpZiBpbiBhZG1pbiBhbmQgYWN0aXZhdGlvbiBmaWxlIGV4aXN0cy4KCQkJaWYgKCBmaWxlX2V4aXN0cyggc2VsZjo6JF9wbHVnaW5fcGF0aCAuICcvY29udHJvbGxlcnMvYWN0aXZhdGlvbi5waHAnICkgKSB7CgkJCQkkZXNjYXBlZF9wbHVnaW5fcGF0aCA9IHByZWdfcmVwbGFjZSggJyNeXFxcXFxcXFwjJywgJ1xcXFxcXFxcXFxcXFxcXFwnLCBzZWxmOjokX3BsdWdpbl9wYXRoICk7IC8vIFJlcGxhY2UgYSBwYXRoIHN0YXJ0aW5nIHdpdGggXFwgdG8gYmUgXFxcXCBzbyB0aGF0IHdoZW4gY3JlYXRlX2Z1bmN0aW9uIHBhcnNlcyB0aGUgYmFja3NsYXNoIGl0IHdpbGwgcmV0dXJuIGJhY2sgdG8gXFwuCgkJCQlyZWdpc3Rlcl9hY3RpdmF0aW9uX2hvb2soIHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnLycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdpbml0JyApLCBjcmVhdGVfZnVuY3Rpb24oICcnLCAicmVxdWlyZV9vbmNlKCciIC4gJGVzY2FwZWRfcGx1Z2luX3BhdGggLiAiL2NvbnRyb2xsZXJzL2FjdGl2YXRpb24ucGhwJyk7IiApICk7IC8vIFJ1biBzb21lIGNvZGUgd2hlbiBwbHVnaW4gaXMgYWN0aXZhdGVkIGluIGRhc2hib2FyZC4KCQkJfQoJCX0gZWxzZSB7IC8vIFB1YmxpYyBzaWRlLgoJCQkvLyBEbyBub3RoaW5nLgoJCX0KCQkKCX0gLy8gRW5kIGluaXQoKS4KCQoJCgkKCS8qCXNlbGY6OnBsdWdpbl9wYXRoKCkKCSAqCQoJICoJUmV0dXJucyBsb2NhbCBwYXRoIHRvIHBsdWdpbi4gRXg6IC91c2Vycy9wYi93d3cvd3AtY29udGVudC9wbHVnaW5zL215X3BsdWdpbiAobm8gdHJhaWxpbmcgc2xhc2gpCgkgKgkKCSAqCUByZXR1cm4JCXN0cmluZwkJUGx1Z2luIHBhdGggZGlyZWN0b3J5IChubyB0cmFpbGluZyBzbGFzaCkuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGx1Z2luX3BhdGgoKSB7CgkJcmV0dXJuIHNlbGY6OiRfcGx1Z2luX3BhdGg7Cgl9IC8vIEVuZCBwbHVnaW5fcGF0aCgpLgoJCgkKCQoJLyoJc2VsZjo6cGx1Z2luX3VybCgpCgkgKgkKCSAqCVJldHVybnMgVVJMIHRvIHBsdWdpbiBkaXJlY3RvcnkuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4vICh3aXRoIHRyYWlsaW5nIHNsYXNoKQoJICoJCgkgKglAcmV0dXJuCQlzdHJpbmcJCVBsdWdpbiBwYXRoIFVSTCAod2l0aCB0cmFpbGluZyBzbGFzaCkuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGx1Z2luX3VybCgpIHsKCQlyZXR1cm4gc2VsZjo6JF9wbHVnaW5fdXJsOwoJfSAvLyBFbmQgcGx1Z2luX3VybCgpLgoJCgkKCQoJLyoJc2VsZjo6cGFnZV91cmwoKQoJICoJCgkgKglSZXR1cm5zIFVSTCB0byB0aGUgY3VycmVudCBhZG1pbiBwYWdlIGlmIG9uIGEgcGx1Z2luIHBhZ2UuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWFkbWluL2luZGV4LnBocD9wYWdlPXBiX215cGx1Z2luCgkgKgkKCSAqCUByZXR1cm4JCXN0cmluZwkJUGx1Z2luIHBhZ2UgVVJMICh3aXRoIHRyYWlsaW5nIHNsYXNoKS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYWdlX3VybCgpIHsKCQlyZXR1cm4gc2VsZjo6JF9zZWxmX2xpbms7Cgl9IC8vIEVuZCBwYWdlX3VybCgpLgoJCgkKCQoJLyoJc2VsZjo6YWpheF91cmwoKQoJICoJCgkgKglSZXR1cm5zIHRoZSBhZG1pbi1zaWRlIEFKQVggVVJMLiBQcm9wZXJseSBoYW5kbGVzIHByZWZpeGluZyBhbmQgZXZlcnl0aGluZyBmb3IgUEIgZnJhbWV3b3JrLgoJICoJVG9kbzogcHJvdmlkZSBub24tYWRtaW4tc2lkZSBmdW5jdGlvbmFsaXR5PwoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHRhZwkJVGFnIC8gc2x1ZyBvZiBBSkFYLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlVUkwgZm9yIEFKQVguCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWpheF91cmwoICR0YWcgKSB7CgkJcmV0dXJuIGFkbWluX3VybCggJ2FkbWluLWFqYXgucGhwP2FjdGlvbj1wYl8nIC4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ19iYWNrdXBidWRkeSZmdW5jdGlvbj0nIC4gJHRhZyApOwoJfSAvLyBFbmQgYWpheF91cmwoKS4KCQoJCgkKCS8qCXNlbGY6OnNldHRpbmdzKCkKCSAqCQoJICoJUmV0cmlldmVzIG1pc2MgcGx1Z2luIHNldHRpbmdzIGJvdGggcGFzc2VkIGZyb20gdGhlIGluaXQgZmlsZSAoIGRlZmluZWQgaW4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSApIGludG8gc2VsZjo6JF9zZXR0aW5ncwoJICoJYW5kIGFsc28gcGx1Z2luIHNldHRpbmdzIGRlZmluZWQgaW4gdGhlIGluaXQgZmlsZSAoIGRlZmluZWQgaW4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSApIGhlYWRlciBpbmNsdWRpbmc6CgkgKgluYW1lLCB0aXRsZSwgZGVzY3JpcHRpb24sIGF1dGhvciwgYXV0aG9ydXJpLCB2ZXJzaW9uLCBwbHVnaW51cmkgT1IgdXJsLCB0ZXh0ZG9tYWluLCBkb21haW5wYXRoLCBuZXR3b3JrLgoJICoJQHNlZSBzZWxmOjppbml0KCkKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSR0eXBlCQlUeXBlIG9mIHNldHRpbmcgdG8gcmV0cmlldmUuCgkgKglAcmV0dXJuCQltaXhlZAkJCQkJVmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgc2V0dGluZ3MuIE51bGwgaWYgbm90IGZvdW5kLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldHRpbmdzKCAkdHlwZSApIHsKCQkvL2lmICggIXNlbGY6OmJsYW5rKCBAc2VsZjo6JF9zZXR0aW5nc1skdHlwZV0gKSApIHsgLy8gUmV0dXJuIHZhbHVlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgoJCWlmICggaXNzZXQoIHNlbGY6OiRfc2V0dGluZ3NbJHR5cGVdICkgKSB7CgkJCXJldHVybiBzZWxmOjokX3NldHRpbmdzWyR0eXBlXTsKCQl9CgkJCgkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSApIHsKCQkJaWYgKCAndmVyc2lvbicgPT0gJHR5cGUgKSB7CgkJCQlyZXR1cm4gUEJfQkJfVkVSU0lPTjsKCQkJfQoJCX0KCQkKCQkvLyBUaGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3Qgc28gY2hlY2sgdG8gc2VlIGlmIGl0IGNhbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgcGx1Z2luJ3MgaGVhZGVyLgoJCS8vaWYgKCBzZWxmOjpibGFuayggQHNlbGY6OiRfc2V0dGluZ3NbJ25hbWUnXSApICkgewoJCWlmICggIWlzc2V0KCBzZWxmOjokX3NldHRpbmdzWyduYW1lJ10gKSB8fCAoIHNlbGY6OiRfc2V0dGluZ3NbJ25hbWUnXSA9PSAnJyApICkgewoJCQlpZiAoICFmdW5jdGlvbl9leGlzdHMoICdnZXRfcGx1Z2luX2RhdGEnICkgKSB7CgkJCQlyZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9wbHVnaW4ucGhwJzsKCQkJfQoJCQkkaW5mbyA9IGFycmF5X2NoYW5nZV9rZXlfY2FzZSggZ2V0X3BsdWdpbl9kYXRhKCBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy8nIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSwgZmFsc2UsIGZhbHNlICksIENBU0VfTE9XRVIgKTsKCQkJJGluZm9bJ3VybCddID0gJGluZm9bJ3BsdWdpbnVyaSddOwoJCQl1bnNldCggJGluZm9bJ3BsdWdpbnVyaSddICk7CgkJCXNlbGY6OiRfc2V0dGluZ3MgPSBhcnJheV9tZXJnZSggc2VsZjo6JF9zZXR0aW5ncywgJGluZm8gKTsKCQl9CgoJCS8vIFRyeSB0byByZXR1cm4gc2V0dGluZyBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3IuCgkJaWYgKCBpc3NldCggc2VsZjo6JF9zZXR0aW5nc1skdHlwZV0gKSApIHsKCQkJcmV0dXJuIHNlbGY6OiRfc2V0dGluZ3NbJHR5cGVdOwoJCX0gZWxzZSB7CgkJCXJldHVybiAne1Vua25vd24gc2V0dGluZ3MoKSB2YXJpYWJsZSBgJyAuICR0eXBlIC4gJ2B9JzsKCQl9Cgl9IC8vIEVuZCBzZXR0aW5ncygpLgoJCgkKCQoJLyoJc2VsZjo6YmxhbmsoKQoJICoJCgkgKglSZXR1cm5zIHdoZXRoZXIgYSBub3QgYSB2YXJpYWJsZSBpcyBibGFuayAoZW1wdHkgc3RyaW5nLCBudWxsLCB1bmRlZmluZWQpIG9yIG5vdC4KCSAqCUJlIHN1cmUgdG8gc3VwcHJlc3MgZXJyb3JzIGlmIHVzaW5nIHRoaXMgZnVuY3Rpb24gd2hlcmUgaW5kZXhlcyBtYXkgYmUgbm9uLWV4aXN0YW50IHdpdGggQCBzaWduLgoJICoJCgkgKglAcGFyYW0JCW1peGVkCQlWYXJpYWJsZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYmxhbmsgb3Igbm90LgoJICoJQHJldHVybgkJYm9vbGVhbgkJVHJ1ZSBpZiB2YXJpYWJsZSBpcyBzZXQgYW5kIGlzIG5vdCBhbiBlbXB0eSBzdHJpbmcuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYmxhbmsoICR2YWx1ZSApIHsKCQlyZXR1cm4gZW1wdHkoICR2YWx1ZSApICYmICFpc19udW1lcmljKCAkdmFsdWUgKTsKCX0gLy8gRW5kIGJsYW5rKCkuCgkKCQoJCgkvKglzZWxmOjpfUE9TVCgpCgkgKgkKCSAqCVJldHVybnMgJF9QT1NUIHZhbHVlIGlmIGF2YWlsYWJsZSwgZWxzZSByZXR1cm5zIGEgYmxhbmsuIFByZXZlbnRzIGhhdmluZyB0byBjaGVjayBpc3NldCBmaXJzdC4gU3RyaXBzIFdQJ3MgYWRkZWQgc2xhc2hlcy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCUtleSBvZiBQT1NUIHZhcmlhYmxlIHRvIGNoZWNrLgoJICoJQHJldHVybgkJbWl4ZWQJCVZhbHVlIG9mIFBPU1QgdmFyaWFibGUgaWYgc2V0LiBJZiBub3Qgc2V0IHJldHVybnMgYSBibGFuayBzdHJpbmcgJycuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX1BPU1QoICR2YWx1ZSA9IG51bGwgKSB7CgkJaWYgKCAoICR2YWx1ZSA9PSAnJyApIHx8ICggbnVsbCA9PSAkdmFsdWUgKSApIHsgLy8gUmVxdWVzdGluZyAkX1BPU1QgdmFyaWFibGUuCgkJCWlmICggZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgKCBQQl9TVEFOREFMT05FID09PSB0cnVlICkgJiYgIWdldF9tYWdpY19xdW90ZXNfZ3BjKCkgKSB7IC8vIElmIGluIEltcG9ydEJ1ZGR5IG1vZGUgQU5EIG1hZ2ljIHF1b3RlcyBpcyBub3Qgb24sIGRvbnQgc3RyaXAuIFdQIGVzY2FwZXMgZm9yIHVzIGlmIG1hZ2ljIHF1b3RlcyBhcmUgb2ZmLgoJCQkJcmV0dXJuICRfUE9TVDsKCQkJfQoJCQlyZXR1cm4gc3RyaXBzbGFzaGVzX2RlZXAoICRfUE9TVCApOwoJCX0gZWxzZSB7CgkJCSRwb3N0VmFsdWUgPSAnJzsKCQkJaWYgKCBpc3NldCggJF9QT1NUWyR2YWx1ZV0gKSApIHsKCQkJCSRwb3N0VmFsdWUgPSAkX1BPU1RbJHZhbHVlXTsKCQkJfQoJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmICggUEJfU1RBTkRBTE9ORSA9PT0gdHJ1ZSApICYmICFnZXRfbWFnaWNfcXVvdGVzX2dwYygpICkgeyAvLyBJZiBpbiBJbXBvcnRCdWRkeSBtb2RlIEFORCBtYWdpYyBxdW90ZXMgaXMgbm90IG9uLCBkb250IHN0cmlwLiBXUCBlc2NhcGVzIGZvciB1cyBpZiBtYWdpYyBxdW90ZXMgYXJlIG9mZi4KCQkJCXJldHVybiAkcG9zdFZhbHVlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHN0cmlwc2xhc2hlc19kZWVwKCAkcG9zdFZhbHVlICk7IC8vIFJlbW92ZSBXb3JkUHJlc3MnIG1hZ2ljLXF1b3Rlcy1zdHlsZSBlc2NhcGluZyBvZiBkYXRhLgoJCQl9CgkJfQoJfSAvLyBFbmQgX1BPU1QoKS4KCQoJCgkKCS8qCXNlbGY6Ol9HRVQoKQoJICoJCgkgKglSZXR1cm5zICRfUE9TVCB2YWx1ZSBpZiBhdmFpbGFibGUsIGVsc2UgcmV0dXJucyBhIGJsYW5rLiBQcmV2ZW50cyBoYXZpbmcgdG8gY2hlY2sgaXNzZXQgZmlyc3QuCgkgKglUT0RPOiBEbyB3ZSBuZWVkIHRvIHN0cmlwc2xhc2hlc19kZWVwKCkgb24gR0VUIHZhcnMgYWxzbyBsaWtlIFBPU1RzPwoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJS2V5IG9mIFBPU1QgdmFyaWFibGUgdG8gY2hlY2suCgkgKglAcmV0dXJuCQltaXhlZAkJVmFsdWUgb2YgUE9TVCB2YXJpYWJsZSBpZiBzZXQuIElmIG5vdCBzZXQgcmV0dXJucyBhIGJsYW5rIHN0cmluZyAnJy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfR0VUKCAkdmFsdWUgPSAnJyApIHsKCQlpZiAoICggJHZhbHVlID09ICcnICkgfHwgKCBudWxsID09ICR2YWx1ZSApICkgeyAvLyBSZXF1ZXN0aW5nICRfR0VUIHZhcmlhYmxlLgoJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmICggUEJfU1RBTkRBTE9ORSA9PT0gdHJ1ZSApICYmICFnZXRfbWFnaWNfcXVvdGVzX2dwYygpICkgeyAvLyBJZiBpbiBJbXBvcnRCdWRkeSBtb2RlIEFORCBtYWdpYyBxdW90ZXMgaXMgbm90IG9uLCBkb250IHN0cmlwLiBXUCBlc2NhcGVzIGZvciB1cyBpZiBtYWdpYyBxdW90ZXMgYXJlIG9mZi4KCQkJCXJldHVybiAkX0dFVDsKCQkJfQoJCQlyZXR1cm4gc3RyaXBzbGFzaGVzX2RlZXAoICRfR0VUICk7CgkJfSBlbHNlIHsKCQkJJGdldFZhbHVlID0gJyc7CgkJCWlmICggaXNzZXQoICRfR0VUWyR2YWx1ZV0gKSApIHsKCQkJCSRnZXRWYWx1ZSA9ICRfR0VUWyR2YWx1ZV07CgkJCX0KCQkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSAmJiAhZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgLy8gSWYgaW4gSW1wb3J0QnVkZHkgbW9kZSBBTkQgbWFnaWMgcXVvdGVzIGlzIG5vdCBvbiwgZG9udCBzdHJpcC4gV1AgZXNjYXBlcyBmb3IgdXMgaWYgbWFnaWMgcXVvdGVzIGFyZSBvZmYuCgkJCQlyZXR1cm4gJGdldFZhbHVlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHN0cmlwc2xhc2hlc19kZWVwKCAkZ2V0VmFsdWUgKTsgLy8gUmVtb3ZlIFdvcmRQcmVzcycgbWFnaWMtcXVvdGVzLXN0eWxlIGVzY2FwaW5nIG9mIGRhdGEuCgkJCX0KCQl9Cgl9IC8vIEVuZCBfR0VUKCkuCgkKCQoJCgkvKglzZWxmOjpnZXRfZ3JvdXAoKQoJICoKCSAqCUdyYWJzICYgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHNwZWNpZmllZCBwb2ludCBpbiB0aGUgb3B0aW9ucyBhcnJheS4KCSAqCUV4IHVzYWdlOiAkZ3JvdXAgPSAmc2VsZjo6Z2V0X2dyb3VwKCAnZ3JvdXBzIycgLiAkX0dFVFsnZWRpdCddICk7CgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCSRzYXZlcG9pbnRfcm9vdAkJUGF0aCBpbiB0aGUgYXJyYXkgdG8gcmV0dXJuIGEgcmVmZXJlbmNlIHRvLgoJICoJCQkJCQkJCQkJCUV4OiBncm91cHMjNSB3aWxsIGdyYWIgc2VsZjo6JG9wdGlvbnNbJ2dyb3VwcyddWzVdCgkgKglAcmV0dXJuCQltaXhlZAkJCQkJCVZhbHVlIHdpdGhpbiB0aGUgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBwb2ludC4KCSAqCQkJCQkJCQkJCQlDYW4gYmUgdXNlZCBhcyBhIHJlZmVyZW5jZS4gU2VlIGV4YW1wbGUgaW4gZGVzY3JpcHRpb24uCgkgKgkJCQkJCQkJCQkJTk9URTogUmV0dXJucyBmYWxzZSBpZiBub3QgZm91bmQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gJmdldF9ncm91cCggJHNhdmVwb2ludF9yb290ICkgewoJCWlmICggJHNhdmVwb2ludF9yb290ID09ICcnICkgeyAvLyBSb290IHdhcyByZXF1ZXN0ZWQuCgkJCSRyZXR1cm4gPSAmc2VsZjo6JG9wdGlvbnM7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQkKCQkkc2F2ZXBvaW50X3N1YnNlY3Rpb24gPSAmc2VsZjo6JG9wdGlvbnM7CgkJJHNhdmVwb2ludF9sZXZlbHMgPSBleHBsb2RlKCAnIycsICRzYXZlcG9pbnRfcm9vdCApOwoJCWZvcmVhY2ggKCAkc2F2ZXBvaW50X2xldmVscyBhcyAkc2F2ZXBvaW50X2xldmVsICkgewoJCQlpZiAoIGlzc2V0KCAkc2F2ZXBvaW50X3N1YnNlY3Rpb257JHNhdmVwb2ludF9sZXZlbH0gKSApIHsKCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9ICYkc2F2ZXBvaW50X3N1YnNlY3Rpb257JHNhdmVwb2ludF9sZXZlbH07CgkJCX0gZWxzZSB7CgkJCQllY2hvICd7RXJyb3IgIzQ0ODkwNDU6IEludmFsaWQgYXJyYXkgaW4gcGF0aDogYCcgLiAkc2F2ZXBvaW50X3Jvb3QgLiAnYH0nOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJCQoJCXJldHVybiAkc2F2ZXBvaW50X3N1YnNlY3Rpb247Cgl9IC8vIEVuZCBnZXRfZ3JvdXAoKS4KCQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF9mcm9tX2JhY2t1cCgpIHsKCQkvL2Vycm9yX2xvZyggJ0JhY2t1cEJ1ZGR5IHNldHRpbmdzIG1pc3NpbmcvY29ycnVwdC4gQXR0ZW1wdGluZyB0byByZXN0b3JlIGZyb20gc2V0dGluZ3MgYmFja3VwIChpZiBleGlzdHMpLicgKTsKCQkkcmVzdG9yZV9mYWlsX21lc3NhZ2UgPSAnRXJyb3IgIzg0OTM4OTQzOiBZb3VyIEJhY2t1cEJ1ZGR5IFNldHRpbmdzIHdlcmUgZGV0ZWN0ZWQgYXMgbWlzc2luZyBvciBjb3JydXB0LiBCYWNrdXBCdWRkeSBoYXMgYXR0ZW1wdGVkIHRvIGxvYWQgQmFja3VwQnVkZHkgc2V0dGluZ3MgZnJvbSBpdHMgc2V0dGluZ3MgYmFja3VwIGZpbGUgYnV0IGZhaWxlZC4gVmVyaWZ5IHlvdXIgQmFja3VwQnVkZHkgc2V0dGluZ3MgYXJlIHN0aWxsIGludGFjdCBhbmQgdmFsaWQuIFRoaXMgY291bGQgaGF2ZSBiZWVuIGNhdXNlZCBieSBhIGRhdGFiYXNlIGVycm9yIG9yIGNvcnJ1cHRpb24uJzsKCQkkcmVzdG9yZV9zdWNjZXNzX21lc3NhZ2UgPSAnV2FybmluZyAjODk0Mzg0OiBZb3VyIEJhY2t1cEJ1ZGR5IFNldHRpbmdzIHdlcmUgZGV0ZWN0ZWQgYXMgbWlzc2luZyBvciBjb3JydXB0LiBCYWNrdXBCdWRkeSBoYXMgcmVzdG9yZWQgeW91ciBwcmV2aW91cyBCYWNrdXBCdWRkeSBzZXR0aW5ncyBmcm9tIGl0cyBzZXR0aW5ncyBiYWNrdXAgZmlsZS4gUGxlYXNlIHZlcmlmeSB5b3VyIHJlc3RvcmVkIEJhY2t1cEJ1ZGR5IHNldHRpbmdzIGxvb2sgb2theS4gVGhpcyBjb3VsZCBoYXZlIGJlZW4gY2F1c2VkIGJ5IGEgZGF0YWJhc2UgZXJyb3Igb3IgY29ycnVwdGlvbi4nOwoJCQoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvY29yZS5waHAnICk7CgkJJGJhY2t1cF9kaXIgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsKCQkkZXhpc3RpbmdfYmFja3VwcyA9IGdsb2IoICRiYWNrdXBfZGlyIC4gJ3NldHRpbmdzX2JhY2t1cC0qLnBocCcgKTsKCQlpZiAoICggISBpc19hcnJheSggJGV4aXN0aW5nX2JhY2t1cHMgKSApIHx8ICggY291bnQoICRleGlzdGluZ19iYWNrdXBzICkgPCAxICkgKSB7IC8vIE5vIGJhY2t1cHMgc28ganVzdCBsb2FkIGRlZmF1bHRzLiBNYXkgYmUgYSBuZXcgaW5zdGFsbC4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlpZiAoIGZhbHNlID09PSAoICRzZXR0aW5ncyA9IEBmaWxlX2dldF9jb250ZW50cyggJGV4aXN0aW5nX2JhY2t1cHNbMF0gKSApICkgewoJCQliYWNrdXBidWRkeV9jb3JlOjptYWlsX2Vycm9yKCAkcmVzdG9yZV9mYWlsX21lc3NhZ2UgLiAnIERldGFpbHM6IFVuYWJsZSB0byBvcGVuL3JlYWQgYmFja3VwIGZpbGUgdGhhdCB3YXMgZm91bmQuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIFNraXAgZmlyc3QgbGluZS4KCQkkc2Vjb25kX2xpbmVfcG9zID0gc3RycG9zKCAkc2V0dGluZ3MsICJcbiIgKSArIDE7CgkJJHNldHRpbmdzID0gc3Vic3RyKCAkc2V0dGluZ3MsICRzZWNvbmRfbGluZV9wb3MgKTsKCQkKCQkvLyBEZWNvZGUgYmFjayBpbnRvIGFuIGFycmF5LgoJCSRzZXR0aW5ncyA9IHVuc2VyaWFsaXplKCBiYXNlNjRfZGVjb2RlKCAkc2V0dGluZ3MgKSApOwoJCQoJCWlmICggaXNfYXJyYXkoICRzZXR0aW5ncyApICYmICggaXNzZXQoICRzZXR0aW5nc1snZGF0YV92ZXJzaW9uJ10gKSApICkgeyAvLyBHb29kIHJlc3RvcmUuCgkJCS8vZXJyb3JfbG9nKCAnQmFja3VwQnVkZHkgc2V0dGluZ3MgcmVzdG9yZWQuJyApOwoJCQlyZXR1cm4gJHNldHRpbmdzOwoJCX0gZWxzZSB7IC8vIFJlc3RvcmUgZmFpbGVkLiBCYWQgZGF0YSEKCQkJZXJyb3JfbG9nKCAnQmFja3VwQnVkZHkgc2V0dGluZ3MgZmFpbGVkIHJlc3RvcmUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCQoJfSAvLyBFbmQgbG9hZF9mcm9tX2JhY2t1cCgpLgoJCgkKCS8qCXNlbGY6OmxvYWQoKQoJICoJCgkgKglMb2FkcyB0aGUgcGx1Z2luIG9wdGlvbnMgYXJyYXkgY29udGFpbmluZyBhbGwgdXNlci1jb25maWd1cmFibGUgb3B0aW9ucywgZXRjLgoJICoJQWNjZXNzIG9wdGlvbnMgdmlhIHNlbGY6OiRvcHRpb25zLiBCeXBhc3NlcyBXUCBvcHRpb25zIGNhY2hpbmcgZm9yIHJlbGlhYmlsaXR5LgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZCggJHJldHJ5X2RiID0gdHJ1ZSApIHsKCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7IC8vIFN0YW5kYWxvbmUgZnJhbWV3b3JrIG1vZGUgKG91dHNpZGUgV29yZFByZXNzKS4KCQkJLy8gTG9hZCBvcHRpb25zIGZyb20gZmlsZSBpZiBpdCBleGlzdHMuCgkJCSRkYXRfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvX3NldHRpbmdzX2RhdC5waHAnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkZGF0X2ZpbGUgKSApIHsKCQkJCSRvcHRpb25zID0gZmlsZV9nZXRfY29udGVudHMoICRkYXRfZmlsZSApOwoJCQkJCgkJCQkvLyBVbnNlcmlhbGl6ZSBkYXRhOyBJZiBpdCBmYWlscyBpdCB0aGVuIGRlY29kZXMgdGhlIG9ic2N1ZmF0ZWQgZGF0YSB0aGVuIHVuc2VyaWFsaXplcyBpdC4gKG5ldyBkYXQgZmlsZSBtZXRob2Qgc3RhcnRpbmcgYXQgMi4wKS4KCQkJCWlmICggIWlzX3NlcmlhbGl6ZWQoICRvcHRpb25zICkgfHwgKCBmYWxzZSA9PT0gKCAkcmV0dXJuID0gdW5zZXJpYWxpemUoICRvcHRpb25zICkgKSApICkgewoJCQkJCS8vIFNraXAgZmlyc3QgbGluZS4KCQkJCQkkc2Vjb25kX2xpbmVfcG9zID0gc3RycG9zKCAkb3B0aW9ucywgIlxuIiApICsgMTsKCQkJCQkkb3B0aW9ucyA9IHN1YnN0ciggJG9wdGlvbnMsICRzZWNvbmRfbGluZV9wb3MgKTsKCQkJCQkKCQkJCQkvLyBEZWNvZGUgYmFjayBpbnRvIGFuIGFycmF5LgoJCQkJCSRvcHRpb25zID0gdW5zZXJpYWxpemUoIGJhc2U2NF9kZWNvZGUoICRvcHRpb25zICkgKTsKCQkJCX0KCQkJfSBlbHNlIHsgLy8gTm8gZXhpc3Rpbmcgb3B0aW9ucy4gRW1wdHkgb3B0aW9ucy4KCQkJCSRvcHRpb25zID0gYXJyYXkoKTsKCQkJfQoJCQkKCQkJLy8gTWVyZ2UgZGVmYXVsdHMuCgkJCSRvcHRpb25zID0gYXJyYXlfbWVyZ2UoIChhcnJheSlzZWxmOjpzZXR0aW5ncyggJ2RlZmF1bHRfb3B0aW9ucycgKSwgJG9wdGlvbnMgKTsKCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyA9ICRvcHRpb25zOwoJCX0gZWxzZSB7IC8vIE5vcm1hbCBCQiBpbiBXb3JkUHJlc3MuCgkJCQoJCQlzZWxmOjokb3B0aW9ucyA9IHNlbGY6Ol9nZXRfb3B0aW9uKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSApOwoJCQkvL3NlbGY6OiRvcHRpb25zID0gJyc7IC8vIFRlc3QgZGFtYWdlZCBvcHRpb25zLgoJCQkKCQl9CgkJCgkJLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0ZW1wb3JhcnkgJG9wdGlvbnMgdmFyaWFibGUgYW5kIHNhdmUgaWYgaXQgZGlmZmVycyB3aXRoIHRoZSBwcmUtbWVyZ2Ugb3B0aW9ucy4gT25seSByZXRyaWVzIHRoaXMgb25jZS4KCQlpZiAoICggZW1wdHkoIHNlbGY6OiRvcHRpb25zICkgfHwgKCAhIGlzc2V0KCBzZWxmOjokb3B0aW9uc1snZGF0YV92ZXJzaW9uJ10gKSApICkgJiYgKCB0cnVlID09PSAkcmV0cnlfZGIgKSApIHsgLy8gSWYgZW1wdHkgb3B0aW9ucyBvciBjb3JydXB0LgoJCQlnbG9iYWwgJHdwZGI7CgkJCS8vIElmIHRoZSBkYXRhYmFzZSBnb2VzIGF3YXkgaW4gdGhlIG1pZGRsZSBvZiBhIHF1ZXJ5LCB3YWl0IDUgc2Vjb25kcyBhbmQgdHJ5IGFnYWluLiBPdGhlcndpc2UsIHdlIHVuaW50ZW50aW9uYWxseSBvdmVyd3JpdGUgdGhlIHNldHRpbmdzLgoJCQlpZiAoICEgZW1wdHkoICR3cGRiLT5sYXN0X2Vycm9yICkgJiYgKCBGQUxTRSAhPT0gc3RycG9zKCAkd3BkYi0+bGFzdF9lcnJvciwgIlNFTEVDVCBvcHRpb25fdmFsdWUgRlJPTSBgJHdwZGItPm9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lID0gJ3BiX2JhY2t1cGJ1ZGR5JyIgKSApICkgewoJCQkJc2xlZXAoIDUgKTsKCQkJCXNlbGY6OmxvYWQoICRyZXRyeV9kYiA9IGZhbHNlICk7CgkJCQlyZXR1cm47CgkJCX0gZWxzZSB7IC8vIE1pc3Npbmcgb3IgY29ycnVwdCBvcHRpb25zIHdoZW4gbG9hZGluZy4gRWl0aGVyIGEgbmV3IGluc3RhbGwgb3Igc2V0dGluZ3Mgd2VudCBtaXNzaW5nLgoJCQkJCgkJCQkvLyBDaGVjayBmb3IgYSBzZXR0aW5ncyBiYWNrdXAgYW5kIHRyeSB0byBsb2FkIGl0IGlmIHdlcmUgbm90IGluIGEgc3RhbmRhbG9uZSBzY3JpcHQKCQkJCWlmICggISBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSB8fCBQQl9TVEFOREFMT05FID09PSBmYWxzZSApIHsKCQkJCQlpZiAoIGZhbHNlICE9PSAoICRyZXN0b3JlZF9zZXR0aW5ncyA9IHNlbGY6OmxvYWRfZnJvbV9iYWNrdXAoKSApICkgewoJCQkJCQkkb3B0aW9ucyA9ICRyZXN0b3JlZF9zZXR0aW5nczsKCQkJCQl9IGVsc2UgeyAvLyBMb2FkIGRlZmF1bHRzLgoJCQkJCQkkb3B0aW9ucyA9IChhcnJheSlzZWxmOjpzZXR0aW5ncyggJ2RlZmF1bHRfb3B0aW9ucycgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgeyAvLyBOb3JtYWwgbWVyZ2UuCgkJCSRkZWZhdWx0cyA9IChhcnJheSlzZWxmOjpzZXR0aW5ncyggJ2RlZmF1bHRfb3B0aW9ucycgKTsKCgkJCS8vIEFwcGx5IGRlZmF1bHRzLgoJCQkkb3B0aW9ucyA9IGFycmF5X21lcmdlKCAkZGVmYXVsdHMsIChhcnJheSlzZWxmOjokb3B0aW9ucyApOwoJCQkvL3NlbGY6OiRvcHRpb25zWydwcm9maWxlcyddID0gYXJyYXkoKTsgLy8gUmVzZXQgcHJvZmlsZXMuCgoJCQkvLyBBcHBseSBkZWZhdWx0IHByb2ZpbGVzLgoJCQkkb3B0aW9uc1sncHJvZmlsZXMnXSA9IChhcnJheSlzZWxmOjokb3B0aW9uc1sncHJvZmlsZXMnXSArICRkZWZhdWx0c1sncHJvZmlsZXMnXTsgLy8gTWVyZ2UgYXJyYXlzIG9uIG51bWVyaWMgaW5kaWNlcy4gTGVmdCBzaWRlIGlzIHByZXNlcnZlZCAob3Bwb3NpdGUgb2YgYXJyYXlfbWVyZ2UoKSkuCgkJfQoJCWlmICggc2VsZjo6JG9wdGlvbnMgIT09ICRvcHRpb25zICkgewoJCQlzZWxmOjokb3B0aW9ucyA9ICRvcHRpb25zOwoJCQlzZWxmOjpzYXZlKCk7CgkJfQoJfSAvLyBFbmQgbG9hZCgpLgoJCgkKCQoJLyoJc2VsZjo6X2dldF9vcHRpb24oKQoJICoJCgkgKglCeXBhc3NlcyBXb3JkUHJlc3Mgb3B0aW9ucyBjYWNoZS4gVW5mb3J0dW5hdGVseSB0aGVyZSBhcHBlYXJzIHRvIGJlIHJhY2UgY29uZGl0aW9uIGlzc3VlcyB3aXRoIHRoZSBidWlsdC1pbiBXUCBvcHRpb25zIHN5c3RlbS4KCSAqCVVzZWQgYnkgbG9hZCgpIGZ1bmN0aW9uIGludGVybmFsbHkuIFRha2VuIGFuZCBtb2RpZmllZCBmcm9tIFdvcmRQcmVzcyBjb3JlLgoJICoJQHNlZSBsb2FkKCkKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRvcHRpb24JCU9wdGlvbiBuYW1lLgoJICoJQHBhcmFtCQltaXhlZAkJJGRlZmF1bHQJZGVmYXVsdCA9IGZhbHNlOyB3ZSBkbyBub3QgdXNlIHRoaXMuCgkgKglAcmV0dXJuCQltaXhlZAkJCQkJU2F2ZWQgb3B0aW9uIHZhbHVlLgoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZ2V0X29wdGlvbiggJG9wdGlvbiwgJGRlZmF1bHQgPSBmYWxzZSApIHsKCQlnbG9iYWwgJHdwZGI7CgoJCSRvcHRpb24gPSB0cmltKCRvcHRpb24pOwoJCWlmICggZW1wdHkoJG9wdGlvbikgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCWlmICggZGVmaW5lZCggJ1dQX1NFVFVQX0NPTkZJRycgKSApCgkJCXJldHVybiBmYWxzZTsKCgkJJGJhc2VfcHJlZml4ID0gJHdwZGItPmJhc2VfcHJlZml4OwoJCSRyb3cgPSAkd3BkYi0+Z2V0X3JvdyggJHdwZGItPnByZXBhcmUoICJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00geyRiYXNlX3ByZWZpeH1vcHRpb25zIFdIRVJFIG9wdGlvbl9uYW1lID0gJXMgTElNSVQgMSIsICRvcHRpb24gKSApOwoKCQkvLyBIYXMgdG8gYmUgZ2V0X3JvdyBpbnN0ZWFkIG9mIGdldF92YXIgYmVjYXVzZSBvZiBmdW5raW5lc3Mgd2l0aCAwLCBmYWxzZSwgbnVsbCB2YWx1ZXMKCQlpZiAoIGlzX29iamVjdCggJHJvdyApICkgewoJCQkkdmFsdWUgPSAkcm93LT5vcHRpb25fdmFsdWU7CgkJfSBlbHNlIHsKCQkJJHZhbHVlID0gJGRlZmF1bHQ7CgkJfQoKCQkvLyBJZiBob21lIGlzIG5vdCBzZXQgdXNlIHNpdGV1cmwuCgkJaWYgKCAnaG9tZScgPT0gJG9wdGlvbiAmJiAnJyA9PSAkdmFsdWUgKQoJCQlyZXR1cm4gZ2V0X29wdGlvbiggJ3NpdGV1cmwnICk7CgoJCWlmICggaW5fYXJyYXkoICRvcHRpb24sIGFycmF5KCdzaXRldXJsJywgJ2hvbWUnLCAnY2F0ZWdvcnlfYmFzZScsICd0YWdfYmFzZScpICkgKQoJCQkkdmFsdWUgPSB1bnRyYWlsaW5nc2xhc2hpdCggJHZhbHVlICk7CgoJCSR2YWx1ZSA9IG1heWJlX3Vuc2VyaWFsaXplKCAkdmFsdWUgKTsKCgkJcmV0dXJuICR2YWx1ZTsKCX0gLy8gRW5kIGdldF9vcHRpb24oKS4KCQoJCgkKCS8qCXNlbGY6OnNhdmUoKQoJICoJCgkgKglTYXZlIHBsdWdpbiBvcHRpb25zIHRvIGRhdGFiYXNlLgoJICoJCgkgKglAcmV0dXJuCQlib29sZWFuCQkJVHJ1ZSBpZiBzYXZlIHN1Y2NlZWRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhdmUoKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiBQQl9TVEFOREFMT05FID09PSB0cnVlICkgewoJCQkkb3B0aW9uc19jb250ZW50ID0gYmFzZTY0X2VuY29kZSggc2VyaWFsaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgKSApOwoJCQkkcmVzdWx0ID0gZmlsZV9wdXRfY29udGVudHMoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvX3NldHRpbmdzX2RhdC5waHAnLCAiPD9waHAgZGllKCc8IS0tIC8vIFNpbGVuY2UgaXMgZ29sZGVuLiAtLT4nKTsgPz5cbiIgLiAkb3B0aW9uc19jb250ZW50ICk7CgkJCWlmICggJHJlc3VsdCA9PT0gZmFsc2UgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQoJCWFkZF9zaXRlX29wdGlvbiggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICksIHNlbGY6OiRvcHRpb25zLCAnJywgJ25vJyk7IC8vICdObycgcHJldmVudHMgYXV0b2xvYWQgaWYgd2Ugd29udCBhbHdheXMgbmVlZCB0aGUgZGF0YSBsb2FkZWQuCgkJcmV0dXJuIHNlbGY6Ol91cGRhdGVfb3B0aW9uKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSwgc2VsZjo6JG9wdGlvbnMgKTsKCX0gLy8gRW5kIHNhdmUoKS4KCQoJCgkKCS8qCXNlbGY6Ol91cGRhdGVfb3B0aW9uKCkKCSAqCQoJICoJQnlwYXNzZXMgV29yZFByZXNzIGJ1aWx0IGluIHVwZGF0ZSBvcHRpb24gY2FjaGUuIFRha2VuIGZyb20gV29yZFByZXNzIGNvcmUgYW5kIG1vZGlmaWVkLgoJICoJQHNlZSBzZWxmOjpfZ2V0X29wdGlvbigpCgkgKglAc2VlIHNlbGY6OnNhdmUoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkkb3B0aW9uCQkJT3B0aW9uIG5hbWUuCgkgKglAcGFyYW0JCW1peGVkCSRuZXd2YWx1ZQkJTmV3IHZhbHVlIHRvIHNhdmUgaW50byBvcHRpb24uCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQlUcnVlIG9uIHN1Y2Nlc3M7IGZhbHNlIG90aGVyd2lzZS4KCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3VwZGF0ZV9vcHRpb24oICRvcHRpb24sICRuZXd2YWx1ZSApIHsKCQlnbG9iYWwgJHdwZGI7CgoJCSRvcHRpb24gPSB0cmltKCRvcHRpb24pOwoJCWlmICggZW1wdHkoJG9wdGlvbikgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCSRvbGR2YWx1ZSA9IGdldF9vcHRpb24oICRvcHRpb24gKTsKCQlpZiAoIGZhbHNlID09PSAkb2xkdmFsdWUgKSB7CgkJCXJldHVybiBhZGRfb3B0aW9uKCAkb3B0aW9uLCAkbmV3dmFsdWUgKTsKCQl9IGVsc2UgewoJCQkkbmV3dmFsdWUgPSBzYW5pdGl6ZV9vcHRpb24oICRvcHRpb24sICRuZXd2YWx1ZSApOwoJCQkkbmV3dmFsdWUgPSBtYXliZV9zZXJpYWxpemUoICRuZXd2YWx1ZSApOwoJCQkkcmVzdWx0ID0gJHdwZGItPnVwZGF0ZSggJHdwZGItPm9wdGlvbnMsIGFycmF5KCAnb3B0aW9uX3ZhbHVlJyA9PiAkbmV3dmFsdWUgKSwgYXJyYXkoICdvcHRpb25fbmFtZScgPT4gJG9wdGlvbiApICk7CgkJCQoJCQlpZiAoICRyZXN1bHQgKSByZXR1cm4gdHJ1ZTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0gLy8gRW5kIF91cGRhdGVfb3B0aW9uKCkuCgkKCQoJCgkvKioKCSAqCWFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCkKCSAqCgkgKglIZWxwcyBzZWN1cml0eSBieSBhdHRlbXB0aW5nIHRvIGJsb2NrIGRpcmVjdG9yeSBicm93c2luZyBieSBjcmVhdGluZwoJICoJYm90aCBpbmRleC5odG0gZmlsZXMgYW5kIC5odGFjY2VzcyBmaWxlcyB0dXJuaW5nIGJyb3dzaW5nIG9mZi4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJGRpcmVjdG9yeQkJRnVsbCBhYnNvbHV0ZSBwYXNzIHRvIGluc2VydCBhbnRpLWRpcmVjdG9yeS1icm93c2luZyBmaWxlcyBpbnRvLiBObyB0cmFpbGluZyBzbGFzaC4KCSAqCUBwYXJhbQkJYm9vbAkJJGRlbnlfYWxsCQlXaGVuIHRydWUgYWxzbyBlbmZvcmNlIGRlbnlpbmcgQUxMIHdlYi1iYXNlZCBhY2Nlc3MgdG8gZGlyZWN0b3J5LiBkZWZhdWx0IGZhbHNlCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQkJVHJ1ZSBvbiBzdWNjZXNzIHNlY3VyaW5nIGRpcmVjdG9yeSwgZmFsc2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkZGlyZWN0b3J5ID0gJycsICRkaWVfb25fZmFpbCA9IHRydWUsICRkZW55X2FsbCA9IGZhbHNlLCAkc3VwcHJlc3NfYWxlcnQgPSBmYWxzZSApIHsKCQkKCQkvLyBDaGVjayBkaXJlY3RvcnkgZXhpc3RzICYgY3JlYXRlIGlmIGl0IGRvZXNuJ3QuCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGlyZWN0b3J5ICkgKSB7CgkJCWlmICggc2VsZjo6JGZpbGVzeXN0ZW0tPm1rZGlyKCAkZGlyZWN0b3J5LCAkbW9kZSA9IDA3NTUsICRyZWN1cnNlID0gdHJ1ZSApID09PSBmYWxzZSApIHsKCQkJCSRlcnJvciA9ICdFcnJvciAjOTAwMjogQmFja3VwQnVkZHkgdW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgYCcgLiAkZGlyZWN0b3J5IC4gJ2AuIFBsZWFzZSB2ZXJpZnkgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGAnIC4gZGlybmFtZSggJGRpcmVjdG9yeSApIC4gJ2Agb3IgbWFudWFsbHkgY3JlYXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5ICYgc2V0IHBlcm1pc3Npb25zLic7CgkJCQlpZiAoICRzdXBwcmVzc19hbGVydCAhPT0gdHJ1ZSApIHsKCQkJCQlzZWxmOjphbGVydCggJGVycm9yLCB0cnVlLCAnOTAwMicgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJCX0KCQkJCWlmICggJGRpZV9vbl9mYWlsID09PSB0cnVlICkgewoJCQkJCWRpZSggJGVycm9yICk7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJCgkJLy8gQ2hlY2sgd3JpdGFibGUuCgkJaWYgKCAhIGlzX3dyaXRhYmxlKCAkZGlyZWN0b3J5ICkgKSB7CgkJCSRlcnJvciA9ICdFcnJvciAjOTAwMmQ6IEJhY2t1cEJ1ZGR5IGRpcmVjdG9yeSBgJyAuICRkaXJlY3RvcnkgLiAnYCBpcyBpbmRpY2F0ZWQgYXMgTk9UIGJlaW5nIHdyaXRhYmxlLiBQbGVhc2UgdmVyaWZ5IHdyaXRlIHBlcm1pc3Npb25zIGZvciBpdCBhbmQgcGFyZW50IGRpcmVjdG9yaWVzIGFzIGFwcGxpY2FibGUuJzsKCQkJaWYgKCAkc3VwcHJlc3NfYWxlcnQgIT09IHRydWUgKSB7CgkJCQlzZWxmOjphbGVydCggJGVycm9yLCB0cnVlLCAnOTAwMicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQl9CgkJCWlmICggJGRpZV9vbl9mYWlsID09PSB0cnVlICkgewoJCQkJZGllKCAkZXJyb3IgKTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIC5odGFjY2VzcyBjb250ZW50cyBmb3IgZGVueWluZy4KCQlpZiAoIHRydWUgPT09ICRkZW55X2FsbCApIHsKCQkJJGRlbnlfYWxsID0gIlxuZGVueSBmcm9tIGFsbCI7CgkJfSBlbHNlIHsKCQkJJGRlbnlfYWxsID0gJyc7CgkJfQoJCQoJCQoJCSRlcnJvciA9ICcnOwoJCQoJCS8vIGluZGV4LnBocAoJCWlmICggISBmaWxlX2V4aXN0cyggJGRpcmVjdG9yeSAuICcvaW5kZXgucGhwJyApICkgewoJCQlpZiAoIGZhbHNlID09PSBAZmlsZV9wdXRfY29udGVudHMoICRkaXJlY3RvcnkgLiAnL2luZGV4LnBocCcsICc8aHRtbD48L2h0bWw+JyApICkgewoJCQkJJGVycm9yIC49ICdVbmFibGUgdG8gd3JpdGUgaW5kZXgucGhwIGZpbGUuICc7CgkJCX0KCQl9CgkJCgkJLy8gaW5kZXguaHRtCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGlyZWN0b3J5IC4gJy9pbmRleC5odG0nICkgKSB7CgkJCWlmICggZmFsc2UgPT09IEBmaWxlX3B1dF9jb250ZW50cyggJGRpcmVjdG9yeSAuICcvaW5kZXguaHRtJywgJzxodG1sPjwvaHRtbD4nICkgKSB7CgkJCQkkZXJyb3IgLj0gJ1VuYWJsZSB0byB3cml0ZSBpbmRleC5odG0gZmlsZS4gJzsKCQkJfQoJCX0KCQkKCQkvLyBpbmRleC5odG1sCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGlyZWN0b3J5IC4gJy9pbmRleC5odG1sJyApICkgewoJCQlpZiAoIGZhbHNlID09PSBAZmlsZV9wdXRfY29udGVudHMoICRkaXJlY3RvcnkgLiAnL2luZGV4Lmh0bWwnLCAnPGh0bWw+PC9odG1sPicgKSApIHsKCQkJCSRlcnJvciAuPSAnVW5hYmxlIHRvIHdyaXRlIGluZGV4Lmh0bWwgZmlsZS4gJzsKCQkJfQoJCX0KCQkKCQkvLyAuaHRhY2Nlc3MgaWYgd2UgYXJlbid0IGluIHRoZSBpbXBvcnRidWRkeSBzY3JpcHQKCQlpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgLiAnLy5odGFjY2VzcycgKSApIHsKCQkJaWYgKCBmYWxzZSA9PT0gQGZpbGVfcHV0X2NvbnRlbnRzKCAkZGlyZWN0b3J5IC4gJy8uaHRhY2Nlc3MnLCAnT3B0aW9ucyAtSW5kZXhlcycgLiAkZGVueV9hbGwgKSApIHsKCQkJCSRlcnJvciAuPSAnVW5hYmxlIHRvIHdyaXRlIC5odGFjY2VzcyBmaWxlLiAnOwoJCQl9CgkJfQoJCQoJCWlmICggJGVycm9yICE9ICcnICkgeyAvLyBGYWlsdXJlLgoJCQlpZiAoIHRydWUgIT09ICRzdXBwcmVzc19hbGVydCApIHsKCQkJCSRlcnJvciA9ICdFcnJvciBjcmVhdGluZyBhbnRpIGRpcmVjdG9yeSBicm93c2luZyBzZWN1cml0eSBmaWxlcyBpbiBkaXJlY3RvcnkgYCcgLiAkZGlyZWN0b3J5IC4gJ2AuIFBsZWFzZSB2ZXJpZnkgdGhpcyBkaXJlY3RvcnlcJ3MgcGVybWlzc2lvbnMgYWxsb3cgd3JpdGluZyAmIHJlYWRpbmcuIEVycm9yczogYCcgLiAkZXJyb3IgLiAnYC4nOwoJCQkJc2VsZjo6YWxlcnQoICRlcnJvciApOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yICk7CgkJCX0KCQkJaWYgKCAkZGllX29uX2ZhaWwgPT09IHRydWUgKSB7CgkJCQlkaWUoICdTY3JpcHQgaGFsdGVkIGZvciBzZWN1cml0eS4gUGxlYXNlIHZlcmlmeSBwZXJtaXNzaW9ucyBhbmQgdHJ5IGFnYWluLicgKTsKCQkJfQoJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCXJldHVybiB0cnVlOwoJCX0KCX0gLy8gRW5kIGFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCkuCgkKCQoJCgkvKglzZXRfc3RhdHVzX3NlcmlhbCgpCgkgKgkKCSAqCURlZmluZSBhIGRlZmF1bHQgc2VyaWFsIGZvciBhbGwgc3Vic2VxdWVudCBzdGF0dXMoKSBjYWxscy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzZXJpYWwJCVVuaXF1ZSBpZGVudGlmaWVyIHRvIHVzZSBhcyBkZWZhdWx0IHNlcmlhbC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRfc3RhdHVzX3NlcmlhbCggJHNlcmlhbCApIHsKCQkKCQlzZWxmOjokX3N0YXR1c19zZXJpYWwgPSAkc2VyaWFsOwoJCQoJCXJldHVybjsKCQkKCX0gLy8gRW5kIHNldF9zdGF0dXNfc2VyaWFsKCkuCgkKCQoJCgkvKglhZGRfc3RhdHVzX3NlcmlhbCgpCgkgKgkKCSAqCUFkZCBhIHNlcmlhbCBmb3IgYWxsIHN1YnNlcXVlbnQgc3RhdHVzKCkgY2FsbHMgdG8gbG9nIHRvIGluIGFkZGl0aW9uIHRvIGFueSBjdXJyZW50bHkgbG9nZ2luZyBzZXJpYWxzLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlcmlhbAkJVW5pcXVlIGlkZW50aWZpZXIgdG8gYWRkIHRvIHNlcmlhbHMgdG8gbG9nIHRvLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9zdGF0dXNfc2VyaWFsKCAkc2VyaWFsICkgewoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0FkZGluZyBzdGF0dXMgc2VyaWFsIGAnIC4gJHNlcmlhbCAuICdgLicgKTsKCQlpZiAoIGlzX2FycmF5KCBzZWxmOjokX3N0YXR1c19zZXJpYWwgKSApIHsKCQkJc2VsZjo6JF9zdGF0dXNfc2VyaWFsW10gPSAkc2VyaWFsOwoJCX0gZWxzZSB7CgkJCXNlbGY6OiRfc3RhdHVzX3NlcmlhbCA9IGFycmF5KCBzZWxmOjokX3N0YXR1c19zZXJpYWwsICRzZXJpYWwgKTsKCQl9CgkJCgkJcmV0dXJuOwoJCQoJfSAvLyBFbmQgYWRkX3N0YXR1c19zZXJpYWwoKS4KCQoJCgkKCS8qCXJlbW92ZV9zdGF0dXNfc2VyaWFsKCkKCSAqCQoJICoJUmVtb3ZlIGEgc2VyaWFsIGZvciBhbGwgc3Vic2VxdWVudCBzdGF0dXMoKSBjYWxscyB0byBsb2cgdG8gaW4gYWRkaXRpb24gdG8gYW55IGN1cnJlbnRseSBsb2dnaW5nIHNlcmlhbHMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2VyaWFsCQlVbmlxdWUgaWRlbnRpZmllciB0byByZW1vdmUgZnJvbSBzZXJpYWxzIHRvIGxvZyB0by4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW1vdmVfc3RhdHVzX3NlcmlhbCggJHNlcmlhbCApIHsKCQkKCQlpZiAoIGlzX2FycmF5KCBzZWxmOjokX3N0YXR1c19zZXJpYWwgKSApIHsgLy8gYXJyYXkKCQkJZm9yZWFjaCggc2VsZjo6JF9zdGF0dXNfc2VyaWFsIGFzICRpID0+ICR0aGlzX3NlcmlhbCApIHsKCQkJCWlmICggJHRoaXNfc2VyaWFsID09ICRzZXJpYWwgKSB7CgkJCQkJdW5zZXQoIHNlbGY6OiRfc3RhdHVzX3NlcmlhbFskaV0gKTsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCQl9IGVsc2UgeyAvLyBzdHJpbmcKCQkJaWYgKCBzZWxmOjokX3N0YXR1c19zZXJpYWwgPT0gJHNlcmlhbCApIHsKCQkJCXNlbGY6OiRfc3RhdHVzX3NlcmlhbCA9PSAnJzsKCQkJfQoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW1vdmVkIHN0YXR1cyBzZXJpYWwgYCcgLiAkc2VyaWFsIC4gJ2AuJyApOwoJCQoJCXJldHVybjsKCQkKCX0gLy8gRW5kIHJlbW92ZV9zdGF0dXNfc2VyaWFsKCkuCgkKCQoJCgkvKglnZXRfc3RhdHVzX3NlcmlhbCgpCgkgKgkKCSAqCUdldCBjdXJyZW50IHNlcmlhbCBzdGF0dXMgbG9ncyBhcmUgZ29pbmcgdG8uCgkgKgkKCSAqCUByZXR1cm4JCXN0cmluZwkJJHNlcmlhbAkJQ3VycmVudCBzZXJpYWwgc2V0LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zdGF0dXNfc2VyaWFsKCkgewoJCQoJCXJldHVybiBzZWxmOjokX3N0YXR1c19zZXJpYWw7CgkJCgl9IC8vIEVuZCBnZXRfc3RhdHVzX3NlcmlhbCgpLgoJCgkKCQoJLyoqCgkgKglzZWxmOjpzdGF0dXMoKQoJICoKCSAqCUxvZ3MgZGF0YSB0byBhIENTViBmaWxlLiBPcHRpb25hbCB1bmlxdWUgc2VyaWFsIGlkZW50aWZpZXIuCgkgKglJZiBhIHNlcmlhbCBpcyBwYXNzZWQgdGhlbiBFVkVSWVRISU5HIHdpbGwgYmUgbG9nZ2VkIHRvIHRoZSBzcGVjaWZpZWQgc2VyaWFsIGZpbGUgaW4gYWRkaXRpb24gdG8gd2hhdGV2ZXIgKGlmIGFueXRoaW5nKSBpcyBsb2dnZWQgdG8gbWFpbiBzdGF0dXMgZmlsZS4KCSAqCUFsd2F5cyBsb2dzIHRvIG1haW4gc3RhdHVzIGZpbGUgYmFzZWQgb24gbG9nZ2luZyBzZXR0aW5ncyB3aGV0aGVyIHNlcmlhbCBpcyBwYXNzZWQgb3Igbm90LgoJICoJTk9URTogV2hlbiBmdWxsIGxvZ2dpbmcgaXMgb24gQU5EIGEgc2VyaWFsIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB3cml0dGVuIHRvIGEgX3N1bV8gdGV4dCBmaWxlIGluc3RlYWQgb2YgdGhlIG1haW4gbG9nIGZpbGUuCgkgKgoJICoJQHNlZSBzZWxmOjpnZXRfc3RhdHVzKCkuCgkgKgoJICoJQHBhcmFtCXN0cmluZwkJCSR0eXBlCQlWYWxpZCB0eXBlczogZXJyb3IsIHdhcm5pbmcsIGRldGFpbHMsIG1lc3NhZ2UKCSAqCUBwYXJhbQlzdHJpbmcJCQkkdGV4dAkJVGV4dCBtZXNzYWdlIHRvIGxvZy4KCSAqCUBwYXJhbQlzdHJpbmcJCQkkc2VyaWFsCQlPcHRpb25hbC4gT3B0aW9uYWwgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcGx1Z2luJ3MgbWVzc2FnZS4gU3RhdHVzIG1lc3NhZ2VzIGFyZSB1bmlxdWUgcGVyIHBsdWdpbiBzbyB0aGlzIGFkZHMgYW4gYWRkaXRpb25hbCB1bmlxdWUgbGF5ZXIgZm9yIHJldHJpZXZhbC4KCSAqCQkJCQkJCQkJCUlmIHNlbGY6OiRfc3RhdHVzX3NlcmlhbCBoYXMgYmVlbiBzZXQgYnkgc2V0X3N0YXR1c19zZXJpYWwoKSB0aGVuIGl0IHdpbGwgb3ZlcnJpZGUgaWYgJHNlcmlhbCBpcyBibGFuay4KCSAqCUByZXR1cm4JbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0YXR1cyggJHR5cGUsICRtZXNzYWdlLCAkc2VyaWFscyA9ICcnLCAkanNfbW9kZSA9IGZhbHNlLCAkZWNob05vdFdyaXRlID0gZmFsc2UgKSB7CgkJCgkJaWYgKCAhIGNsYXNzX2V4aXN0cyggJ2JhY2t1cGJ1ZGR5X2NvcmUnICkgKSB7CgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvY29yZS5waHAnICk7CgkJfQoJCQoJCWlmICggISBpc3NldCggc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddICkgKSB7IC8vIElmIHNldHRpbmdzIGFyZSBjb3JydXB0ZWQgZGVmYXVsdCB0byBubyBsb2dnaW5nLgoJCQlzZWxmOjokb3B0aW9uc1snbG9nX2xldmVsJ10gPSAwOwoJCX0KCQkKCQlpZiAoICggc2VsZjo6JF9zdGF0dXNfc2VyaWFsICE9ICcnICkgJiYgKCAkc2VyaWFscyA9PSAnJyApICkgewoJCQkkc2VyaWFscyA9IHNlbGY6OiRfc3RhdHVzX3NlcmlhbDsKCQl9CgkJCgkJaWYgKCBkZWZpbmVkKCAnQkFDS1VQQlVERFlfV1BfQ0xJJyApICYmICggdHJ1ZSA9PT0gQkFDS1VQQlVERFlfV1BfQ0xJICkgKSB7CgkJCWlmICggY2xhc3NfZXhpc3RzKCAnV1BfQ0xJJyApICkgewoJCQkJV1BfQ0xJOjpsaW5lKCAkdHlwZSAuICcgLSAnIC4gJG1lc3NhZ2UgKTsKCQkJfQoJCX0KCQkKCQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHVuaXF1ZSBsb2cgc2VyaWFsIGZvciBhbGwgbG9ncyBmb3Igc2VjdXJpdHkuCgkJaWYgKCAhIGlzc2V0KCBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddICkgfHwgKCBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddID09ICcnICkgKSB7CgkJCXNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gPSBzZWxmOjpyYW5kb21fc3RyaW5nKCAxNSApOwoJCQlzZWxmOjpzYXZlKCk7CgkJfQoJCQoJCWlmICggISBpc19hcnJheSggJHNlcmlhbHMgKSApIHsKCQkJJHNlcmlhbHMgPSBhcnJheSggJHNlcmlhbHMgKTsKCQl9CgkJCgkJLy8gQ2FsY3VsYXRlIGxvZyBkaXJlY3RvcnkuCgkJJGxvZ19kaXJlY3RvcnkgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsgLy8gQWxzbyBoYW5kbGVzIHdoZW4gd2l0aGluIGltcG9ydGJ1ZGR5LgoJCQoJCS8vIFByZXBhcmUgZGlyZWN0b3J5IGZvciBsb2cgZmlsZXMuIFJldHVybiBpZiB1bmFibGUgdG8gZG8gc28uCgkJaWYgKCB0cnVlID09PSBzZWxmOjokX3NraXBsb2cgKSB7IC8vIGJvb2wgdHJ1ZSBzbyBza2lwLgoJCQlyZXR1cm47CgkJfSBlbHNlaWYoIGZhbHNlICE9PSBzZWxmOjokX3NraXBsb2cgKSB7IC8vIHNvbWV0aGluZyBvdGhlciB0aGFuIGJvb2wgZmFsc2Ugc28gY2hlY2sgZGlyZWN0b3J5IGJlZm9yZSBwcm9jZWVkaW5nLgoJCQlpZiAoIHRydWUgIT09IHNlbGY6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkbG9nX2RpcmVjdG9yeSwgJGRpZV9vbl9mYWlsID0gZmFsc2UsICRkZW55X2FsbCA9IGZhbHNlLCAkc3VwcHJlc3NfYWxlcnQgPSB0cnVlICkgKSB7IC8vIFVuYWJsZSB0byBzZWN1cmUgZGlyZWN0b3J5LiBGYWlsLgoJCQkJc2VsZjo6JF9za2lwbG9nID0gdHJ1ZTsKCQkJCXJldHVybjsKCQkJfSBlbHNlIHsKCQkJCXNlbGY6OiRfc2tpcGxvZyA9IGZhbHNlOwoJCQl9CgkJfQoJCQoJCWZvcmVhY2goICRzZXJpYWxzIGFzICRzZXJpYWwgKSB7CgkJCQoJCQkvLyBJbXBvcnRCdWRkeSBhbHdheXMgd3JpdGUgdG8gbWFpbiBzdGF0dXMgbG9nLgoJCQlpZiAoIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSAmJiAoIFBCX0lNUE9SVEJVRERZID09PSB0cnVlICkgKSB7IC8vIElNUE9SVEJVRERZCgkJCQkKCQkJCSR3cml0ZV9zZXJpYWwgPSBmYWxzZTsKCQkJCSR3cml0ZV9tYWluID0gdHJ1ZTsKCQkJCSRtYWluX2ZpbGUgPSAkbG9nX2RpcmVjdG9yeSAuICdzdGF0dXMtJyAuIHNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJCQkKCQkJfSBlbHNlIHsgLy8gU1RBTkRBTE9ORS4KCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd3JpdGluZyB0byBtYWluIGV4dHJhbmVvdXMgbG9nIGZpbGUuCgkJCQkkd3JpdGVfbWFpbiA9IGZhbHNlOwoJCQkJaWYgKCBzZWxmOjokb3B0aW9uc1snbG9nX2xldmVsJ10gPT0gMCApIHsgLy8gTm8gbG9nZ2luZy4KCQkJCQkJJHdyaXRlX21haW4gPSBmYWxzZTsKCQkJCX0gZWxzZWlmICggc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddID09IDEgKSB7IC8vIEVycm9ycyBvbmx5LgoJCQkJCWlmICggJHR5cGUgPT0gJ2Vycm9yJyApIHsKCQkJCQkJJHdyaXRlX21haW4gPSB0cnVlOwoJCQkJCQlzZWxmOjpsb2coICdbJyAuICRzZXJpYWwgLiAnXSAnIC4gJG1lc3NhZ2UsICdlcnJvcicgKTsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBFdmVyeXRoaW5nIGVsc2UuCgkJCQkJJHdyaXRlX21haW4gPSB0cnVlOwoJCQkJCWlmICggaXNfYXJyYXkoICRzZXJpYWwgKSApIHsKCQkJCQkJZXJyb3JfbG9nKCBwcmludF9yKCAkc2VyaWFsLCB0cnVlICkgKTsKCQkJCQl9CgkJCQkJc2VsZjo6bG9nKCAnWycgLiAkc2VyaWFsIC4gJ10gJyAuICRtZXNzYWdlLCAkdHlwZSApOwoJCQkJfQoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgd2hpY2ggbm9ybWFsIHN0YXR1cyBsb2cgZmlsZXMgdG8gd3JpdGUuCgkJCQlpZiAoICRzZXJpYWwgIT0gJycgKSB7CgkJCQkJJHdyaXRlX3NlcmlhbCA9IHRydWU7CgkJCQkJJHdyaXRlX21haW4gPSBmYWxzZTsKCQkJCQkvL2Vycm9yX2xvZyggJ3NlcmlhbDogJyAuICRzZXJpYWwgKTsKCQkJCQlpZiAoICggZmFsc2UgPT09IHN0cmlzdHIoICRzZXJpYWwsICdyZW1vdGVfc2VuZC0nICkgKSAmJiAoIGZhbHNlID09PSBzdHJpc3RyKCAkc2VyaWFsLCAnbGl2ZV9wZXJpb2RpYycgKSApICkgeyAvLyBPbmx5IHdyaXRlIHN1bSBmaWxlIGlmIE5PVCBhIHJlbW90ZSBzZW5kIGFuZCBOT1QgTGl2ZSBsb2cuCgkJCQkJCSR3cml0ZV9tYWluID0gdHJ1ZTsKCQkJCQkJJG1haW5fZmlsZSA9ICRsb2dfZGlyZWN0b3J5IC4gJ3N0YXR1cy0nIC4gJHNlcmlhbCAuICdfc3VtXycgLiBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJHdyaXRlX3NlcmlhbCA9IGZhbHNlOwoJCQkJCSR3cml0ZV9tYWluID0gZmFsc2U7CgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJCgkJCS8vIEZ1bmN0aW9uIGZvciB3cml0aW5nIGFjdHVhbCBsb2cgQ1NWIGRhdGEuIFVzZWQgbGF0ZXIuCgkJCWlmICggISBmdW5jdGlvbl9leGlzdHMoICd3cml0ZV9zdGF0dXNfbGluZScgKSApIHsKCQkJCWZ1bmN0aW9uIHdyaXRlX3N0YXR1c19saW5lKCAkZmlsZSwgJGNvbnRlbnRfYXJyYXksICRlY2hvTm90V3JpdGUgKSB7CgkJCQkJJHdyaXRlRGF0YSA9IGpzb25fZW5jb2RlKCAkY29udGVudF9hcnJheSApIC4gUEhQX0VPTDsKCQkJCQlpZiAoIHRydWUgPT09ICRlY2hvTm90V3JpdGUgKSB7IC8vIGVjaG8gZGF0YSBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gZmlsZS4gdXNlZCBieSBhamF4IHdoZW4gY2hlY2tpbmcgc3RhdHVzIGxvZyBhbmQgbmVlZGluZyB0byBwcmVwZW5kIGJlZm9yZSBsb2cuCgkJCQkJCWVjaG8gJHdyaXRlRGF0YTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyRkZWxpbWl0ZXIgPSAnfH58JzsKCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkZmlsZV9oYW5kbGUgPSBAZm9wZW4oICRmaWxlLCAnYScpICkgKSB7IC8vIEFwcGVuZCBtb2RlLgoJCQkJCQkJLy9mcHV0Y3N2ICggJGZpbGVfaGFuZGxlICwgJGNvbnRlbnRfYXJyYXkgKTsKCQkJCQkJCS8vQGZ3cml0ZSggJGZpbGVfaGFuZGxlLCB0cmltKCBpbXBsb2RlKCAkZGVsaW1pdGVyLCAkY29udGVudF9hcnJheSApICkgLiBQSFBfRU9MICk7CgkJCQkJCQlAZndyaXRlKCAkZmlsZV9oYW5kbGUsICR3cml0ZURhdGEgKTsKCQkJCQkJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy9wYl9iYWNrdXBidWRkeTo6YWxlcnQoICdVbmFibGUgdG8gb3BlbiBmaWxlIGhhbmRsZXIgZm9yIHN0YXR1cyBmaWxlIGAnIC4gJGZpbGUgLiAnYC4gVW5hYmxlIHRvIHdyaXRlIHN0YXR1cyBsb2cuJyApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkkY29udGVudF9hcnJheSA9IGFycmF5KAoJCQkJJ2V2ZW50JwkJPT4gJHR5cGUsCgkJCQkndGltZScJCT0+IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCB0aW1lKCkgKSwgLy8gVGltZSB0aGlzIGhhcHBlbmVkLgoJCQkJJ3UnCQkJPT4gc3Vic3RyKChzdHJpbmcpbWljcm90aW1lKCksIDIsIDIpLAoJCQkJJ3J1bicJCT0+IHNwcmludGYoICIlMDEuMmYiLCByb3VuZCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gc2VsZjo6JHN0YXJ0X3RpbWUsIDIgKSApLCAvLyBFbGFwc2VkIFBIUCB0aW1lLgoJCQkJJ21lbScJCT0+IHNwcmludGYoICIlMDEuMmYiLCByb3VuZCggbWVtb3J5X2dldF91c2FnZSgpIC8gMTA0ODU3NiwgMiApICksIC8vIE1lbW9yeSB1c2VkLglQcmUtNy4wIHdhczogbWVtb3J5X2dldF9wZWFrX3VzYWdlKCkuCgkJCQknZGF0YScJCT0+IHN0cl9yZXBsYWNlKCBjaHIoOSksICcgICAnLCAkbWVzc2FnZSApLCAvLyBCb2R5IG9mIHRoZSBtZXNzYWdlLgoJCQkpOwoJCQkKCQkJLyoqKioqKioqKiogTUFJTiBMT0cgRklMRSBvciBTVU0gRklMRSAqKioqKioqKioqLwoJCQlpZiAoICR3cml0ZV9tYWluID09PSB0cnVlICkgeyAvLyBXUklURSBUTyBNQUlOIExPRyBGSUxFIG9yIFNVTSBGSUxFLgoJCQkJd3JpdGVfc3RhdHVzX2xpbmUoICRtYWluX2ZpbGUsICRjb250ZW50X2FycmF5LCAkZWNob05vdFdyaXRlICk7CgkJCX0KCQkJCgkJCS8qKioqKioqKioqIFNFUklBTCBMT0cgRklMRSAqKioqKioqKioqLwoJCQlpZiAoICR3cml0ZV9zZXJpYWwgPT09IHRydWUgKSB7CgkJCQkkc2VyaWFsX2ZpbGUgPSAkbG9nX2RpcmVjdG9yeSAuICdzdGF0dXMtJyAuICRzZXJpYWwgLiAnXycgLiBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQkJd3JpdGVfc3RhdHVzX2xpbmUoICRzZXJpYWxfZmlsZSwgJGNvbnRlbnRfYXJyYXksICRlY2hvTm90V3JpdGUgKTsKCQkJfQoJCQkKCQkJLy8gT3V0cHV0IGltcG9ydGJ1ZGR5IHN0YXR1cyBsb2cgdG8gc2NyZWVuLgoJCQlnbG9iYWwgJHBiX2JhY2t1cGJ1ZGR5X2pzX3N0YXR1czsKCQkJaWYgKCAoIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIGlzc2V0KCAkcGJfYmFja3VwYnVkZHlfanNfc3RhdHVzICkgJiYgKCAkcGJfYmFja3VwYnVkZHlfanNfc3RhdHVzID09PSB0cnVlICkgKSApICYmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCdkZXBsb3knKSApICkgeyAvLyBJZiBpbXBvcnRidWRkeSwganMgbW9kZSwgYW5kIG5vdCBhIGRlcGxveW1lbnQuCgkJCQllY2hvICc8c2NyaXB0PnBiX3N0YXR1c19hcHBlbmQoICcgLiBqc29uX2VuY29kZSggJGNvbnRlbnRfYXJyYXkgKSAuICcgKTs8L3NjcmlwdD4nIC4gIlxuIjsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJCQl9CgkJCQoJCX0gLy8gZW5kIGZvcmVhY2ggJHNlcmlhbHMuCgkJCgkJCgl9IC8vIEVuZCBzdGF0dXMoKS4KCQkKCQoJCgkvKglzZWxmOjpnZXRfc3RhdHVzKCkKCSAqCQoJICoJR2V0cyBhbGwgc3RhdHVzIGluZm9ybWF0aW9uIGxvZ2dlZCB2aWEgc3RhdHVzKCkuIFJldHVybnMgYW4gYXJyYXkgb2YgYXJyYXlzIHdpdGggbG9nZ2VkIGRhdGEuCgkgKglSZXR1cm4gZm9ybWF0OiBhcnJheSgKCSAqCQkJCQlhcnJheSggVElNRVNUQU1QLCBUSU1FX0lOLCBQRUFLX01FTU9SWSwgVFlQRSwgTUVTU0FHRSApLAoJICoJCQkJCWFycmF5KCBUSU1FU1RBTVAsIFRZUEUsIE1FU1NBR0UgKSwKCSAqCQkJCSkKCSAqCgkgKglAc2VlIHNlbGY6OnN0YXR1cygpLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlcmlhbAkJCQkJVW5pcXVlIGlkZW50aWZpZXIuIFJldHJpZXZlcyBhIHN1YnNldCBvZiBsb2dnZWQgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhpcyB1bmlxdWUgSUQgdGhhdCB3YXMgcGFzc2VkIHRvIHN0YXR1cygpIHdoZW4gbG9nZ2luZy4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGNsZWFyX3JldHJpZXZlZAkJRGVmYXVsdDogdHJ1ZS4gT24gdHJ1ZSBzdGF0dXMgaW5mb3JtYXRpb24gd2lsbCBiZSBwdXJnZWQgYWZ0ZXIgcmV0cmlldmFsLgoJICoJQHBhcmFtCQlib29sZWFuCQkkZXJhc2VfcmV0cmlldmVkCQlEZWZhdWx0OiB0cnVlLiBXaGV0aGVyIG9yIG5vdCB0byBkZWxldGUgbG9nIGZpbGUgb24gcmV0cmlldmFsLiBOT1RFOiBQQ0xaaXAgY2FuIE5PVCBsb3NlIGZpbGVzIG1pZC1iYWNrdXAgc28gbG9nIGZpbGVzIGNhbm5vdCBkZWxldGUgbWlkLXppcC4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGhpZGVfZ2V0dGluZ19zdGF0dXMJRGVmYXVsdDogZmFsc2UuIFdoZXRoZXIgb3Igbm90IHRvIG91dHB1dCBzdGF0dXMgcmV0cmlldmFsIG1lc3NhZ2UuCgkgKglAcmV0dXJuCQlhcnJheQkJCQkJCQkJQXJyYXkgb2YgYXJyYXlzLiAgRWFjaCBzdWItYXJyYXkgY29udGFpbnMgdGhyZWUgdmFsdWVzOiB0aW1lc3RhbXAsIHR5cGUgb2YgbWVzc2FnZSwgYW5kIHRoZSBtZXNzYWdlIGl0c2VsZi4gU2VlIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGZvciBkZXRhaWxzLiBFbXB0eSBhcnJheSBpZiBub24tZXhpc3RpbmcgbG9nLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zdGF0dXMoICRzZXJpYWwgPSAnJywgJGNsZWFyX3JldHJpZXZlZCA9IHRydWUsICRlcmFzZV9yZXRyaWV2ZWQgPSB0cnVlLCAkaGlkZV9nZXR0aW5nX3N0YXR1cyA9IGZhbHNlLCAkY29weV9yZXRyaWV2ZWQgPSBmYWxzZSApIHsKCQkvLyRkZWxpbWl0ZXIgPSAnfH58JzsKCQkKCQkvLyBDYWxjdWxhdGUgbG9nIGRpcmVjdG9yeS4KCQkkbG9nX2RpcmVjdG9yeSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpOyAvLyBBbHNvIGhhbmRsZXMgd2hlbiBpbXBvcnRidWRkeS4KCQkKCQkkc3RhdHVzX2ZpbGUgPSAkbG9nX2RpcmVjdG9yeSAuICdzdGF0dXMtJzsKCQlpZiAoICRzZXJpYWwgIT0gJycgKSB7CgkJCSRzdGF0dXNfZmlsZSAuPSAkc2VyaWFsIC4gJ18nOwoJCX0KCQkkc3RhdHVzX2ZpbGUgLj0gc2VsZjo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQkKCQlpZiAoICEgZmlsZV9leGlzdHMoICRzdGF0dXNfZmlsZSApICkgewoJCQlyZXR1cm4gYXJyYXkoKTsgLy8gTm8gbG9nLgoJCX0KCQkKCQlpZiAoICRoaWRlX2dldHRpbmdfc3RhdHVzID09PSBmYWxzZSApIHsKCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsICdHZXR0aW5nIHN0YXR1cyBmb3Igc2VyaWFsIGAnIC4gJHNlcmlhbCAuICdgLiBDbGVhcjogYCcgLiAoICRjbGVhcl9yZXRyaWV2ZWQgPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnYCcsICRzZXJpYWwgKTsKCQl9CgkJCgkJaWYgKCBmYWxzZSAhPT0gKCAkZmggPSBAZm9wZW4oICRzdGF0dXNfZmlsZSwgJ3InKSApICkgeyAvLyBSZWFkIHdyaXRlIG1vZGUuCgkJCSRzdGF0dXNfbGluZXMgPSBhcnJheSgpOwoJCQl3aGlsZSAoIGZhbHNlICE9PSAoICRzdGF0dXNfbGluZSA9IGZnZXRzKCAkZmggKSApICkgewoJCQkJLyoKCQkJCWlmICggc3RyaXN0ciggJHN0YXR1c19saW5lLCAkZGVsaW1pdGVyICkgKSB7IC8vIERlbGltaW5hdG9yIGluIGxpbmUuCgkJCQkJJHN0YXR1c19saW5lc1tdID0gZXhwbG9kZSggJGRlbGltaXRlciwgdHJpbSggJHN0YXR1c19saW5lICkgKTsKCQkJCX0gZWxzZSB7IC8vIE5vIGRlbGltaW5hdG9yLiBKdXN0IHByaW50IGxpbmUgd2l0aCBibGFuayB2YWx1ZXMuCgkJCQkJJHN0YXR1c19saW5lc1tdID0gYXJyYXkoIDAsMCwwLCd1bmtub3duJywgdHJpbSggJHN0YXR1c19saW5lICkgKTsKCQkJCX0KCQkJCSovCgkJCQkkc3RhdHVzX2xpbmVzW10gPSAkc3RhdHVzX2xpbmU7CgkJCX0KCQkJZmNsb3NlKCAkZmggKTsKCQkJCgkJCWlmICggJGNsZWFyX3JldHJpZXZlZCA9PT0gdHJ1ZSApIHsKCQkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkc3RhdHVzX2ZpbGUsICcnICk7CgkJCX0KCQkJCgkJCWlmICggJGVyYXNlX3JldHJpZXZlZCA9PT0gdHJ1ZSApIHsKCQkJCUB1bmxpbmsoICRzdGF0dXNfZmlsZSApOyAvLyB0b2RvOiBjYXRjaCBlcnJvcnMgb24gdGhpcz8gc3VwcmVzcz8KCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSAhPT0gJGNvcHlfcmV0cmlldmVkICkgewoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCAkY29weV9yZXRyaWV2ZWQsICRzdGF0dXNfbGluZXMsIEZJTEVfQVBQRU5EICk7CgkJCX0KCQkJCgkJCXJldHVybiAkc3RhdHVzX2xpbmVzOwoJCX0gZWxzZSB7CgkJCS8vc2VsZjo6YWxlcnQoICdVbmFibGUgdG8gb3BlbiBmaWxlIGhhbmRsZXIgZm9yIHN0YXR1cyBmaWxlIGAnIC4gJHN0YXR1c19maWxlIC4gJ2AuIFVuYWJsZSB0byB3cml0ZSBzdGF0dXMgbG9nLicgKTsKCQl9Cgl9IC8vIEVuZCBnZXRfc3RhdHVzKCkuCgkKCQoJCgkvKioKCSAqCXN0YXR1c19ib3goKQoJICoKCSAqCURpc3BsYXlzIGEgdGV4dGFyZWEgZm9yIHBsYWNpbmcgc3RhdHVzIHRleHQgaW50by4KCSAqCgkgKglAcGFyYW0JCQkkZGVmYXVsdF90ZXh0CXN0cmluZwkJRmlyc3QgbGluZSBvZiB0ZXh0IHRvIGRpc3BsYXkuCgkgKglAcGFyYW0JCQlib29sZWFuCQkJJGhpZGRlbgkJV2hldGhlciBvciBub3QgdG8gYXBwbHkgZGlzcGxheTogbm9uZTsgQ1NTLgoJICoJQHJldHVybgkJCQkJCQlzdHJpbmcJCUhUTUwgZm9yIHRleHRhcmVhLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0YXR1c19ib3goICRkZWZhdWx0X3RleHQgPSAnJywgJGhpZGRlbiA9IGZhbHNlICkgewoJCWRlZmluZSggJ1BCX1NUQVRVUycsIHRydWUgKTsgLy8gVGVsbHMgZnJhbWV3b3JrIHN0YXR1cygpIGZ1bmN0aW9uIHRvIG91dHB1dCBmdXR1cmUgbG9nZ2luZyBpbmZvIGludG8gc3RhdHVzIGJveCB2aWEgamF2YXNjcmlwdC4KCQkkcmV0dXJuID0gJzx0ZXh0YXJlYSByZWFkb25seT0icmVhZG9ubHkiIGlkPSJwYl9iYWNrdXBidWRkeV9zdGF0dXMiIHdyYXA9Im9mZiInOwoJCWlmICggJGhpZGRlbiA9PT0gdHJ1ZSApIHsKCQkJJHJldHVybiAuPSAnIHN0eWxlPSJkaXNwbGF5OiBub25lOyAiJzsKCQl9CgkJJHJldHVybiAuPSAnPicgLiAkZGVmYXVsdF90ZXh0IC4gJzwvdGV4dGFyZWE+JzsKCQkKCQlyZXR1cm4gJHJldHVybjsKCX0gLy8gRW5kIHN0YXR1c19ib3goKS4KCQoJCgkKCS8qKgoJICoJc2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCkKCSAqCgkgKglTZXRzIGdyZWVkeSBzY3JpcHQgbGltaXRzIHRvIGhlbHAgcHJldmVudCB0aW1lb3V0cywgcnVubmluZyBvdXQgb2YgbWVtb3J5LCBldGMuCgkgKgoJICoJQHJldHVybgkJbnVsbAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoICRzdXByZXNzX3N0YXR1cyA9IGZhbHNlICkgIHsKCQoJCSRyZXF1ZXN0ZWRfc29ja2V0X3RpbWVvdXQgPSA2MCAqIDYwICogMjsKCQkkcmVxdWVzdGVkX2V4ZWN1dGlvbl90aW1lID0gNjAgKiA2MCAqIDI7CgkJCgkJLy8gRG9uJ3QgYWJvcnQgc2NyaXB0IGlmIHRoZSBjbGllbnQgY29ubmVjdGlvbiBpcyBsb3N0L2Nsb3NlZAoJCUBpZ25vcmVfdXNlcl9hYm9ydCggdHJ1ZSApOwoJCQoJCS8vIFNldCBzb2NrZXQgdGltZW91dCB0byByZXF1ZXN0ZWQgcGVyaW9kLgoJCUBpbmlfc2V0KCAnZGVmYXVsdF9zb2NrZXRfdGltZW91dCcsICRyZXF1ZXN0ZWRfc29ja2V0X3RpbWVvdXQgKTsKCQkKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyBtYXggUEhQIGV4ZWN1dGlvbiB0aW1lIHNldHRpbmdzLicgKTsKCQkvLyBTZXQgbWF4aW11bSBleGVjdXRpb24gdGltZSB0byByZXF1ZXN0ZWQgcGVyaW9kIGlmIG5vdCBhbHJlYWR5IGJldHRlciB0aGFuIHRoYXQKCQkvLyBTZWUgaWYgd2UgY2FuIGdldCBhIGN1cnJlbnQgdmFsdWUgKG9mIGFueSBzb3J0KQoJCWlmICggZmFsc2UgPT09ICggJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lID0gQGluaV9nZXQoICdtYXhfZXhlY3V0aW9uX3RpbWUnICkgKSApIHsKCQkJJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCX0KCQkKCQkvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHRyeSBhbmQgc2V0L2luY3JlYXNlCgkJaWYgKCBpc19udW1lcmljKCAkb3JpZ2luYWxfZXhlY3V0aW9uX3RpbWUgKSAmJiAoICggMCA9PSAkb3JpZ2luYWxfZXhlY3V0aW9uX3RpbWUgKSB8fCAoICRyZXF1ZXN0ZWRfZXhlY3V0aW9uX3RpbWUgPD0gJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lICkgKSApIHsKCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgbWF4X2V4ZWN1dGlvbl90aW1lCgkJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJCWlmICggZmFsc2UgPT09ICggJGNvbmZpZ3VyZWRfZXhlY3V0aW9uX3RpbWUgPSBAZ2V0X2NmZ192YXIoICdtYXhfZXhlY3V0aW9uX3RpbWUnICkgKSApIHsKCQkJCQkkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSA9ICdVbmtub3duJzsKCQkJCX0KCQkJCWlmICggZmFsc2UgPT09ICggJGN1cnJlbnRfZXhlY3V0aW9uX3RpbWUgPSBAaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSApICkgewoJCQkJCSRjdXJyZW50X2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCQkJfQoJCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnTWF4aW11bSBQSFAgZXhlY3V0aW9uIHRpbWUgd2FzIG5vdCBtb2RpZmllZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdSZXBvcnRlZCBQSFAgZXhlY3V0aW9uIHRpbWUgLSBDb25maWd1cmVkOiAlMSRzOyBPcmlnaW5hbDogJTIkczsgQ3VycmVudDogJTMkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSwgJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lLCAkY3VycmVudF9leGVjdXRpb25fdGltZSApICk7CgkJCX0KCQl9IGVsc2UgeyAvLyBFaXRoZXIgbm90IGEgbnVtZXJpYyB2YWx1ZSBvciB3ZSBuZWVkIHRvIHRyeSBhbmQgaW5jcmVhc2UKCQkJCgkJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc2V0X2dyZWVkeV9leGVjdXRpb25fdGltZSddICkgJiYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzZXRfZ3JlZWR5X2V4ZWN1dGlvbl90aW1lJ10gKSApIHsKCQkJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdBdHRlbXB0aW5nIHRvIHNldCBQSFAgZXhlY3V0aW9uIHRpbWUgdG8gJTEkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkcmVxdWVzdGVkX2V4ZWN1dGlvbl90aW1lICkgKTsKCQkJCX0KCQkJCUBzZXRfdGltZV9saW1pdCggJHJlcXVlc3RlZF9leGVjdXRpb25fdGltZSApOwoJCQl9ICBlbHNlaWYgKCBmYWxzZSA9PT0gJHN1cHJlc3Nfc3RhdHVzICkgey8vIGVuZCBzZXR0aW5nIG1heCBleGVjdXRpb24gdGltZQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBlZCBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIG1heCBQSFAgZXhlY3V0aW9uIHRpbWUgYmFzZWQgb24gc2V0dGluZ3MuJyApOwoJCQl9CgkJCQoJCQlpZiAoIGZhbHNlID09PSAkc3VwcmVzc19zdGF0dXMgKSB7CgkJCQlpZiAoIGZhbHNlID09PSAoICRjb25maWd1cmVkX2V4ZWN1dGlvbl90aW1lID0gQGdldF9jZmdfdmFyKCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApICkgKSB7CgkJCQkJJGNvbmZpZ3VyZWRfZXhlY3V0aW9uX3RpbWUgPSAnVW5rbm93bic7CgkJCQl9CgkJCQlpZiAoIGZhbHNlID09PSAoICRjdXJyZW50X2V4ZWN1dGlvbl90aW1lID0gQGluaV9nZXQoICdtYXhfZXhlY3V0aW9uX3RpbWUnICkgKSApIHsKCQkJCQkkY3VycmVudF9leGVjdXRpb25fdGltZSA9ICdVbmtub3duJzsKCQkJCX0KCQkJCXNlbGY6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1JlcG9ydGVkIFBIUCBleGVjdXRpb24gdGltZSAtIENvbmZpZ3VyZWQ6ICUxJHM7IE9yaWdpbmFsOiAlMiRzOyBDdXJyZW50OiAlMyRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRjb25maWd1cmVkX2V4ZWN1dGlvbl90aW1lLCAkb3JpZ2luYWxfZXhlY3V0aW9uX3RpbWUsICRjdXJyZW50X2V4ZWN1dGlvbl90aW1lICkgKTsKCQkJfQoJCX0KCQkKCQkKCQkKCQkKCQkvLyBTZXQgbWVtb3J5X2xpbWl0IHRvIGVpdGhlciB0aGUgdXNlciBkZWZpbmVkIChXb3JkUHJlc3MgZGVmYXVsdGVkKSBvciBvdmVyLXJpZGRlbiB2YWx1ZQoJCS8vIE5lZWQgdG8gZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBoZXJlIGFzIHdlIHdpbGwgYmUgdXBkYXRpbmcgaXQKCQlpZiAoIGZhbHNlID09PSAoICRvcmlnaW5hbF9tZW1vcnlfbGltaXQgPSBAaW5pX2dldCggJ21lbW9yeV9saW1pdCcgKSApICkgewoJCQkkb3JpZ2luYWxfbWVtb3J5X2xpbWl0ID0gJ1Vua25vd24nOwoJCX0KCgkJLy8gTmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgcnVubmluZyBvdXRzaWRlIG9mIFdvcmRQcmVzcyBpbiB3aGljaCBjYXNlIHdlIGRvbid0IHRyeSBhbmQgY2hhbmdlIGFueXRoaW5nCgkJLy8gYnV0IGp1c3QgcmVwb3J0IHRoZSBtZW1vcnlfbGltaXQgdmFsdWVzLiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gdXBkYXRlIGNvbmZpZyBpZiBuZWNlc3NhcnkgYmVjYXVzZQoJCS8vIHRoZXJlIGlzIG5vIG90aGVyIG1lY2hhbmlzbSB0byBzZXQgdGhlIHZhbGlkIG1lbW9yeV9saW1pdC4KCQkvLyBJZiB3ZSBhcmUgcnVubmluZyB1bmRlciBXb3JkUHJlc3MgdGhlbiBuZWVkIGEgbGl0dGxlIGZha2VyeSBmb3IgZWFybGllciB2ZXJzaW9ucy4KCQlpZiAoICEgZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgfHwgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIGZhbHNlID09PSBQQl9TVEFOREFMT05FICkgKSApIHsJCgkJCS8vIE5vdGU6IFdQX01BWF9NRU1PUllfTElNSVQgd2FzIGludHJvZHVjZWQgV1AzLjIgc28gd2UgbmVlZCB0byBmYWtlIGl0IGlmIGNvbnN0YW50IG5vdCBhbHJlYWR5IGRlZmluZWQKCQkJLy8gVXNlIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgV29yZFByZXNzIHVzZXMgaWYgdGhlIHVzZXIgaGFzbid0IGRlZmluZWQgaXQKCQkJaWYgKCAhIGRlZmluZWQoICdXUF9NQVhfTUVNT1JZX0xJTUlUJyApICkgewoJCQkJZGVmaW5lKCAnV1BfTUFYX01FTU9SWV9MSU1JVCcsICcyNTZNJyApOwoJCQl9CgkJCUBpbmlfc2V0KCAnbWVtb3J5X2xpbWl0JywgYXBwbHlfZmlsdGVycyggJ2FkbWluX21lbW9yeV9saW1pdCcsIFdQX01BWF9NRU1PUllfTElNSVQgKSApOwoJCQlpZiAoIGZhbHNlID09PSAkc3VwcmVzc19zdGF0dXMgKSB7CgkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdBdHRlbXB0ZWQgdG8gc2V0IFBIUCBtZW1vcnkgbGltaXQgdG8gdXNlciBkZWZpbmVkIFdQX01BWF9NRU1PUllfTElNSVQgKCUxJHMpIG9yIG92ZXItcmlkZGVuIHZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksIFdQX01BWF9NRU1PUllfTElNSVQgKSApOwoJCQl9CgkJfQoJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJaWYgKCBmYWxzZSA9PT0gKCAkY29uZmlndXJlZF9tZW1vcnlfbGltaXQgPSBAZ2V0X2NmZ192YXIoICdtZW1vcnlfbGltaXQnICkgKSApIHsKCQkJCSRjb25maWd1cmVkX21lbW9yeV9saW1pdCA9ICdVbmtub3duJzsKCQkJfQoJCQlpZiAoIGZhbHNlID09PSAoICRjdXJyZW50X21lbW9yeV9saW1pdCA9IEBpbmlfZ2V0KCAnbWVtb3J5X2xpbWl0JyApICkgKSB7CgkJCQkkY3VycmVudF9tZW1vcnlfbGltaXQgPSAnVW5rbm93bic7CgkJCX0KCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnUmVwb3J0ZWQgUEhQIG1lbW9yeSBsaW1pdHMgLSBDb25maWd1cmVkOiAlMSRzOyBPcmlnaW5hbDogJTIkczsgQ3VycmVudDogJTMkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkY29uZmlndXJlZF9tZW1vcnlfbGltaXQsICRvcmlnaW5hbF9tZW1vcnlfbGltaXQsICRjdXJyZW50X21lbW9yeV9saW1pdCApICk7CgkJfQoKCX0gLy8gRW5kIHNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpLgoJCgkKCQoJLyoqCgkgKglzZWxmOjpsb2coKQoJICoKCSAqCUxvZ3MgdG8gYSB0ZXh0IGZpbGUgZGVwZW5kaW5nIG9uIHNldHRpbmdzLgoJICoJMCA9IG5vbmUsIDEgPSBlcnJvcnMgb25seSwgMiA9IGVycm9ycyArIHdhcm5pbmdzLCAzID0gZGVidWdnaW5nIChhbGwga2luZHMgb2YgYWN0aW9ucykKCSAqCgkgKglAcGFyYW0Jc3RyaW5nCSR0ZXh0CQlUZXh0IHRvIGxvZy4KCSAqCUBwYXJhbQlzdHJpbmcJJGxvZ190eXBlCVZhbGlkIG9wdGlvbnM6IGVycm9yLCB3YXJuaW5nLCBhbGwgKGRlZmF1bHQgc28gbWF5IGJlIG9taXR0ZWQpLgoJICoJQHJldHVybgludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9nKCAkdGV4dCwgJGxvZ190eXBlID0gJ2FsbCcgKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApIHx8ICFpc3NldCggc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddICkgfHwgKCBzZWxmOjokb3B0aW9uc1snbG9nX2xldmVsJ10gPT0gMCApICkgeyAvLyBObyBsb2dnaW5nIGluIHRoaXMgcGx1Z2luIG9yIGRpc2FibGVkLgoJCQlyZXR1cm47CgkJfQoJCQoJCSR3cml0ZSA9IGZhbHNlOwoJCWlmICggc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddID09IDEgKSB7IC8vIEVycm9ycyBvbmx5LgoJCQlpZiAoICRsb2dfdHlwZSA9PSAnZXJyb3InICkgewoJCQkJJHdyaXRlID0gdHJ1ZTsKCQkJfQoJCX0gZWxzZSB7IC8vIEFsbCBsb2dnaW5nIChkZWJ1ZyBtb2RlKS4KCQkJJHdyaXRlID0gdHJ1ZTsKCQl9CgkJCgkJaWYgKCAkd3JpdGUgPT09IHRydWUgKSB7CgkJCWlmICggIWlzc2V0KCBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddICkgKSB7CgkJCQlzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddID0gc2VsZjo6cmFuZG9tX3N0cmluZyggMTUgKTsKCQkJCXNlbGY6OnNhdmUoKTsKCQkJfQoJCQkkZmggPSBAZm9wZW4oIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2xvZy0nIC4gc2VsZjo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JywgJ2EnKTsKCQkJaWYgKCAkZmggKSB7CgkJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2dldF9vcHRpb24nICkgKSB7CgkJCQkJJGdtdF9vZmZzZXQgPSBnZXRfb3B0aW9uKCAnZ210X29mZnNldCcgKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGdtdF9vZmZzZXQgPSAwOwoJCQkJfQoJCQkJZndyaXRlKCAkZmgsICdbJyAuIGRhdGUoICdNIGosIFkgSDppOnMgJyAuICRnbXRfb2Zmc2V0LCB0aW1lKCkgKyAoICRnbXRfb2Zmc2V0ICogMzYwMCkgKSAuICctJyAuICRsb2dfdHlwZSAuICddICcgLiAkdGV4dCAuICJcbiIgKTsKCQkJCWZjbG9zZSggJGZoICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCBsb2coKS4KCQoJCgkKCS8qCXNlbGY6OnJhbmRvbV9zdHJpbmcoKQoJICoJCgkgKglHZW5lcmF0ZSBhIHJhbmRvbSBzdHJpbmcgb2YgY2hhcmFjdGVycy4KCSAqCQoJICoJQHBhcmFtCQkKCSAqCUByZXR1cm4JCQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbV9zdHJpbmcoICRsZW5ndGggPSAzMiwgJGNoYXJzID0gJ2FiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwJyApIHsKCQkkY2hhcnNfbGVuZ3RoID0gKCBzdHJsZW4oICRjaGFycyApIC0gMSApOwoJCSRzdHJpbmcgPSAkY2hhcnN7cmFuZCgwLCAkY2hhcnNfbGVuZ3RoKX07CgkJZm9yICggJGkgPSAxOyAkaSA8ICRsZW5ndGg7ICRpID0gc3RybGVuKCAkc3RyaW5nICkgKSB7CgkJCSRyID0gJGNoYXJze3JhbmQoMCwgJGNoYXJzX2xlbmd0aCl9OwoJCQlpZiAoICRyICE9ICRzdHJpbmd7JGkgLSAxfSApICRzdHJpbmcgLj0gICRyOwoJCX0KCQlyZXR1cm4gJHN0cmluZzsKCX0gLy8gRW5kIHJhbmRvbV9zdHJpbmcoKS4KCQoJCgkKCS8qKgoJICoJc2VsZjo6dmlkZW8oKQoJICoKCSAqCURpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciB3aGVuIHRoZXkgaG92ZXIgb3ZlciB0aGUgcXVlc3Rpb24gbWFyay4gR3JhY2VmdWxseSBmYWxscyBiYWNrIHRvIG5vcm1hbCB0b29sdGlwLgoJICoJSFRNTCBpcyBzdXBwb3NlZCB3aXRoaW4gdG9vbHRpcHMuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSR2aWRlb19rZXkJCVlvdVR1YmUgdmlkZW8ga2V5IGZyb20gdGhlIFVSTCA/dj1WSURFT19LRVlfSEVSRQoJICoJQHBhcmFtCQlzdHJpbmcJCSR0aXRsZQkJCVRpdGxlIG9mIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLiBUaGlzIGlzIGRpc3BsYXllZCBhdCB0b3Agb2YgdGlwIGluIGJpZ2dlciBsZXR0ZXJzLiBEZWZhdWx0IGlzIGJsYW5rLiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvX3RpcAkJV2hldGhlciB0byBlY2hvIHRoZSB0aXAgKGRlZmF1bHQ7IHRydWUpLCBvciByZXR1cm4gdGhlIHRpcCAoZmFsc2UpLiAob3B0aW9uYWwpCgkgKglAcmV0dXJuCQlzdHJpbmcvbnVsbAkJCQkJSWYgbm90IGVjaG9pbmcgdGlwIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGVjaG9pbmcgdGhlcmUgaXMgbm8gcmV0dXJuLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUgPSAnJywgJGVjaG9fdGlwID0gdHJ1ZSApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXJldHVybiBzZWxmOjokdWktPnZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUsICRlY2hvX3RpcCApOwoJfSAvLyBFbmQgdmlkZW8oKS4KCQoJCgkKCSAvKioKCSAqIHBiX2JhY2t1cGJ1ZGR5OjplbnF1ZXVlX3RoaWNrYm94KCkKCSAqCgkgKiBFbnF1ZXVlcyB0aGUgcmVxdWlyZWQgc2NyaXB0cyAvIHN0eWxlcyBuZWVkZWQgdG8gdXNlIHRoaWNrYm94CgkgKgoJICogQHJldHVybiBudWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5xdWV1ZV90aGlja2JveCgpIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXJldHVybiBzZWxmOjokdWktPmVucXVldWVfdGhpY2tib3goKTsKCX0gLy8gRW5kIGVucXVldWVfdGhpY2tib3gKCQoJCgkKCS8qKgoJICoJc2VsZjo6YWxlcnQoKQoJICoKCSAqCURpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHdoZW4gaW4gdGhlIGRhc2hib2FyZC4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJCU1lc3NhZ2UgeW91IHdhbnQgdG8gZGlzcGxheSB0byB0aGUgdXNlci4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVycm9yCQkJT1BUSU9OQUwhIHRydWUgaW5kaWNhdGVzIHRoaXMgYWxlcnQgaXMgYW4gZXJyb3IgYW5kIGRpc3BsYXlzIGFzIHJlZC4gRGVmYXVsdDogZmFsc2UKCSAqCUBwYXJhbQkJaW50CQkJJGVycm9yX2NvZGUJCU9QVElPTkFMISBFcnJvciBjb2RlIG51bWJlciB0byB1c2UgaW4gbGlua2luZyBpbiB0aGUgd2lraSBmb3IgZWFzeSByZWZlcmVuY2UuCgkgKglAcmV0dXJuCQlzdHJpbmcvbnVsbAkJCQkJSWYgbm90IGVjaG9pbmcgYWxlcnQgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gZWNob2luZyB0aGVyZSBpcyBubyByZXR1cm4uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWxlcnQoICRtZXNzYWdlLCAkZXJyb3IgPSBmYWxzZSwgJGVycm9yX2NvZGUgPSAnJywgJHJlbF90YWcgPSAnJyApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXNlbGY6OiR1aS0+YWxlcnQoICRtZXNzYWdlLCAkZXJyb3IsICRlcnJvcl9jb2RlLCAkcmVsX3RhZyApOwoJfSAvLyBFbmQgYWxlcnQoKS4KCQoJCgkKCS8vIERpc21pc3NhYmxlIGFsZXJ0IHN5c3RlbS4gVXNlcyBhbGVydCgpLgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkaXNhbGVydCggJHVuaXF1ZV9pZCwgJG1lc3NhZ2UsICRlcnJvciA9IGZhbHNlLCAkbW9yZV9jc3MgPSAnJyApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXNlbGY6OiR1aS0+ZGlzYWxlcnQoICR1bmlxdWVfaWQsICRtZXNzYWdlLCAkZXJyb3IsICRtb3JlX2NzcyApOwoJfSAvLyBFbmQgZGlzYWxlcnQoKS4KCQoJCgkKCS8qKgoJICoJc2VsZjo6dGlwKCkKCSAqCgkgKglEaXNwbGF5cyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgd2hlbiB0aGV5IGhvdmVyIG92ZXIgdGhlIHF1ZXN0aW9uIG1hcmsuIEdyYWNlZnVsbHkgZmFsbHMgYmFjayB0byBub3JtYWwgdG9vbHRpcC4KCSAqCUhUTUwgaXMgc3VwcG9zZWQgd2l0aGluIHRvb2x0aXBzLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbWVzc2FnZQkJQWN0dWFsIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLgoJICoJQHBhcmFtCQlzdHJpbmcJCSR0aXRsZQkJCVRpdGxlIG9mIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLiBUaGlzIGlzIGRpc3BsYXllZCBhdCB0b3Agb2YgdGlwIGluIGJpZ2dlciBsZXR0ZXJzLiBEZWZhdWx0IGlzIGJsYW5rLiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvX3RpcAkJV2hldGhlciB0byBlY2hvIHRoZSB0aXAgKGRlZmF1bHQ7IHRydWUpLCBvciByZXR1cm4gdGhlIHRpcCAoZmFsc2UpLiAob3B0aW9uYWwpCgkgKglAcmV0dXJuCQlzdHJpbmcvbnVsbAkJCQkJSWYgbm90IGVjaG9pbmcgdGlwIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGVjaG9pbmcgdGhlcmUgaXMgbm8gcmV0dXJuLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRpcCggJG1lc3NhZ2UsICR0aXRsZSA9ICcnLCAkZWNob190aXAgPSB0cnVlICkgewoJCXNlbGY6OmluaXRfY2xhc3NfY29udHJvbGxlciggJ3VpJyApOyAvLyAkdWkgY2xhc3MgcmVxdWlyZWQgcGFnZXMgY29udHJvbGxlciBhbmQgbWF5IG5vdCBiZSBzZXQgdXAgaWYgbm90IGluIG91ciBvd24gcGFnZXMuCgkJcmV0dXJuIHNlbGY6OiR1aS0+dGlwKCAkbWVzc2FnZSwgJHRpdGxlLCAkZWNob190aXAgKTsKCX0gLy8gRW5kIHRpcCgpLgoJCgkKCQoJLyoJc2VsZjo6YWRkX3BhZ2UoKQoJICoJCgkgKglBZGRzIGEgcGFnZSBpbnRvIHRoZSBhZG1pbi4gU3RvcmVzIG1lbnUgaXRlbXMgdG8gYWRkIGluIHNlbGY6OiRfcGFnZV9zZXR0aW5ncyBhcnJheS4gUmVnaXN0ZXJzIGNhbGxiYWNrIHRvIHJlZ2lzdGVyX2FkbWluX21lbnUoKSB3aXRoIFdvcmRQcmVzcyB0byBhY3R1YWxseSBzZXQgdXAgdGhlIHBhZ2VzLgoJICoJQHNlZSBzZWxmOjpyZWdpc3Rlcl9hZG1pbl9tZW51KCkKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRwYXJlbnRfc2x1ZwkJU2x1ZyBvZiB0aGUgcGFyZW50IG1lbnUgaXRlbSB0byBnbyB1bmRlci4gSWYgYSBzZXJpZXMgdXNlIGBTRVJJRVNgIGZvciB0aGUgdmFsdWUgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgdGhlIHNlcmllcy4gUEIgcHJlZml4IGF1dG9tYXRpY2FsbHkgYXBwbGllZCB1bmxlc3MgJHNsdWdfcHJlZml4IG92ZXJyaWRlcy4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcGFnZV9zbHVnCQkJU2x1ZyBmb3IgdGhpcyBwYWdlLiBQQiBwcmVmaXggYXV0b21hdGljYWxseSBhcHBsaWVkIHVubGVzcyAkc2x1Z19wcmVmaXggb3ZlcnJpZGVzLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRwYWdlX3RpdGxlCQkJVGl0bGUgb2YgdGhlIHBhZ2UuIElmIHRoaXMgbWVudSBpdGVtIGhhcyBubyBwYXJlbnQgdGhpcyBjYW4gYmUgYW4gYXJyYXkgb2YgVFdPIHRpdGxlcy4gVGhlIHJvb3QgbWVudSBhbmQgdGhlIGZpcnN0IHN1Ym1lbnUgaXRlbSB0aGF0IGxpbmtzIHRvIHRoZSBzYW1lIHBsYWNlLgogCSAqCUBwYXJhbQkJc3RyaW5nCQkkY2FwYWJpbGl0eQkJCUNhcGFiaWxpdHkgcmVxdWlyZWQgdG8gYWNjZXNzIHBhZ2UuIERlZmF1bHQ6IGFjdGl2YXRlX3BsdWdpbnMuCiAJICoJQHBhcmFtCQlzdHJpbmcJCSRpY29uCQkJCU1lbnUgaWNvbiBncmFwaGljLiBBdXRvbWF0aWNhbGx5IHByZWZpeGVzIHRoaXMgdmFsdWUgd2l0aCB0aGUgZnVsbCBVUkwgdG8gcGx1Z2luJ3MgaW1hZ2VzIGRpcmVjdG9yeS4gRGVmYXVsdDogaWNvbl8xNngxNi5wbmcuCiAJICoJQHBhcmFtCQlzdHJpbmcJCSRzbHVnX3ByZWZpeAkJUHJlZml4IHRvIHVzZSB3aXRoIHRoaXMgbWVudS4gT3ZlcnJpZGUgaWYgbmVlZGluZyB0byBhZGQgbWVudSB1bmRlciBhbm90aGVyIHBsdWdpbiBvciBjb3JlIG1lbnVzLiBEZWZhdWx0OiBERUZBVUxULgogCSAqCUBwYXJhbQkJaW50CQkJJHBvc2l0aW9uCQkJUHJpb3JpdHkgb24gd2hlcmUgaW4gdGhlIG1lbnUgdG8gYWRkIHRoaXMuIEJ5IGRlZmF1bHQgaXQgaXMgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbWVudS4gSXQncyBwb3NzaWJsZSB0byBvdmVyd3JpdGUgYW5vdGhlciBtZW51IGl0ZW0gaWYgdGhpcyBudW1iZXIgbWF0Y2hlcy4gVXNlIGNhdXRpb24uIERlZmF1bHQ6IG51bGwuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkX3BhZ2UoICRwYXJlbnRfc2x1ZywgJHBhZ2Vfc2x1ZywgJHBhZ2VfdGl0bGUsICRjYXBhYmlsaXR5ID0gJ2FjdGl2YXRlX3BsdWdpbnMnLCAkaWNvbiA9ICdpY29uX21lbnVfMTZ4MTYucG5nJywgJHNsdWdfcHJlZml4ID0gJ0RFRkFVTFQnLCAkcG9zaXRpb24gPSBOVUxMICkgewoJCWlmICggJHNsdWdfcHJlZml4ID09ICdERUZBVUxUJyApIHsKCQkJJHNsdWdfcHJlZml4ID0gJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXyc7CgkJfQoJCQoJCWlmICggIWlzX29iamVjdCggc2VsZjo6JF9wYWdlcyApICkgewoJCQlzZWxmOjpfaW5pdF9jb3JlX2NvbnRyb2xsZXIoICdwYWdlcycgKTsKCQkJCgkJCWlmICggaXNfbmV0d29ya19hZG1pbigpICkgeyAvLyBNdWx0aXNpdGUgaW5zdGFsbGF0aW9uIGFkbWluOyB1c2VzIGRpZmZlcmVudCBob29rLgoJCQkJYWRkX2FjdGlvbiggJ25ldHdvcmtfYWRtaW5fbWVudScsIGNyZWF0ZV9mdW5jdGlvbiggJycsICdwYl8nIC4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApIC4gJzo6cmVnaXN0ZXJfYWRtaW5fbWVudSgpOycgKSApOwoJCQl9IGVsc2UgeyAvLyBTdGFuZGFsb25lIGFkbWluLgoJCQkJYWRkX2FjdGlvbiggJ2FkbWluX21lbnUnLCBjcmVhdGVfZnVuY3Rpb24oICcnLCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICc6OnJlZ2lzdGVyX2FkbWluX21lbnUoKTsnICkgKTsKCQkJfQoJCX0KCQkKCQlzZWxmOjokX3BhZ2Vfc2V0dGluZ3NbXSA9IGFycmF5KAoJCQkncGFyZW50JyAgPT4gICRwYXJlbnRfc2x1ZywKCQkJJ3NsdWcnICAgPT4gICRwYWdlX3NsdWcsCgkJCSd0aXRsZScgICA9PiAgJHBhZ2VfdGl0bGUsCgkJCSdjYXBhYmlsaXR5JyA9PiAgJGNhcGFiaWxpdHksCgkJCSdpY29uJyAgID0+ICAkaWNvbiwKCQkJJ3NsdWdfcHJlZml4JyA9PiAgJHNsdWdfcHJlZml4LAoJCQkncG9zaXRpb24nICA9PiAgJHBvc2l0aW9uLAoJCSk7Cgl9IC8vIEVuZCBhZGRfcGFnZSgpLgkKCQoJCgkvKglyZWdpc3Rlcl9hZG1pbl9tZW51KCkKCSAqCQoJICoJSW50ZXJuYWwgY2FsbGJhY2sgZm9yIGFjdHVhbGx5IHJlZ2lzdGVyaW5nIHRoZSBtZW51IGl0ZW1zIGludG8gV29yZFByZXNzLiBSZWdpc3RlcnMgcGFnZXMgZGVmaW5lZCBieSBzZWxmOjphZGRfcGFnZSgpLgoJICoJQHNlZSBzZWxmOjphZGRfcGFnZSgpCgkgKgkKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWdpc3Rlcl9hZG1pbl9tZW51KCkgewoJCWlmICggIXNlbGY6OmJsYW5rKCBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXSApICkgeyAvLyBTRVJJRVMKCQkJJHNlcmllc19zbHVnID0gJ3BiXycgLiBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXTsKCQkJLy8gV2UgbmVlZCB0byBzZWUgZmlyc3QgaWYgdGhpcyBzZXJpZXMnIHJvb3QgbWVudSBoYXMgYmVlbiBjcmVhdGVkIGJ5IGEgcGx1Z2luIHlldC4KCQkJZ2xvYmFsICRtZW51OwoJCQkkZm91bmRfc2VyaWVzID0gZmFsc2U7CgkJCWZvcmVhY2ggKCAkbWVudSBhcyAkbWVudXMgPT4gJGl0ZW0gKSB7IC8vIExvb3AgdGhyb3VnaCBleGlzdGluZyBtZW51IGl0ZW1zIGxvb2tpbmcgZm9yIG91ciBzZXJpZXMuCgkJCQlpZiAoICRpdGVtWzBdID09ICRzZXJpZXNfc2x1ZyApIHsKCQkJCQkkZm91bmRfc2VyaWVzID0gdHJ1ZTsKCQkJCX0KCQkJfQoJCQlpZiAoICRmb3VuZF9zZXJpZXMgPT09IGZhbHNlICkgeyAvLyBTZXJpZXMgcm9vdCBtZW51IGRvZXMgbm90IGV4aXN0OyBjcmVhdGUgaXQuCgkJCQlhZGRfbWVudV9wYWdlKCBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXSAuICcgR2V0dGluZyBTdGFydGVkJywgc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10sICdhY3RpdmF0ZV9wbHVnaW5zJywgJHNlcmllc19zbHVnLCBhcnJheSggJnNlbGY6OiRfcGFnZXMsICdnZXR0aW5nX3N0YXJ0ZWQnICksIHNlbGY6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3Nlcmllc19pY29uXzE2eDE2LnBuZycgKTsgLy8gLCAkcGFnZVsncG9zaXRpb24nXQoJCQkJYWRkX3N1Ym1lbnVfcGFnZSggJHNlcmllc19zbHVnLCBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXSAuICcgR2V0dGluZyBTdGFydGVkJywgJ0dldHRpbmcgU3RhcnRlZCcsICdhY3RpdmF0ZV9wbHVnaW5zJywgJHNlcmllc19zbHVnLCBhcnJheSggJnNlbGY6OiRfcGFnZXMsICdnZXR0aW5nX3N0YXJ0ZWQnICkgKTsKCQkJfQoJCQkKCQkJLy8gUmVnaXN0ZXIgZm9yIGdldHRpbmcgc3RhcnRlZCBwYWdlLgoJCQlnbG9iYWwgJHBsdWdpbmJ1ZGR5X3NlcmllczsKCQkJaWYgKCAhaXNzZXQoICRwbHVnaW5idWRkeV9zZXJpZXNbIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddIF0gKSApIHsKCQkJCSRwbHVnaW5idWRkeV9zZXJpZXNbIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddIF0gPSBhcnJheSgpOwoJCQl9CgkJCQoJCQkvLyBBZGQgdGhpcyBwbHVnaW4gaW50byBnbG9iYWwgc2VyaWVzIHZhcmlhYmxlLgoJCQkkcGx1Z2luYnVkZHlfc2VyaWVzWyBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXSBdWyBzZWxmOjokX3NldHRpbmdzWydzbHVnJ10gXSA9IGFycmF5KAoJCQkJJ3BhdGgnCQk9PglzZWxmOjpwbHVnaW5fcGF0aCgpLAoJCQkJJ25hbWUnCQk9PglzZWxmOjpzZXR0aW5ncyggJ25hbWUnICksCgkJCQknc2x1ZycJCT0+CXNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSwKCQkJKTsKCQl9CgkJCgkJLy8gQWRkIGFsbCByZWdpc3RlcmVkIHBhZ2VzIGZvciB0aGlzIHBsdWdpbi4KCQlmb3JlYWNoICggc2VsZjo6JF9wYWdlX3NldHRpbmdzIGFzICRwYWdlICkgewoJCQkkbWVudV9zbHVnID0gJHBhZ2VbJ3NsdWdfcHJlZml4J10gLiAkcGFnZVsnc2x1ZyddOwoJCQlpZiAoICRwYWdlWydwYXJlbnQnXSA9PSAnU0VSSUVTJyApIHsgLy8gQWRkaW5nIHBhZ2UgaW50byBzZXJpZXMuCgkJCQkkcGFyZW50X3NsdWcgPSAncGJfJyAuIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddOwoJCQkJaWYgKCBzZWxmOjpibGFuayggc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10gKSApIHsgLy8gTm8gc2VyaWVzIHNldCBidXQgbWVudSBpcyByZWdpc3RlcmVkIGludG8gYSBzZXJpZXMuCgkJCQkJZWNobyAne1dBUk5JTkc6IE1lbnUgaXRlbSByZWdpc3RlcmVkIGludG8gYSBzZXJpZXMgYnV0IG5vIHBsdWdpbiBzZXJpZXMgaXMgZGVmaW5lZC59JzsKCQkJCX0KCQkJfSBlbHNlIHsgLy8gTm9uLXNlcmllcyBwYWdlLgoJCQkJJHBhcmVudF9zbHVnID0gJHBhZ2VbJ3NsdWdfcHJlZml4J10gLiAkcGFnZVsncGFyZW50J107CgkJCX0KCgkJCWlmICggaXNfYXJyYXkoICRwYWdlWyd0aXRsZSddICkgKSB7CgkJCQkkcGFnZV90aXRsZSA9ICRwYWdlWyd0aXRsZSddWzBdOwoJCQkJJHBhZ2VfdGl0bGVfYWx0ID0gJHBhZ2VbJ3RpdGxlJ11bMV07CgkJCX0gZWxzZSB7IC8vIE5vdCBhbiBhcnJheSBzbyBvbmx5IG9uZSBwYWdlIHRpdGxlLgoJCQkJJHBhZ2VfdGl0bGUgPSAkcGFnZVsndGl0bGUnXTsKCQkJCSRwYWdlX3RpdGxlX2FsdCA9ICRwYWdlWyd0aXRsZSddOwoJCQl9CgkJCQoJCQkvLyBDYWxjdWxhdGUgaWNvbi4KCQkJaWYgKCAnJyAhPSAkcGFnZVsnaWNvbiddICkgeyAvLyBJZiBpY29uIHNwZWNpZmllZCB0aGVuIGZpZ3VyZSBvdXQgdXJsLgoJCQkJJGljb24gPSAkcGFnZVsnaWNvbiddOyAvL3NlbGY6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzLycgLiAkcGFnZVsnaWNvbiddOwoJCQl9IGVsc2UgeyAvLyBObyBpY29uLiBVc3VhbGx5IHVzZWQgd2hlbiBtYW51YWxseSBkb2luZyBDU1MgZm9yIHJldGluYSBpY29uLgoJCQkJJGljb24gPSAnJzsKCQkJfQoJCQkKCQkJaWYgKCBzZWxmOjpibGFuayggJHBhZ2VbJ3BhcmVudCddICkgKSB7IC8vIFRvcC1sZXZlbCBtZW51LgoJCQkJYWRkX21lbnVfcGFnZSggJHBhZ2VfdGl0bGUsICRwYWdlX3RpdGxlLCAkcGFnZVsnY2FwYWJpbGl0eSddLCAkbWVudV9zbHVnLCBhcnJheSggJnNlbGY6OiRfcGFnZXMsICRwYWdlWydzbHVnJ10gKSwgJGljb24sICRwYWdlWydwb3NpdGlvbiddICk7CgkJCQlhZGRfc3VibWVudV9wYWdlKCAkbWVudV9zbHVnLCBzZWxmOjpzZXR0aW5ncyggJ25hbWUnICkgLiAnICZsc2FxdW87ICcgLiAkcGFnZV90aXRsZV9hbHQsICRwYWdlX3RpdGxlX2FsdCwgJHBhZ2VbJ2NhcGFiaWxpdHknXSwgJG1lbnVfc2x1ZywgYXJyYXkoICZzZWxmOjokX3BhZ2VzLCAkcGFnZVsnc2x1ZyddICkgKTsgLy8gQWxsb3dzIG5hbWluZyBvZiBmaXJzdCBzdWJtZW51IGl0ZW0gZGlmZmVyZW50bHkgZnJvbSB0aGUgcGFyZW50LiBFbHNlIGl0cyBhdXRvIGNyZWF0ZWQgd2l0aCBzYW1lIG5hbWUuCgkJCX0gZWxzZSB7IC8vIFN1Yi1tZW51LgoJCQkJYWRkX3N1Ym1lbnVfcGFnZSggJHBhcmVudF9zbHVnLCBzZWxmOjpzZXR0aW5ncyggJ25hbWUnICkgLiAnICZsc2FxdW87ICcgLiAkcGFnZV90aXRsZSwgJHBhZ2VfdGl0bGUsICRwYWdlWydjYXBhYmlsaXR5J10sICRtZW51X3NsdWcsIGFycmF5KCAmc2VsZjo6JF9wYWdlcywgJHBhZ2VbJ3NsdWcnXSApICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCByZWdpc3Rlcl9hZG1pbl9tZW51KCkuCgkKCQoJCgkvKglzZWxmOjphZGRfYWN0aW9uKCkKCSAqCQoJICoJUmVnaXN0ZXJzIGEgV29yZFByZXNzIGFjdGlvbi4gQWN0aW9uIG9mIHRoZSBuYW1lICR0YWcgd2lsbCBjYWxsIHRoZSBtZXRob2QgaW4gL2NvbnRyb2xsZXJzL2FjdGlvbnMucGhwIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nL2FycmF5CSR0YWcJCQkJVGFnIC8gc2x1ZyBmb3IgdGhlIGFjdGlvbi4gSWYgYW4gYXJyYXkgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHRhZywgdGhlIHNlY29uZCBpcyBhbiBvcHRpb25hbCBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkgKglAcGFyYW0JCWludAkJCQkkcHJpb3JpdHkJCQlJbnRlZ2VyIHByaW9yaXR5IG51bWJlciBmb3IgdGhlIGFjdGlvbi4KCSAqCUBwYXJhbQkJaW50CQkJCSRhY2NlcHRlZF9hcmdzCQlOdW1iZXIgb2YgYXJndW1lbnRzIHRoaXMgYWN0aW9uIG1heSBhY2NlcHQgaW4gaXRzIG1ldGhvZC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfYWN0aW9uKCAkdGFnLCAkcHJpb3JpdHkgPSAxMCwgJGFjY2VwdGVkX2FyZ3MgPSAxICkgewoJCWlmICggIWlzX29iamVjdCggc2VsZjo6JF9hY3Rpb25zICkgKSB7IHNlbGY6Ol9pbml0X2NvcmVfY29udHJvbGxlciggJ2FjdGlvbnMnICk7IH0KCQlpZiAoIGlzX2FycmF5KCAkdGFnICkgKSB7IC8vIElmIGFycmF5IHRoZW4gZmlyc3QgcGFyYW0gaXMgdGFnLCBzZWNvbmQgcGFyYW0gaXMgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZ1sxXTsKCQkJJHRhZyA9ICR0YWdbMF07CgkJfSBlbHNlIHsgLy8gTm8gY3VzdG9tIG1ldGhvZCBuYW1lIHNvIHRhZyBhbmQgY2FsbGJhY2sgbWV0aG9kIG5hbWUgYXJlIHRoZSBzYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZzsKCQkJaWYgKCBzdHJwb3MoICR0YWcsICcuJyApICE9PSBmYWxzZSApIHsKCQkJCWVjaG8gJ3tXYXJuaW5nOiBZb3VyIHRhZyBjb250YWlucyBkaXNhbGxvd2VkIGNoYXJhY3RlcnMuIFRhZyBuYW1lcyBhcmUgZXF1YWwgdG8gdGhlIFBIUCBtZXRob2QgdGhhdCBpcyBjYWxsZWQgYmFjayBzbyB0aGV5IG11c3QgY29uZm9ybSB0byBQSFAgbWV0aG9kIG5hbWUgc3RhbmRhcmRzLiBGb3IgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lcyB1c2UgYW4gYXJyYXkgZm9yIHRoZSB0YWcgcGFyYW1ldGVyIGluIHRoZSBmb3JtOiBhcnJheSggXCd0YWdcJywgXCdjYWxsYmFja19uYW1lXCcgKS59JzsKCQkJfQoJCX0KCQlhZGRfYWN0aW9uKCAkdGFnLCBhcnJheSggJnNlbGY6OiRfYWN0aW9ucywgJGNhbGxiYWNrX21ldGhvZCApLCAkcHJpb3JpdHksICRhY2NlcHRlZF9hcmdzICk7Cgl9IC8vIEVuZCBhZGRfYWN0aW9uKCkuCgkKCQoJCgkvKglzZWxmOjphZGRfYWpheCgpCgkgKgkKCSAqCVJlZ2lzdGVycyBhIFdvcmRQcmVzcyBhamF4IGFjdGlvbi4gQWpheCBhY3Rpb24gb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvYWpheC5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcvYXJyYXkJCSR0YWcJCQkJVGFnIC8gc2x1ZyBmb3IgdGhlIGFjdGlvbi4gSWYgYW4gYXJyYXkgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHRhZywgdGhlIHNlY29uZCBpcyBhbiBvcHRpb25hbCBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkX2FqYXgoICR0YWcgKSB7CgkJaWYgKCAhaXNfb2JqZWN0KCBzZWxmOjokX2FqYXggKSApIHsgc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnYWpheCcgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9hY3Rpb24oICd3cF9hamF4X3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXycgLiAkdGFnLCBhcnJheSggJnNlbGY6OiRfYWpheCwgJGNhbGxiYWNrX21ldGhvZCApICk7Cgl9IC8vIEVuZCBhZGRfYWpheCgpLgoJCgkKCQoJLyoJc2VsZjo6YWRkX2Nyb24oKQoJICoJCgkgKglSZWdpc3RlcnMgYSBXb3JkUHJlc3MgY3JvbiBjYWxsYmFjayAodGVjaG5pY2FsbHkgYW4gYWN0aW9uKS4gQ3JvbiBhY3Rpb24gb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvY3Jvbi5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCgkgKglAcGFyYW0JCXN0cmluZy9hcnJheQkkdGFnCQkJCVRhZyAvIHNsdWcgZm9yIHRoZSBjcm9uIGFjdGlvbi4gSWYgYW4gYXJyYXkgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHRhZywgdGhlIHNlY29uZCBpcyBhbiBvcHRpb25hbCBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkgKglAcGFyYW0JCWludAkJCQkkcHJpb3JpdHkJCQlJbnRlZ2VyIHByaW9yaXR5IG51bWJlciBmb3IgdGhlIGNyb24gYWN0aW9uLgoJICoJQHBhcmFtCQlpbnQJCQkJJGFjY2VwdGVkX2FyZ3MJCU51bWJlciBvZiBhcmd1bWVudHMgdGhpcyBhY3Rpb24gbWF5IGFjY2VwdCBpbiBpdHMgbWV0aG9kLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9jcm9uKCAkdGFnLCAkcHJpb3JpdHkgPSAxMCwgJGFjY2VwdGVkX2FyZ3NfbnVtID0gMSApIHsKCQlpZiAoICFpc19vYmplY3QoIHNlbGY6OiRfY3JvbiApICkgeyBzZWxmOjpfaW5pdF9jb3JlX2NvbnRyb2xsZXIoICdjcm9uJyApOyB9CgkJaWYgKCBpc19hcnJheSggJHRhZyApICkgeyAvLyBJZiBhcnJheSB0aGVuIGZpcnN0IHBhcmFtIGlzIHRhZywgc2Vjb25kIHBhcmFtIGlzIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCQkJJGNhbGxiYWNrX21ldGhvZCA9ICR0YWdbMV07CgkJCSR0YWcgPSAkdGFnWzBdOwoJCX0gZWxzZSB7IC8vIE5vIGN1c3RvbSBtZXRob2QgbmFtZSBzbyB0YWcgYW5kIGNhbGxiYWNrIG1ldGhvZCBuYW1lIGFyZSB0aGUgc2FtZS4KCQkJJGNhbGxiYWNrX21ldGhvZCA9ICR0YWc7CgkJCWlmICggc3RycG9zKCAkdGFnLCAnLicgKSAhPT0gZmFsc2UgKSB7CgkJCQllY2hvICd7V2FybmluZzogWW91ciB0YWcgY29udGFpbnMgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLiBUYWcgbmFtZXMgYXJlIGVxdWFsIHRvIHRoZSBQSFAgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJhY2sgc28gdGhleSBtdXN0IGNvbmZvcm0gdG8gUEhQIG1ldGhvZCBuYW1lIHN0YW5kYXJkcy4gRm9yIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZXMgdXNlIGFuIGFycmF5IGZvciB0aGUgdGFnIHBhcmFtZXRlciBpbiB0aGUgZm9ybTogYXJyYXkoIFwndGFnXCcsIFwnY2FsbGJhY2tfbmFtZVwnICkufSc7CgkJCX0KCQl9CgkJYWRkX2FjdGlvbiggc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nIC4gJHRhZywgYXJyYXkoICZzZWxmOjokX2Nyb24sICRjYWxsYmFja19tZXRob2QgKSwgJHByaW9yaXR5LCAkYWNjZXB0ZWRfYXJnc19udW0gKTsKCX0gLy8gRW5kIGFkZF9jcm9uKCkuCgkKCQoJCgkvKglzZWxmOjphZGRfZGFzaGJvYXJkX3dpZGdldCgpCgkgKgkKCSAqCVJlZ2lzdGVycyBhIFdvcmRQcmVzcyBhY3Rpb24uIEFjdGlvbiBvZiB0aGUgbmFtZSAkdGFnIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIC9jb250cm9sbGVycy9kYXNoYm9hcmQucGhwIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nL2FycmF5CSR0YWcJCQkJVGFnIC8gc2x1ZyBmb3IgdGhlIGFjdGlvbi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHRpdGxlCQkJCURhc2hib2FyZCB3aWRnZXQgdGl0bGUuCgkgKglAcGFyYW0JCXN0cmluZwkJCSRjYXBhYmlsaXR5CQkJUmVxdWlyZWQgY2FwYWJpbGl0eSB0byBkaXNwbGF5LiBBbHNvIGFjY2VwdHMgYGdvZG1vZGVgIHRvIG9ubHkgYWxsb3cgc3VwZXJhZG1pbnMgaW4gbXVsdGlzaXRlIGFuZCBhZG1pbnMgaW4gc3RhbmRhbG9uZS4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJCSRhY2NlcHRlZF9hcmdzCQlOdW1iZXIgb2YgYXJndW1lbnRzIHRoaXMgYWN0aW9uIG1heSBhY2NlcHQgaW4gaXRzIG1ldGhvZC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfZGFzaGJvYXJkX3dpZGdldCggJHRhZywgJHRpdGxlLCAkY2FwYWJpbGl0eSwgJGZvcmNlX3RvcCA9IGZhbHNlICkgewoJCWlmICggIWlzX29iamVjdCggc2VsZjo6JF9kYXNoYm9hcmQgKSApIHsKCQkJc2VsZjo6JF9kYXNoYm9hcmRfd2lkZ2V0cyA9IGFycmF5KCk7IC8vIEluaXQgdmFyaWFibGUuCgoJCQlzZWxmOjpfaW5pdF9jb3JlX2NvbnRyb2xsZXIoICdkYXNoYm9hcmQnICk7CgkJCQoJCQlpZiAoIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgLy8gTmV0d29yayBhZG1pbi4KCQkJCWFkZF9hY3Rpb24oICd3cF9uZXR3b3JrX2Rhc2hib2FyZF9zZXR1cCcsIGFycmF5KCAmc2VsZjo6JF9kYXNoYm9hcmQsICdyZWdpc3Rlcl93aWRnZXRzJyApICk7CgkJCX0gZWxzZSB7IC8vIE5vcm1hbCBhZG1pbi4KCQkJCWFkZF9hY3Rpb24oICd3cF9kYXNoYm9hcmRfc2V0dXAnLCBhcnJheSggJnNlbGY6OiRfZGFzaGJvYXJkLCAncmVnaXN0ZXJfd2lkZ2V0cycgKSApOwoJCQl9CgkJfQoJCXNlbGY6OiRfZGFzaGJvYXJkX3dpZGdldHNbXSA9IGFycmF5KCAndGFnJyA9PiAkdGFnLCAndGl0bGUnID0+ICR0aXRsZSwgJ2NhcGFiaWxpdHknID0+ICRjYXBhYmlsaXR5LCAnZm9yY2VfdG9wJyA9PiAkZm9yY2VfdG9wICk7IC8vIFB1c2ggaW50byBhcnJheSB0byBiZSBsYXRlciByZWdpc3RlcmVkIHZpYSBkYXNoYm9hcmQgY29udHJvbGxlcidzIHJlZ2lzdGVyX3dpZGdldHMgZnVuY3Rpb24uCgl9IC8vIEVuZCBhZGRfZGFzaGJvYXJkX3dpZGdldCgpLgoJCgkKCQoJLyoJc2VsZjo6YWRkX2ZpbHRlcigpCgkgKgkKCSAqCVJlZ2lzdGVycyBhIFdvcmRQcmVzcyBmaWx0ZXIuIEZpbHRlciBvZiB0aGUgbmFtZSAkdGFnIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIC9jb250cm9sbGVycy9maWx0ZXJzLnBocCB3aXRoIHRoZSBtYXRjaGluZyBuYW1lLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZy9hcnJheQkJJHRhZwkJCQlUYWcgLyBzbHVnIGZvciB0aGUgYWN0aW9uLiBJZiBhbiBhcnJheSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgdGFnLCB0aGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCSAqCUBwYXJhbQkJaW50CQkJCSRwcmlvcml0eQkJCUludGVnZXIgcHJpb3JpdHkgbnVtYmVyIGZvciB0aGUgZmlsdGVyLgoJICoJQHBhcmFtCQlpbnQJCQkJJGFjY2VwdGVkX2FyZ3MJCU51bWJlciBvZiBhcmd1bWVudHMgdGhpcyBmaWx0ZXIgbWF5IGFjY2VwdCBpbiBpdHMgbWV0aG9kLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9maWx0ZXIoICR0YWcsICRwcmlvcml0eSA9IDEwLCAkYWNjZXB0ZWRfYXJncyA9IDEgKSB7CgkJaWYgKCAhaXNfb2JqZWN0KCBzZWxmOjokX2ZpbHRlcnMgKSApIHsgc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnZmlsdGVycycgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9maWx0ZXIoICR0YWcsIGFycmF5KCAmc2VsZjo6JF9maWx0ZXJzLCAkY2FsbGJhY2tfbWV0aG9kICksICRwcmlvcml0eSwgJGFjY2VwdGVkX2FyZ3MgKTsKCX0gLy8gRW5kIGFkZF9maWx0ZXIoKS4KCQoJCgkKCS8qCXNlbGY6OmFkZF9zaG9ydGNvZGUoKQoJICoJCgkgKglSZWdpc3RlcnMgYSBXb3JkUHJlc3Mgc2hvcnRjb2RlLiBTaG9ydGNvZGUgb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvc2hvcnRjb2Rlcy5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcvYXJyYXkJCSR0YWcJCQkJVGFnIC8gc2x1ZyBmb3IgdGhlIHNob3J0Y29kZS4gSWYgYW4gYXJyYXkgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHRhZywgdGhlIHNlY29uZCBpcyBhbiBvcHRpb25hbCBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkgKglAcmV0dXJuCQkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfc2hvcnRjb2RlKCAkdGFnICkgewoJCWlmICggIWlzX29iamVjdCggc2VsZjo6JF9zaG9ydGNvZGVzICkgKSB7IHNlbGY6Ol9pbml0X2NvcmVfY29udHJvbGxlciggJ3Nob3J0Y29kZXMnICk7IH0KCQlpZiAoIGlzX2FycmF5KCAkdGFnICkgKSB7IC8vIElmIGFycmF5IHRoZW4gZmlyc3QgcGFyYW0gaXMgdGFnLCBzZWNvbmQgcGFyYW0gaXMgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZ1sxXTsKCQkJJHRhZyA9ICR0YWdbMF07CgkJfSBlbHNlIHsgLy8gTm8gY3VzdG9tIG1ldGhvZCBuYW1lIHNvIHRhZyBhbmQgY2FsbGJhY2sgbWV0aG9kIG5hbWUgYXJlIHRoZSBzYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZzsKCQkJaWYgKCBzdHJwb3MoICR0YWcsICcuJyApICE9PSBmYWxzZSApIHsKCQkJCWVjaG8gJ3tXYXJuaW5nOiBZb3VyIHRhZyBjb250YWlucyBkaXNhbGxvd2VkIGNoYXJhY3RlcnMuIFRhZyBuYW1lcyBhcmUgZXF1YWwgdG8gdGhlIFBIUCBtZXRob2QgdGhhdCBpcyBjYWxsZWQgYmFjayBzbyB0aGV5IG11c3QgY29uZm9ybSB0byBQSFAgbWV0aG9kIG5hbWUgc3RhbmRhcmRzLiBGb3IgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lcyB1c2UgYW4gYXJyYXkgZm9yIHRoZSB0YWcgcGFyYW1ldGVyIGluIHRoZSBmb3JtOiBhcnJheSggXCd0YWdcJywgXCdjYWxsYmFja19uYW1lXCcgKS59JzsKCQkJfQoJCX0KCQlhZGRfc2hvcnRjb2RlKCAkdGFnLCBhcnJheSggJnNlbGY6OiRfc2hvcnRjb2RlcywgJGNhbGxiYWNrX21ldGhvZCApICk7Cgl9IC8vIEVuZCBhZGRfc2hvcnRjb2RlKCkuCgkKCQoJCgkvKglzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoKQoJICoJCgkgKglSZWdpc3RlcnMgdGhlIFVJIGNsYXNzIGludG8gdGhlIHBsdWdpbmJ1ZGR5IGZyYW1ld29yayBmb3IgcGFnZXMuIFJlZ2lzdGVyZWQgb24gZGVtYW5kIGJ5IHBhZ2VzIGNvbnRyb2xsZXIuCgkgKglAc2VlIHBhZ2VzIGNvbnRyb2xsZXIKCSAqCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5pdF9jbGFzc19jb250cm9sbGVyKCAkY2xhc3Nfc2x1ZyApIHsKCQlpZiAoICFpc19vYmplY3QoIHNlbGY6OiQkY2xhc3Nfc2x1ZyApICkgewoJCQkkY2xhc3NfZmlsZSA9IHNlbGY6OnBsdWdpbl9wYXRoKCkgLiAnL3BsdWdpbmJ1ZGR5L2NsYXNzZXMvJyAuICRjbGFzc19zbHVnIC4gJy5waHAnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkY2xhc3NfZmlsZSApICkgewoJCQkJcmVxdWlyZV9vbmNlKCAkY2xhc3NfZmlsZSApOwoJCQkJJGNsYXNzX25hbWUgPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICRjbGFzc19zbHVnOwoJCQkJc2VsZjo6JCRjbGFzc19zbHVnID0gbmV3ICRjbGFzc19uYW1lKCk7CgkJCX0gZWxzZSB7CgkJCQllY2hvICd7RXJyb3I6IE1pc3NpbmcgY2xhc3MgY29udHJvbGxlciBmaWxlIGAnIC4gJGNsYXNzX2ZpbGUgLiAnYC59JzsKCQkJfQoJCX0KCX0KCQoJCgkKCS8qCXNlbGY6Ol9pbml0X2NvcmVfY29udHJvbGxlcigpCgkgKgkKCSAqCUluaXRpYWxpemUgYSBjb3JlIGNvbnRyb2xsZXIgY2xhc3MgKGV4OiBwYWdlcywgYWpheCwgZmlsdGVycywgZXRjKSBmb3IgcGx1Z2luYnVkZHkgZnJhbWV3b3JrIHVzYWdlLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCU5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgdG8gcmVnaXN0ZXIuIFZhbGlkIGNvbnRyb2xsZXJzOiBhY3Rpb25zLCBhamF4LCBjcm9uLCBkYXNoYm9hcmQsIGZpbHRlcnMsIHNob3J0Y29kZXMsIHBhZ2VzLgoJICoJQHJldHVybgkJCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9pbml0X2NvcmVfY29udHJvbGxlciggJG5hbWUgKSB7CgkJaWYgKCAhaXNfYXJyYXkoIHNlbGY6OiRvcHRpb25zICkgKSB7IHNlbGY6OmxvYWQoKTsgfSAvLyBBc3N1bWUgd2UgbmVlZCBwbHVnaW4gb3B0aW9ucyBuZWVkIGxvYWRlZCBpZiBjb250cm9sbGVycyBhcmUgbG9hZGVkIGZvciB0aGlzIHNlc3Npb24uCgkJCgkJcmVxdWlyZV9vbmNlKCBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy9jb250cm9sbGVycy8nIC4gJG5hbWUgLiAnLnBocCcgKTsKCQkkY2xhc3NuYW1lID0gJ3BiX2JhY2t1cGJ1ZGR5XycgLiAkbmFtZTsKCQkkaW50ZXJuYWxfY2xhc3NuYW1lID0gJ18nIC4gJG5hbWU7CgkJc2VsZjo6JCRpbnRlcm5hbF9jbGFzc25hbWUgPSBuZXcgJGNsYXNzbmFtZSgpOwoJfSAvLyBFbmQgX2luaXRfY29yZV9jb250cm9sbGVyKCkuCgkKCQoJCgkvKglzZWxmOjpub25jZSgpCgkgKgkKCSAqCUVjaG9zIG9yIHJldHVybnMgYSBXb3JkUHJlc3Mgbm9uY2UgZm9yIHRoZSBmcmFtZXdvcmsuIEhhbmRsZXMgcHJlZml4aW5nLiBVc2Ugd2l0aCBmb3JtcyBmb3Igc2VjdXJpdHkuIFZlcmlmaWVzIHRoZSB1c2VyIGNhbWUgZnJvbSBhIFdQIGdlbmVyYXRlZCBwYWdlLgoJICoJCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQlUcnVlOiBlY2hvcyB0aGUgbm9uZTsgZmFsc2U6IHJldHVybnMgbm9uY2UuCgkgKglAcmV0dXJuCQludWxsL3N0cmluZwkJCQlSZXR1cm5zIG51bGwgb3Igc3RyaW5nIGJhc2VkIG9uICRlY2hvIHZhbHVlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vbmNlKCAkZWNobyA9IHRydWUgKSB7CgkJcmV0dXJuIHdwX25vbmNlX2ZpZWxkKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSAuICctbm9uY2UnLCAnX3dwbm9uY2UnLCB0cnVlLCAkZWNobyApOwoJfSAvLyBFbmQgbm9uY2UoKS4KCQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9uY2VfdXJsKCAkYmFyZV91cmwgKSB7CgkJcmV0dXJuIHdwX25vbmNlX3VybCggJGJhcmVfdXJsLCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSAuICctbm9uY2UnICk7Cgl9CgkKCQoJLyoJc2VsZjo6dmVyaWZ5X25vbmNlKCkKCSAqCQoJICoJVmVyaWZpZXMgdGhlIG5vbmNlIHN1Ym1pdHRlZCBpbiBmb3JtLgoJICoJCgkgKglAcmV0dXJuCQludWxsL3RydWUJCVNjcmlwdCBkaWUoKSdzIG9uIGZhaWx1cmUsIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZlcmlmeV9ub25jZSgpIHsKCQljaGVja19hZG1pbl9yZWZlcmVyKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSAuICctbm9uY2UnICk7Cgl9IC8vIEVuZCB2ZXJpZnlfbm9uY2UoKS4KCQoJCgkKCS8qCXNlbGY6OmxvYWRfc2NyaXB0KCkKCSAqCQoJICoJTG9hZCBhIEphdmFTY3JpcHQgZmlsZSBpbnRvIHRoZSBwYWdlLiBIYW5kbGVzIHByZWZpeGVkLCBlbnF1ZXVpbmcsIGV0Yy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzY3JpcHQJCQlJZiBhIC5qcyBmaWxlIGlzIGluY2x1ZGVkIHRoZW4gYSBmaWxlIGluIHRoZSBqcyBkaXJlY3RvcnkgaXMgbG9hZGVkOyBlbHNlIGxvYWRzIGEgYnVpbHQtaW4gbmFtZWQgbGlicmFyeSBzY3JpcHQuCgkgKgkJCQkJCQkJCQkJRXg6IGxvYWRfc2NyaXB0KCAnc29ydC5qcycgKSB3aWxsIGxvYWQgL3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4vanMvc29ydC5qczsgbG9hZF9zY3JpcHQoICdqcXVlcnknICkgd2lsbCBsb2FkIGludGVybmFsIGpxdWVyeSBsaWJyYXJ5IGluIFdvcmRQcmVzcyBpZiBpdCBleGlzdHMuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRjb3JlX3NjcmlwdAlJZiB0cnVlIHNjcmlwdHMgYXJlIGxvYWRlZCBmcm9tIC9wbHVnaW5idWRkeS9qcy9TQ1JJUFQuanMuIEVsc2Ugc2NyaXB0cyBsb2FkZWQgZnJvbSBwbHVnaW4ncyBqcyBkaXJlY3RvcnkuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF9zY3JpcHQoICRzY3JpcHQsICRjb3JlX3NjcmlwdCA9IGZhbHNlICkgewoJCWlmICggc3Ryc3RyKCAkc2NyaXB0LCAnLmpzJyApICkgeyAvLyBMb2FkaW5nIGEgZmlsZSBzcGVjaWZpY2FsbHkuCgkJCWlmICggJGNvcmVfc2NyaXB0ID09PSB0cnVlICkgewoJCQkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiBQQl9TVEFOREFMT05FID09PSB0cnVlICkgewoJCQkJCSR1cmxfcGF0aCA9ICdpbXBvcnRidWRkeS9wbHVnaW5idWRkeS9qcy8nOwoJCQkJfSBlbHNlIHsKCQkJCQkkdXJsX3BhdGggPSBzZWxmOjokX3BsdWdpbl91cmwgLiAnL3BsdWdpbmJ1ZGR5L2pzLyc7CgkJCQl9CgkJCQkkbG9jYWxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL3BsdWdpbmJ1ZGR5L2pzLyc7CgkJCQkkc2NyaXB0X25hbWUgPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfY29yZV8nIC4gJHNjcmlwdDsKCQkJfSBlbHNlIHsKCQkJCWlmICggZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgUEJfU1RBTkRBTE9ORSA9PT0gdHJ1ZSApIHsKCQkJCQkkdXJsX3BhdGggPSAnaW1wb3J0YnVkZHkvanMvJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHVybF9wYXRoID0gc2VsZjo6JF9wbHVnaW5fdXJsIC4gJy9qcy8nOwoJCQkJfQoJCQkJJGxvY2FsX3BhdGggPSBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy9qcy8nOwoJCQkJJHNjcmlwdF9uYW1lID0gJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXycgLiAkc2NyaXB0OwoJCQl9CgkJCQoJCQlpZiAoICF3cF9zY3JpcHRfaXMoICRzY3JpcHRfbmFtZSApICkgeyAvLyBPbmx5IGxvYWQgc2NyaXB0IG9uY2UuCgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkbG9jYWxfcGF0aCAuICRzY3JpcHQgKSApIHsgLy8gTG9hZCBvdXIgbG9jYWwgc2NyaXB0IGlmIGZpbGUgZXhpc3RzLgoJCQkJCXdwX2VucXVldWVfc2NyaXB0KCAkc2NyaXB0X25hbWUsICR1cmxfcGF0aCAuICRzY3JpcHQsIGFycmF5KCksIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgKTsKCQkJCQl3cF9wcmludF9zY3JpcHRzKCAkc2NyaXB0X25hbWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJZWNobyAne0Vycm9yOiBKYXZhc2NyaXB0IGZpbGUgd2FzIHNldCB0byBsb2FkIHRoYXQgZGlkIG5vdCBleGlzdDogYCcgLiAkdXJsX3BhdGggLiAkc2NyaXB0IC4gJ2B9JzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7IC8vIE5vdCBhIHNwZWNpZmljIGZpbGUuCgkJCWlmICggIXdwX3NjcmlwdF9pcyggJHNjcmlwdCwgJ2RvbmUnICkgKSB7IC8vIE9ubHkgUFJJTlQgc2NyaXB0IG9uY2UuIENoZWNrcyB0aGUgZG9uZSB3cHNjcmlwdCBsaXN0IHRvIHNlZSBpZiBpdCdzIGJlZW4gcHJpbnRlZCB5ZXQgb3Igbm90LgoJCQkJd3BfZW5xdWV1ZV9zY3JpcHQoICRzY3JpcHQgKTsKCQkJCXdwX3ByaW50X3NjcmlwdHMoICRzY3JpcHQgKTsKCQkJfQoJCX0KCX0gLy8gRW5kIGxvYWRfc2NyaXB0KCkuCgkKCQoJCgkvKglzZWxmOjpsb2FkX3N0eWxlKCkKCSAqCQoJICoJTG9hZCBhIENTUyBmaWxlIGludG8gdGhlIHBhZ2UuIEhhbmRsZXMgcHJlZml4ZWQsIGVucXVldWluZywgZXRjLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHN0eWxlCQkJSWYgYSAuY3NzIGZpbGUgaXMgaW5jbHVkZWQgdGhlbiBhIGZpbGUgaW4gdGhlIGNzcyBkaXJlY3RvcnkgaXMgbG9hZGVkOyBlbHNlIGxvYWRzIGEgYnVpbHQtaW4gbmFtZWQgbGlicmFyeSBzdHlsZS4KCSAqCQkJCQkJCQkJCQlFeDogbG9hZF9zdHlsZSggJ3NvcnQuY3NzJyApIHdpbGwgbG9hZCAvd3AtY29udGVudC9wbHVnaW5zL215X3BsdWdpbi9jc3Mvc29ydC5jc3M7IGxvYWRfc3R5bGUoICdkYXNoYm9hcmQnICkgd2lsbCBsb2FkIGludGVybmFsIGRhc2hib2FyZCBjc3MgaW4gV29yZFByZXNzIGlmIGl0IGV4aXN0cy4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGNvcmVfc3R5bGUJCUlmIHRydWUgc3R5bGVzIGFyZSBsb2FkZWQgZnJvbSAvcGx1Z2luYnVkZHkvY3NzL1NUWUxFLmNzcy4gRWxzZSBzdHlsZXMgbG9hZGVkIGZyb20gcGx1Z2luJ3MgY3NzIGRpcmVjdG9yeS4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkX3N0eWxlKCAkc3R5bGUsICRjb3JlX3N0eWxlID0gZmFsc2UgKSB7CgkJaWYgKCBzdHJzdHIoICRzdHlsZSwgJy5jc3MnICkgKSB7IC8vIExvYWRpbmcgYSBmaWxlIHNwZWNpZmljYWxseS4KCQkJaWYgKCAkY29yZV9zdHlsZSA9PT0gdHJ1ZSApIHsKCQkJCWlmICggZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgUEJfU1RBTkRBTE9ORSA9PT0gdHJ1ZSApIHsKCQkJCQkkdXJsX3BhdGggPSAnaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHkvY3NzLyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3VybCAuICcvcGx1Z2luYnVkZHkvY3NzLyc7CgkJCQl9CgkJCQkkbG9jYWxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL3BsdWdpbmJ1ZGR5L2Nzcy8nOwoJCQkJJGNvcmVfdHlwZSA9ICdjb3JlJzsKCQkJfSBlbHNlIHsKCQkJCWlmICggZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgUEJfU1RBTkRBTE9ORSA9PT0gdHJ1ZSApIHsKCQkJCQkkdXJsX3BhdGggPSAnaW1wb3J0YnVkZHkvY3NzLyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3VybCAuICcvY3NzLyc7CgkJCQl9CgkJCQkkbG9jYWxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL2Nzcy8nOwoJCQkJJGNvcmVfdHlwZSA9ICdub25jb3JlJzsKCQkJfQoJCQkkc3R5bGVfbmFtZSA9ICdwYl8nIC4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nIC4gJGNvcmVfdHlwZSAuICdfJyAuICRzdHlsZTsKCQkJaWYgKCAhd3Bfc3R5bGVfaXMoICRzdHlsZV9uYW1lICkgKSB7IC8vIE9ubHkgbG9hZCBzdHlsZSBvbmNlLgoJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGxvY2FsX3BhdGggLiAkc3R5bGUgKSApIHsgLy8gTG9hZCBvdXIgbG9jYWwgc3R5bGUgaWYgZmlsZSBleGlzdHMuCgkJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJHN0eWxlX25hbWUsICR1cmxfcGF0aCAuICRzdHlsZSwgYXJyYXkoKSwgcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSApOwoJCQkJCXdwX3ByaW50X3N0eWxlcyggJHN0eWxlX25hbWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJZWNobyAne0Vycm9yOiBDU1MgZmlsZSB3YXMgc2V0IHRvIGxvYWQgdGhhdCBkaWQgbm90IGV4aXN0OiBgJyAuICR1cmxfcGF0aCAuICRzdHlsZSAuICdgfSc7CgkJCQl9CgkJCX0KCQl9IGVsc2UgeyAvLyBOb3QgYSBzcGVjaWZpYyBmaWxlLgoJCQlpZiAoICF3cF9zdHlsZV9pcyggJHN0eWxlICkgKSB7IC8vIE9ubHkgbG9hZCBzdHlsZSBvbmNlLgoJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJHN0eWxlICk7CgkJCQl3cF9wcmludF9zdHlsZXMoICRzdHlsZSApOwoJCQl9CgkJfQoJfSAvLyBFbmQgbG9hZF9zdHlsZSgpLgoJCgkKCQoJLyoJc2VsZjo6bG9hZF92aWV3KCkKCSAqCQoJICoJTG9hZHMgYSB2aWV3LiBUeXBpY2FsbHkgY2FsbGVkIGZyb20gd2l0aGluIGEgY29udHJvbGxlci4gRGF0YSBwYXNzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHdpbGwgaGFzIGV4dHJhY3QoKSByYW4gb24gaXQgd2l0aGluIHRoZSB2aWV3IGZvciBlYXN5IHZhcmlhYmxlIGFjY2Vzcy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSR2aWV3X25hbWUJCQkJTmFtZSBvZiB2aWV3LiBDb3JyZXNwb25kcyB0byB0aGUgdmlldyBmaWxlbmFtZTogL3ZpZXdzL3ZpZXdfbmFtZS5waHAKCSAqCUBwYXJhbQkJYXJyYXkJCSRwbHVnaW5idWRkeV9kYXRhCQlBcnJheSBvZiB2YXJpYWJsZXMgdG8gYmUgZXh0cmFjdGVkIGZvciB1c2UgYnkgdGhlIHZpZXcuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF92aWV3KCAkdmlld19uYW1lLCAkcGx1Z2luYnVkZHlfZGF0YSA9IGFycmF5KCkgKSB7CgkJJHBsdWdpbmJ1ZGR5X3ZpZXdfZmlsZSA9IHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnL3ZpZXdzLycgLiAkdmlld19uYW1lIC4gJy5waHAnOyAvLyBWYXJpYWJsZSBuYW1lZCB0aGlzIHdheSBhcyB0aGUgaW5jbHVkZWQgZmlsZSBpbmhlcml0cyB0aGlzIHZhcmlhYmxlIGFuZCB3ZSBkb24ndCB3YW50IGFuIGFjY2lkZW50YWwgY29sbGlzaW9uLgoJCWlmICggZmlsZV9leGlzdHMoICRwbHVnaW5idWRkeV92aWV3X2ZpbGUgKSApIHsKCQkJdW5zZXQoICR2aWV3X25hbWUgKTsKCQkJaWYgKCBpc19hcnJheSggJHBsdWdpbmJ1ZGR5X2RhdGEgKSApIHsKCQkJCWV4dHJhY3QoICRwbHVnaW5idWRkeV9kYXRhICk7CgkJCX0gZWxzZSB7CgkJCQllY2hvICd7V2FybmluZzogRGF0YSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHZpZXcgd2FzIG5vdCBhbiBhcnJheS59JzsKCQkJfQoJCQkvL2dsb2JhbCAkZGlvbnlzdXNfY29udHJvbGxlcjsgLy8gR2l2ZXMgdGhlIHZpZXcgdGhlIGFiaWxpdHkgdG8gYWNjZXNzIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIGNvbnRyb2xsZXIgaWYgbmVlZGVkLgoJCQlyZXF1aXJlICRwbHVnaW5idWRkeV92aWV3X2ZpbGU7CgkJfSBlbHNlIHsKCQkJZWNobyAne0lOVkFMSUQgVklFVzogYCcgLiAkdmlld19uYW1lIC4gJ2A7IGZpbGUgbm90IGZvdW5kLn0nOwoJCX0KCX0gLy8gRW5kIGxvYWRfdmlldygpLgoJCgkKCQoJLyoJc2VsZjo6bG9hZF9jb250cm9sbGVyKCkKCSAqCQoJICoJTG9hZHMgYSBjb250cm9sbGVyLiBDb250cm9sbGVycyBtYXkgbG9hZCBjb250cm9sbGVycy4gQ29udHJvbGxlciB1c2VzIHJlcXVpcmVfb25jZSB0byBhdm9pZCBwcm9ibGVtcy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRjb250cm9sbGVyCQkJCU5hbWUgb2YgY29udHJvbGxlci4gQ29ycmVzcG9uZHMgdG8gdGhlIGNvbnRyb2xsZXIgZmlsZW5hbWU6IC9jb250cm9sbGVycy9jb250cm9sbGVyX25hbWUucGhwCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF9jb250cm9sbGVyKCAkY29udHJvbGxlciApIHsKCQkvLyBVc2luZyB0aGlzIG1ldGhvZCBzbyBsb2FkX2NvbnRyb2xsZXIoKSBtYXkgYmUgdXNlZCBhbnl3aGVyZS4KCQlpZiAoIGZpbGVfZXhpc3RzKCBzZWxmOjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy8nIC4gJGNvbnRyb2xsZXIgLiAnLnBocCcgKSApIHsKCQkJcmVxdWlyZV9vbmNlKCBzZWxmOjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy8nIC4gJGNvbnRyb2xsZXIgLiAnLnBocCcgKTsKCQl9IGVsc2UgewoJCQllY2hvICd7RXJyb3I6IFVuYWJsZSB0byBsb2FkIHBhZ2UgY29udHJvbGxlciBgJyAuICRjb250cm9sbGVyIC4gJ2A7IGZpbGUgbm90IGZvdW5kLn0nOwoJCX0KCX0gLy8gRW5kIGxvYWRfY29udHJvbGxlcigpLgoJCgkKCQoJLyoJc2VsZjo6cmVnaXN0ZXJfd2lkZ2V0KCkKCSAqCQoJICoJUmVnaXN0ZXJzIGEgd2lkZ2V0LiBXaWxsIHJlZ2lzdGVyIHdpZGdldCBjbGFzcyBpbiAvY29udHJvbGxlcnMvd2lkZ2V0L3NsdWcucGhwLiBXaWRnZXQgY2xhc3MgZXh0ZW5kIFdQX1dpZGdldHMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2x1ZwkJTmFtZSAvIHNsdWcgZm9yIHdpZGdldC4gTXVzdCBtYXRjaCBmaWxlbmFtZSBpbiBjb250cm9sbGVyc1x3aWRnZXRzXCBkaXJlY3RvcnkuIENsYXNzIG5hbWUgaW4gdGhlIGZvcm1hdDogcGJfe1BMVUdJTlNMVUd9X3dpZGdldF97V0lER0VUU0xVR30KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWdpc3Rlcl93aWRnZXQoICRzbHVnICkgewoJCWlmICggZmlsZV9leGlzdHMoIHNlbGY6OnBsdWdpbl9wYXRoKCkgLiAnL2NvbnRyb2xsZXJzL3dpZGdldHMvJyAuICRzbHVnIC4gJy5waHAnICkgKSB7CgkJCXJlcXVpcmUoIHNlbGY6OnBsdWdpbl9wYXRoKCkgLiAnL2NvbnRyb2xsZXJzL3dpZGdldHMvJyAuICRzbHVnIC4gJy5waHAnICk7CgkJCWFkZF9hY3Rpb24oICd3aWRnZXRzX2luaXQnLCBjcmVhdGVfZnVuY3Rpb24oICcnLCAncmVnaXN0ZXJfd2lkZ2V0KFwncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfd2lkZ2V0XycgLiAkc2x1ZyAuICdcJyk7JyApICk7CgkJfSBlbHNlIHsKCQkJZWNobyAne0Vycm9yICMzNDQ0NTQ4OTIyOiBVbmFibGUgdG8gbG9hZCB3aWRnZXQgZmlsZSBgY29udHJvbGxlcnMvd2lkZ2V0cy8nIC4gJHNsdWcgLiAnLnBocGAufSc7CgkJfQoJfSAvLyBFbmQgcmVnaXN0ZXJfd2lkZ2V0KCkuCgkKCQoJCgkvKioKCSAqCWFycmF5X3JlbW92ZSgpCgkgKgoJICoJUmVtb3ZlcyBhcnJheSB2YWx1ZXMgaW4gJHJlbW92ZSBmcm9tICRhcnJheS4KCSAqCgkgKglAcGFyYW0JCQkkYXJyYXkJCWFycmF5CQlTb3VyY2UgYXJyYXkuIFRoaXMgd2lsbCBoYXZlIHZhbHVlcyByZW1vdmVkIGFuZCBiZSByZXR1cm5lZC4KCSAqCUBwYXJhbQkJCSRyZW1vdmUJCWFycmF5CQlBcnJheSBvZiB2YWx1ZXMgdG8gc2VhcmNoIGZvciBpbiAkYXJyYXkgYW5kIHJlbW92ZS4KCSAqCUByZXR1cm4JCQkJCQlhcnJheQkJUmV0dXJucyBhcnJheSAkYXJyYXkgc3RyaXBwZWQgb2YgYWxsIHZhbHVlcyBmb3VuZCBpbiAkcmVtb3ZlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlfcmVtb3ZlKCAkYXJyYXksICRyZW1vdmUgKSB7CgkJaWYgKCAhaXNfYXJyYXkoICRyZW1vdmUgKSApIHsKCQkJJHJlbW92ZSA9IGFycmF5KCAkcmVtb3ZlICk7CgkJfQoJCXJldHVybiBhcnJheV92YWx1ZXMoIGFycmF5X2RpZmYoICRhcnJheSwgJHJlbW92ZSApICk7Cgl9IC8vIEVuZCBhcnJheV9yZW1vdmUoKS4KCQoJCgkKCS8qIGZsdXNoKCkKCSAqCgkgKiBBdHRlbXB0IHRvIHN0cm9uZ2FybSBhIGZsdXNoIHRvIGFjdHVhbGx5IHdvcmsuCgkgKiBQcmV2ZW50IGZsdXNoaW5nIGJ5IGFkZGluZyB0aGlzIHRvIHdwLWNvbmZpZy5waHA6CgkgKgkJZGVmaW5lKCAnQkFDS1VQQlVERFlfTk9GTFVTSCcsIHRydWUgKTsKCSAqICBPUgoJICoJCXNldCBhZHZhbmNlZCBvcHRpb24gdG8gcHJldmVudCBmbHVzaAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmbHVzaCggJGZvcmNlID0gZmFsc2UgKSB7CgkJaWYgKCB0cnVlID09PSAkZm9yY2UgKSB7CgkJCXNlbGY6OiRfaGFzX2ZsdXNoZWQgPSBmYWxzZTsKCQl9CgkJCgkJaWYgKCBkZWZpbmVkKCAnQkFDS1VQQlVERFlfTk9GTFVTSCcgKSAmJiAoIEJBQ0tVUEJVRERZX05PRkxVU0ggPT09IHRydWUgKSApIHsgLy8gU29tZSBzZXJ2ZXJzIHNlZW0gdG8gZGllIG9uIG11bHRpcGxlIGZsdXNoZXMgaW4gdGhlIHNhbWUgcGFnZWxvYWQuIERlZmluZSB0aGlzIHRvIHByZXZlbnQgZmx1c2hpbmcuCgkJCXJldHVybjsKCQl9CgkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgJiYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcmV2ZW50X2ZsdXNoJ10gKSApICYmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJldmVudF9mbHVzaCddICkgKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0cnVlICE9PSBzZWxmOjokX2hhc19mbHVzaGVkICkgeyAvLyBPbmx5IHJ1biB0aGlzIG9uY2UuCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnYXBhY2hlX3NldGVudicgKSApIHsKCQkJCUBhcGFjaGVfc2V0ZW52KCduby1nemlwJywgMSk7IC8vIENvbXByZXNzaW9uIGNvdWxkIGNhdXNlIHNlcnZlciB0byB3YWl0IGZvciBwYWdlIHRvIGZpbmlzaCBiZWZvcmUgcHJvY2VlZGluZy4gVHVybiBvZmYgY29tcHJlc3Npb24uCgkJCX0KCQkJQGluaV9zZXQoJ3psaWIub3V0cHV0X2NvbXByZXNzaW9uJywgMCk7IC8vIENvbXByZXNzaW9uIGNvdWxkIGNhdXNlIHNlcnZlciB0byB3YWl0IGZvciBwYWdlIHRvIGZpbmlzaCBiZWZvcmUgcHJvY2VlZGluZy4gVHVybiBvZmYgY29tcHJlc3Npb24uCgkJCXNlbGY6OiRfaGFzX2ZsdXNoZWQgPSB0cnVlOwoJCX0KCQkvL0BvYl9mbHVzaCgpOwoJCWZsdXNoKCk7Cgl9IC8vIEVuZCBmbHVzaCgpLgoJCgkKCS8qCXJlc2V0X2RlZmF1bHRzKCkKCSAqCQoJICoJUmVzZXQgcGx1Z2luIG9wdGlvbnMgdG8gZGVmYXVsdHMuIEdldHRpbmcgc3RhcnRlZCBwYWdlIHVzZXMgdGhpcy4KCSAqCQoJICoJQHJldHVybgkJYm9vbGVhbgkJCVRydWUgb24gc3VjY2VzczsgZmFsc2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc2V0X2RlZmF1bHRzKCkgewoJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokX3NldHRpbmdzWydkZWZhdWx0X29wdGlvbnMnXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgPSBwYl9iYWNrdXBidWRkeTo6JF9zZXR0aW5nc1snZGVmYXVsdF9vcHRpb25zJ107CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9IC8vIEVuZCByZXNldF9kZWZhdWx0cygpLgoJCgkKCQoJLyogeGRlYnVnKCkKCSAqCgkgKiBMb2dzIGNhbGxlciB0byBlcnJvcl9sb2coKSBpZiB4ZGVidWcgYXZhaWxhYmxlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB4ZGVidWcoKSB7CgkJaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3hkZWJ1Z19jYWxsX2ZpbGUnICkgKSB7CgkJCXJldHVybjsKCQl9CgkJZXJyb3JfbG9nKCAiQ2FsbGVkIEAgIiAuIHhkZWJ1Z19jYWxsX2ZpbGUoKSAuICI6IiAuIHhkZWJ1Z19jYWxsX2xpbmUoKSAuICIgZnJvbSAiIC4geGRlYnVnX2NhbGxfZnVuY3Rpb24oKSApOwoJfQoJCgkKCQp9IC8vIEVuZCBjbGFzcyBwbHVnaW5idWRkeS4KCgppZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7CglyZXF1aXJlX29uY2UoICdzdGFuZGFsb25lX3ByZWxvYWRlci5waHAnICk7Cn0KCi8vICoqKioqKioqKiogTG9hZCBjb3JlIGNsYXNzZXMgKioqKioqKioqKgoKcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9jbGFzc2VzL2NvcmVfY29udHJvbGxlcnMucGhwJyApOwppZiAoIGlzX2FkbWluKCkgKSB7CglyZXF1aXJlX29uY2UoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL2NsYXNzZXMvZm9ybS5waHAnICk7CglyZXF1aXJlX29uY2UoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL2NsYXNzZXMvc2V0dGluZ3MucGhwJyApOwp9CgoKLy8gKioqKioqKioqKiBJbml0aWFsaXplIFBsdWdpbkJ1ZGR5IGZyYW1ld29yayAqKioqKioqKioqCgppZiAoICFpc3NldCggJHBsdWdpbmJ1ZGR5X2luaXQgKSApIHsKCSRwbHVnaW5idWRkeV9pbml0ID0gJ2luaXQucGhwJzsgLy8gZGVmYXVsdCBpbml0IGZpbGUuCn0KcGJfYmFja3VwYnVkZHk6OmluaXQoICRwbHVnaW5idWRkeV9zZXR0aW5ncywgJHBsdWdpbmJ1ZGR5X2luaXQgKTsKdW5zZXQoICRwbHVnaW5idWRkeV9zZXR0aW5ncyApOwp1bnNldCggJHBsdWdpbmJ1ZGR5X2luaXQgKTsKCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkKCk7CgovLyAqKioqKioqKioqIExvYWQgaW5pdGlhbGl6YXRpb24gZmlsZXMgKioqKioqKioqKgoKcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL2luaXRfZ2xvYmFsLnBocCcgKTsKaWYgKCBpc19hZG1pbigpICkgewoJcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL2luaXRfYWRtaW4ucGhwJyApOwp9CgppZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7CglwYl9iYWNrdXBidWRkeTo6bG9hZF9jb250cm9sbGVyKCAncGFnZXMvZGVmYXVsdCcgKTsKfQo= ###PACKDATA,FILE_END,/pluginbuddy/_pluginbuddy.php,importbuddy/pluginbuddy/_pluginbuddy.php ###PACKDATA,FILE_START,/pluginbuddy/history.txt,importbuddy/pluginbuddy/history.txt MS4wLjAgLSAyMDExLTEyLTEzIC0gRHVzdGluIEJvbHRvbgoJSW5pdGlhbCBwdXNoLgoxLjAuMSAtIDIwMTEtMTItMTMgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBVSSB0aXRsZSgpIG5vdCBzaG93aW5nIGltYWdlLgoJRml4ZWQgbm9uLXNlcmllcyBHZXR0aW5nIFN0YXJ0ZWQgcGFnZSB1bmRlZmluZWQgaW5kZXguCglwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoKSByZXR1cm5zIGJsYW5rIGZvciBzZXJpZXMgdGFnIGlmIG5vdCBmb3VuZC4KMS4wLjIgLSAyMDExLTAyLTEyIC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgdXBkYXRlci4KMS4wLjMgLSAyMDEyLTAxLTA0IC0gRHVzdGluIEJvbHRvbgoJRml4ZWQgdmFyaW91cyB3aWRnZXQgdGhpbmdzLgoJVXNpbmcgVUkgZWxlbWVudHMgb24gcGFnZXMgdGhhdCBhcmVuJ3Qgb3VyIG93bi4KMS4wLjQgLSAyMDEyLTAxLTA1IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgb3B0aW9uYWwgYWJpbGl0eSB0byBzcGVjaWZpYyB0aGUgZmlyc3QgcGFyYW1ldGVyICgkdGFnKSBmb3IgYWRkX3Nob3J0Y3V0LCBhZGRfZmlsdGVyLCBhZGRfYWN0aW9uLCBldGMgdGhhdCBhbGxvd3MgcGFzc2luZyBhIGN1c3RvbSBtZXRob2QgY2FsbGJhY2sgbmFtZSB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgdGFnLiBTb21lIGFjdGlvbnMgaGF2ZSBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gUEhQIG1ldGhvZCBuYW1lcyBzbyB0aGV5IG5lZWQgdG8gZGlmZmVyLgoxLjAuNSAtIDIwMTItMDEtMDUgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBmb3JtIHZhbGlkYXRpb24gZm9yIGVtcHR5IGZvcm0gZWxlbWVudHMuCglGaXhlZCBtaXNzaW5nIHRvb2x0aXBzIGluIHNldHRpbmdzIGZvcm1zLgoxLjAuNiAtIDIwMTItMDEtMDUgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9uIGZvcm0gdmFsaWRhdGlvbiBmYWlsdXJlLgoJTm93IGFsbG93aW5nIHBhcnRpYWwgZm9ybSBzYXZpbmcgb24gdmFsaWR0aW9uIGZhaWx1cmUuCglBZGRlZCByZWQgYm9yZGVyIGFyb3VuZCBmb3JtIGl0ZW1zIHRoYXQgZmFpbCB2YWxpZGF0aW9uIGZvciBlYXNpZXIgcmVjb2duaXRpb24uCjEuMC43IC0gMjAxMi0wMS0wNiAtIER1c3RpbiBCb2x0b24KCUZvcm0gdmFsaWRhdGlvbiBmdW5jdGlvbiBudW1iZXIgcnVsZSB3YXMgaW5wcm9wZXJseSBuYW1lZCBudW0uCjEuMC44IC0gMjAxMi0wMS0xMyAtIER1c3RpbiBCb2x0b24KCUFkZGVkIGVycm9yIG1lc3NhZ2UgaWYgdXBkYXRlciBzZXR0aW5ncyBwYXJhbWV0ZXIgbWlzc2luZy4KCUZpeGVkIHZlcnNpb24gbnVtYmVyLgoxLjAuOSAtIDIwMTItMDEtMTMgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBwbHVnaW5idWRkeV9zZXR0aW5ncyBmb3JtIHNldHRpbmcgZm9ybSBuYW1lIHN0YXRpY2FsbHkuCglDdXN0b20gcHJvY2Vzc2luZyBhZGRlZCBpbnRvIHBsdWdpbmJ1ZGR5X3NldHRpbmdzIGNsYXNzIHZpYSBwcm9jZXNzKCk7IGp1c3Qgc2V0IHNhdmVwb2ludCBpbiBjb25zdHJ1Y3RvciB0byBmYWxzZSB0byBhY3RpdmF0ZSB0aGlzIG1vZGUuCjEuMC4xMSAtIDIwMTItMDEtMTggLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBpbml0aWFsIHN0YXJ0aW5ncyBmb3IgbmV3IG1lZGlhIGxpYnJhcnkgc3lzdGVtLgoJVHdlYWtlZCBkb3duc2l6ZXIgbG9hZGVyIHN5c3RlbS4KCVJlbmFtZWQgcGx1Z2luYnVkZHkgY2xhc3MgdG8gcGIgY2xhc3MuIEFsbCByZWZlcmVuY2VzIHRvIHBiX2JhY2t1cGJ1ZGR5Ojogc2hvdWxkIGNoYW5nZSB0byBwYl9iYWNrdXBidWRkeTo6CjEuMC4xMiAtIDIwMTItMDEtMTggLSBEdXN0aW4gQm9sdG9uCQoJX2luaXRfY29yZV9jb250cm9sbGVyKCkgY2xlYW51cC4KMS4wLjEzIC0gMjAxMi0wMS0xOSAtIER1c3RpbiBCb2x0b24JCglGaXhlZCBsYWNrIG9mIHJldHVybiBpbiBwYl9iYWNrdXBidWRkeTo6dGlwKCkgYW5kIHBiX2JhY2t1cGJ1ZGR5Ojp2aWRlbygpLgoxLjAuMTQgLSAyMDEyLTAxLTE5IC0gRHVzdGluIEJvbHRvbgoJTW92ZWQgYWxsIGZyYW1ld29yay1yZXF1aXJlZCBKUyBhbmQgQ1NTIGludG8gcGx1Z2luYnVkZHkgZGlyZWN0b3J5LgoxLjAuMTUgLSAyMDEyLTAxLTI1IC0gRHVzdGluIEJvbHRvbgoJRml4ZWQgY29yZSBjb250cm9sbGVyIGZvciBkYXNoYm9hcmQgd2lkZ2V0IGJlaW5nIGFibGUgdG8gYWNjZXNzIHByaXZhdGUgc3RhdGljIHZhci4KCUFkZGVkIHBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZygpLgoJQWRkZWQgcGJfYmFja3VwYnVkZHk6Om1rZGlyKCkuCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCkuCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6Z2V0X3N0YXR1cygpLgoJQWRkZWQgcGJfYmFja3VwYnVkZHk6OmRlYnVnKCkuCjEuMC4xNiAtIDIwMTItMDEtMjYgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0gY2xhc3MgY29udHJvbGxlciBmb3IgaW50ZXJmYWNpbmcgd2l0aCBmaWxlIHN5c3RlbS4KCUFkZGVkIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0IGNsYXNzIGNvbnRyb2xsZXIgZm9yIGZvcm1hdHRpbmcgZGF0YSAvIHRleHQgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0cy4KCWRvd25zaXplciwgdXBkYXRlciwgZmlsZXN5c3RlbSwgYW5kIGZvcm1hdCAnbW9kdWxlcycgbm93IGNvbnRyb2xsZWQgdmlhIG1vZHVsZXMga2V5IGluIHRoZSAkc2V0dGluZ3MgYXJyYXkuICBTZWUgbmV3IGluaXQucGhwLgoxLjAuMTkgLSAyMDEyLTAxLTMxIC0gRHVzdGluIEJvbHRvbgoJRm9ybSBmaXguCglTZXR0aW5ncyBmaXguCglBZGRlZCBDU1Mgb3B0aW9ucyBmb3IgZ3JvdXAgbGlzdCBpbiBVSSBjbGFzcy4KCUFkZGVkIHRpdGxlIHR5cGUgZm9yIGZvcm0vc2V0dGluZ3MgY2xhc3Nlcy4KCVVwZGF0ZWQgYWRtaW4uY3NzIGZvciB0aXRsZSBzZXR0aW5ncyBmb3JtIHR5cGUuCjEuMC4yMCAtIDIwMTItMDEtMDEgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBlcnJvciBjb2RlIGxvb2t1cCBmdW5jdGlvbiB0byBmaWxlc3lzdGVtIGNsYXNzLiBGb3IgZXhpdCBjb2RlcyBmcm9tIGV4ZWMoKSBhbmQgc3VjaC4KCUZpeGVkIHN0YXR1cygpIGJ1Z3Mgd2l0aCBuZXdsaW5lcywgYXJyYXlzIChjaGFuZ2VkIGRlbGltaXRlcikuCjEuMC4yMSAtIDIwMTItMDEtMDEgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCB3eXNpd3lnIG9iamVjdCB5b3UgZm9ybSAmIHNldHRpbmdzIHN5c3RlbS4KCVRvdWNodXAgdG8gZmlsZXN5c3RlbSBjbGFzcy4KCUFkZGVkIGhpZGRlbiBmb3JtIG9iamVjdC4KCVNldHRpbmcgdGhlIHRpdGxlIG9mIGFueSBmb3JtL3NldHRpbmdzIG9iamVjdCB0byAnJyB3aWxsIGhpZGUgaXRzIGxlZnQgY29sdW1uIChjb2xsYXBzZXMgbGVmdCkuCglBZGRlZCB0aXRsZSBmb3JtIG9iamVjdCB0eXBlIGZvciBmb3JtYXR0aW5nLgoxLjAuMjIgLSAyMDEyLTAxLTAzIC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgcGI6OiRzdGFydF90aW1lIHRvIHVzZSB0byBjb21wYXJlIHBhc3NhZ2Ugb2YgdGltZS4KMS4wLjIzIC0gMjAxMi0wMi0wOCAtIER1c3RpbiBCb2x0b24KCVVwZGF0ZWQgdXBkYXRlci4KMS4wLjI0IC0gMjAxMi0wMi0wOCAtIER1c3RpbiBCb2x0b24KCUZpeGVkIGNoZWNrYm94ICJZRVMhIiBkZWJ1ZyBvdXRwdXQuCglGaXhlZCByYWRpbyBpbnB1dCBkZWZhdWx0IGNoZWNrZWQgc2VsZWN0aW9uIG5vdCBiZWluZyBhcHBsaWVkLgoxLjAuMjUgLSAyMDEyLTAyLTA5IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgb3JpZW50YXRpb24gb3B0aW9uIHRvIHJhZGlvIGJ1dHRvbnMuICBQb3NzaWJsZSB2YWxzOiBob3Jpem9udGFsLCB2ZXJ0aWNhbAoxLjAuMjYgLSAyMDEyLTAyLTA5IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgdGFiYmVkIGludGVyZmFjZXMgaW50byAkdWkgY2xhc3MuCjEuMC4yNyAtIDIwMTItMDItMTAgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBHZXR0aW5nIFN0YXJ0ZWQgcGFnZSB3aXRoIG9sZGVyIHNlcmllcyBjb25mbGljdGluZy4KMS4wLjI4IC0gMjAxMi0wMi0xNyAtIER1c3RpbiBCb2x0b24KCXN0cnN0cigpIHVzZWQgM3JkIHBhcmFtIHdoaWNoIHJlcXVpcmVkIFBIUCA+PSA1LjMgaW4gZm9ybTo6dGVzdF9ydWxlKCkuCglDbGVhbmVkIHVwIGluaXQucGhwIGEgYml0LgoJQ29sb3IgcGlja2VyOiBBZGRlZCBjb2xvciB0eXBlIHRvIGZvcm0vc2V0dGluZ3MuCgkKCUFkZGVkIHNldHRpbmdzIGNsYXNzIG1ldGhvZDogc2V0X3ZhbHVlKCkgdG8gb3ZlcndyaXRlIHZhbHVlcy4KCQ== ###PACKDATA,FILE_END,/pluginbuddy/history.txt,importbuddy/pluginbuddy/history.txt ###PACKDATA,FILE_START,/pluginbuddy/index.php,importbuddy/pluginbuddy/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/pluginbuddy/index.php,importbuddy/pluginbuddy/index.php ###PACKDATA,FILE_START,/pluginbuddy/standalone_preloader.php,importbuddy/pluginbuddy/standalone_preloader.php PD9waHAKLy8gSU1QT1JUQU5UOiBDb3B5IG9mIHRoaXMgZmlsZSAoIHN0YW5kYWxvbmVfcHJlbG9hZGVyLnBocCApIGluY2x1ZGVkIGluIF9yb2xsYmFja191bmRvLnBocC4KCiRwYl9zdHlsZXMgPSBhcnJheSgpOwokcGJfc2NyaXB0cyA9IGFycmF5KCk7CiRwYl9hY3Rpb25zID0gYXJyYXkoKTsKJHdwX3NjcmlwdHMgPSBhcnJheSgpOwoKLy8gTk9URTogTW9kaWZpZWQgZnJvbSBXUCB0byBydHJpbSBvbiBkaXJuYW1lKCkgZHVlIHRvIFdpbmRvd3MgaXNzdWVzLgpmdW5jdGlvbiBzaXRlX3VybCgpIHsKCSRwYWdlVVJMID0gJ2h0dHAnOwoJaWYgKCBpc3NldCggJF9TRVJWRVJbIkhUVFBTIl0gKSAmJiAoICRfU0VSVkVSWyJIVFRQUyJdID09ICJvbiIgKSApIHskcGFnZVVSTCAuPSAicyI7fQoJJHBhZ2VVUkwgLj0gIjovLyI7CglpZiAoJF9TRVJWRVJbIlNFUlZFUl9QT1JUIl0gIT0gIjgwIikgewoJCSRwYWdlVVJMIC49ICRfU0VSVkVSWyJTRVJWRVJfTkFNRSJdLiI6Ii4kX1NFUlZFUlsiU0VSVkVSX1BPUlQiXSAuIHJ0cmltKCBkaXJuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKSwgJy9cXCcgKTsKCX0gZWxzZSB7CgkJJHBhZ2VVUkwgLj0gJF9TRVJWRVJbIlNFUlZFUl9OQU1FIl0gLiBydHJpbSggZGlybmFtZSgkX1NFUlZFUlsnUEhQX1NFTEYnXSksICcvXFwnICk7Cgl9CgkKCXJldHVybiAkcGFnZVVSTDsKfQoKLyoqCiAqIE5hdmlnYXRlcyB0aHJvdWdoIGFuIGFycmF5IGFuZCByZW1vdmVzIHNsYXNoZXMgZnJvbSB0aGUgdmFsdWVzLgogKgogKiBJZiBhbiBhcnJheSBpcyBwYXNzZWQsIHRoZSBhcnJheV9tYXAoKSBmdW5jdGlvbiBjYXVzZXMgYSBjYWxsYmFjayB0byBwYXNzIHRoZQogKiB2YWx1ZSBiYWNrIHRvIHRoZSBmdW5jdGlvbi4gVGhlIHNsYXNoZXMgZnJvbSB0aGlzIHZhbHVlIHdpbGwgcmVtb3ZlZC4KICoKICogQHNpbmNlIDIuMC4wCiAqCiAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHZhbHVlIFRoZSBhcnJheSBvciBzdHJpbmcgdG8gYmUgc3RyaXBwZWQuCiAqIEByZXR1cm4gYXJyYXl8c3RyaW5nIFN0cmlwcGVkIGFycmF5IChvciBzdHJpbmcgaW4gdGhlIGNhbGxiYWNrKS4KICovCmZ1bmN0aW9uIHN0cmlwc2xhc2hlc19kZWVwKCR2YWx1ZSkgewoJaWYgKCBpc19hcnJheSgkdmFsdWUpICkgewoJCSR2YWx1ZSA9IGFycmF5X21hcCgnc3RyaXBzbGFzaGVzX2RlZXAnLCAkdmFsdWUpOwoJfSBlbHNlaWYgKCBpc19vYmplY3QoJHZhbHVlKSApIHsKCQkkdmFycyA9IGdldF9vYmplY3RfdmFycyggJHZhbHVlICk7CgkJZm9yZWFjaCAoJHZhcnMgYXMgJGtleT0+JGRhdGEpIHsKCQkJJHZhbHVlLT57JGtleX0gPSBzdHJpcHNsYXNoZXNfZGVlcCggJGRhdGEgKTsKCQl9Cgl9IGVsc2UgewoJCSR2YWx1ZSA9IHN0cmlwc2xhc2hlcygkdmFsdWUpOwoJfQoKCXJldHVybiAkdmFsdWU7Cn0KCgovKioKICogQ2hlY2sgdmFsdWUgdG8gZmluZCBpZiBpdCB3YXMgc2VyaWFsaXplZC4KICoKICogSWYgJGRhdGEgaXMgbm90IGFuIHN0cmluZywgdGhlbiByZXR1cm5lZCB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBmYWxzZS4KICogU2VyaWFsaXplZCBkYXRhIGlzIGFsd2F5cyBhIHN0cmluZy4KICogQ291cnRlc3kgV29yZFByZXNzOyBzaW5jZSBXb3JkUHJlc3MgMi4wLjUuCiAqCiAqIEBwYXJhbSBtaXhlZCAkZGF0YSBWYWx1ZSB0byBjaGVjayB0byBzZWUgaWYgd2FzIHNlcmlhbGl6ZWQuCiAqIEByZXR1cm4gYm9vbCBGYWxzZSBpZiBub3Qgc2VyaWFsaXplZCBhbmQgdHJ1ZSBpZiBpdCB3YXMuCiAqLwpmdW5jdGlvbiBpc19zZXJpYWxpemVkKCAkZGF0YSApIHsKCS8vIGlmIGl0IGlzbid0IGEgc3RyaW5nLCBpdCBpc24ndCBzZXJpYWxpemVkCglpZiAoICEgaXNfc3RyaW5nKCAkZGF0YSApICkKCQlyZXR1cm4gZmFsc2U7CgkkZGF0YSA9IHRyaW0oICRkYXRhICk7CiAJaWYgKCAnTjsnID09ICRkYXRhICkKCQlyZXR1cm4gdHJ1ZTsKCSRsZW5ndGggPSBzdHJsZW4oICRkYXRhICk7CglpZiAoICRsZW5ndGggPCA0ICkKCQlyZXR1cm4gZmFsc2U7CglpZiAoICc6JyAhPT0gJGRhdGFbMV0gKQoJCXJldHVybiBmYWxzZTsKCSRsYXN0YyA9ICRkYXRhWyRsZW5ndGgtMV07CglpZiAoICc7JyAhPT0gJGxhc3RjICYmICd9JyAhPT0gJGxhc3RjICkKCQlyZXR1cm4gZmFsc2U7CgkkdG9rZW4gPSAkZGF0YVswXTsKCXN3aXRjaCAoICR0b2tlbiApIHsKCQljYXNlICdzJyA6CgkJCWlmICggJyInICE9PSAkZGF0YVskbGVuZ3RoLTJdICkKCQkJCXJldHVybiBmYWxzZTsKCQljYXNlICdhJyA6CgkJY2FzZSAnTycgOgoJCQlyZXR1cm4gKGJvb2wpIHByZWdfbWF0Y2goICIvXnskdG9rZW59OlswLTldKzovcyIsICRkYXRhICk7CgkJY2FzZSAnYicgOgoJCWNhc2UgJ2knIDoKCQljYXNlICdkJyA6CgkJCXJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCggIi9eeyR0b2tlbn06WzAtOS5FLV0rO1wkLyIsICRkYXRhICk7Cgl9CglyZXR1cm4gZmFsc2U7Cn0gLy8gRW5kIGlzX3NlcmlhbGl6ZWQoKS4KCmZ1bmN0aW9uIF9fKCAkdGV4dCwgJGRvbWFpbiA9ICcnICkgewoJcmV0dXJuICR0ZXh0Owp9CmZ1bmN0aW9uIF9lKCAkdGV4dCwgJGRvbWFpbiA9ICcnICkgewoJZWNobyAkdGV4dDsKfQoKZnVuY3Rpb24gd3Bfc3R5bGVfaXMoICRuYW1lICkgewoJZ2xvYmFsICRwYl9zdHlsZXM7CglyZXR1cm4gYXJyYXlfa2V5X2V4aXN0cyggJG5hbWUsICRwYl9zdHlsZXMgKTsKfQpmdW5jdGlvbiB3cF9lbnF1ZXVlX3N0eWxlKCAkbmFtZSwgJGZpbGUsICRkZXBzID0gYXJyYXkoKSwgJHZlciA9ICcnICkgewoJZ2xvYmFsICRwYl9zdHlsZXM7CgkkcGJfc3R5bGVzWyRuYW1lXVsnZmlsZSddID0gJGZpbGU7CgkkcGJfc3R5bGVzWyRuYW1lXVsndmVyc2lvbiddID0gJHZlcjsKCSRwYl9zdHlsZXNbJG5hbWVdWydwcmludGVkJ10gPSBmYWxzZTsKfQpmdW5jdGlvbiB3cF9wcmludF9zdHlsZXMoICRuYW1lICkgewoJZ2xvYmFsICRwYl9zdHlsZXM7CglpZiAoICRwYl9zdHlsZXNbJG5hbWVdWydwcmludGVkJ10gPT09IGZhbHNlICkgewoJCSRwYl9zdHlsZXNbJG5hbWVdWydwcmludGVkJ10gPSB0cnVlOwoJCQoJCWVjaG8gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgLiAkcGJfc3R5bGVzWyRuYW1lXVsnZmlsZSddIC4gJz92ZXI9JyAuIG1kNSggJHBiX3N0eWxlc1skbmFtZV1bJ3ZlcnNpb24nXSApIC4gJyI+JzsKCX0KfQoKZnVuY3Rpb24gd3Bfc2NyaXB0X2lzKCAkbmFtZSApIHsKCWdsb2JhbCAkcGJfc2NyaXB0czsKCXJldHVybiBhcnJheV9rZXlfZXhpc3RzKCAkbmFtZSwgJHBiX3NjcmlwdHMgKTsKfQpmdW5jdGlvbiB3cF9lbnF1ZXVlX3NjcmlwdCggJG5hbWUsICRmaWxlLCAkZGVwcyA9IGFycmF5KCksICR2ZXIgPSAnJyApIHsKCWdsb2JhbCAkcGJfc2NyaXB0czsKCSRwYl9zY3JpcHRzWyRuYW1lXVsnZmlsZSddID0gJGZpbGU7CgkkcGJfc2NyaXB0c1skbmFtZV1bJ3ZlcnNpb24nXSA9ICR2ZXI7CgkkcGJfc2NyaXB0c1skbmFtZV1bJ3ByaW50ZWQnXSA9IGZhbHNlOwp9CmZ1bmN0aW9uIHdwX3ByaW50X3NjcmlwdHMoICRuYW1lICkgewoJZ2xvYmFsICRwYl9zY3JpcHRzOwoJaWYgKCAkcGJfc2NyaXB0c1skbmFtZV1bJ3ByaW50ZWQnXSA9PT0gZmFsc2UgKSB7CgkJJHBiX3NjcmlwdHNbJG5hbWVdWydwcmludGVkJ10gPSB0cnVlOwoJCQoJCWVjaG8gJzxzY3JpcHQgc3JjPSInIC4gJHBiX3NjcmlwdHNbJG5hbWVdWydmaWxlJ10gLiAnP3Zlcj0nIC4gbWQ1KCAkcGJfc2NyaXB0c1skbmFtZV1bJ3ZlcnNpb24nXSApIC4gJyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4nOwoJfQp9CgpmdW5jdGlvbiBhZGRfYWN0aW9uKCAkdGFnLCAkY2FsbGJhY2sgKSB7CglnbG9iYWwgJHBiX2FjdGlvbnM7CgkkcGJfYWN0aW9uc1skdGFnXVsnY2FsbGJhY2snXSA9ICRjYWxsYmFjazsKfQoKCmZ1bmN0aW9uIGlzX2FkbWluKCkgewoJcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIGFwcGx5X2ZpbHRlcnMoICRmaWx0ZXIsICR2YWx1ZSApIHsKCXJldHVybiAkdmFsdWU7Cn0KCmZ1bmN0aW9uIF9jbGVhbnVwX2hlYWRlcl9jb21tZW50KCRzdHIpIHsKCXJldHVybiB0cmltKHByZWdfcmVwbGFjZSgiL1xzKig/OlwqXC98XD8+KS4qLyIsICcnLCAkc3RyKSk7Cn0KCmZ1bmN0aW9uIGdldF9wbHVnaW5fZGF0YSggJHBsdWdpbl9maWxlLCAkbWFya3VwID0gdHJ1ZSwgJHRyYW5zbGF0ZSA9IHRydWUgKSB7CgoJJGRlZmF1bHRfaGVhZGVycyA9IGFycmF5KAoJCSdOYW1lJyA9PiAnUGx1Z2luIE5hbWUnLAoJCSdQbHVnaW5VUkknID0+ICdQbHVnaW4gVVJJJywKCQknVmVyc2lvbicgPT4gJ1ZlcnNpb24nLAoJCSdEZXNjcmlwdGlvbicgPT4gJ0Rlc2NyaXB0aW9uJywKCQknQXV0aG9yJyA9PiAnQXV0aG9yJywKCQknQXV0aG9yVVJJJyA9PiAnQXV0aG9yIFVSSScsCgkJJ1RleHREb21haW4nID0+ICdUZXh0IERvbWFpbicsCgkJJ0RvbWFpblBhdGgnID0+ICdEb21haW4gUGF0aCcsCgkJJ05ldHdvcmsnID0+ICdOZXR3b3JrJywKCQkvLyBTaXRlIFdpZGUgT25seSBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIE5ldHdvcmsuCgkJJ19zaXRld2lkZScgPT4gJ1NpdGUgV2lkZSBPbmx5JywKCSk7CgoJJHBsdWdpbl9kYXRhID0gZ2V0X2ZpbGVfZGF0YSggJHBsdWdpbl9maWxlLCAkZGVmYXVsdF9oZWFkZXJzLCAncGx1Z2luJyApOwoKCS8vIFNpdGUgV2lkZSBPbmx5IGlzIHRoZSBvbGQgaGVhZGVyIGZvciBOZXR3b3JrCglpZiAoIGVtcHR5KCAkcGx1Z2luX2RhdGFbJ05ldHdvcmsnXSApICYmICEgZW1wdHkoICRwbHVnaW5fZGF0YVsnX3NpdGV3aWRlJ10gKSApIHsKCQlfZGVwcmVjYXRlZF9hcmd1bWVudCggX19GVU5DVElPTl9fLCAnMy4wJywgc3ByaW50ZiggX18oICdUaGUgPGNvZGU+JTEkczwvY29kZT4gcGx1Z2luIGhlYWRlciBpcyBkZXByZWNhdGVkLiBVc2UgPGNvZGU+JTIkczwvY29kZT4gaW5zdGVhZC4nICksICdTaXRlIFdpZGUgT25seTogdHJ1ZScsICdOZXR3b3JrOiB0cnVlJyApICk7CgkJJHBsdWdpbl9kYXRhWydOZXR3b3JrJ10gPSAkcGx1Z2luX2RhdGFbJ19zaXRld2lkZSddOwoJfQoJJHBsdWdpbl9kYXRhWydOZXR3b3JrJ10gPSAoICd0cnVlJyA9PSBzdHJ0b2xvd2VyKCAkcGx1Z2luX2RhdGFbJ05ldHdvcmsnXSApICk7Cgl1bnNldCggJHBsdWdpbl9kYXRhWydfc2l0ZXdpZGUnXSApOwoKCS8vRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnkgZGVmYXVsdCBUaXRsZSBpcyB0aGUgc2FtZSBhcyBOYW1lLgoJJHBsdWdpbl9kYXRhWydUaXRsZSddID0gJHBsdWdpbl9kYXRhWydOYW1lJ107CgoJaWYgKCAkbWFya3VwIHx8ICR0cmFuc2xhdGUgKQoJCSRwbHVnaW5fZGF0YSA9IF9nZXRfcGx1Z2luX2RhdGFfbWFya3VwX3RyYW5zbGF0ZSggJHBsdWdpbl9maWxlLCAkcGx1Z2luX2RhdGEsICRtYXJrdXAsICR0cmFuc2xhdGUgKTsKCWVsc2UKCQkkcGx1Z2luX2RhdGFbJ0F1dGhvck5hbWUnXSA9ICRwbHVnaW5fZGF0YVsnQXV0aG9yJ107CgoJcmV0dXJuICRwbHVnaW5fZGF0YTsKfQoKCmZ1bmN0aW9uIGdldF9maWxlX2RhdGEoICRmaWxlLCAkZGVmYXVsdF9oZWFkZXJzLCAkY29udGV4dCA9ICcnICkgewoJLy8gV2UgZG9uJ3QgbmVlZCB0byB3cml0ZSB0byB0aGUgZmlsZSwgc28ganVzdCBvcGVuIGZvciByZWFkaW5nLgoJJGZwID0gZm9wZW4oICRmaWxlLCAncicgKTsKCgkvLyBQdWxsIG9ubHkgdGhlIGZpcnN0IDhraUIgb2YgdGhlIGZpbGUgaW4uCgkkZmlsZV9kYXRhID0gZnJlYWQoICRmcCwgODE5MiApOwoKCS8vIFBIUCB3aWxsIGNsb3NlIGZpbGUgaGFuZGxlLCBidXQgd2UgYXJlIGdvb2QgY2l0aXplbnMuCglmY2xvc2UoICRmcCApOwoKCWlmICggJGNvbnRleHQgIT0gJycgKSB7CgkJJGV4dHJhX2hlYWRlcnMgPSBhcHBseV9maWx0ZXJzKCAiZXh0cmFfeyRjb250ZXh0fV9oZWFkZXJzIiwgYXJyYXkoKSApOwoKCQkkZXh0cmFfaGVhZGVycyA9IGFycmF5X2ZsaXAoICRleHRyYV9oZWFkZXJzICk7CgkJZm9yZWFjaCggJGV4dHJhX2hlYWRlcnMgYXMgJGtleT0+JHZhbHVlICkgewoJCQkkZXh0cmFfaGVhZGVyc1ska2V5XSA9ICRrZXk7CgkJfQoJCSRhbGxfaGVhZGVycyA9IGFycmF5X21lcmdlKCAkZXh0cmFfaGVhZGVycywgKGFycmF5KSAkZGVmYXVsdF9oZWFkZXJzICk7Cgl9IGVsc2UgewoJCSRhbGxfaGVhZGVycyA9ICRkZWZhdWx0X2hlYWRlcnM7Cgl9CgoJZm9yZWFjaCAoICRhbGxfaGVhZGVycyBhcyAkZmllbGQgPT4gJHJlZ2V4ICkgewoJCXByZWdfbWF0Y2goICcvXlsgXHRcLyojQF0qJyAuIHByZWdfcXVvdGUoICRyZWdleCwgJy8nICkgLiAnOiguKikkL21pJywgJGZpbGVfZGF0YSwgJHskZmllbGR9KTsKCQlpZiAoICFlbXB0eSggJHskZmllbGR9ICkgKQoJCQkkeyRmaWVsZH0gPSBfY2xlYW51cF9oZWFkZXJfY29tbWVudCggJHskZmllbGR9WzFdICk7CgkJZWxzZQoJCQkkeyRmaWVsZH0gPSAnJzsKCX0KCgkkZmlsZV9kYXRhID0gY29tcGFjdCggYXJyYXlfa2V5cyggJGFsbF9oZWFkZXJzICkgKTsKCglyZXR1cm4gJGZpbGVfZGF0YTsKfQoKCmZ1bmN0aW9uIHdwX25vbmNlX2ZpZWxkKCkgewoJcmV0dXJuOwp9CgoKCi8vIFNvbWUgUEhQIGluc3RhbGxzIGRvbid0IGhhdmUgbmdldHRleHQuIE5lZWRlZCBieSBodW1hbl90aW1lX2RpZmYoKS4KaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ25nZXR0ZXh0JyApICkgewoJZnVuY3Rpb24gbmdldHRleHQoICRzaW5ndWxhciwgJHBsdXJhbCwgJG51bSApIHsKCQlpZiAoICRudW0gPiAxICkgewoJCQlyZXR1cm4gJHBsdXJhbDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHNpbmd1bGFyOwoJCX0KCX0KfSAvLyBFbmQgbmdldHRleHQoKS4KCgoKLyoqCiAqIERldGVybWluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdGltZXN0YW1wcy4KICoKICogVGhlIGRpZmZlcmVuY2UgaXMgcmV0dXJuZWQgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtYXQgc3VjaCBhcyAiMSBob3VyIiwKICogIjUgbWlucyIsICIyIGRheXMiLgogKgogKiBAc2luY2UgMS41LjAKICoKICogQHBhcmFtIGludCAkZnJvbSBVbml4IHRpbWVzdGFtcCBmcm9tIHdoaWNoIHRoZSBkaWZmZXJlbmNlIGJlZ2lucy4KICogQHBhcmFtIGludCAkdG8gT3B0aW9uYWwuIFVuaXggdGltZXN0YW1wIHRvIGVuZCB0aGUgdGltZSBkaWZmZXJlbmNlLiBEZWZhdWx0IGJlY29tZXMgdGltZSgpIGlmIG5vdCBzZXQuCiAqIEByZXR1cm4gc3RyaW5nIEh1bWFuIHJlYWRhYmxlIHRpbWUgZGlmZmVyZW5jZS4KICovCmZ1bmN0aW9uIGh1bWFuX3RpbWVfZGlmZiggJGZyb20sICR0byA9ICcnICkgewoJaWYgKCBlbXB0eSgkdG8pICkKCQkkdG8gPSB0aW1lKCk7CgkkZGlmZiA9IChpbnQpIGFicygkdG8gLSAkZnJvbSk7CglpZiAoJGRpZmYgPD0gMzYwMCkgewoJCSRtaW5zID0gcm91bmQoJGRpZmYgLyA2MCk7CgkJaWYgKCRtaW5zIDw9IDEpIHsKCQkJJG1pbnMgPSAxOwoJCX0KCQkvKiB0cmFuc2xhdG9yczogbWluPW1pbnV0ZSAqLwoJCSRzaW5jZSA9IHNwcmludGYoIG5nZXR0ZXh0KCAnJXMgbWluJywgJyVzIG1pbnMnLCAkbWlucyApLCAkbWlucyk7Cgl9IGVsc2UgaWYgKCgkZGlmZiA8PSA4NjQwMCkgJiYgKCRkaWZmID4gMzYwMCkpIHsKCQkkaG91cnMgPSByb3VuZCgkZGlmZiAvIDM2MDApOwoJCWlmICgkaG91cnMgPD0gMSkgewoJCQkkaG91cnMgPSAxOwoJCX0KCQkkc2luY2UgPSBzcHJpbnRmKCBuZ2V0dGV4dCgnJXMgaG91cicsICclcyBob3VycycsICRob3VycyApLCAkaG91cnMpOwoJfSBlbHNlaWYgKCRkaWZmID49IDg2NDAwKSB7CgkJJGRheXMgPSByb3VuZCgkZGlmZiAvIDg2NDAwKTsKCQlpZiAoJGRheXMgPD0gMSkgewoJCQkkZGF5cyA9IDE7CgkJfQoJCSRzaW5jZSA9IHNwcmludGYoIG5nZXR0ZXh0KCclcyBkYXknLCAnJXMgZGF5cycsICRkYXlzICksICRkYXlzKTsKCX0KCXJldHVybiAkc2luY2U7Cn0KCgoKLyoqCiAqIFVuc2VyaWFsaXplIHZhbHVlIG9ubHkgaWYgaXQgd2FzIHNlcmlhbGl6ZWQuCiAqCiAqIEBzaW5jZSAyLjAuMAogKgogKiBAcGFyYW0gc3RyaW5nICRvcmlnaW5hbCBNYXliZSB1bnNlcmlhbGl6ZWQgb3JpZ2luYWwsIGlmIGlzIG5lZWRlZC4KICogQHJldHVybiBtaXhlZCBVbnNlcmlhbGl6ZWQgZGF0YSBjYW4gYmUgYW55IHR5cGUuCiAqLwpmdW5jdGlvbiBtYXliZV91bnNlcmlhbGl6ZSggJG9yaWdpbmFsICkgewoJaWYgKCBpc19zZXJpYWxpemVkKCAkb3JpZ2luYWwgKSApIC8vIGRvbid0IGF0dGVtcHQgdG8gdW5zZXJpYWxpemUgZGF0YSB0aGF0IHdhc24ndCBzZXJpYWxpemVkIGdvaW5nIGluCgkJcmV0dXJuIEB1bnNlcmlhbGl6ZSggJG9yaWdpbmFsICk7CglyZXR1cm4gJG9yaWdpbmFsOwp9CgoKCgoKCi8vIE5PVCBJTVBMRU1FTlRFRCBCVVQgTk9OLUJMT0NLSU5HLgoKZnVuY3Rpb24gcmVnaXN0ZXJfYWN0aXZhdGlvbl9ob29rKCkgewp9CmZ1bmN0aW9uIGxvYWRfcGx1Z2luX3RleHRkb21haW4oKSB7Cn0KZnVuY3Rpb24gY3VycmVudF91c2VyX2NhbiggJHJvbGUgKSB7CglyZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBnZXRfdGVtcF9kaXIoKSB7CgkKCWlmICggZnVuY3Rpb25fZXhpc3RzKCdzeXNfZ2V0X3RlbXBfZGlyJykgKSB7CgkJJHRlbXAgPSBzeXNfZ2V0X3RlbXBfZGlyKCk7CgkJaWYgKCBAaXNfZGlyKCAkdGVtcCApICYmIGlzX3dyaXRhYmxlKCAkdGVtcCApICkKCQkJcmV0dXJuIHJ0cmltKCAkdGVtcCwgJy9cXCcgKSAuICcvJzsKCX0KCQoJJHRlbXAgPSBBQlNQQVRIIC4gJ3RlbXAvJzsKCUBta2RpciggJHRlbXAgKTsKCWlmICggaXNfZGlyKCAkdGVtcCApICYmIGlzX3dyaXRhYmxlKCAkdGVtcCApICkgewoJCXJldHVybiAkdGVtcDsKCX0KCQoJJHRlbXAgPSAnL3RtcC8nOwoJQG1rZGlyKCAkdGVtcCApOwoJcmV0dXJuICR0ZW1wOwp9CgoKZnVuY3Rpb24gd3BfdXBsb2FkX2RpcigpIHsKCXJldHVybiBhcnJheSggJ2Jhc2VkaXInID0+IEFCU1BBVEggKTsKfQoKCgpmdW5jdGlvbiB3cF9kaWUoICRtZXNzYWdlICkgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3dwX2RpZSgpIGNhbGxlZCB3aXRoIG1lc3NhZ2U6ICcgLiAkbWVzc2FnZSApOwoJZWNobyAkbWVzc2FnZTsKCWRpZSgpOwp9CgpmdW5jdGlvbiB3cF9sb2FkX3RyYW5zbGF0aW9uc19lYXJseSgpIHsKfQoKZnVuY3Rpb24gd3BfZGVidWdfYmFja3RyYWNlX3N1bW1hcnkoKSB7Cn0KCmlmICggIWRlZmluZWQoJ1dQX0RFQlVHJykgKQoJZGVmaW5lKCAnV1BfREVCVUcnLCBmYWxzZSApOwppZiAoICFkZWZpbmVkKCdXUF9ERUJVR19ESVNQTEFZJykgKQoJZGVmaW5lKCAnV1BfREVCVUdfRElTUExBWScsIHRydWUgKTsKaWYgKCAhZGVmaW5lZCgnV1BfREVCVUdfTE9HJykgKQoJZGVmaW5lKCdXUF9ERUJVR19MT0cnLCBmYWxzZSk7CmlmICggIWRlZmluZWQoJ1dQX0NBQ0hFJykgKQoJZGVmaW5lKCdXUF9DQUNIRScsIGZhbHNlKTsKCmZ1bmN0aW9uIGFkbWluX3VybCggJHZhbCApIHsKCXJldHVybiAnPycgLiAkdmFsOwp9CgoKLyoqCiAqIFdvcmRQcmVzcyBFcnJvciBjbGFzcy4KICoKICogQ29udGFpbmVyIGZvciBjaGVja2luZyBmb3IgV29yZFByZXNzIGVycm9ycyBhbmQgZXJyb3IgbWVzc2FnZXMuIFJldHVybgogKiBXUF9FcnJvciBhbmQgdXNlIHtAbGluayBpc193cF9lcnJvcigpfSB0byBjaGVjayBpZiB0aGlzIGNsYXNzIGlzIHJldHVybmVkLgogKiBNYW55IGNvcmUgV29yZFByZXNzIGZ1bmN0aW9ucyBwYXNzIHRoaXMgY2xhc3MgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIGFuZAogKiBpZiBub3QgaGFuZGxlZCBwcm9wZXJseSB3aWxsIHJlc3VsdCBpbiBjb2RlIGVycm9ycy4KICoKICogQHBhY2thZ2UgV29yZFByZXNzCiAqIEBzaW5jZSAyLjEuMAogKi8KY2xhc3MgV1BfRXJyb3IgewoJLyoqCgkgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgZXJyb3JzLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgJGVycm9ycyA9IGFycmF5KCk7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgZGF0YSBmb3IgZXJyb3IgY29kZXMuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKiBAdmFyIGFycmF5CgkgKi8KCXB1YmxpYyAkZXJyb3JfZGF0YSA9IGFycmF5KCk7CgoJLyoqCgkgKiBJbml0aWFsaXplIHRoZSBlcnJvci4KCSAqCgkgKiBJZiBgJGNvZGVgIGlzIGVtcHR5LCB0aGUgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQuCgkgKiBXaGVuIGAkY29kZWAgaXMgbm90IGVtcHR5LCBgJG1lc3NhZ2VgIHdpbGwgYmUgdXNlZCBldmVuIGlmCgkgKiBpdCBpcyBlbXB0eS4gVGhlIGAkZGF0YWAgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBvbmx5IGlmIGl0CgkgKiBpcyBub3QgZW1wdHkuCgkgKgoJICogVGhvdWdoIHRoZSBjbGFzcyBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgc2luZ2xlIGVycm9yIGNvZGUgYW5kCgkgKiBtZXNzYWdlLCBtdWx0aXBsZSBjb2RlcyBjYW4gYmUgYWRkZWQgdXNpbmcgdGhlIGBhZGQoKWAgbWV0aG9kLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmd8aW50ICRjb2RlIEVycm9yIGNvZGUKCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgRXJyb3IgbWVzc2FnZQoJICogQHBhcmFtIG1peGVkICRkYXRhIE9wdGlvbmFsLiBFcnJvciBkYXRhLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRjb2RlID0gJycsICRtZXNzYWdlID0gJycsICRkYXRhID0gJycgKSB7CgkJaWYgKCBlbXB0eSgkY29kZSkgKQoJCQlyZXR1cm47CgoJCSR0aGlzLT5lcnJvcnNbJGNvZGVdW10gPSAkbWVzc2FnZTsKCgkJaWYgKCAhIGVtcHR5KCRkYXRhKSApCgkJCSR0aGlzLT5lcnJvcl9kYXRhWyRjb2RlXSA9ICRkYXRhOwoJfQoKCS8qKgoJICogUmV0cmlldmUgYWxsIGVycm9yIGNvZGVzLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqCgkgKiBAcmV0dXJuIGFycmF5IExpc3Qgb2YgZXJyb3IgY29kZXMsIGlmIGF2YWlsYWJsZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9lcnJvcl9jb2RlcygpIHsKCQlpZiAoIGVtcHR5KCR0aGlzLT5lcnJvcnMpICkKCQkJcmV0dXJuIGFycmF5KCk7CgoJCXJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5lcnJvcnMpOwoJfQoKCS8qKgoJICogUmV0cmlldmUgZmlyc3QgZXJyb3IgY29kZSBhdmFpbGFibGUuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICoKCSAqIEByZXR1cm4gc3RyaW5nfGludCBFbXB0eSBzdHJpbmcsIGlmIG5vIGVycm9yIGNvZGVzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2Vycm9yX2NvZGUoKSB7CgkJJGNvZGVzID0gJHRoaXMtPmdldF9lcnJvcl9jb2RlcygpOwoKCQlpZiAoIGVtcHR5KCRjb2RlcykgKQoJCQlyZXR1cm4gJyc7CgoJCXJldHVybiAkY29kZXNbMF07Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZSBhbGwgZXJyb3IgbWVzc2FnZXMgb3IgZXJyb3IgbWVzc2FnZXMgbWF0Y2hpbmcgY29kZS4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nfGludCAkY29kZSBPcHRpb25hbC4gUmV0cmlldmUgbWVzc2FnZXMgbWF0Y2hpbmcgY29kZSwgaWYgZXhpc3RzLgoJICogQHJldHVybiBhcnJheSBFcnJvciBzdHJpbmdzIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGFycmF5IG9uIGZhaWx1cmUgKGlmIHVzaW5nIGNvZGUgcGFyYW1ldGVyKS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9lcnJvcl9tZXNzYWdlcygkY29kZSA9ICcnKSB7CgkJLy8gUmV0dXJuIGFsbCBtZXNzYWdlcyBpZiBubyBjb2RlIHNwZWNpZmllZC4KCQlpZiAoIGVtcHR5KCRjb2RlKSApIHsKCQkJJGFsbF9tZXNzYWdlcyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCAoYXJyYXkpICR0aGlzLT5lcnJvcnMgYXMgJGNvZGUgPT4gJG1lc3NhZ2VzICkKCQkJCSRhbGxfbWVzc2FnZXMgPSBhcnJheV9tZXJnZSgkYWxsX21lc3NhZ2VzLCAkbWVzc2FnZXMpOwoKCQkJcmV0dXJuICRhbGxfbWVzc2FnZXM7CgkJfQoKCQlpZiAoIGlzc2V0KCR0aGlzLT5lcnJvcnNbJGNvZGVdKSApCgkJCXJldHVybiAkdGhpcy0+ZXJyb3JzWyRjb2RlXTsKCQllbHNlCgkJCXJldHVybiBhcnJheSgpOwoJfQoKCS8qKgoJICogR2V0IHNpbmdsZSBlcnJvciBtZXNzYWdlLgoJICoKCSAqIFRoaXMgd2lsbCBnZXQgdGhlIGZpcnN0IG1lc3NhZ2UgYXZhaWxhYmxlIGZvciB0aGUgY29kZS4gSWYgbm8gY29kZSBpcwoJICogZ2l2ZW4gdGhlbiB0aGUgZmlyc3QgY29kZSBhdmFpbGFibGUgd2lsbCBiZSB1c2VkLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmd8aW50ICRjb2RlIE9wdGlvbmFsLiBFcnJvciBjb2RlIHRvIHJldHJpZXZlIG1lc3NhZ2UuCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2Vycm9yX21lc3NhZ2UoJGNvZGUgPSAnJykgewoJCWlmICggZW1wdHkoJGNvZGUpICkKCQkJJGNvZGUgPSAkdGhpcy0+Z2V0X2Vycm9yX2NvZGUoKTsKCQkkbWVzc2FnZXMgPSAkdGhpcy0+Z2V0X2Vycm9yX21lc3NhZ2VzKCRjb2RlKTsKCQlpZiAoIGVtcHR5KCRtZXNzYWdlcykgKQoJCQlyZXR1cm4gJyc7CgkJcmV0dXJuICRtZXNzYWdlc1swXTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIGVycm9yIGRhdGEgZm9yIGVycm9yIGNvZGUuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKgoJICogQHBhcmFtIHN0cmluZ3xpbnQgJGNvZGUgT3B0aW9uYWwuIEVycm9yIGNvZGUuCgkgKiBAcmV0dXJuIG1peGVkIEVycm9yIGRhdGEsIGlmIGl0IGV4aXN0cy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9lcnJvcl9kYXRhKCRjb2RlID0gJycpIHsKCQlpZiAoIGVtcHR5KCRjb2RlKSApCgkJCSRjb2RlID0gJHRoaXMtPmdldF9lcnJvcl9jb2RlKCk7CgoJCWlmICggaXNzZXQoJHRoaXMtPmVycm9yX2RhdGFbJGNvZGVdKSApCgkJCXJldHVybiAkdGhpcy0+ZXJyb3JfZGF0YVskY29kZV07Cgl9CgoJLyoqCgkgKiBBZGQgYW4gZXJyb3Igb3IgYXBwZW5kIGFkZGl0aW9uYWwgbWVzc2FnZSB0byBhbiBleGlzdGluZyBlcnJvci4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKgoJICogQHBhcmFtIHN0cmluZ3xpbnQgJGNvZGUgRXJyb3IgY29kZS4KCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgRXJyb3IgbWVzc2FnZS4KCSAqIEBwYXJhbSBtaXhlZCAkZGF0YSBPcHRpb25hbC4gRXJyb3IgZGF0YS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZCgkY29kZSwgJG1lc3NhZ2UsICRkYXRhID0gJycpIHsKCQkkdGhpcy0+ZXJyb3JzWyRjb2RlXVtdID0gJG1lc3NhZ2U7CgkJaWYgKCAhIGVtcHR5KCRkYXRhKSApCgkJCSR0aGlzLT5lcnJvcl9kYXRhWyRjb2RlXSA9ICRkYXRhOwoJfQoKCS8qKgoJICogQWRkIGRhdGEgZm9yIGVycm9yIGNvZGUuCgkgKgoJICogVGhlIGVycm9yIGNvZGUgY2FuIG9ubHkgY29udGFpbiBvbmUgZXJyb3IgZGF0YS4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJGRhdGEgRXJyb3IgZGF0YS4KCSAqIEBwYXJhbSBzdHJpbmd8aW50ICRjb2RlIEVycm9yIGNvZGUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRfZGF0YSgkZGF0YSwgJGNvZGUgPSAnJykgewoJCWlmICggZW1wdHkoJGNvZGUpICkKCQkJJGNvZGUgPSAkdGhpcy0+Z2V0X2Vycm9yX2NvZGUoKTsKCgkJJHRoaXMtPmVycm9yX2RhdGFbJGNvZGVdID0gJGRhdGE7Cgl9CgoJLyoqCgkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZXJyb3IuCgkgKgoJICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCBlcnJvciBtZXNzYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAoJICogZXJyb3IgY29kZSwgYWxvbmcgd2l0aCBhbnkgZXJyb3IgZGF0YSBmb3IgdGhhdCBjb2RlLgoJICoKCSAqIEBzaW5jZSA0LjEuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmd8aW50ICRjb2RlIEVycm9yIGNvZGUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZW1vdmUoICRjb2RlICkgewoJCXVuc2V0KCAkdGhpcy0+ZXJyb3JzWyAkY29kZSBdICk7CgkJdW5zZXQoICR0aGlzLT5lcnJvcl9kYXRhWyAkY29kZSBdICk7Cgl9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHZhcmlhYmxlIGlzIGEgV29yZFByZXNzIEVycm9yLgogKgogKiBSZXR1cm5zIHRydWUgaWYgJHRoaW5nIGlzIGFuIG9iamVjdCBvZiB0aGUgV1BfRXJyb3IgY2xhc3MuCiAqCiAqIEBzaW5jZSAyLjEuMAogKgogKiBAcGFyYW0gbWl4ZWQgJHRoaW5nIENoZWNrIGlmIHVua25vd24gdmFyaWFibGUgaXMgYSBXUF9FcnJvciBvYmplY3QuCiAqIEByZXR1cm4gYm9vbCBUcnVlLCBpZiBXUF9FcnJvci4gRmFsc2UsIGlmIG5vdCBXUF9FcnJvci4KICovCmZ1bmN0aW9uIGlzX3dwX2Vycm9yKCAkdGhpbmcgKSB7CglyZXR1cm4gKCAkdGhpbmcgaW5zdGFuY2VvZiBXUF9FcnJvciApOwp9CgovKioKICogU2V0IHRoZSBtYnN0cmluZyBpbnRlcm5hbCBlbmNvZGluZyB0byBhIGJpbmFyeSBzYWZlIGVuY29kaW5nIHdoZW4gZnVuY19vdmVybG9hZAogKiBpcyBlbmFibGVkLgogKgogKiBXaGVuIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgaXMgaW4gdXNlIGZvciBtdWx0aS1ieXRlIGVuY29kaW5ncywgdGhlIHJlc3VsdHMgZnJvbQogKiBzdHJsZW4oKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgcmVzcGVjdCB0aGUgdXRmOCBjaGFyYWN0ZXJzLCBjYXVzaW5nIGJpbmFyeSBkYXRhCiAqIHRvIHJldHVybiBpbmNvcnJlY3QgbGVuZ3Rocy4KICoKICogVGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIG1ic3RyaW5nIGVuY29kaW5nIHRvIGEgYmluYXJ5LXNhZmUgZW5jb2RpbmcsIGFuZAogKiByZXNldHMgaXQgdG8gdGhlIHVzZXJzIGV4cGVjdGVkIGVuY29kaW5nIGFmdGVyd2FyZHMgdGhyb3VnaCB0aGUKICogYHJlc2V0X21ic3RyaW5nX2VuY29kaW5nYCBmdW5jdGlvbi4KICoKICogSXQgaXMgc2FmZSB0byByZWN1cnNpdmVseSBjYWxsIHRoaXMgZnVuY3Rpb24sIGhvd2V2ZXIgZWFjaAogKiBgbWJzdHJpbmdfYmluYXJ5X3NhZmVfZW5jb2RpbmcoKWAgY2FsbCBtdXN0IGJlIGZvbGxvd2VkIHVwIHdpdGggYW4gZXF1YWwgbnVtYmVyCiAqIG9mIGByZXNldF9tYnN0cmluZ19lbmNvZGluZygpYCBjYWxscy4KICoKICogQHNpbmNlIDMuNy4wCiAqCiAqIEBzZWUgcmVzZXRfbWJzdHJpbmdfZW5jb2RpbmcoKQogKgogKiBAc3RhdGljdmFyIGFycmF5ICRlbmNvZGluZ3MKICogQHN0YXRpY3ZhciBib29sICAkb3ZlcmxvYWRlZAogKgogKiBAcGFyYW0gYm9vbCAkcmVzZXQgT3B0aW9uYWwuIFdoZXRoZXIgdG8gcmVzZXQgdGhlIGVuY29kaW5nIGJhY2sgdG8gYSBwcmV2aW91c2x5LXNldCBlbmNvZGluZy4KICogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZmFsc2UuCiAqLwpmdW5jdGlvbiBtYnN0cmluZ19iaW5hcnlfc2FmZV9lbmNvZGluZyggJHJlc2V0ID0gZmFsc2UgKSB7CglzdGF0aWMgJGVuY29kaW5ncyA9IGFycmF5KCk7CglzdGF0aWMgJG92ZXJsb2FkZWQgPSBudWxsOwoKCWlmICggaXNfbnVsbCggJG92ZXJsb2FkZWQgKSApCgkJJG92ZXJsb2FkZWQgPSBmdW5jdGlvbl9leGlzdHMoICdtYl9pbnRlcm5hbF9lbmNvZGluZycgKSAmJiAoIGluaV9nZXQoICdtYnN0cmluZy5mdW5jX292ZXJsb2FkJyApICYgMiApOwoKCWlmICggZmFsc2UgPT09ICRvdmVybG9hZGVkICkKCQlyZXR1cm47CgoJaWYgKCAhICRyZXNldCApIHsKCQkkZW5jb2RpbmcgPSBtYl9pbnRlcm5hbF9lbmNvZGluZygpOwoJCWFycmF5X3B1c2goICRlbmNvZGluZ3MsICRlbmNvZGluZyApOwoJCW1iX2ludGVybmFsX2VuY29kaW5nKCAnSVNPLTg4NTktMScgKTsKCX0KCglpZiAoICRyZXNldCAmJiAkZW5jb2RpbmdzICkgewoJCSRlbmNvZGluZyA9IGFycmF5X3BvcCggJGVuY29kaW5ncyApOwoJCW1iX2ludGVybmFsX2VuY29kaW5nKCAkZW5jb2RpbmcgKTsKCX0KfQoKLyoqCiAqIFJlc2V0IHRoZSBtYnN0cmluZyBpbnRlcm5hbCBlbmNvZGluZyB0byBhIHVzZXJzIHByZXZpb3VzbHkgc2V0IGVuY29kaW5nLgogKgogKiBAc2VlIG1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nKCkKICoKICogQHNpbmNlIDMuNy4wCiAqLwpmdW5jdGlvbiByZXNldF9tYnN0cmluZ19lbmNvZGluZygpIHsKCW1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nKCB0cnVlICk7Cn0KCgpmdW5jdGlvbiBkaWRfYWN0aW9uKCAkYWN0aW9uICkgewoJaWYgKCAndGVtcGxhdGVfcmVkaXJlY3QnID09ICRhY3Rpb24gKSB7CgkJcmV0dXJuIHRydWU7Cgl9Cn0KCmZ1bmN0aW9uIF9kb2luZ19pdF93cm9uZyggJGZ1bmN0aW9uLCAkbWVzc2FnZSwgJHZlcnNpb24gKSB7CglyZXR1cm47Cn0= ###PACKDATA,FILE_END,/pluginbuddy/standalone_preloader.php,importbuddy/pluginbuddy/standalone_preloader.php ###PACKDATA,FILE_START,/pluginbuddy/classes/core_controllers.php,importbuddy/pluginbuddy/classes/core_controllers.php PD9waHAKCgoKCi8qCWNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FjdGlvbnMKICoJCiAqCUhhbmRsZXMgYWN0aW9ucy4gQ3VycmVudGx5IGp1c3QgcmVwb3J0cyBpZiBhY3Rpb25zIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9hY3Rpb25zY29yZSB7CgkKCQoJLyoJcGx1Z2luYnVkZHlfYWN0aW9uc2NvcmUtPl9fY2FsbCgpCgkgKgkKCSAqCU1hZ2ljIG1ldGhvZCBpZiBhIG1ldGhvZCBpcyBjYWxsZWQgdGhhdCBkb2VzIG5vdCBleGlzdC4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJRnVuY3Rpb24gbmFtZS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRhcmd1bWVudHMJCUFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gZnVuY3Rpb24uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIF9fY2FsbCggJG5hbWUsICRhcmd1bWVudHMgKSB7CgkJZWNobyAne01pc3NpbmcgYWN0aW9ucyBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nOwoJfSAvLyBFbmQgX19jYWxsKCkuCgkKCQoJCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FjdGlvbnMuCgoKCi8qCWNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FqYXhjb3JlCiAqCQogKglIYW5kbGVzIGFqYXguIEN1cnJlbnRseSBqdXN0IHJlcG9ydHMgaWYgYWpheCB3YXMgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9hamF4Y29yZSB7CgkKCQoJLyoJcGx1Z2luYnVkZHlfc2hvcnRjb2Rlcy0+X19jYWxsKCkKCSAqCQoJICoJTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlGdW5jdGlvbiBuYW1lLgoJICoJQHBhcmFtCQlhcnJheQkJJGFyZ3VtZW50cwkJQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jYWxsKCAkbmFtZSwgJGFyZ3VtZW50cyApIHsKCQlkaWUoICd7TWlzc2luZyBhamF4IG1ldGhvZCBgJyAuICRuYW1lIC4gJ2AufScgKTsKCX0gLy8gRW5kIF9fY2FsbCgpLgoJCgkKfSAvLyBFbmQgY2xhc3MgcGJfYmFja3VwYnVkZHlfYWpheC4KCgoKLyoJY2xhc3MgYmFja3VwYnVkZHlfY3JvbmNvcmUKICoJCiAqCUhhbmRsZXMgY3JvbnMuIEN1cnJlbnRseSBqdXN0IHJlcG9ydHMgaWYgY3JvbnMgd2VyZSByZWdpc3RlcmVkIGFuZCBjYWxsZWQgYnV0IHRoZSBjYWxsYmFjayB3YXMgbWlzc2luZy4KICoJCiAqCUByZXR1cm4JCW51bGwKICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2Nyb25jb3JlIHsKCQoJCgkvKglwbHVnaW5idWRkeV9zaG9ydGNvZGVzLT5fX2NhbGwoKQoJICoJCgkgKglNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCUZ1bmN0aW9uIG5hbWUuCgkgKglAcGFyYW0JCWFycmF5CQkkYXJndW1lbnRzCQlBcnJheSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGZ1bmN0aW9uLgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiBfX2NhbGwoICRuYW1lLCAkYXJndW1lbnRzICkgewoJCWRpZSggJ3tNaXNzaW5nIGNyb24gbWV0aG9kIGAnIC4gJG5hbWUgLiAnYC59JyApOwoJfSAvLyBFbmQgX19jYWxsKCkuCgkKCQp9IC8vIEVuZCBjbGFzcyBiYWNrdXBidWRkeV9jcm9uLgoKCgovKgljbGFzcyBwYl9iYWNrdXBidWRkeV9kYXNoYm9hcmRjb3JlCiAqCQogKglIYW5kbGVzIGRhc2hib2FyZCB3aWRnZXRzIChvbiBtYWluIGFkbWluIHNjcmVlbikuIFJlcG9ydHMgaWYgYWRtaW4gZGFzaGJvYXJkIHdpZGdldHMgd2VyZSByZWdpc3RlcmVkIGFuZCBjYWxsZWQgYnV0IHRoZSBjYWxsYmFjayB3YXMgbWlzc2luZy4KICoJQWxzbyBoYW5kbGVzIHRoZSBhY3R1YWwgcmVnaXN0ZXJpbmcgb2YgdGhlIHdpZGdldHMuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9kYXNoYm9hcmRjb3JlIHsKCQoJCgkvKglwbHVnaW5idWRkeV9zaG9ydGNvZGVzLT5fX2NhbGwoKQoJICoJCgkgKglNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCUZ1bmN0aW9uIG5hbWUuCgkgKglAcGFyYW0JCWFycmF5CQkkYXJndW1lbnRzCQlBcnJheSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGZ1bmN0aW9uLgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiBfX2NhbGwoICRuYW1lLCAkYXJndW1lbnRzICkgewoJCWRpZSggJ3tNaXNzaW5nIGRhc2hib2FyZCBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nICk7Cgl9IC8vIEVuZCBfX2NhbGwoKS4KCQoJCgkvKglwbHVnaW5idWRkeV9kYXNoYm9hcmQtPnJlZ2lzdGVyX3dpZGdldHMoKQoJICoJCgkgKglDYWxsZWQgYmFjayBieSBXb3JkUHJlc3MgdG8gYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGRhc2hib2FyZCB3aWRnZXQgaW4gdGhlIGFkbWluLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIHJlZ2lzdGVyX3dpZGdldHMoKSB7CgkJLy93cF9hZGRfZGFzaGJvYXJkX3dpZGdldCggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXycgLiAkdGFnLCAkdGl0bGUsICBhcnJheSggJnNlbGY6OiRfZGFzaGJvYXJkLCAkdGFnICkgKTsKCQlmb3JlYWNoICggcGJfYmFja3VwYnVkZHk6OiRfZGFzaGJvYXJkX3dpZGdldHMgYXMgJHdpZGdldCApIHsKCQkJCgkJCWlmICggJHdpZGdldFsnY2FwYWJpbGl0eSddID09ICdnb2Rtb2RlJyApIHsgLy8gZ29kbW9kZSBjYXBhYmlsdGl5LgoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSAmJiBiYWNrdXBidWRkeV9jb3JlOjppc19uZXR3b3JrX2FjdGl2YXRlZCgpICkgeyAvLyBJbiBhIG5ldHdvcmsgaW5zdGFsbGF0aW9uLgoJCQkJCWlmICggIWN1cnJlbnRfdXNlcl9jYW4oICdtYW5hZ2VfbmV0d29yaycgKSApIHsKCQkJCQkJY29udGludWU7IC8vIFNraXAgdGhpcyB3aWRnZXQuIEFjY2VzcyBkZW5pZWQgdG8gaXQuCgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gU3RhbmRhbG9uZQoJCQkJCWlmICggIWN1cnJlbnRfdXNlcl9jYW4oICdhY3RpdmF0ZV9wbHVnaW5zJyApICkgewoJCQkJCQljb250aW51ZTsgLy8gU2tpcCB0aGlzIHdpZGdldC4gQWNjZXNzIGRlbmllZCB0byBpdC4KCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7IC8vIFdQIGNhcGFiaWxpdHkuCgkJCQlpZiAoICFjdXJyZW50X3VzZXJfY2FuKCAkd2lkZ2V0WydjYXBhYmlsaXR5J10gKSApIHsKCQkJCQljb250aW51ZTsgLy8gU2tpcCB0aGlzIHdpZGdldC4gQWNjZXNzIGRlbmllZCB0byBpdC4KCQkJCX0KCQkJfQoJCQkKCQkJJHdpZGdldF9zbHVnID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nIC4gJHdpZGdldFsndGFnJ107CgkJCXdwX2FkZF9kYXNoYm9hcmRfd2lkZ2V0KCAkd2lkZ2V0X3NsdWcsICR3aWRnZXRbJ3RpdGxlJ10sICBhcnJheSggJiR0aGlzLCAkd2lkZ2V0Wyd0YWcnXSApICk7CgoJCQkvLyBJZiBmb3JjZSB0b3AgaXMgZW5hYmxlZCB0aGVuIHdlIHdpbGwgYXR0ZW1wdCB0byBmb3JjZSB0aGUgd2lkZ2V0IHRvIHRoZSB0b3AgaWYgcG9zc2libGUuCgkJCWlmICggaXNzZXQoICR3aWRnZXRbJ2ZvcmNlX3RvcCddICkgJiYgKCAkd2lkZ2V0Wydmb3JjZV90b3AnXSA9PT0gdHJ1ZSApICkgewoJCQkJLy8gTm90ZTogT25seSB3b3JrcyBpZiB1c2VycyBoYXZlIG5ldmVyIHJlLWFycmFuZ2VkIHRoZWlyIGRhc2hib2FyZCB3aWRnZXRzLgoJCQkJZ2xvYmFsICR3cF9tZXRhX2JveGVzOwoJCQkJJG5vcm1hbF9kYXNoYm9hcmQgPSAkd3BfbWV0YV9ib3hlc1snZGFzaGJvYXJkJ11bJ25vcm1hbCddWydjb3JlJ107CgkJCQkkd2lkZ2V0X2JhY2t1cCA9IGFycmF5KCAkd2lkZ2V0X3NsdWcgPT4gJG5vcm1hbF9kYXNoYm9hcmRbJHdpZGdldF9zbHVnXSApOyAvLyBTYXZlIGNvcHkgb2Ygb3VyIHdpZGdldC4KCQkJCXVuc2V0KCAkbm9ybWFsX2Rhc2hib2FyZFskd2lkZ2V0X3NsdWddICk7IC8vIERlbGV0ZSBvdXIgd2lkZ2V0LgoJCQkJJHdwX21ldGFfYm94ZXNbJ2Rhc2hib2FyZCddWydub3JtYWwnXVsnY29yZSddID0gYXJyYXlfbWVyZ2UoICR3aWRnZXRfYmFja3VwLCAkbm9ybWFsX2Rhc2hib2FyZCApOyAvLyBNZXJnZSBvdXIgd2lkZ2V0IGludG8gdGhlIHRvcC4KCQkJfQoJCX0KCX0gLy8gRW5kIHJlZ2lzdGVyX3dpZGdldHMoKS4KCQoJCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2Rhc2hib2FyZC4KCgoKLyoJY2xhc3MgcGJfYmFja3VwYnVkZHlfZmlsdGVyc2NvcmUKICoJCiAqCUhhbmRsZXMgZmlsdGVycy4gQ3VycmVudGx5IGp1c3QgcmVwb3J0cyBpZiBmaWx0ZXJzIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9maWx0ZXJzY29yZSB7CgkKCQoJLyoJcGx1Z2luYnVkZHlfc2hvcnRjb2Rlcy0+X19jYWxsKCkKCSAqCQoJICoJTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlGdW5jdGlvbiBuYW1lLgoJICoJQHBhcmFtCQlhcnJheQkJJGFyZ3VtZW50cwkJQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jYWxsKCAkbmFtZSwgJGFyZ3VtZW50cyApIHsKCQlyZXR1cm4gJ3tNaXNzaW5nIGZpbHRlcnMgbWV0aG9kIGAnIC4gJG5hbWUgLiAnYC59JzsKCX0gLy8gRW5kIF9fY2FsbCgpLgoJCgkKfSAvLyBFbmQgY2xhc3MgcGJfYmFja3VwYnVkZHlfZmlsdGVycy4KCgoKLyoJY2xhc3MgcGJfYmFja3VwYnVkZHlfcGFnZXNjb3JlCiAqCQogKglIYW5kbGVzIGFkbWluIHBhZ2VzLiBSZXBvcnRzIGlmIHBhZ2VzIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCUFsc28gcHJvdmlkZXMgbG9hZF9jb250cm9sbGVyKCkgZnVuY3Rpb24gZm9yIHBhZ2VzIHRvIGNhbGwgdG8gbG9hZCBhIGNvbnRyb2xsZXIgd2hpbGUgaW4gdGhlIGNvbnRyb2xsZXIuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9wYWdlc2NvcmUgewoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3BhZ2VzLT5fX2NhbGwoKQoJICoJCgkgKglNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKglBdHRlbXB0cyB0byBsb2FkIGEgY29udHJvbGxlciBwYWdlIG1hdGNoaW5nIHRoZSBtZXRob2QgbmFtZSBpZiBwb3NzaWJsZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJRnVuY3Rpb24gbmFtZS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRhcmd1bWVudHMJCUFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gZnVuY3Rpb24uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIF9fY2FsbCggJG5hbWUsICRhcmd1bWVudHMgKSB7CgkJJHBhZ2VfZmlsZSA9IHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy9wYWdlcy8nIC4gJG5hbWUgLiAnLnBocCc7CgkJaWYgKCAkbmFtZSA9PSAnZ2V0dGluZ19zdGFydGVkJyApIHsKCQkJJHBhZ2VfZmlsZSA9IHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9wbHVnaW5idWRkeS9fJyAuICRuYW1lIC4gJy5waHAnOwoJCX0KCQkKCQlpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZV9maWxlICkgKSB7IC8vIExvYWQgZnJvbSAvY29udHJvbGxlcnMvcGFnZXMvUEFHRS5waHAgaWYgaXQgZXhpc3RzLgoJCQkKCQkJLy8gRGlzcGxheSBwYWdlLgoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdhZG1pbi5qcycsIHRydWUgKTsKCQkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnICk7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2pxdWVyeS11aS10b29sdGlwJywgZmFsc2UgKTsKCQkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdqUXVlcnktdWktMS4xMS4yLmNzcycsIHRydWUgKTsKCQkJZWNobyAnPGRpdiBjbGFzcz0id3JhcCI+JzsKIAkJCXJlcXVpcmVfb25jZSggJHBhZ2VfZmlsZSApOwoJCQllY2hvICc8L2Rpdj4nOwoJCQkKCQkJLy9lY2hvICc8ZGl2IGlkPSJmb290ZXItdGhhbmt5b3UiIHN0eWxlPSJmbG9hdDogcmlnaHQ7IGNvbG9yOiAjNzc3OyBtYXJnaW4tcmlnaHQ6IDIxcHg7IG1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IC0zNHB4OyI+UnVubmluZyBCYWNrdXBCdWRkeSB2JyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgLiAnLjwvZGl2Pic7CgkJCQoJCX0gZWxzZSB7IC8vIE5vdCBmb3VuZAoJCQllY2hvICd7TWlzc2luZyBwYWdlcyBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nOwoJCX0KCX0gLy8gRW5kIF9fY2FsbCgpLgoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3BhZ2VzLT5sb2FkX2NvbnRyb2xsZXIoKQoJICoJCgkgKglMb2FkIGEgY29udHJvbGxlciBmcm9tIHdpdGhpbiBhIHBhZ2UgKHdoaWNoIGlzIGxvYWRlZCBieSBhIGNvbnRyb2xsZXIgaXRzZWxmKS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRwYWdlCQlOYW1lIG9mIHRoZSBwYWdlLiBMb2FkcyBwYWdlIGZyb20gL2NvbnRyb2xsZXJzL3BhZ2VzL05BTUUucGhwLgoJICoJQHJldHVybgkJCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsb2FkX2NvbnRyb2xsZXIoICRwYWdlICkgewoJCWlmICggZmlsZV9leGlzdHMoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy9wYWdlcy8nIC4gJHBhZ2UgLiAnLnBocCcgKSApIHsKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY29udHJvbGxlcnMvcGFnZXMvJyAuICRwYWdlIC4gJy5waHAnICk7CgkJfSBlbHNlIHsKCQkJZWNobyAne0Vycm9yOiBVbmFibGUgdG8gbG9hZCBwYWdlIGNvbnRyb2xsZXIgYCcgLiAkcGFnZSAuICdgOyBmaWxlIG5vdCBmb3VuZC59JzsKCQl9Cgl9CgkKCQoJCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3BhZ2VzLgoKCgovKgljbGFzcyBwYl9iYWNrdXBidWRkeV9zaG9ydGNvZGVzY29yZQogKgkKICoJSGFuZGxlcyBzaG9ydGNvZGVzLiBDdXJyZW50bHkganVzdCByZXBvcnRzIGlmIHNob3J0Y29kZXMgd2VyZSByZWdpc3RlcmVkIGFuZCBjYWxsZWQgYnV0IHRoZSBjYWxsYmFjayB3YXMgbWlzc2luZy4KICoJCiAqCUByZXR1cm4JCW51bGwKICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X3Nob3J0Y29kZXNjb3JlIHsKCQoJCgkvKglwbHVnaW5idWRkeV9zaG9ydGNvZGVzLT5fX2NhbGwoKQoJICoJCgkgKglNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCUZ1bmN0aW9uIG5hbWUuCgkgKglAcGFyYW0JCWFycmF5CQkkYXJndW1lbnRzCQlBcnJheSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGZ1bmN0aW9uLgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiBfX2NhbGwoICRuYW1lLCAkYXJndW1lbnRzICkgewoJCXJldHVybiAne01pc3Npbmcgc2hvcnRjb2RlcyBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nOwoJfSAvLyBFbmQgX19jYWxsKCkuCgkKCQp9IC8vIEVuZCBjbGFzcyBwYl9iYWNrdXBidWRkeV9zaG9ydGNvZGVzLgoK ###PACKDATA,FILE_END,/pluginbuddy/classes/core_controllers.php,importbuddy/pluginbuddy/classes/core_controllers.php ###PACKDATA,FILE_START,/pluginbuddy/classes/filesystem.php,importbuddy/pluginbuddy/classes/filesystem.php PD9waHAKCgoKLyoJY2xhc3MgcGx1Z2luYnVkZHlfZmlsZXN5c3RlbQogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICoJCiAqCUhhbmRsZXMgaW50ZXJmYWNpbmcgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9maWxlc3lzdGVtIHsKCQoJCgkKCS8vICoqKioqKioqKiogUFVCTElDIFBST1BFUlRJRVMgKioqKioqKioqKgoJCgkKCQoJLy8gKioqKioqKioqKiBQUklWQVRFIFBST1BFUlRJRVMgKioqKioqKioqKgoJCgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZmlsZXN5c3RlbS0+X19jb25zdHJ1Y3QoKQoJICoJCgkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCQoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCQoJCgkKCS8qCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+bWtkaXIoKQoJICoJCgkgKglta2RpciB0aGF0IGRlZmF1bHRzIHRvIHJlY3Vyc2l2ZSBiZWhhdmlvdXIuIDk5JSBvZiB0aGUgdGltZSB0aGlzIGlzIHdoYXQgd2Ugd2FudC4KCSAqCQoJICoJQHBhcmFtCQkkcGF0aG5hbWUJCXN0cmluZwkJUGF0aCB0byBjcmVhdGUuCgkgKglAcGFyYW0JCSRtb2RlCQkJaW50CQkJRGVmYXVsdDogMDc3Ny4gU2VlIFBIUCdzIG1rZGlyKCkgZnVuY3Rpb24gZm9yIGRldGFpbHMuCgkgKglAcGFyYW0JCSRyZWN1cnNpdmUJCWJvb2xlYW4JCURlZmF1bHQ6IHRydWUuIFNlZSBQSFAncyBta2RpcigpIGZ1bmN0aW9uIGZvciBkZXRhaWxzLgoJICoJQHJldHVybgkJCQkJCWJvb2xlYW4JCVJldHVybnMgVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGZhaWx1cmUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWtkaXIoICRwYXRobmFtZSwgJG1vZGUgPSAwNzU1LCAkcmVjdXJzaXZlID0gdHJ1ZSkgewoJCXJldHVybiBAbWtkaXIoICRwYXRobmFtZSwgJG1vZGUsICRyZWN1cnNpdmUgKTsKCX0gLy8gRW5kIG1rZGlyKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9maWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCkKCSAqCQoJICoJVW5saW5rIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LiBGaWxlcyBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGhpbi4gVVNFIFdJVEggQ0FVVElPTi4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRkaXIJCURpcmVjdG9yeSB0byBkZWxldGUgLS0gYWxsIGNvbnRlbnRzIHdpdGhpbiwgc3ViZGlyZWN0b3JpZXMsIGZpbGVzLCBldGMgd2lsbCBiZSBwZXJtYW5lbnRseSBkZWxldGVkLgoJICoJQHJldHVybgkJYm9vbGVhbgkJCQkJVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLgoJICovCglmdW5jdGlvbiB1bmxpbmtfcmVjdXJzaXZlKCAkZGlyICkgewoJCWlmICggZGVmaW5lZCggJ1BCX0RFTU9fTU9ERScgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlpZiAoICFmaWxlX2V4aXN0cyggJGRpciApICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKCAhaXNfZGlyKCAkZGlyICkgfHwgaXNfbGluayggJGRpciApICkgewoJCQlAY2htb2QoICRkaXIsIDA3NzcgKTsKCQkJcmV0dXJuIHVubGluaygkZGlyKTsKCQl9CgkJZm9yZWFjaCAoIHNjYW5kaXIoICRkaXIgKSBhcyAkaXRlbSApIHsKCQkJaWYgKCAkaXRlbSA9PSAnLicgfHwgJGl0ZW0gPT0gJy4uJyApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWlmICggISR0aGlzLT51bmxpbmtfcmVjdXJzaXZlKCAkZGlyIC4gIi8iIC4gJGl0ZW0gKSApIHsKCQkJCUBjaG1vZCggJGRpciAuICIvIiAuICRpdGVtLCAwNzc3ICk7CgkJCQlpZiAoICEkdGhpcy0+dW5saW5rX3JlY3Vyc2l2ZSggJGRpciAuICIvIiAuICRpdGVtICkgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBAcm1kaXIoJGRpcik7Cgl9IC8vIEVuZCB1bmxpbmtfcmVjdXJzaXZlKCkuCgkKCQoJCgkvKioKCSAqCXBsdWdpbmJ1ZGR5X2ZpbGVzeXN0ZW0tPmRlZXBnbG9iKCkKCSAqCgkgKglMaWtlIHRoZSBnbG9iKCkgZnVuY3Rpb24gZXhjZXB0IHdhbGtzIGRvd24gaW50byBwYXRocyB0byBjcmVhdGUgYSBmdWxsIGxpc3Rpbmcgb2YgYWxsIHJlc3VsdHMgaW4gdGhlIGRpcmVjdG9yeSBhbmQgYWxsIHN1YmRpcmVjdG9yaWVzLgoJICoJVGhpcyBpcyBlc3NlbnRpYWxseSBhIHJlY3Vyc2l2ZSBnbG9iKCkgYWx0aG91Z2ggaXQgZG9lcyBub3QgdXNlIHJlY3Vyc2lvbiB0byBwZXJmb3JtIHRoaXMuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSRkaXIJCVBhdGggdG8gcGFzcyB0byBnbG9iIGFuZCB3YWxrIHRocm91Z2guCgkgKglAcGFyYW0JCWFycmF5IAkJJGV4Y2x1ZGVzCUFycmF5IG9mIGRpcmVjdG9yaWVzIHRvIGV4Y2x1ZGUsIHJlbGF0aXZlIHRvIHRoZSAkZGlyLiAgSW5jbHVkZSBiZWdpbm5pbmcgc2xhc2guIE5vIHRyYWlsaW5nIHNsYXNoLgoJICoJQHJldHVybgkJYXJyYXkJCQkJCVJldHVybnMgYXJyYXkgb2YgYWxsIG1hdGNoZXMgZm91bmQuCgkgKi8KCWZ1bmN0aW9uIGRlZXBnbG9iKCAkZGlyLCAkZXhjbHVkZXMgPSBhcnJheSgpICkgewoJCSRkaXIgPSBydHJpbSggJGRpciwgJy9cXCcgKTsgLy8gTWFrZSBzdXJlIG5vIHRyYWlsaW5nIHNsYXNoLgoJCSRleGNsdWRlcyA9IHN0cl9yZXBsYWNlKCAkZGlyLCAnJywgJGV4Y2x1ZGVzICk7CgkJJGRpcl9sZW4gPSBzdHJsZW4oICRkaXIgKTsKCQkKCQkkaXRlbXMgPSBnbG9iKCAkZGlyIC4gJy8qJyApOwoJCWlmICggZmFsc2UgPT09ICRpdGVtcyApIHsKCQkJJGl0ZW1zID0gYXJyYXkoKTsKCQl9CgkJCgkJZm9yICggJGkgPSAwOyAkaSA8IGNvdW50KCAkaXRlbXMgKTsgJGkrKyApIHsKCQkJLy8gSWYgdGhpcyBmaWxlL2RpcmVjdG9yeSBiZWdpbnMgd2l0aCBhbiBleGNsdXNpb24gdGhlbiBqdW1wIHRvIG5leHQgZmlsZS9kaXJlY3RvcnkuCgkJCWZvcmVhY2goICRleGNsdWRlcyBhcyAkZXhjbHVkZSApIHsKCQkJCWlmICggYmFja3VwYnVkZHlfY29yZTo6c3RhcnRzV2l0aCggc3Vic3RyKCAkaXRlbXNbJGldLCAkZGlyX2xlbiApLCAkZXhjbHVkZSApICkgewoJCQkJCXVuc2V0KCAkaXRlbXNbJGldICk7CgkJCQkJY29udGludWUgMjsKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKCBpc19kaXIoICRpdGVtc1skaV0gKSApIHsKCQkJCSRhZGQgPSBnbG9iKCAkaXRlbXNbJGldIC4gJy8qJyApOwoJCQkJaWYgKCBmYWxzZSA9PT0gJGFkZCApIHsKCQkJCQkkYWRkID0gYXJyYXkoKTsKCQkJCX0KCQkJCSRpdGVtcyA9IGFycmF5X21lcmdlKCAkaXRlbXMsICRhZGQgKTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJGl0ZW1zOwoJfSAvLyBFbmQgZGVlcGdsb2IoKS4KCQoJCgkKCS8qKgoJICoJcGx1Z2luYnVkZHlfZmlsZXN5c3RlbS0+ZGVlcHNjYW5kaXIoKQoJICoKCSAqCUxpa2UgdGhlIGdsb2IoKSBmdW5jdGlvbiBleGNlcHQgd2Fsa3MgZG93biBpbnRvIHBhdGhzIHRvIGNyZWF0ZSBhIGZ1bGwgbGlzdGluZyBvZiBhbGwgcmVzdWx0cyBpbiB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgc3ViZGlyZWN0b3JpZXMuCgkgKglUaGlzIGlzIGVzc2VudGlhbGx5IGEgcmVjdXJzaXZlIGdsb2IoKSBhbHRob3VnaCBpdCBkb2VzIG5vdCB1c2UgcmVjdXJzaW9uIHRvIHBlcmZvcm0gdGhpcy4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJGRpcgkJUGF0aCB0byBwYXNzIHRvIGdsb2IgYW5kIHdhbGsgdGhyb3VnaC4KCSAqCUBwYXJhbQkJYXJyYXkgCQkkZXhjbHVkZXMJQXJyYXkgb2YgZGlyZWN0b3JpZXMgdG8gZXhjbHVkZSwgcmVsYXRpdmUgdG8gdGhlICRkaXIuICBJbmNsdWRlIGJlZ2lubmluZyBzbGFzaC4gTm8gdHJhaWxpbmcgc2xhc2guCgkgKglAcGFyYW0JCWludCAJCSRzdGFydEF0CU9mZnNldCB0byBzdGFydCBjYWxjdWxhdGluZyBmcm9tIGZvciByZXN1bWVkIGNodW5raW5nLiAkaXRlbXMgbXVzdCBhbHNvIGJlIHBhc3NlZCBmcm9tIHByZXZpb3VzIHJ1bi4KCSAqCUBwYXJhbQkJYXJyYXkgCQkkaXRlbXMJCUFycmF5IG9mIGl0ZW1zIHRvIHVzZSBmb3IgcmVzdW1pbmcuIFJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2hlbiBjaHVua2luZy4KCSAqCUBwYXJhbQkJaW50CQkJJHN0YXJ0X3RpbWUJVGltZXN0YW1wIHRvIGNhbGN1bGF0ZSBlbGFwc2VkIHJ1bnRpbWUgZnJvbS4KCSAqCUBwYXJhbQkJaW50CQkJJG1heF90aW1lCU1heCBzZWNvbmRzIHRvIHJ1biBmb3IgYmVmb3JlIHJldHVybmluZyBmb3IgY2h1bmtpbmcgaWYgYXBwcm9hY2hpbmcuIFplcm8gKDApIHRvIGRpc2FibGluZyBjaHVua2luZy4gSU1QT1JUQU5UOiBEb2VzIF9OT1RfIGFwcGx5IGEgd2lnZ2xlIHJvb20uIFN1YnRyYWN0IHdpZ2dsZSBmcm9tICRtYXhfdGltZSBiZWZvcmUgcGFzc2luZy4KCSAqCUByZXR1cm4JCWFycmF5fHN0cmluZwkJCVN0cmluZyBlcnJvciBtZXNzYWdlIE9SIFJldHVybnMgYXJyYXkgb2YgYWxsIG1hdGNoZXMgZm91bmQgT1IgYXJyYXkoICRmaW5pc2hlZCA9IGZhbHNlLCBhcnJheSggJHN0YXJ0QXQsICRpdGVtcyApICkgaWYgY2h1bmtpbmcgZHVlIHRvIHJ1bm5pbmcgb3V0IG9mIHRpbWUuCgkgKi8KCWZ1bmN0aW9uIGRlZXBzY2FuZGlyKCAkZGlyLCAkZXhjbHVkZXMgPSBhcnJheSgpLCAkc3RhcnRBdCA9IDAsICRpdGVtcyA9IGFycmF5KCksICRzdGFydF90aW1lID0gMCwgJG1heF90aW1lID0gMCApIHsKCQkKCQkkZGlyID0gcnRyaW0oICRkaXIsICcvXFwnICk7IC8vIE1ha2Ugc3VyZSBubyB0cmFpbGluZyBzbGFzaC4KCQkkZXhjbHVkZXMgPSBzdHJfcmVwbGFjZSggJGRpciwgJycsICRleGNsdWRlcyApOwoJCSRkaXJfbGVuID0gc3RybGVuKCAkZGlyICk7CgkJCgkJLy8gSWYgbm90IHJlc3VtaW5nIGEgY2h1bmtlZCBwcm9jZXNzIHRoZW4gZ2V0IGl0ZW1zLgoJCWlmICggISBpc19hcnJheSggJGl0ZW1zICkgfHwgKCAwID09IGNvdW50KCAkaXRlbXMgKSApICkgewoJCQkkaXRlbXMgPSBzY2FuZGlyKCAkZGlyICk7IC8vZ2xvYiggJGRpciAuICcvKicgKTsKCQkJaWYgKCBmYWxzZSA9PT0gJGl0ZW1zICkgewoJCQkJJGl0ZW1zID0gYXJyYXkoKTsKCQkJfSBlbHNlIHsKCQkJCWZvcmVhY2goICRpdGVtcyBhcyAkaSA9PiAgJiRpdGVtICkgewoJCQkJCWlmICggKCAnLicgPT0gJGl0ZW0gKSB8fCAoICcuLicgPT0gJGl0ZW0gKSApIHsKCQkJCQkJdW5zZXQoICRpdGVtc1skaV0gKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCSRpdGVtID0gJGRpciAuICcvJyAuICRpdGVtOyAvLyBBZGQgZGlyZWN0b3J5LgoJCQkJfQoJCQl9CgkJCSRpdGVtcyA9IGFycmF5X3ZhbHVlcyggJGl0ZW1zICk7IC8vIFJlbW92ZSBtaXNzaW5nIGtleWVkIGl0ZW1zLgoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlZXAgc2NhbiByZXN1bWluZyBhdCBgJyAuICRzdGFydEF0IC4gJ2AuJyApOwoJCX0KCQkKCQkvKgoJCWVjaG8gJzxwcmU+JzsKCQlwcmludF9yKCAkaXRlbXMgKTsKCQllY2hvICc8L3ByZT4nOwoJCSovCgkJLy9kaWUoKTsKCQkKCQkKCQlmb3IgKCAkaSA9ICRzdGFydEF0OyAkaSA8IGNvdW50KCAkaXRlbXMgKTsgJGkrKyApIHsgLy8gbWF4KCBhcnJheV9rZXlzCgkJCQoJCQkvL2VjaG8gJ1JhbjogJyAuICRpIC4gJyA9ICcgLiAkaXRlbXNbICRpIF0gLiAnPGJyPic7CgkJCQoJCQkvKgoJCQlpZiAoICEgaXNzZXQoICRpdGVtc1skaV0gKSApIHsgLy8gSXRlbSB3YXMgcmVtb3ZlZCBzbyBpbmRleCBpcyBtaXNzaW5nLiBTa2lwLgoJCQkJY29udGludWU7CgkJCX0KCQkJKi8KCQkJCgkJCS8qCgkJCWVjaG8gJGl0ZW1zWyRpXSAuICc8YnI+JzsKCQkJKi8KCQkJCgkJCS8vIElmIHRoaXMgZmlsZS9kaXJlY3RvcnkgYmVnaW5zIHdpdGggYW4gZXhjbHVzaW9uIHRoZW4ganVtcCB0byBuZXh0IGZpbGUvZGlyZWN0b3J5LgoJCQlmb3JlYWNoKCAkZXhjbHVkZXMgYXMgJGV4Y2x1ZGUgKSB7CgkJCQlpZiAoIGJhY2t1cGJ1ZGR5X2NvcmU6OnN0YXJ0c1dpdGgoIHN1YnN0ciggJGl0ZW1zWyRpXSwgJGRpcl9sZW4gKSwgJGV4Y2x1ZGUgKSApIHsKCQkJCQkvL2VjaG8gJ0V4Y2x1ZGU6ICcgLiAkaXRlbXNbJGldIC4gJyAtLSBNYXRjaGVzOiAnIC4gJGV4Y2x1ZGUgLiAnPGJyPic7CgkJCQkJLy91bnNldCggJGl0ZW1zWyRpXSApOwoJCQkJCSRpdGVtc1skaV0gPSAnJzsKCQkJCQljb250aW51ZSAyOwoJCQkJfQoJCQl9CgkJCQoJCQlpZiAoIGlzX2RpciggJGl0ZW1zWyRpXSApICkgewoJCQkJJGFkZHMgPSBzY2FuZGlyKCAkaXRlbXNbJGldICk7IC8vZ2xvYiggJGl0ZW1zWyRpXSAuICcvKicgKTsKCQkJCWlmICggISBpc19hcnJheSggJGFkZHMgKSApIHsKCQkJCQkkYWRkcyA9IGFycmF5KCk7CgkJCQl9IGVsc2UgewoJCQkJCWZvcmVhY2goICRhZGRzIGFzICRqID0+ICYkYWRkSXRlbSApIHsKCQkJCQkJaWYgKCAoICcuJyA9PSAkYWRkSXRlbSApIHx8ICggJy4uJyA9PSAkYWRkSXRlbSApICkgewoJCQkJCQkJdW5zZXQoICRhZGRzWyRqXSApOwoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJJGFkZEl0ZW0gPSAkaXRlbXNbJGldIC4gJy8nIC4gJGFkZEl0ZW07IC8vIEFkZCBkaXJlY3RvcnkuCgkJCQkJfQoJCQkJCS8vJGl0ZW1zID0gYXJyYXlfdmFsdWVzKCAkaXRlbXMgKTsKCQkJCX0KCQkJCSRpdGVtcyA9IGFycmF5X21lcmdlKCAkaXRlbXMsICRhZGRzICk7CgkJCX0KCQkJCgkJCS8vIENoZWNrIGlmIGVub3VnaCB0aW1lIHJlbWFpbnMgdG8gY29udGludWUsIGVsc2UgY2h1bmsuCgkJCWlmICggMCAhPSAkbWF4X3RpbWUgKSB7IC8vIENodW5raW5nIGVuYWJsZWQuCgkJCQlpZiAoICggdGltZSgpIC0gJHN0YXJ0X3RpbWUgKSA+ICRtYXhfdGltZSApIHsgLy8gTm90IGVub3VnaCB0aW1lIGxlZnQuCgkJCQkJaWYgKCAkaSA9PSAkc3RhcnRBdCApIHsgLy8gRGlkIG5vdCBpbmNyZWFzZSBwb3NpdGlvbi4KCQkJCQkJaWYgKCAkbWF4X3RpbWUgPCAwICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4MzQ3NDM3NDU6IE1heCB0aW1lIG5lZ2F0aXZlLiBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIG1heCBQSFAgdGltZSBmb3IgdGhpcyBzZXJ2ZXIgaXMgZXhjZXB0aW9uYWxseSBsb3cuIENoZWNrIG1heCBQSFAgcnVudGltZSB0byB2ZXJpZnkgaXQgaXMgMzAgc2Vjb25kcyBvciBtb3JlLicgKTsKCQkJCQkJfQoJCQkJCQkkZXJyb3IgPSAnRXJyb3IgIzM0ODQ4OTM0OiBObyBwcm9ncmVzcyB3YXMgbWFkZSBkdXJpbmcgZmlsZSBzY2FuLiBIYWx0aW5nIHRvIHByZXZlbnQgbG9vcGluZyByZXBlYXRlZGx5IGF0IGJlZ2lubmluZyBvZiBkZWVwIHNjYW4uIEVsYXBzZWQ6IGAnIC4gKCB0aW1lKCkgLSAkc3RhcnRfdGltZSApIC4gJ2AuIE1heCB0aW1lOiBgJyAuICRtYXhfdGltZSAuICdgLiBzdGFydEF0OiBgJyAuICRzdGFydEF0IC4gJ2AuIEl0ZW1zIGNvdW50OiBgJyAuIGNvdW50KCAkaXRlbXMgKSAuICdgLic7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQkJCQlyZXR1cm4gJGVycm9yOwoJCQkJCX0KCQkJCQkkc3RhcnRBdCA9ICRpOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1J1bm5pbmcgb3V0IG9mIHRpbWUgY2FsY3VsYXRpbmcgZGVlcCBmaWxlIHNjYW4uIENodW5raW5nIGF0IHBvc2l0aW9uIGAnIC4gJHN0YXJ0QXQgLiAnYC4gSXRlbXMgc28gZmFyOiBgJyAuIGNvdW50KCAkaXRlbXMgKSAuICdgLiBFbGFwc2VkOiBgJyAuICggdGltZSgpIC0gJHN0YXJ0X3RpbWUgKSAuICdgIHNlY3MuIE1heCB0aW1lOiBgJyAuICRtYXhfdGltZSAuICdgIHNlY3MuJyApOwoJCQkJCXJldHVybiBhcnJheSggZmFsc2UsIGFycmF5KCAoICRpICsgMSApLCAkaXRlbXMgKSApOwoJCQkJfQoJCQl9CgkJCQoJCX0gLy8gZW5kIGZvci4KCQkKCQlyZXR1cm4gYXJyYXlfZmlsdGVyKCAkaXRlbXMgKTsgLy8gUmVtb3ZlZCBhbnkgZW1wdHkgdmFsdWVzIChleGNsdWRlcyBpdGVtcykuCgl9IC8vIEVuZCBkZWVwc2NhbmRpcigpLgoJCgkKCQoJZnVuY3Rpb24gcmVjdXJzaXZlX2NvcHkoICRzcmMsICRkc3QgKSB7CgkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb3B5aW5nIGAnIC4gJHNyYyAuICdgIHRvIGAnIC4gJGRzdCAuICdgLicgKTsKCQlpZiAoIGlzX2RpciggJHNyYyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb3B5aW5nIGRpcmVjdG9yeSBgJyAuICRzcmMgLiAnYCB0byBgJyAuICRkc3QgLiAnYCByZWN1cnNpdmVseS4nICk7CgkJCUAkdGhpcy0+bWtkaXIoICRkc3QsIDA3NzcgKTsKCQkJJGZpbGVzID0gc2NhbmRpcigkc3JjKTsKCQkJZm9yZWFjaCAoICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCWlmICgkZmlsZSAhPSAiLiIgJiYgJGZpbGUgIT0gIi4uIikgewoJCQkJCSR0aGlzLT5yZWN1cnNpdmVfY29weSgiJHNyYy8kZmlsZSIsICIkZHN0LyRmaWxlIik7CgkJCQl9CgkJCX0KCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCAkc3JjICkgKSB7CgkJCUBjb3B5KCAkc3JjLCAkZHN0ICk7IC8vIFRvZG86IHNob3VsZCB0aGlzIG5lZWQgc3VwcHJlc3Npb24/IE1lZGlhIGNvcHlpbmcgd2FzIHRocm93aW5nICRkc3QgaXMgZGlyZWN0b3J5IGVycm9ycy4KCQl9Cgl9CgkKCQoJLy8gUkggYWRkZWQ7IGZyb20gQ2hyaXM/CgkvKgoJCglwdWJsaWMgZnVuY3Rpb24gY3VzdG9tX2NvcHkoICRzb3VyY2UsICRkZXN0aW5hdGlvbiwgJGFyZ3MgPSBhcnJheSgpICkgewoJCSRkZWZhdWx0X2FyZ3MgPSBhcnJheSgKCQkJJ21heF9kZXB0aCcgICAgPT4gMTAwLAoJCQknZm9sZGVyX21vZGUnICA9PiAwNzU1LAoJCQknZmlsZV9tb2RlJyAgICA9PiAwNzQ0LAoJCQknaWdub3JlX2ZpbGVzJyA9PiBhcnJheSgpLAoJCSk7CgkJJGFyZ3MgPSBhcnJheV9tZXJnZSggJGRlZmF1bHRfYXJncywgJGFyZ3MgKTsKCQkKCQlyZXR1cm4gJHRoaXMtPl9jdXN0b21fY29weSggJHNvdXJjZSwgJGRlc3RpbmF0aW9uLCAkYXJncyApOwoJfSAvLyBFbmQgY3VzdG9tX2NvcHkoKS4KCQoJCgkKCXByaXZhdGUgZnVuY3Rpb24gX2N1c3RvbV9jb3B5KCAkc291cmNlLCAkZGVzdGluYXRpb24sICRhcmdzLCAkZGVwdGggPSAwICkgewoJCWlmICggJGRlcHRoID4gJGFyZ3NbJ21heF9kZXB0aCddICkKCQkJcmV0dXJuIHRydWU7CgkJCQoJCWlmICggaW5fYXJyYXkoIGJhc2VuYW1lKCAkc291cmNlICksICRhcmdzWyAnaWdub3JlX2ZpbGVzJyBdICkgKSByZXR1cm4gdHJ1ZTsKCQkKCQlpZiAoIGlzX2ZpbGUoICRzb3VyY2UgKSApIHsKCQkJaWYgKCBpc19kaXIoICRkZXN0aW5hdGlvbiApIHx8IHByZWdfbWF0Y2goICd8LyR8JywgJGRlc3RpbmF0aW9uICkgKSB7CgkJCQkkZGVzdGluYXRpb24gPSBwcmVnX3JlcGxhY2UoICd8LyskfCcsICcnLCAkZGVzdGluYXRpb24gKTsKCQkJCQoJCQkJJGRlc3RpbmF0aW9uID0gIiRkZXN0aW5hdGlvbi8iIC4gYmFzZW5hbWUoICRzb3VyY2UgKTsKCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPm1rZGlyKCBkaXJuYW1lKCAkZGVzdGluYXRpb24gKSwgJGFyZ3NbJ2ZvbGRlcl9tb2RlJ10gKSApCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCQlpZiAoIGZhbHNlID09PSBAY29weSggJHNvdXJjZSwgJGRlc3RpbmF0aW9uICkgKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQkJQGNobW9kKCAkZGVzdGluYXRpb24sICRhcmdzWydmaWxlX21vZGUnXSApOwoJCQkKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UgaWYgKCBpc19kaXIoICRzb3VyY2UgKSB8fCBwcmVnX21hdGNoKCAnfC9cKiR8JywgJHNvdXJjZSApICkgewoJCQlpZiAoIHByZWdfbWF0Y2goICd8L1wqJHwnLCAkc291cmNlICkgKQoJCQkJJHNvdXJjZSA9IHByZWdfcmVwbGFjZSggJ3wvXCokfCcsICcnLCAkc291cmNlICk7CgkJCWVsc2UgaWYgKCBwcmVnX21hdGNoKCAnfC8kfCcsICRkZXN0aW5hdGlvbiApICkKCQkJCSRkZXN0aW5hdGlvbiA9ICRkZXN0aW5hdGlvbiAuIGJhc2VuYW1lKCAkc291cmNlICk7CgkJCQoJCQkkZGVzdGluYXRpb24gPSBwcmVnX3JlcGxhY2UoICd8LyR8JywgJycsICRkZXN0aW5hdGlvbiApOwoJCQkKCQkJJGZpbGVzID0gYXJyYXlfZGlmZiggYXJyYXlfbWVyZ2UoIGdsb2IoICRzb3VyY2UgLiAnLy4qJyApLCBnbG9iKCAkc291cmNlIC4gJy8qJyApICksIGFycmF5KCAkc291cmNlIC4gJy8uJywgJHNvdXJjZSAuICcvLi4nICkgKTsKCQkJCgkJCWlmICggZmFsc2UgPT09IEBta2RpciggJGRlc3RpbmF0aW9uICkgKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQlmb3JlYWNoICggKGFycmF5KSAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+X2N1c3RvbV9jb3B5KCAkZmlsZSwgIiRkZXN0aW5hdGlvbi8iLCAkYXJncywgJGRlcHRoICsgMSApICkKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCQkKCQlyZXR1cm4gZmFsc2U7Cgl9IC8vIEVuZCBfY29weSgpLgoJCgkKCSovCgoJCgkvLyB0b2RvOiBkb2N1bWVudAoJLy8gJGV4Y2x1c2lvbnMgaXMgbmV2ZXIgbW9kaWZpZWQgc28ganVzdCB1c2UgUEhQJ3MgY29weSBvbiBtb2RpZnkgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LgoJLyoJZnVuY3Rpb25fbmFtZSgpCgkgKgkKCSAqCWZ1bmN0aW9uIGRlc2NyaXB0aW9uCgkgKglAcGFyYW0JCWFycmF5L2Jvb2wJCUFycmF5IG9mIGRpcmVjdG9yeSBwYXRocyB0byBleGNsdWRlLiAgSWYgdHJ1ZSB0aGVuIHRoaXMgZGlyZWN0b3J5IGlzIGV4Y2x1ZGVkIHNvIG5vIG5lZWQgdG8gY2hlY2sgd2l0aCBleGNsdXNpb24gZGlyZWN0b3J5LgoJICoJQHJldHVybgkJYXJyYXkJCQlhcnJheSggVE9UQUxfRElSRUNUT1JZX1NJWkUsIFRPVEFMX1NJWkVfV0lUSF9FWENMVVNJT05TX1RBS0VOX0lOVE9fQUNDT1VOVCwgT0JKRUNUU19GT1VORCwgT0JKRUNUU19GT1VORF9XSVRIX0VYQ0xVU0lPTlMgKQoJICovCglmdW5jdGlvbiBkaXJfc2l6ZV9tYXAoICRkaXIsICRiYXNlLCAkZXhjbHVzaW9ucywgJiRkaXJfYXJyYXkgKSB7CgkJJGRpciA9IHJ0cmltKCAkZGlyLCAnL1xcJyApOyAvLyBGb3JjZSBubyB0cmFpbGluZyBzbGFzaC4KCQkKCQlpZiggIWlzX2RpciggJGRpciApICkgewoJCQlyZXR1cm4gMDsKCQl9CgkJCgkJJHJldCA9IDA7CgkJJHJldF93aXRoX2V4Y2x1c2lvbnMgPSAwOwoJCSRyZXRfb2JqZWN0cyA9IDA7CgkJJHJldF9vYmplY3RzX3dpdGhfZXhjbHVzaW9ucyA9IDA7CgkJJGV4Y2x1c2lvbnNfcmVzdWx0ID0gJGV4Y2x1c2lvbnM7CgkJJHN1YiA9IEBvcGVuZGlyKCAkZGlyICk7CgkJaWYgKCBmYWxzZSA9PT0gJHN1YiApIHsgLy8gQ2Fubm90IGFjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzU2ODM4NTogVW5hYmxlIHRvIGFjY2VzcyBkaXJlY3Rvcnk6IGAnIC4gJGRpciAuICdgLiBWZXJpZnkgcHJvcGVyIHBlcm1pc3Npb25zLicsIHRydWUgKTsKCQkJcmV0dXJuIDA7CgkJfSBlbHNlIHsKCQkJd2hpbGUoICRmaWxlID0gcmVhZGRpciggJHN1YiApICkgewoJCQkJJGV4Y2x1c2lvbnNfcmVzdWx0ID0gJGV4Y2x1c2lvbnM7CgkJCQkKCQkJCSRkaXJfcGF0aCA9ICcvJyAuIHN0cl9yZXBsYWNlKCAkYmFzZSwgJycsICRkaXIgLiAnLycgLiAkZmlsZSApIC4gJy8nOyAvL3N0cl9yZXBsYWNlKCAkYmFzZSwgJycsICRkaXIgLiAkZmlsZSAuICcvJyApOwoJCQkJCgkJCQlpZiAoICggJGZpbGUgPT0gJy4nICkgfHwgKCAkZmlsZSA9PSAnLi4nICkgKSB7CgkJCQkJCgkJCQkJLy8gRG8gbm90aGluZy4KCQkJCQkKCQkJCX0gZWxzZWlmICggaXNfZGlyKCAkZGlyIC4gJy8nIC4gJGZpbGUgKSApIHsgLy8gRElSRUNUT1JZLgoJCQkJCQoJCQkJCWlmICggKCAkZXhjbHVzaW9ucyA9PT0gdHJ1ZSApIHx8IHNlbGY6OmluX2FycmF5X3N1YnN0ciggJGV4Y2x1c2lvbnMsICRkaXJfcGF0aCwgJy8nICkgKSB7CgkJCQkJCSRleGNsdXNpb25zX3Jlc3VsdCA9IHRydWU7CgkJCQkJfQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZGlyX3NpemVfbWFwKCAkZGlyIC4gJy8nIC4gJGZpbGUgLiAnLycsICRiYXNlLCAkZXhjbHVzaW9ucywgJGRpcl9hcnJheSApOwoJCQkJCSR0aGlzX3NpemUgPSAkcmVzdWx0WzBdOwoJCQkJCSR0aGlzX29iamVjdHMgPSAkcmVzdWx0WzJdOwoJCQkJCQoJCQkJCWlmICggJGV4Y2x1c2lvbnNfcmVzdWx0ID09PSB0cnVlICkgeyAvLyBJZiBleGNsdWRpbmcgdGhlbiB3aXBlIGV4Y2x1ZGVkIHZhbHVlLgoJCQkJCQkkdGhpc19zaXplX3dpdGhfZXhjbHVzaW9ucyA9IGZhbHNlOwoJCQkJCQkkdGhpc19vYmplY3RzX3dpdGhfZXhjbHVzaW9ucyA9IDA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXNfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgPSAkcmVzdWx0WzFdOyAvLyAvIDEwNDg1NzYgKTsKCQkJCQkJJHRoaXNfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgPSAkcmVzdWx0WzNdOyAvLyAvIDEwNDg1NzYgKTsKCQkJCQl9CgkJCQkJCgkJCQkJJGRpcl9hcnJheVsgJGRpcl9wYXRoIF0gPSBhcnJheSggJHRoaXNfc2l6ZSwgJHRoaXNfc2l6ZV93aXRoX2V4Y2x1c2lvbnMsICR0aGlzX29iamVjdHMsICR0aGlzX29iamVjdHNfd2l0aF9leGNsdXNpb25zICk7IC8vICRkaXJfYXJyYXlbIERJUkVDVE9SWV9QQVRIIF0gPSBESVJFQ1RPUllfU0laRTsKCQkJCQkKCQkJCQkkcmV0ICs9ICR0aGlzX3NpemU7CgkJCQkJJHJldF9vYmplY3RzICs9ICR0aGlzX29iamVjdHM7CgkJCQkJJHJldF93aXRoX2V4Y2x1c2lvbnMgKz0gJHRoaXNfc2l6ZV93aXRoX2V4Y2x1c2lvbnM7CgkJCQkJJHJldF9vYmplY3RzX3dpdGhfZXhjbHVzaW9ucyArPSAkdGhpc19vYmplY3RzX3dpdGhfZXhjbHVzaW9uczsKCQkJCQkKCQkJCQl1bnNldCggJGZpbGUgKTsKCQkJCQkKCQkJCX0gZWxzZSB7IC8vIEZJTEUuCgkJCQkJCgkJCQkJJHN0YXRzID0gQHN0YXQoICRkaXIgLiAnLycgLiAkZmlsZSApOwoJCQkJCWlmICggaXNfYXJyYXkoICRzdGF0cyApICkgewoJCQkJCQkkcmV0ICs9ICRzdGF0c1snc2l6ZSddOwoJCQkJCQkkcmV0X29iamVjdHMrKzsKCQkJCQkJaWYgKCAoICRleGNsdXNpb25zICE9PSB0cnVlICkgJiYgIWluX2FycmF5KCAkZGlyX3BhdGgsICRleGNsdXNpb25zICkgKSB7IC8vIE5vdCBleGNsdWRpbmcuCgkJCQkJCQkkcmV0X3dpdGhfZXhjbHVzaW9ucyArPSAkc3RhdHNbJ3NpemUnXTsKCQkJCQkJCSRyZXRfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMrKzsKCQkJCQkJfQoJCQkJCX0KCQkJCQl1bnNldCggJGZpbGUgKTsKCQkJCQkKCQkJCX0KCQkJfQoJCQljbG9zZWRpciggJHN1YiApOwoJCQl1bnNldCggJHN1YiApOwoJCQlyZXR1cm4gYXJyYXkoICRyZXQsICRyZXRfd2l0aF9leGNsdXNpb25zLCAkcmV0X29iamVjdHMsICRyZXRfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgKTsKCQl9Cgl9IC8vIEVuZCBkaXJfc2l6ZV9tYXAoKS4KCQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5fYXJyYXlfc3Vic3RyKCAkaGF5c3RhY2ssICRuZWVkbGUsICR0cmFpbGluZyA9ICcnICkgewoJCWZvcmVhY2goICRoYXlzdGFjayBhcyAkaGF5ICkgewoJCQlpZiAoICggJGhheSAuICR0cmFpbGluZyApID09IHN1YnN0ciggJG5lZWRsZSAuICR0cmFpbGluZywgMCwgc3RybGVuKCAkaGF5IC4gJHRyYWlsaW5nICkgKSApIHsKCQkJCS8vZWNobyAkbmVlZGxlIC4gJ34nIC4gJGhheSAuICc8YnI+JzsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJCQoJCXJldHVybiBmYWxzZTsKCX0KCQoJCglwdWJsaWMgZnVuY3Rpb24gZXhpdF9jb2RlX2xvb2t1cCggJGNvZGUgKSB7CgkJc3dpdGNoKCAoc3RyaW5nKSRjb2RlICkgewoJCQljYXNlICcwJzoKCQkJCXJldHVybiAnQ29tbWFuZCBjb21wbGV0ZWQgJiByZXR1cm5lZCBub3JtYWxseS4nOwoJCQkJYnJlYWs7CgkJCWNhc2UgJzEyNic6CgkJCQlyZXR1cm4gJ0NvbW1hbmQgaW52b2tlZCBjYW5ub3QgZXhlY3V0ZS4gQ2hlY2sgY29tbWFuZCBoYXMgdmFsaWQgcGVybWlzaW9ucyBhbmQgZXhlY3V0ZSBjYXBhYmlsaXR5Lic7CgkJCQlicmVhazsKCQkJY2FzZSAnMTI3JzoKCQkJCXJldHVybiAnQ29tbWFuZCBub3QgZm91bmQuJzsKCQkJCWJyZWFrOwoJCQljYXNlICcxNTInOgoJCQkJcmV0dXJuICdTSUdYQ1BVIDE1MjsgQ1BVIHRpbWUgbGltaXQgZXhjZWVkZWQuJzsKCQkJCWJyZWFrOwoJCQljYXNlICcxNTMnOgoJCQkJcmV0dXJuICdTSUdYRlNaIDE1MzsgRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkLiBWZXJpZnkgZW5vdWdoIGZyZWUgc3BhY2UgZXhpc3RzICYgZmlsZXN5c3RlbSBtYXggc2l6ZSBub3QgZXhjZWVkZWQuJzsKCQkJCWJyZWFrOwoJCQljYXNlICcxNTgnOgoJCQkJcmV0dXJuICdTSUdYQ1BVIDE1ODsgQ1BVIHRpbWUgbGltaXQgZXhjZWVkZWQuJzsKCQkJCWJyZWFrOwoJCQljYXNlICcxNTknOgoJCQkJcmV0dXJuICdTSUdYRlNaIDE1OTsgRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkLiBWZXJpZnkgZW5vdWdoIGZyZWUgc3BhY2UgZXhpc3RzICYgZmlsZXN5c3RlbSBtYXggc2l6ZSBub3QgZXhjZWVkZWQuJzsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuICctTm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZvciB0aGlzIGV4aXQgY29kZS0gU2VlOiBodHRwczovL3dpa2kubmNzYS5pbGxpbm9pcy5lZHUvZGlzcGxheS9NUkRQVUIvQmF0Y2grRXhpdCtDb2RlcyAnOwoJCQkJYnJlYWs7CgkJfQoJfQoJCgkvLyBOZXdlc3QgdG8gb2xkZXN0LgoJZnVuY3Rpb24gZ2xvYl9ieV9kYXRlKCAkcGF0dGVybiwgJG1vZGUgPSAnY3RpbWUnICkgewoJCSRmaWxlX2FycmF5ID0gYXJyYXkoKTsKCQkkZ2xvYl9yZXN1bHQgPSBnbG9iKCAkcGF0dGVybiApOwoJCWlmICggISBpc19hcnJheSggJGdsb2JfcmVzdWx0ICkgKSB7CgkJCSRnbG9iX3Jlc3VsdCA9IGFycmF5KCk7CgkJfQoJCWZvcmVhY2ggKCAkZ2xvYl9yZXN1bHQgYXMgJGkgPT4gJGZpbGVuYW1lICkgewoJCQlpZiAoICdjdGltZScgPT0gJG1vZGUgKSB7CgkJCQkkdGltZSA9IEBmaWxlY3RpbWUoICRmaWxlbmFtZSApOwoJCQl9IGVsc2VpZiAoICdtdGltZScgPT0gJG1vZGUgKSB7CgkJCQkkdGltZSA9IEBmaWxlbXRpbWUoICRmaWxlbmFtZSApOwoJCQl9IGVsc2UgewoJCQkJZXJyb3JfbG9nKCAnQmFja3VwQnVkZHkgRXJyb3IgIzIzMzQ5ODQ0ODkzODM6IEludmFsaWQgZ2xvYl9ieV9kYXRlIG1vZGU6IGAnIC4gJG1vZGUgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJaWYgKCBmYWxzZSA9PT0gJHRpbWUgKSB7IC8vIEZpbGUgbWlzc2luZyBvciBubyBsb25nZXIgYWNjZXNzaWJsZT8KCQkJCWlmICggISBmaWxlX2V4aXN0cyggJGZpbGVuYW1lICkgKSB7IC8vIEZpbGUgd2VudCBhd2F5LgoJCQkJCXVuc2V0KCAkZ2xvYl9yZXN1bHRbICRpIF0gKTsKCQkJCX0gZWxzZSB7IC8vIFVrbm93biBtb2QgdGltZS4gU2V0IGFzIGN1cnJlbnQgdGltZS4KCQkJCQkkdGltZSA9IHRpbWUoKTsKCQkJCX0KCQkJfQoJCQl3aGlsZSggaXNzZXQoICRmaWxlX2FycmF5WyR0aW1lXSApICkgeyAvLyBBdm9pZCBjb2xsaXNpb25zLgoJCQkJJHRpbWUgPSAkdGltZSArIDAuMTsKCQkJfQoJCQkkZmlsZV9hcnJheVskdGltZV0gPSAkZmlsZW5hbWU7IC8vIG9yIGp1c3QgJGZpbGVuYW1lCgkJfQoJCWtyc29ydCggJGZpbGVfYXJyYXkgKTsKCQlyZXR1cm4gJGZpbGVfYXJyYXk7CgkJCgl9IC8vIEVuZCBnbG9iX2J5X2RhdGUoKS4KCQoJCn0gLy8gRW5kIGNsYXNzIHBsdWdpbmJ1ZGR5X3NldHRpbmdzLgoK ###PACKDATA,FILE_END,/pluginbuddy/classes/filesystem.php,importbuddy/pluginbuddy/classes/filesystem.php ###PACKDATA,FILE_START,/pluginbuddy/classes/form.php,importbuddy/pluginbuddy/classes/form.php PD9waHAKCgovKglwbHVnaW5idWRkeSBjbGFzcwogKgkKICoJRm9ybSBmcmFtZXdvcmsgZm9yIGhhbmRsaW5nIGFsbCBmb3JtcywgdmFsaWRhdGlvbiwgYW5kIHRoZWlyIGRpc3BsYXkuCiAqCQogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2Zvcm0gewoJCgkKCQoJLy8gKioqKioqKioqKiBQVUJMSUMgUFJPUEVSVElFUyAqKioqKioqKioqCgkKCQoJCgkvLyAqKioqKioqKioqIFBSSVZBVEUgUFJPUEVSVElFUyAqKioqKioqKioqCgkKCQoJCglwcml2YXRlICRfZm9ybV9uYW1lID0gJyc7Cglwcml2YXRlICRfc2F2ZV9wb2ludCA9ICcnOwoJcHJpdmF0ZSAkX2lucHV0cyA9IGFycmF5KCk7Cglwcml2YXRlICRfcHJlZml4ID0gJ0RFRkFVTFQnOwoJcHJpdmF0ZSAkX3N0YXJ0ZWQgPSBmYWxzZTsKCXByaXZhdGUgJF9lbmRlZCA9IGZhbHNlOwoJcHJpdmF0ZSAkX2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nID0gJyc7Cglwcml2YXRlICRfbG9hZGVkX2NvbG9yID0gZmFsc2U7CgkKCQoJCgkvLyAqKioqKioqKioqIEZVTkNUSU9OUyAqKioqKioqKioqCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5fY29uc3RydWN0KCkKCSAqCQoJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU2V0cyB1cCB0aGUgZm9ybS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRmb3JtX25hbWUJCQkJCU5hbWUgLyBzbHVnIG9mIHRoZSBmb3JtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRzYXZlX3BvaW50CQkJCQlTYXZlIHBvaW50IHRvIHNhdmUgZm9ybTsgQ3VycmVudGx5IG9ubHkgdXNlZCBmb3Igc2V0dGluZ3MgZm9ybS4gQHNlZSBwbHVnaW5idWRkeV9zZXR0aW5ncy0+X19jb25zdHJ1Y3QoKS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcJQWRkaXRpb25hbCBxdWVyeXN0cmluZyB0byBhcHBlbmQgdG8gZW5kIG9mIGZvcm0gYWN0aW9uIFVSTC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRmb3JtX25hbWUsICRzYXZlX3BvaW50ID0gJycsICRhZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZyA9ICcnICkgewoJCSR0aGlzLT5fZm9ybV9uYW1lID0gJGZvcm1fbmFtZTsKCQkkdGhpcy0+X3NhdmVfcG9pbnQgPSAkc2F2ZV9wb2ludDsKCQkkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nID0gJGFkZGl0aW9uYWxfcXVlcnlfc3RyaW5nOwoJCSR0aGlzLT5fcHJlZml4ID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nOwoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnRleHQoKQoJICoJCgkgKglBZGQgYSB0ZXh0IGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRleHQoICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyRuYW1lXSA9IGFycmF5KAoJCQkndHlwZScgID0+IF9fRlVOQ1RJT05fXywKCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIHRleHQoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnBsYWludGV4dCgpCgkgKgkKCSAqCUFkZCBhIHRleHQgaW5wdXQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwbGFpbnRleHQoICRuYW1lLCAkdmFsdWUgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnICA9PiAkdmFsdWUsCgkJKTsKCX0gLy8gRW5kIHRleHQoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPmNvbG9yKCkKCSAqCQoJICoJQWRkIGEgY29sb3IgaW5wdXQ7IHRoaXMgaXMgYSB0ZXh0IGlucHV0IHRoYXQgaGFzIGEgY29sb3Igc2VsZWN0b3IuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gY29sb3IoICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyRuYW1lXSA9IGFycmF5KAoJCQkndHlwZScgID0+IF9fRlVOQ1RJT05fXywKCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIGNvbG9yKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5oaWRkZW4oKQoJICoJCgkgKglBZGQgYSBoaWRkZW4gaW5wdXQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gaGlkZGVuKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCBoaWRkZW4oKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnd5c2l3eWcoKQoJICoJCgkgKglBZGRzIGEgdGV4dCBib3ggd3lzaXd5Zy4KCSAqCUBzZWUgd3BfZWRpdG9yKCkgaW4gV29yZFByZXNzIGNvcmUuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHBhcmFtCQlhcnJheQkJJHNldHRpbmdzCQlXb3JkUHJlc3Mgc2V0dGluZ3MgYXJyYXkgdG8gcGFzcyB0byB3cF9lZGl0b3IoKS4gQHNlZSB3cF9lZGl0b3IoKS4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHd5c2l3eWcoICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnLCAkc2V0dGluZ3MgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnICA9PiAkdmFsdWUsCgkJCSdydWxlcycgID0+ICRydWxlcywKCQkJJ3NldHRpbmdzJyAgPT4gJHNldHRpbmdzLAoJCSk7Cgl9IC8vIEVuZCB3eXNpd3lnKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT50ZXh0YXJlYSgpCgkgKgkKCSAqCUFkZCBhIHRleHRhcmVhIGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRleHRhcmVhKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCB0ZXh0YXJlYSgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+c2VsZWN0KCkKCSAqCQoJICoJQWRkIGEgc2VsZWN0IGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCWFycmF5CQkkb3B0aW9ucwkJQXJyYXkgb2Ygb3B0aW9ucyBmb3IgdGhlIGRyb3Bkb3duLiAgVGhlIGtleSBpcyB0aGUgc2x1ZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBwcmV0dHkgdXNlci1kaXNwbGF5ZWQgcGFydC4gPG9wdGlvbiB2YWx1ZT0iYXJyYXlfa2V5Ij5hcnJheV92YWx1ZTwvb3B0aW9uPi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCAkbmFtZSwgJG9wdGlvbnMsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQknb3B0aW9ucycgPT4gJG9wdGlvbnMsCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCBzZWxlY3QoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnJhZGlvKCkKCSAqCQoJICoJQWRkIGEgcmFkaW8gaW5wdXQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRvcHRpb25zCQlBcnJheSBvZiBvcHRpb25zIGZvciB0aGUgcmFkaW8gaW5wdXRzLiAgVGhlIGtleSBpcyB0aGUgc2x1ZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBwcmV0dHkgdXNlci1kaXNwbGF5ZWQgcGFydC4gPGlucHV0IHR5cGU9InJhZGlvIiB2YWx1ZT0iYXJyYXlfa2V5Ij5hcnJheV92YWx1ZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gcmFkaW8oICRuYW1lLCAkb3B0aW9ucywgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSdvcHRpb25zJyA9PiAkb3B0aW9ucywKCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIHJhZGlvKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT50aXRsZSgpCgkgKgkKCSAqCUFkZCBhIHJhZGlvIGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRpdGxlKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCByYWRpbygpLgoJCgkKCQoJcHVibGljIGZ1bmN0aW9uIGh0bWwoICRuYW1lLCAkaHRtbCApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSdodG1sJyAgPT4gJGh0bWwsCgkJKTsKCX0KCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5jaGVja2JveCgpCgkgKgkKCSAqCUFkZCBhIGNoZWNrYm94IGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCWFycmF5CQkkb3B0aW9ucwkJQXJyYXkgZm9ybWF0OiBhcnJheSggJ3VuY2hlY2tlZCcgPT4gJ3VuY2hlY2tlZF92YWx1ZScsICdjaGVja2VkJyA9PiAnY2hlY2tlZF92YWx1ZScgKTsKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gY2hlY2tib3goICRuYW1lLCAkb3B0aW9ucywgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSdvcHRpb25zJyA9PiAkb3B0aW9ucywKCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIGNoZWNrYm94KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5wYXNzd29yZCgpCgkgKgkKCSAqCUFkZCBhIHBhc3N3b3JkIGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHBhc3N3b3JkKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCBwYXNzd29yZCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+c3VibWl0KCkKCSAqCQoJICoJQWRkIGEgc3VibWl0IGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLiBUaGlzIGlzIHRoZSB0ZXh0IGluIHRoZSBkaXNwbGF5ZWQgYnV0dG9uLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc3VibWl0KCAkbmFtZSwgJHZhbHVlID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJwk9PglfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScJPT4JJHZhbHVlLAoJCSk7Cgl9IC8vIEVuZCBzdWJtaXQoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnN0YXJ0KCkKCSAqCQoJICoJU3RhcnRzIHRoZSBmb3JtIG91dHB1dC4gIEF1dG9tYXRpY2FsbHkgcnVucyB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyBzbyB1c3VhbGx5IHNob3VsZCBub3QgbmVlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RhcnQoKSB7CgkJJHRoaXMtPl9zdGFydGVkID0gdHJ1ZTsKCQkKCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nLCAnaHR0cCcgKSApIHsKCQkJJGFjdGlvbl91cmwgPSAkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nOwoJCX0gZWxzZSB7CgkJCQoJCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpICE9ICcnICkgewoJCQkJJGFjdGlvbl91cmwgPSBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmJyAuICR0aGlzLT5fYWRkaXRpb25hbF9xdWVyeV9zdHJpbmc7CgkJCX0gZWxzZSB7CgkJCQkkYWN0aW9uX3VybCA9ICc/JyAuICR0aGlzLT5fYWRkaXRpb25hbF9xdWVyeV9zdHJpbmc7CgkJCX0KCQkJCgkJfQoJCQoJCSRyZXR1cm4gPSAnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IicgLiAkYWN0aW9uX3VybCAuICciIGNsYXNzPSJwYl9mb3JtIHBiX2Zvcm0gJyAuICR0aGlzLT5fcHJlZml4IC4gJHRoaXMtPl9mb3JtX25hbWUgLiAnX2Zvcm0iIGlkPSInIC4gJHRoaXMtPl9wcmVmaXggLiAkdGhpcy0+X2Zvcm1fbmFtZSAuICdfZm9ybSI+JzsKCQkkcmV0dXJuIC49ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInIC4gJHRoaXMtPl9wcmVmaXggLiAnIiB2YWx1ZT0iJyAuICR0aGlzLT5fZm9ybV9uYW1lIC4gJyI+JzsKCQlyZXR1cm4gJHJldHVybjsKCX0gLy8gRW5kIHN0YXJ0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5lbmQoKQoJICoJCgkgKglFbmRzIHRoZSBmb3JtIHNldHRpbmcgbm9uY2UgYW5kIGNsb3NpbmcgPC9mb3JtPi4gTk9UIGF1dG9tYXRpY2FsbHkgcnVuIGV4Y2VwdCBpbiBwbHVnaW5idWRkeV9zZXR0aW5ncyBjbGFzcy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSR2YWx1ZQkJCVZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcnVsZXMJCQkob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlbmQoICRlY2hvID0gZmFsc2UgKSB7CgkJJHRoaXMtPl9lbmRlZCA9IHRydWU7CgoJCS8vIFRPRE86IGZpZWxkcyBtYXliZT8KCQkvLyRyZXR1cm4gPSBwYl9iYWNrdXBidWRkeTo6bm9uY2UoICR0aGlzLT5fZm9ybV9uYW1lICk7CgkJJHJldHVybiA9IHBiX2JhY2t1cGJ1ZGR5Ojpub25jZSggZmFsc2UgKTsgLy8gRG8gbm90IGVjaG8uCgkJJHJldHVybiAuPSAnPC9mb3JtPic7CgkJCgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0gLy8gRW5kIGVuZCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+ZGlzcGxheSgpCgkgKgkKCSAqCURpc3BsYXlzIChlY2hvcykgYSBmb3JtIGl0ZW0gYW5kIGFsbCBpdHMgY29kZS9IVE1MLgoJICoJQHNlZSBwbHVnaW5idWRkeV9mb3JtLT5nZXQoKS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSR2YWx1ZQkJCVZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcnVsZXMJCQkob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkaXNwbGF5KCAkbmFtZSwgJGNzcyA9ICcnICkgewoJCWVjaG8gJHRoaXMtPmdldCggJG5hbWUsICRjc3MgKTsKCX0gLy8gRW5kIGRpc3BsYXkoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPmdldCgpCgkgKgkKCSAqCVJldHVybnMgYSBmb3JtIGl0ZW0gYW5kIGFsbCBpdHMgY29kZS9IVE1MLgoJICoJTGVmdCBjb2x1bW4gaXMgaGlkZGVuIGlmIGFuIG9iamVjdCdzIHRpdGxlID0gJycuCgkgKgl0aXRsZSBvYmplY3QgdHlwZSBjb2xzcGFucyAyLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJGNzcwkJCUFkZGl0aW9uYWwgQ1NTIHRvIGFwcGx5IHRvIGZvcm0gaXRlbS4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJCUFsbCBIVE1MLCBldGMgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0KCAkbmFtZSwgJGNzcyA9ICcnLCAkY2xhc3NlcyA9ICcnLCAkb3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCcgKSB7CgkJaWYgKCAkdGhpcy0+X2VuZGVkID09PSB0cnVlICkgeyAvLyBGb3JtIGFscmVhZHkgY2xvc2VkIGFuZCBlbmRlZC4gRmF0YWwgcHJvYmxlbS4KCQkJcmV0dXJuICd7RXJyb3I6IEZvcm0gYWxyZWFkeSBjbG9zZWQgd2l0aCBlbmQgZnVuY3Rpb24gc28gY2Fubm90IGFkZCBtb3JlIGZpZWxkcy4gT25seSBlbmQgaW4gdmlldyBhZnRlciBhbGwgZGlzcGxheXMgYXJlIGRvbmUufSc7CgkJfQoJCQoJCWlmICggaXNzZXQoICR0aGlzLT5faW5wdXRzWyRuYW1lXSApICkgewoJCQkkcHJlZml4ID0gJHRoaXMtPl9wcmVmaXg7CgkJCQoJCQlpZiAoICR0aGlzLT5fc3RhcnRlZCA9PT0gZmFsc2UgKSB7IC8vIEZvcm0gb3V0cHV0IGhhcyBub3Qgc3RhcnRlZC4gU3RhcnQgaXQuCgkJCQkkcmV0dXJuID0gJHRoaXMtPnN0YXJ0KCk7CgkJCX0gZWxzZSB7CgkJCQkkcmV0dXJuID0gJyc7CgkJCX0KCQkJCgkJCSRpbnB1dCA9ICYkdGhpcy0+X2lucHV0c1skbmFtZV07CgkJCQoJCQlpZiAoICRjc3MgIT0gJycgKSB7CgkJCQkkY3NzID0gJyBzdHlsZT0iJyAuICRjc3MgLiAnIic7CgkJCX0KCQkJCgkJCQoJCQkvKioqKioqKioqKiBURVhUICoqKioqKioqKiovCgkJCWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3RleHQnICkgewoJCQkJCgkJCQkKCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iJyAuICRjbGFzc2VzIC4gJyIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0Wyd2YWx1ZSddIC4gJyIgaWQ9IicgLiAkcHJlZml4IC4gc3RyX3JlcGxhY2UoICcjJywgJ19fJywgJG5hbWUgKSAuICciJyAuICRjc3MgLiAnPic7CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBQTEFJTlRFWFQgKioqKioqKioqKi8KCQkJfSBlbHNlaWYgKCAkaW5wdXRbJ3R5cGUnXSA9PSAncGxhaW50ZXh0JyApIHsKCQkJCQoJCQkJCgkJCQkkcmV0dXJuIC49ICc8c3BhbiBjbGFzcz0iJyAuICRjbGFzc2VzIC4gJyIgJyAuICRjc3MgLiAnPicgLiAkaW5wdXRbJ3ZhbHVlJ10gLiAnPC9zcGFuPic7CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBDT0xPUiAqKioqKioqKioqLwoJCQl9IGVsc2VpZiAoICRpbnB1dFsndHlwZSddID09ICdjb2xvcicgKSB7CgkJCQkKCQkJCS8vIFRPRE86IHRoaXMgYWN0dWFsbHkgc2hvdWxkIG9ubHkgcnVuIG9uY2UgcGVyIFBBR0UgbG9hZC4gYWRkIGEgZnVuY3Rpb24gaXNfc2NyaXB0IGFuZCBpc19zdHlsZSBpbnRvIGZyYW1ld29yayB0byBzZWUgaWYgbG9hZGVkIGludG8gZnJhbWV3b3JrIHlldCBvciBub3QuCgkJCQlpZiAoICR0aGlzLT5fbG9hZGVkX2NvbG9yID09PSBmYWxzZSApIHsgLy8gT25seSBsb2FkIHRoZSBqYXZhc2NyaXB0LCBDU1MsIGV0YyBvbmNlIHBlciBpbnN0YW5jZS4KCQkJCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdqcXVlcnkubWluaUNvbG9ycy5taW4uanMnLCB0cnVlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdqcXVlcnkubWluaUNvbG9ycy5jc3MnLCB0cnVlICk7CgkJCQkJZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQkJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKCQkJCQkJalF1ZXJ5KCAiLnBiX2NvbG9ycGlja2VyIiApLm1pbmlDb2xvcnMoeyBsZXR0ZXJDYXNlOiAidXBwZXJjYXNlIiB9KTsKCQkJCQkJfSk7CgkJCQkJPC9zY3JpcHQ+CgkJCQkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCQkJCQkJLm1pbmlDb2xvcnMtdHJpZ2dlciB7CgkJCQkJCQliYWNrZ3JvdW5kOiB1cmwoICcgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvbWluaWNvbG9ycy90cmlnZ2VyLnBuZyApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtY29sb3JzIHsKCQkJCQkJCWJhY2tncm91bmQ6IHVybCggJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9taW5pY29sb3JzL2dyYWRpZW50LnBuZyApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtaHVlcyB7CgkJCQkJCQliYWNrZ3JvdW5kOiB1cmwoICcgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvbWluaWNvbG9ycy9yYWluYm93LnBuZyApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtY29sb3JQaWNrZXIgewoJCQkJCQkJYmFja2dyb3VuZDogdXJsKCAnIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvcGx1Z2luYnVkZHkvaW1hZ2VzL21pbmljb2xvcnMvY2lyY2xlLmdpZiApIGNlbnRlciBuby1yZXBlYXQ7CgkJCQkJCX0KCQkJCQkJLm1pbmlDb2xvcnMtaHVlUGlja2VyIHsKCQkJCQkJCWJhY2tncm91bmQ6IHVybCggJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9taW5pY29sb3JzL2xpbmUuZ2lmICkgY2VudGVyIG5vLXJlcGVhdDsKCQkJCQkJfQoJCQkJCTwvc3R5bGU+JzsKCQkJCQkkdGhpcy0+X2xvYWRlZF9jb2xvciA9IHRydWU7CgkJCQl9CgkJCQkKCQkJCWlmICggJGNzcyA9PSAnJyApIHsgLy8gZGVmYXVsdCB3aWR0aC4KCQkJCQkkY3NzID0gJyBzdHlsZT0id2lkdGg6IDYwcHg7Iic7CgkJCQl9CgkJCQkKCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCBjbGFzcz0icGJfY29sb3JwaWNrZXIgJyAuICRjbGFzc2VzIC4gJyIgdHlwZT0idGV4dCIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0Wyd2YWx1ZSddIC4gJyIgaWQ9IicgLiAkcHJlZml4IC4gc3RyX3JlcGxhY2UoICcjJywgJ19fJywgJG5hbWUgKSAuICciJyAuICRjc3MgLiAnPic7CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBISURERU4gKioqKioqKioqKi8KCQkJfSBlbHNlaWYgKCAkaW5wdXRbJ3R5cGUnXSA9PSAnaGlkZGVuJyApIHsKCQkJCQoJCQkJCgkJCQkkcmV0dXJuIC49ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgdmFsdWU9IicgLiAkaW5wdXRbJ3ZhbHVlJ10gLiAnIiBjbGFzcz0iJyAuICRjbGFzc2VzIC4gJyIgaWQ9IicgLiAkcHJlZml4IC4gc3RyX3JlcGxhY2UoICcjJywgJ19fJywgJG5hbWUgKSAuICciJyAuICRjc3MgLiAnPic7CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBXWVNJV1lHICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3d5c2l3eWcnICkgewoJCQkJCgkJCQkKCQkJCSR3eXNpd3lnX3NldHRpbmdzID0gYXJyYXlfbWVyZ2UoICRpbnB1dFsnc2V0dGluZ3MnXSwgYXJyYXkoICd0ZXh0YXJlYV9uYW1lJyA9PiAkcHJlZml4IC4gJG5hbWUgKSApOwoJCQkJCgkJCQkvLyRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSInIC4gIC4gJyIgdmFsdWU9IicgLiAgLiAnIiBpZD0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciJyAuICRjc3MgLiAnPic7CgkJCQlvYl9zdGFydCgpOwoJCQkJd3BfZWRpdG9yKCAkaW5wdXRbJ3ZhbHVlJ10sICRwcmVmaXggLiAkbmFtZSwgJHd5c2l3eWdfc2V0dGluZ3MgKTsKCQkJCSRyZXR1cm4gLj0gb2JfZ2V0X2NvbnRlbnRzKCk7CgkJCQlvYl9lbmRfY2xlYW4oKTsKCQkJCQoJCQkJCgkJCS8qKioqKioqKioqIFRJVExFICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3RpdGxlJyApIHsKCQkJCQoJCQkJCgkJCQkvLyBBbGwgaGFuZGxlZCBieSBzZXR0aW5ncyBjbGFzcyBjdXJyZW50bHkuIFNob3dpbmcgaW4gdGhlIHRoIG5vdCB0aGUgdGQuCgkJCQkvLyRyZXR1cm4gLj0gJzxoNCBpZD0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciJyAuICRjc3MgLiAnPicgLiAkaW5wdXRbJ3ZhbHVlJ10gLiAnPC9oND4nOwoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogSFRNTCAqKioqKioqKioqKi8KCQkJCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ2h0bWwnICkgewoJCQkJCgkJCQkKCQkJCSRyZXR1cm4gLj0gJGlucHV0WydodG1sJ107CgkJCQkKCQkJCgkJCS8qKioqKioqKioqIFRFWFRBUkVBICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3RleHRhcmVhJyApIHsKCQkJCQoJCQkJCgkJCQkkcmV0dXJuIC49ICc8dGV4dGFyZWEgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiBpZD0iJyAuICRwcmVmaXggLiBzdHJfcmVwbGFjZSggJyMnLCAnX18nLCAkbmFtZSApIC4gJyInIC4gJGNzcyAuICc+JyAuICRpbnB1dFsndmFsdWUnXSAuICc8L3RleHRhcmVhPic7CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBQQVNTV09SRCAqKioqKioqKioqLwoJCQl9IGVsc2VpZiAoICRpbnB1dFsndHlwZSddID09ICdwYXNzd29yZCcgKSB7CgkJCQkKCQkJCQoJCQkJLy8gUXVpY2sgZml4IC0gZXNjX2F0dHIgaXMgbm90IGNhbGxhYmxlIGR1cmluZyBJTVBPUlRCVUREWQoJCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdlc2NfYXR0cicgKSApIHsKCQkJCQkkaW5wdXRfdmFsdWUgPSBlc2NfYXR0ciggJGlucHV0Wyd2YWx1ZSddICk7CgkJCQl9IGVsc2UgewoJCQkJCSRpbnB1dF92YWx1ZSA9ICRpbnB1dFsndmFsdWUnXTsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0X3ZhbHVlIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIicgLiAkY3NzIC4gJz4nOwoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogU0VMRUNUICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3NlbGVjdCcgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPHNlbGVjdCBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIicgLiAkY3NzIC4gJz4nOwoJCQkJZm9yZWFjaCAoICRpbnB1dFsnb3B0aW9ucyddIGFzICRvcHRpb25fdmFsdWUgPT4gJG9wdGlvbl90aXRsZSApIHsKCQkJCQkkcmV0dXJuIC49ICc8b3B0aW9uIHZhbHVlPSInIC4gJG9wdGlvbl92YWx1ZSAuICciJzsKCQkJCQlpZiAoICRvcHRpb25fdmFsdWUgPT0gJGlucHV0Wyd2YWx1ZSddICkgeyAkcmV0dXJuIC49ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIic7IH0KCQkJCQkkcmV0dXJuIC49ICc+JyAuICRvcHRpb25fdGl0bGUgLiAnPC9vcHRpb24+JzsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJzwvc2VsZWN0Pic7CgkJCQkKCQkJCgkJCS8qKioqKioqKioqIFJBRElPICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3JhZGlvJyApIHsKCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSIiPic7IC8vIGRlZmF1bHQgaWYgbm8gcmFkaW8gY2hlY2tlZAoJCQkJCgkJCQkkaSA9IDA7CgkJCQlmb3JlYWNoICggJGlucHV0WydvcHRpb25zJ10gYXMgJG9wdGlvbl92YWx1ZSA9PiAkb3B0aW9uX3RpdGxlICkgewoJCQkJCSRpKys7CgkJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIiB2YWx1ZT0iJyAuICRvcHRpb25fdmFsdWUgLiAnIicgLiAkY3NzOwoJCQkJCQoJCQkJCWlmICggJG9wdGlvbl92YWx1ZSA9PSAkaW5wdXRbJ3ZhbHVlJ10gKSB7IC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBzZWxlY3RlZC4KCQkJCQkJJHJldHVybiAuPSAnIGNoZWNrZWQ9ImNoZWNrZWQiJzsKCQkJCQl9CgkJCQkJJHJldHVybiAuPSAnPiAnIC4gJG9wdGlvbl90aXRsZTsKCQkJCQlpZiAoICRpIDwgY291bnQoICRpbnB1dFsnb3B0aW9ucyddICkgKSB7IC8vIHNwYWNlciBiZXR3ZWVuIGVhY2ggb25lLgoJCQkJCQlpZiAoICRvcmllbnRhdGlvbiA9PSAnaG9yaXpvbnRhbCcgKSB7IC8vIEhvcml6b25hbCBkaXNwbGF5LgoJCQkJCQkJJHJldHVybiAuPSAnICZuYnNwOyZuYnNwOyZuYnNwOyAnOwoJCQkJCQl9IGVsc2UgeyAvLyBWZXJ0aWNhbCBkaXNwbGF5LgoJCQkJCQkJJHJldHVybiAuPSAnPGJyPic7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBDSEVDS0JPWCAqKioqKioqKioqLwoJCQl9IGVsc2VpZiAoICRpbnB1dFsndHlwZSddID09ICdjaGVja2JveCcgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0WydvcHRpb25zJ11bJ3VuY2hlY2tlZCddIC4gJyI+JzsKCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiBpZD0iJyAuICRwcmVmaXggLiBzdHJfcmVwbGFjZSggJyMnLCAnX18nLCAkbmFtZSApIC4gJyIgdmFsdWU9IicgLiAkaW5wdXRbJ29wdGlvbnMnXVsnY2hlY2tlZCddIC4gJyInIC4gJGNzczsKCQkJCWlmICggJGlucHV0WydvcHRpb25zJ11bJ2NoZWNrZWQnXSA9PSAkaW5wdXRbJ3ZhbHVlJ10gKSB7CgkJCQkJJHJldHVybiAuPSAnIGNoZWNrZWQnOwoJCQkJfQoJCQkJJHJldHVybiAuPSAnPic7CgkJCQkvLyBUT0RPOiBjb25kaXRpb25hbCB0byBzZWUgaWYgdGhpcyBuZWVkZXMgdG8gYmUgZGVmYXVsdCBzZWxlY3RlZCBiYXNlZCBvbiBvcHRpb25zLgoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogU1VCTUlUICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3N1Ym1pdCcgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IGNsYXNzPSJidXR0b24tcHJpbWFyeSAnIC4gJGNsYXNzZXMgLiAnIiB0eXBlPSJzdWJtaXQiIG5hbWU9IicgLiAkcHJlZml4IC4gJG5hbWUgLiAnIiB2YWx1ZT0iJyAuICRpbnB1dFsndmFsdWUnXSAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIicgLiAkY3NzIC4gJz4nOwoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogflVOS05PV04gVFlQRX4gKioqKioqKioqKi8KCQkJfSBlbHNlIHsKCQkJCQoJCQkJCgkJCQkkcmV0dXJuIC49ICd7VW5rbm93biBmb3JtIGl0ZW0gdHlwZTogYCcgLiAkaW5wdXRbJ3R5cGUnXSAuICdgLn0nOwoJCQkJCgkJCQkKCQkJfQoKCQkJcmV0dXJuICRyZXR1cm47CgkJfSBlbHNlIHsKCQkJcmV0dXJuICd7SW52YWxpZCBmb3JtIGZpZWxkOiBgJyAuICRuYW1lIC4gJ2AufSc7CgkJfQoJCQoJfSAvLyBFbmQgZ2V0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5zZXRfdmFsdWUoKQoJICoJCgkgKglVcGRhdGVzIHRoZSB2YWx1ZSBvZiBhbiBleGlzdGluZyBmb3JtIGl0ZW0uCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJTmFtZSBvZiB0aGUgaXRlbSBpbiB0aGUgZm9ybSB0byB1cGRhdGUuIEV4OiB0ZXh0CgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQlWYWx1ZSB0byBhcHBseSB0byB0aGUgZm9ybSBpdGVtLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3ZhbHVlKCAkbmFtZSwgJHZhbHVlICkgewoJCSR0aGlzLT5faW5wdXRzWyRuYW1lXVsndmFsdWUnXSA9ICR2YWx1ZTsKCX0gLy8gRW5kIHNldF92YWx1ZSgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+Z2V0X3ZhbHVlKCkKCSAqCQoJICoJR2V0IHRoZSBzdWJtaXR0ZWQgKFBPU1RlZCkgdmFsdWUgb2YgdGhpcyBmb3JtIGl0ZW0uCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCgkvLyBHZXQgdGhlIHN1Ym1pdHRlZCB2YWx1ZSBvZiBhIGZvcm0gaXRlbS4gZmFsc2UgaWYgbm90IGZvdW5kLiBTdHJpcHMgV1Agc2xhc2hlcy4KCWZ1bmN0aW9uIGdldF92YWx1ZSggJG5hbWUgKSB7CgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4IC4gJG5hbWUgKSAhPSAnJyApIHsgLy8gU3VibWl0dGVkIHZhbHVlIGV4aXN0cywgdXNlIGl0LgoJCQlyZXR1cm4gc3RyaXBzbGFzaGVzX2RlZXAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJHRoaXMtPl9wcmVmaXggLiAkbmFtZSApICk7CgkJfSBlbHNlIHsgLy8gTm90aGluZyBzdWJtaXR0ZWQsIGZhaWwuCgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9IC8vIEVuZCBnZXRfdmFsdWUoKS4KCQoJCgkKCS8qCXBiX2JhY2t1cGJ1ZGR5Ojp0ZXN0KCkKCSAqCQoJICoJVGVzdHMgd2hldGhlciBhIGZvcm0gaXRlbSdzIHJ1bGVzIG9uIGEgcHJvdmlkZWQgdmFsdWUuIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZW4gd2lsbCB0cnkgdG8gZ2V0IHRoZSBQT1NUJ2VkIHZhbHVlLgoJICoJQHNlZSBwYl9iYWNrdXBidWRkeTo6dGVzdF9ydWxlKCkKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCgkgKglAcGFyYW0JCW1peGVkCQkkdmFsdWUJCU9wdGlvbmFsOiBUaGlzIHdpbGwgYmUgdGVzdGVkIHdpdGggdGhlIHJ1bGUgYXNzaWduZWQgdG8gdGhlIGZvcm0gaXRlbSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLgoJICoJCQkJCQkJCQkJSWYgZW1wdHkgd2Ugd2lsbCB0cnkgdG8gdGVzdCBiYXNlZCBvbiBhIHN1Ym1pdHRlZCBwb3N0IHZhbHVlIGlmIGl0IGV4aXN0cy4KCSAqCUByZXR1cm4JCXRydWUvYXJyYXkJCQkJdHJ1ZSBpZiB0aGUgdmFsdWUgcGFzc2VzOyBhcnJheSBvZiBlcnJvciBtZXNzYWdlcyBvbiBmYWlsdXJlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdGVzdCggJG5hbWUsICR2YWx1ZSA9ICcnICkgewoJCWlmICggJHZhbHVlID09ICcnICkgeyAvLyBObyB2YWx1ZSwgdHJ5IHRvIGdldCBpdC4KCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4IC4gJG5hbWUgKSAhPSAnJyApIHsgLy8gU3VibWl0dGVkIHZhbHVlIGV4aXN0cywgdXNlIGl0LgoJCQkJJHZhbHVlID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAkdGhpcy0+X3ByZWZpeCAuICRuYW1lICk7CgkJCS8vfSBlbHNlIHsgLy8gTm90aGluZyBzdWJtaXR0ZWQsIGZhaWwuCgkJCS8vCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkKCQlpZiAoIGlzc2V0KCAkdGhpcy0+X2lucHV0c1skbmFtZV1bJ3J1bGVzJ10gKSApIHsKCQkJcmV0dXJuIHNlbGY6OnRlc3RfcnVsZSggJHRoaXMtPl9pbnB1dHNbJG5hbWVdWydydWxlcyddLCAkdmFsdWUgKTsKCQl9IGVsc2UgeyAvLyBObyB0ZXN0cy4gUGFzc2VkLgoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9IC8vIEVuZCB0ZXN0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT50ZXN0X3J1bGUoKQoJICoJCgkgKglUZXN0cyBhIHByb3ZpZGVkIHJ1bGVzZXQgYWdhaW5zdCBhIHZhbHVlIHRvIHZlcmlmeSB3aGV0aGVyIGl0IGNvbXBsaWVzIG9yIG5vdC4KCSAqCUBhdXRob3IgRGFuIEhhcnpoZWltCgkgKglAc2VlIHBsdWdpbmJ1ZGR5X2Zvcm0tPnRlc3QoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGUJCQlSdWxlKHMpIHRvIHZhbGlkYXRlIGFnYWluc3QuIFNlZSBjb2RleCBmb3IgZGV0YWlscy4gVE9ETzogZG9jdW1lbnQgcnVsZXNldHMgaGVyZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSB0byB2YWxpZGF0ZS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRjYWxsYmFja3MJCU5PVCBZRVQgSU1QTEVNRU5URUQuIEFycmF5IG9mIGNhbGxiYWNrcyBmb3IgY3VzdG9tCgkgKgkJCQkJCQkJCQkJdmVyaWZpY2F0aW9uIG1ldGhvZHMuIEVhY2ggaXRlbSBpbiBhcnJheSBpcyBhCgkgKgkJCQkJCQkJCQkJcnVsZV9uYW1lID0+IGNhbGxiYWNrX2FycmF5IHBhaXIuCgkgKgkJCQkJCQkJCQkJRXg6ICRjYWxsYmFja3MgPSBhcnJheSggJ3Bob25lJyA9PiBhcnJheSggJHRoaXMsICdteV9waG9uZV92YWxpZGF0b3InICkgKTsKCSAqCUByZXR1cm4JCXRydWUvYXJyYXkJCQkJCXRydWUgb24gc3VjY2VzczsgYXJyYXkgb2YgZXJyb3IocykgZW5jb3VudGVyZWQgb24gZmFpbHVyZS4KCSAqLwoJZnVuY3Rpb24gdGVzdF9ydWxlKCAkcnVsZXNldCwgJHZhbHVlICkgewoJCSRlcnJvcnMgPSBhcnJheSgpOwoJCWlmICggJHJ1bGVzZXQgPT0gJycgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCQkkcnVsZXMgPSBleHBsb2RlKCAnfCcsICRydWxlc2V0ICk7IC8vIENyZWF0ZSBhcnJheSBvZiBydWxlcy4KCQlmb3JlYWNoKCAkcnVsZXMgYXMgJHJ1bGUgKSB7IC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHJ1bGUuCgkJCQoJCQkvLyAqKioqKiBHRVQgUlVMRSBUWVBFICoqKioqCgkJCS8vIEdyYWIgdGhlIHR5cGUgb2YgdGhlIHJ1bGU7IGV4OiBzdHJpbmcsIGludCwgc2V0LCBldGMgdmlhIHJlZ2V4LgoJCQkkcnVsZV90eXBlX3BvcyA9IHN0cnBvcyggJHJ1bGUsICdbJyApOwoJCQkKCQkJaWYgKCAkcnVsZV90eXBlX3BvcyA9PT0gZmFsc2UgKSB7CgkJCQkkcnVsZV90eXBlID0gJHJ1bGU7CgkJCX0gZWxzZSB7CgkJCQkkcnVsZV90eXBlID0gc3Vic3RyKCAkcnVsZSwgMCwgJHJ1bGVfdHlwZV9wb3MgKTsKCQkJfQoJCQkKCQkJCgkJCS8qICoqKioqIFJFUVVJUkVEICoqKioqCgkJCSAqIFJ1bGUgaXMgcmVxdWlyZWQuCgkJCSAqIEZhaWwgaWYgJHZhbHVlIGlzIGVtcHR5LgoJCQkgKiBpZiBmYWlsczogICRlcnJvcnNbXSA9ICdWYWx1ZSBpcyBub3QgYSBzdHJpbmcuJzsKCQkJICogKi8KCQkJaWYgKCAkcnVsZV90eXBlID09ICdyZXF1aXJlZCcgKSB7IC8vIFJlcXVpcmVkIHJ1bGUuCgkJCQlpZiggJHZhbHVlID09ICcnICkgewoJCQkJCSRlcnJvcnNbXSA9ICdUaGlzIHZhbHVlIGlzIHJlcXVpcmVkLic7CgkJCQkJcmV0dXJuICRlcnJvcnM7IC8vIE5vIG1vcmUgY2hlY2tpbmcgaWYgbGVmdCBibGFuay4KCQkJCX0KCQkJCgkJCQoJCQkvKiAqKioqKiBTVFJJTkcgKioqKioKCQkJICogY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN0cmluZyBpcyB0aGUgYXBwcm9wcmlhdGUgbGVuZ3RoLgoJCQkgKiAqLwoJCQl9IGVsc2VpZiAoICRydWxlX3R5cGUgPT0gJ3N0cmluZycgKSB7IC8vIFN0cmluZyBydWxlLgoJCQkJJHN1YnJ1bGUgPSBzdHJzdHIoICRydWxlLCAnWycgKTsKCQkJCSRoeXBoZW5fcG9zID0gc3RycG9zKCAkc3VicnVsZSwgJy0nICk7CgkJCQlpZiggJGh5cGhlbl9wb3MgIT0gJycgKSB7CgkJCQkJJGZpcnN0X251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsIDEsICRoeXBoZW5fcG9zIC0gMSApOwoJCQkJCSRzZWNvbmRfbnVtYmVyID0gc3Vic3RyKCAkc3VicnVsZSwgJGh5cGhlbl9wb3MgKyAxLCAtMSApOwoJCQkJCSR2YWxfbGVuZ3RoID0gc3RybGVuKCAkdmFsdWUgKTsKCQkJCQlpZiggJHZhbF9sZW5ndGggPCAkZmlyc3RfbnVtYmVyIHx8ICR2YWxfbGVuZ3RoID4gJHNlY29uZF9udW1iZXIgKXsKCQkJCQkJJGVycm9yc1tdID0gJ0xlbmd0aCBvZiB2YWx1ZSBgJyAuIGh0bWxlbnRpdGllcyggJHZhbHVlICkgLiAnYCBpcyBpbnZhbGlkLic7CgkJCQkJfQoJCQkJfQoJCQkKCQkJLyogKioqKiogSU5UIFRZUEUgKioqKioKCQkJICogbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGZpdHMgaW5zaWRlIG9mIGJvdW5kcwoJCQkgKiBtYWtlIHN1cmUgaXQgZG9lc24ndCBpbmNsdWRlIGEgZGVjaW1hbAoJCQkgKiBhY2NlcHRzIGJsYW5rIHZhbHVlCgkJCSAqICovCgkJCX0gZWxzZWlmICggJHJ1bGVfdHlwZSA9PSAnaW50JyApIHsKCQkJCWlmICggJycgIT0gJHZhbHVlICkgewoJCQkJCWlmKCAhaXNfbnVtZXJpYyggJHZhbHVlICkgfHwgc3RycG9zKCR2YWx1ZSwgJy4nKSAhPT0gZmFsc2UgKSB7CgkJCQkJCSRlcnJvcnNbXSA9ICdgJyAuIGh0bWxlbnRpdGllcyggJHZhbHVlICkgLiAnYCBpcyBub3QgYSB2YWxpZCBudW1iZXIuJzsKCQkJCQl9IGVsc2UgewoJCQkJCQkJJHN1YnJ1bGUgPSBzdHJzdHIoICRydWxlLCAnWycgKTsKCQkJCQkJCSRoeXBoZW5fcG9zID0gc3RycG9zKCAkc3VicnVsZSwgJy0nICk7CgkJCQkJCQlpZiggJGh5cGhlbl9wb3MgIT0gJycgKSB7CgkJCQkJCQkJJGZpcnN0X251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsIDEsICRoeXBoZW5fcG9zIC0gMSApOwoJCQkJCQkJCSRzZWNvbmRfbnVtYmVyID0gc3Vic3RyKCAkc3VicnVsZSwgJGh5cGhlbl9wb3MgKyAxLCAtMSApOwoJCQkJCQkJCWlmKCAkdmFsdWUgPCAkZmlyc3RfbnVtYmVyIHx8ICR2YWx1ZSA+ICRzZWNvbmRfbnVtYmVyICkgewoJCQkJCQkJCQkkZXJyb3JzW10gPSAnVmFsdWUgYCcgLiBodG1sZW50aXRpZXMoICR2YWx1ZSApIC4gJ2AgaXMgb3V0c2lkZSBvZiB0aGUgc2V0IGJvdW5kcy4nOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQoJCQkKCQkJLyogKioqKiogRU1BSUwgVFlQRSAqKioqKgoJCQkgKiB2YWxpZGF0ZSB0byBtYWtlIHN1cmUgdGhlIGUtbWFpbCBhZGRyZXNzIGlzIGFjdHVhbGx5IGFuIGUtbWFpbCBhZGRyZXNzLgoJCQkgKiAqLwoJCQl9IGVsc2VpZiAoICRydWxlX3R5cGUgPT0gJ2VtYWlsJyApIHsKCQkJCWlmICggJycgIT0gJHZhbHVlICkgewoJCQkJCS8vIFRPRE86IEFkZCBjdXN0b20gY2FsbGJhY2sgZnVuY3Rpb25hbGl0eSBoZXJlLgoJCQkJCWlmKCAhZmlsdGVyX3ZhciggJHZhbHVlLCBGSUxURVJfVkFMSURBVEVfRU1BSUwgKSApIHsKCQkJCQkJJGVycm9yc1tdID0gJ1ZhbHVlIGAnIC4gaHRtbGVudGl0aWVzKCAkdmFsdWUgKSAuICdgIGlzIG5vdCBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzLic7CgkJCQkJfQoJCQkJfQoJCQkKCQkJCgkJCS8qICoqKioqIFNFVCBUWVBFICoqKioqCgkJCSAqIG1ha2Ugc3VyZSB0aGF0ICR2YWx1ZSBmYWxscyBpbnRvIG9uZSBvZiB0aGUgdHlwZXMuCgkJCSAqICovCgkJCX0gZWxzZWlmICggJHJ1bGVfdHlwZSA9PSAnc2V0JyApIHsKCQkJCS8vc2V0W3N0cmluZyxzdHJpbmcsc3RyaW5nLF0KCQkJCSRpc190aGVyZSA9IGZhbHNlOwoJCQkJJHN1YnN0cmluZyA9IHN0cnN0ciggJHJ1bGUsICdbJyApOwoJCQkJJHN1YnN0cmluZyA9IHN1YnN0ciggJHN1YnN0cmluZywgJHN1YnN0cmluZyArIDEsICRzdWJzdHJpbmcgLSAxICk7CgkJCQkkcGFydHMgPSBleHBsb2RlKCAnLCcsICRzdWJzdHJpbmcgKTsKCQkJCWZvcmVhY2goICRwYXJ0cyBhcyAkcGFydCApIHsKCQkJCQlpZiggJHZhbHVlID09ICRwYXJ0ICkgewoJCQkJCQkkaXNfdGhlcmUgPSB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJCWlmKCAkaXNfdGhlcmUgPT0gZmFsc2UgKSB7CgkJCQkJJGVycm9yc1tdID0gJ1ZhbHVlIGAnIC4gaHRtbGVudGl0aWVzKCAkdmFsdWUgKSAuICdgIGlzIG5vdCBhIHZhbGlkIHZhbHVlLic7CgkJCQl9CQoJCQkKCQkJCgkJCS8qICoqKioqIE5VTSBUWVBFICoqKioqCQoJCQkgKiBtYWtlIHN1cmUgdGhhdCAkdmFsdWUgaXMgbnVtZXJpYywgaWYgc28sIG1ha2Ugc3VyZSBpdCBmaXRzIGluc2lkZSBvZiBib3VuZHMKCQkJICogKi8KCQkJfSBlbHNlaWYgKCAkcnVsZV90eXBlID09ICdudW1iZXInICkgewoJCQkJaWYgKCAnJyAhPSAkdmFsdWUgKSB7CgkJCQkJaWYoICFpc19udW1lcmljKCAkdmFsdWUgKSApIHsKCQkJCQkJJGVycm9yc1tdID0gJHZhbHVlIC4gJyBpcyBub3QgYSBudW1iZXIuJzsKCQkJCQl9CgkJCQkJJHN1YnJ1bGUgPSBzdHJzdHIoICRydWxlLCAnWycgKTsKCQkJCQkkaHlwaGVuX3BvcyA9IHN0cnBvcyggJHN1YnJ1bGUsICctJyApOwoJCQkJCWlmKCAkaHlwaGVuX3BvcyAhPSAnJyApIHsKCQkJCQkJJGZpcnN0X251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsIDEsICRoeXBoZW5fcG9zIC0gMSApOwoJCQkJCQkkc2Vjb25kX251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsICRoeXBoZW5fcG9zICsgMSwgLTEgKTsKCQkJCQkJaWYoICR2YWx1ZSA8ICRmaXJzdF9udW1iZXIgfHwgJHZhbHVlID4gJHNlY29uZF9udW1iZXIgKSB7CgkJCQkJCQkkZXJyb3JzW10gPSAnVmFsdWUgYCcgLiBodG1sZW50aXRpZXMoICR2YWx1ZSApIC4gJ2AgaXMgb3V0c2lkZSBvZiB0aGUgc2V0IGJvdW5kcy4nOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQkvLyBUT0RPOiBBZGQgY3VzdG9tIGNhbGxiYWNrIGZ1bmN0aW9uYWxpdHkgaGVyZS4KCQkJCQoJCQkJLy8gVW5rbm93biBydWxlIHNvIG5vdGlmeSB0aGUgZGV2ZWxvcGVyLgoJCQkJJGVycm9yc1tdID0gJ3tFcnJvciAjNTQ1ODkuIFVua25vd24gcnVsZSBgJyAuICRydWxlX3R5cGUgLiAnYC59JzsKCQkJfQoJCQkKCQl9CgkJCgkJaWYgKCBjb3VudCggJGVycm9ycyApID09PSAwICkgeyAvLyBObyBlcnJvcnM7IHN1Y2Nlc3MhCgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7IC8vIE9uZSBvciBtb3JlIGVycm9ycyBlbmNvdW50ZXJlZDsgcmV0dXJuIGFycmF5IG9mIGVycm9ycy4KCQkJcmV0dXJuICRlcnJvcnM7CgkJfQoJfSAvLyBFbmQgdGVzdF9ydWxlKCkuCgkKCQoJCgkvKgljbGVhcl92YWx1ZXMoKQoJICoJCgkgKglDbGVhcnMgdGhlIHZhbHVlIG9mIGFsbCBmb3JtIGl0ZW1zIHNldHRpbmcgdGhlIHZhbHVlIHRvIGFuIGVtcHR5IHN0cmluZyAnJy4KCSAqCQoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gY2xlYXJfdmFsdWVzKCkgewoJCWZvcmVhY2goICR0aGlzLT5faW5wdXRzIGFzICYkaW5wdXQgKSB7CgkJCSRpbnB1dFsndmFsdWUnXSA9ICcnOzsKCQl9CgkJCgkJcmV0dXJuOwoJfSAvLyBFbmQgY2xlYXJfdmFsdWVzKCkuCgkKCQoJCn0gLy8gRW5kIGNsYXNzIHBsdWdpbmJ1ZGR5X2Zvcm0KCg== ###PACKDATA,FILE_END,/pluginbuddy/classes/form.php,importbuddy/pluginbuddy/classes/form.php ###PACKDATA,FILE_START,/pluginbuddy/classes/format.php,importbuddy/pluginbuddy/classes/format.php PD9waHAKCgoKLyoJY2xhc3MgcGx1Z2luYnVkZHlfZm9ybWF0CiAqCUBhdXRob3IgRHVzdGluIEJvbHRvbgogKgkKICoJSGVscHMgZm9ybWF0IGNvbnRlbnQgb3IgZGF0YSBzdWNoIGFzIHRpbWUsIGRhdGUsIGZpbGUgc2l6ZSwgZXRjLgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfZm9ybWF0IHsKCQoJCgkKCS8vICoqKioqKioqKiogUFVCTElDIFBST1BFUlRJRVMgKioqKioqKioqKgoJCgkKCQoJLy8gKioqKioqKioqKiBQUklWQVRFIFBST1BFUlRJRVMgKioqKioqKioqKgoJcHJpdmF0ZSAkX3RpbWVzdGFtcCA9ICdNIGosIFkgZzppOnMgYSc7CgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybWF0LT5fX2NvbnN0cnVjdCgpCgkgKgkKCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkgKgkKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7Cgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybWF0LT5maWxlX3NpemUoKQoJICoJCgkgKglUYWtlcyBhIGZpbGUgc2l6ZSBpbiBieXRlcyBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgaHVtYW4gcmVhZGFibGUgZm9ybWF0IHdpdGggbW9yZSBmcmllbmRseSB1bml0cy4gRGVjaWRlcyBvbiB1bml0IGJhc2VkIG9uIHRoZSBzaXplLgoJICoJCgkgKglAcGFyYW0JCWludAkJJHNpemUJRmlsZSBzaXplLgoJICoJQHJldHVybgkJc3RyaW5nCQkJSHVtYW4gZm9ybWF0dGVkIGZyaWVuZGx5IHJlYWRhYmxlIGZvcm1hdC4KCSAqLwoJZnVuY3Rpb24gZmlsZV9zaXplKCAkc2l6ZSApIHsKCQkkc2l6ZXMgPSBhcnJheSggJyBCeXRlcycsICcgS0InLCAnIE1CJywgJyBHQicsICcgVEInLCAnIFBCJywgJyBFQicsICcgWkInLCAnIFlCJyk7CgkJaWYgKCAkc2l6ZSA9PSAwICkgewoJCQlyZXR1cm4oICcwIE1CJyApOwoJCX0gZWxzZSB7CgkJCXJldHVybiAoIHJvdW5kKCAkc2l6ZSAvIHBvdyggMTAyNCwgKCAkaSA9IGZsb29yKCBsb2coICRzaXplLCAxMDI0ICkgKSApICksICRpID4gMSA/IDIgOiAwKSAuICRzaXplc1skaV0gKTsKCQl9Cgl9IC8vIEVuZCBmaWxlX3NpemUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+ZGF0ZSgpCgkgKgkKCSAqCUZvcm1hdHMgYSB0aW1lc3RhbXAgaW50byBhIG5pY2UgaHVtYW4gZGF0ZSBmb3JtYXQuCgkgKgkKCSAqCUBwYXJhbQkJaW50CQkkdGltZXN0YW1wCQlUaW1lc3RhbXAgdG8gbWFrZSBwcmV0dHkuCgkgKglAcGFyYW0JCXN0cmluZwkkY3VzdG9tRm9ybWF0CUN1c3RvbSB0aW1lc3RhbXAgZm9ybWF0LiBFbHNlIHVzZXMgJHRoaXMtPl90aW1lc3RhbXAgZGVmaW5lZCBhdCB0b3Agb2YgdGhpcyBmaWxlLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlQcmV0dHkgaHVtYW4gdGltZXN0YW1wLgoJICovCglmdW5jdGlvbiBkYXRlKCAkdGltZXN0YW1wLCAkY3VzdG9tRm9ybWF0ID0gJycgKSB7CgkJaWYgKCAnJyA9PSAkY3VzdG9tRm9ybWF0ICkgewoJCQlyZXR1cm4gZGF0ZSggJHRoaXMtPl90aW1lc3RhbXAsICR0aW1lc3RhbXAgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZGF0ZSggJGN1c3RvbUZvcm1hdCwgJHRpbWVzdGFtcCApOwoJCX0KCX0gLy8gRW5kIGRhdGUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+bG9jYWxpemVfdGltZSgpCgkgKgkKCSAqCUxvY2FsaXplcyB0aW1lIGZvciB0aGUgY3VycmVudCB1c2VyIGZvciBkaXNwbGF5LgoJICoJCgkgKglAcGFyYW0JCWludAkJJHRpbWVzdGFtcAkJVGltZXN0YW1wIHRvIHJlbW92ZSB0aW1lIG9mZnNldCBmb3IuCgkgKglAcmV0dXJuCQlpbnQJCQkJCQlDb3JyZWN0ZWQgdGltZXN0YW1wLgoJICovCglmdW5jdGlvbiBsb2NhbGl6ZV90aW1lKCAkdGltZXN0YW1wICkgewoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZ2V0X29wdGlvbicgKSApIHsKCQkJJGdtdF9vZmZzZXQgPSBnZXRfb3B0aW9uKCAnZ210X29mZnNldCcgKTsKCQl9IGVsc2UgewoJCQkkZ210X29mZnNldCA9IDA7CgkJfQoJCXJldHVybiAkdGltZXN0YW1wICsgKCAkZ210X29mZnNldCAqIDM2MDAgKTsKCX0gLy8gRW5kIGxvY2FsaXplX3RpbWUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+dW5sb2NhbGl6ZV90aW1lKCkKCSAqCQoJICoJUmVtb3ZlcyB0aGUgdGltZXpvbmUgb2Zmc2V0IG9mIGEgbG9jYWxpemVkIHRpbWUgZGlzcGxheSBmb3IgYSB1c2VyLgoJICoJCgkgKglAcGFyYW0JCWludAkJJHRpbWVzdGFtcAkJVGltZXN0YW1wIHRvIHJlbW92ZSB0aW1lIG9mZnNldCBmb3IuCgkgKglAcmV0dXJuCQlpbnQJCQkJCQlDb3JyZWN0ZWQgdGltZXN0YW1wLgoJICovCglmdW5jdGlvbiB1bmxvY2FsaXplX3RpbWUoICR0aW1lc3RhbXAgKSB7CgkJcmV0dXJuICR0aW1lc3RhbXAgLSAoIGdldF9vcHRpb24oICdnbXRfb2Zmc2V0JyApICogMzYwMCApOwoJfSAvLyBFbmQgdW5sb2NhbGl6ZV90aW1lKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtYXQtPnRpbWVfYWdvKCkKCSAqCQoJICoJQWNjZXB0cyBOT04tbG9jYWxpemVkIHRpbWVzdGFtcHMuCgkgKglAc2VlIHRpbWVfZHVyYXRpb24KCSAqCQoJICoJQHBhcmFtCQkKCSAqCUByZXR1cm4JCQoJICovCgkgLy8gVE9ETzogZGVwcmVjYXRlZD8KCWZ1bmN0aW9uIHRpbWVfYWdvKCAkdGltZXN0YW1wICkgewoJCXJldHVybiBodW1hbl90aW1lX2RpZmYoICR0aW1lc3RhbXAsIHRpbWUoKSApOwoJfSAvLyBFbmQgdGltZV9hZ28oKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+ZHVyYXRpb24oKQoJICoJCgkgKglSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgZHVyYXRpb24uIFVzZWZ1bCBmb3IgdGltZSBhZ28gb3IgY291bnRkb3ducy4KCSAqCUV4OiA1IGhvdXJzLCA0IG1pbnV0ZXMsIDQzIHNlY29uZHMuCgkgKgkKCSAqCUBwYXJhbQkJaW50CQkkc2Vjb25kcwkJTnVtYmVyIG9mIHNlY29uZHMgdG8gdHVybiBpbnRvIGEgaHVtYW4gZnJpZW5kbHkgcmVhZGFibGUgZm9ybWF0LgoJICoJQHJldHVybgkJCQlzdHJpbmcJCQlIdW1hbiByZWFkYWJsZSBzdHJpbmcgZHVyYXRpb24uCgkgKi8KCWZ1bmN0aW9uIHRpbWVfZHVyYXRpb24oICRzZWNvbmRzICkgewoJCSR0aW1lID0gdGltZSgpIC0gJHNlY29uZHM7CgkJCgkJJHBlcmlvZHMgPSBhcnJheShfXygnc2Vjb25kJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnbWludXRlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnaG91cicsICAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnZGF5JywgCSAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnd2VlaycsICAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnbW9udGgnLCAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygneWVhcicsICAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnZGVjYWRlJy4gJ0xJT04nICkKCQkJCQkJICk7CgkJJGxlbmd0aHMgPSBhcnJheSgnNjAnLCc2MCcsJzI0JywnNycsJzQuMzUnLCcxMicsJzEwJyk7CgkJCgkJJG5vdyA9IHRpbWUoKTsKCQkKCQkkZGlmZmVyZW5jZSA9ICRub3cgLSAkdGltZTsKCQkkdGVuc2UgPSBfXygnYWdvJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCgkJCgkJZm9yKCRqID0gMDsgJGRpZmZlcmVuY2UgPj0gJGxlbmd0aHNbJGpdICYmICRqIDwgY291bnQoJGxlbmd0aHMpLTE7ICRqKyspIHsKCQkJJGRpZmZlcmVuY2UgLz0gJGxlbmd0aHNbJGpdOwoJCX0KCQkKCQkkZGlmZmVyZW5jZSA9IHJvdW5kKCRkaWZmZXJlbmNlKTsKCQkKCQlpZigkZGlmZmVyZW5jZSAhPSAxKSB7CgkJCSRwZXJpb2RzWyRqXS49ICJzIjsKCQl9CgkJCgkJcmV0dXJuICIkZGlmZmVyZW5jZSAkcGVyaW9kc1skal0iOwoJfSAvLyBFbmQgZHVyYXRpb24oKS4KCQoJCgkKCS8qCXByZXR0aWZ5KCkKCSAqCQoJICoJVGFrZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBtb3JlIHByZXR0eSB2ZXJzaW9uLiBMb29rcyBpbiBhbiBhcnJheSBmb3IgYSBrZXkgbWF0Y2hpbmcgdGhlIHN0cmluZy4KCSAqCVJldHVybnMgdGhlIGFzc29jaWF0ZWQgdmFsdWUuIFJldHVybnMgb3JpZ2luYWwgdmFsdWUgaWYgbm8gcHJldHR5IHJlcGxhY2VyIGlzIGZvdW5kLgoJICoJRXg6CgkgKgkJcHJldHRpZnkoICdkb2cnLCBhcnJheSggJ2NhdHMnID0+ICdDYXRzJywgJ2RvZycgPT4gJ0RvZycgKSApOwoJICoJCVJldHVybnM6IERvZwoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIHByZXR0eSB2ZXJzaW9uLgoJICoJQHBhcmFtCQlhcnJheQkJJHJlcGxhY2VtZW50cwlBcnJheSBvZjogdmFsdWUgdG8gbG9vayBmb3IgPT4gdmFsdWUgdG8gcmVwbGFjZSB3aXRoLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQkJUHJldHR5IHZlcnNpb24gdGhhdCByZXBsYWNlZCAkdmFsdWUuIFJldHVybnMgb3JpZ2luYWwgJHZhbHVlIGlmIG5vdCBmb3VuZCBpbiAkcmVwbGFjZW1lbnRzIGtleXMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmV0dGlmeSggJHZhbHVlLCAkcmVwbGFjZW1lbnRzICkgewoJCQoJCWlmICggaXNzZXQoICRyZXBsYWNlbWVudHNbJHZhbHVlXSApICkgeyAvLyBGb3VuZCByZXBsYWNlbWVudC4KCQkJcmV0dXJuICRyZXBsYWNlbWVudHNbJHZhbHVlXTsKCQl9IGVsc2UgeyAvLyBObyByZXBsYWNlbWVudDsgcmV0dXJuIG9yaWdpbmFsIHZhbHVlLgoJCQlyZXR1cm4gJHZhbHVlOwoJCX0KCQkKCX0gLy8gRW5kIHByZXR0aWZ5KCk7CgkKCQoJCgkvKiBtdWx0aV9pbXBsb2RlKCkKCSAqCgkgKiBEZWVwIHJlY3Vyc2l2ZSBpbXBsb3Npb24uCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gbXVsdGlfaW1wbG9kZSgkYXJyYXksICRnbHVlKSB7CgkgICAgJHJldCA9ICcnOwoKCSAgICBmb3JlYWNoICgkYXJyYXkgYXMgJGl0ZW0pIHsKCSAgICAgICAgaWYgKGlzX2FycmF5KCRpdGVtKSkgewoJICAgICAgICAgICAgJHJldCAuPSAkdGhpcy0+bXVsdGlfaW1wbG9kZSgkaXRlbSwgJGdsdWUpIC4gJGdsdWU7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAkcmV0IC49ICRpdGVtIC4gJGdsdWU7CgkgICAgICAgIH0KCSAgICB9CgoJICAgICRyZXQgPSBzdWJzdHIoJHJldCwgMCwgMC1zdHJsZW4oJGdsdWUpKTsKCgkgICAgcmV0dXJuICRyZXQ7Cgl9IC8vIEVuZCBtdWx0aV9pbXBsb2RlKCkuCgkKCQoJCn0gLy8gRW5kIGNsYXNzIHBsdWdpbmJ1ZGR5X3NldHRpbmdzLgoK ###PACKDATA,FILE_END,/pluginbuddy/classes/format.php,importbuddy/pluginbuddy/classes/format.php ###PACKDATA,FILE_START,/pluginbuddy/classes/index.php,importbuddy/pluginbuddy/classes/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/pluginbuddy/classes/index.php,importbuddy/pluginbuddy/classes/index.php ###PACKDATA,FILE_START,/pluginbuddy/classes/settings.php,importbuddy/pluginbuddy/classes/settings.php PD9waHAKCgoKLyoJY2xhc3MgcGx1Z2luYnVkZHlfc2V0dGluZ3MKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqCQogKglIYW5kbGVzIHNldHRpbmcgdXAgYW5kIHBhcnNpbmcgc3VibWl0dGVkIGRhdGEgZm9yIHNldHRpbmdzIHBhZ2VzLiBVc2VzIGZvcm0gY2xhc3MgZm9yIGhhbmRsaW5nIGZvcm1zLgogKglJZiBhIHNhdmVwb2ludCBpcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHRoZW4gc2V0dGluZ3Mgd2lsbCBiZSBhdXRvLXNhdmVkIG9uIHNhdmUuCiAqCUlmIGZhbHNlIGlzIHBhc3NlZCB0byB0aGUgc2F2ZXBvaW50IHRoZW4gdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhbmQgZ3JhYiBzdWJtaXR0ZWQgZm9ybSBkYXRhIGZvciBjdXN0b20gcHJvY2Vzc2luZy4KICoJQHNlZSBwbHVnaW5idWRkeV9mb3JtCiAqCQogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfc2V0dGluZ3MgewoJCgkKCQoJLy8gKioqKioqKioqKiBQVUJMSUMgUFJPUEVSVElFUyAqKioqKioqKioqCgkKCQoJCgkvLyAqKioqKioqKioqIFBSSVZBVEUgUFJPUEVSVElFUyAqKioqKioqKioqCglwcml2YXRlICRfZm9ybTsKCXByaXZhdGUgJF9mb3JtX25hbWUgPSAnJzsKCXByaXZhdGUgJF9wcmVmaXggPSAnJzsKCXByaXZhdGUgJF9zYXZlcG9pbnQ7Cglwcml2YXRlICRfc2V0dGluZ3MgPSBhcnJheSgpOwoJcHJpdmF0ZSAkX2N1c3RvbV90aXRsZV93aWR0aCA9ICcnOwoJCgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfc2V0dGluZ3MtPl9fY29uc3RydWN0KCkKCSAqCQoJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCQkkZm9ybV9uYW1lCQkJCQlOYW1lIC8gc2x1ZyBvZiB0aGUgZm9ybS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHNhdmVfcG9pbnRfb3JfY3VzdG9tX21vZGUJTG9jYXRpb24gaW4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zIGFycmF5IHRvIHNhdmUgdG8uIEV4OiBncm91cHMjNSBzYXZlcyBpbnRvOiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2dyb3VwcyddWzVdLgoJICoJCQkJZmFsc2UJCQkJCQkJCQkJSWYgZmFsc2UgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiB3aWxsIG5vdCBzYXZlIGJ1dCB3aWxsIHJldHVybiByZXN1bHRzIGluc3RlYWQgaW5jbHVkaW5nIGZvcm0gbmFtZSA9PiB2YWx1ZSBwYWlycyBpbiBhbiBhcnJheSBmb3IgcHJvY2Vzc2luZy4KCSAqCQkJCWFycmF5CQkJCQkJCQkJCUlmIGFycmF5IHRoZW4gdGhlc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSBkZWZhdWx0cy4gV29ya3MgdGhlIHNhbWUgYXMgYmVpbmcgZmFsc2Ugb3RoZXIgdGhhbiB0aGlzLgoJICoJQHBhcmFtCQlzdHJpbmcJCQkkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcJQWRkaXRpb25hbCBxdWVyeXN0cmluZyB2YXJpYWJsZXMgdG8gcGFzcyBpbiB0aGUgZm9ybSBhY3Rpb24gVVJMLgoJICoJQHBhcmFtCQlpbnQJCQkJJGN1c3RvbV90aXRsZV93aWR0aAkJCUN1c3RvbSB0aXRsZSB3aWR0aCBpbiBwaXhlbHMuIEZvcm1hdHMgdGFibGUgc2l6aW5nLgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGZvcm1fbmFtZSwgJHNhdmVfcG9pbnRfb3JfY3VzdG9tX21vZGUsICRhZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZyA9ICcnLCAkY3VzdG9tX3RpdGxlX3dpZHRoID0gJycgKSB7CgkJJHRoaXMtPl9mb3JtX25hbWUgPSAkZm9ybV9uYW1lOwoJCSR0aGlzLT5fcHJlZml4ID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nOwoJCSR0aGlzLT5fc2F2ZXBvaW50ID0gJHNhdmVfcG9pbnRfb3JfY3VzdG9tX21vZGU7CgkJJHRoaXMtPl9jdXN0b21fdGl0bGVfd2lkdGggPSAkY3VzdG9tX3RpdGxlX3dpZHRoOwoJCQoJCS8vIFRPRE86IG5vIG5lZWQgdG8gcGFzcyBzYXZlcG9pbnQgaGVyZT8gYmVsb3c6CgkJJHRoaXMtPl9mb3JtID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2Zvcm0oICRmb3JtX25hbWUsICRzYXZlX3BvaW50X29yX2N1c3RvbV9tb2RlLCAkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcgKTsKCX0gLy8gRW5kIF9fY29uc3RydWN0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9zZXR0aW5ncy0+YWRkX3NldHRpbmcoKQoJICoJCgkgKglSZWdpc3RlciBhbmQgYWRkIGEgc2V0dGluZyB0byB0aGUgc2V0dGluZ3MgZm9ybSBzeXN0ZW0uCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkJCSRzZXR0aW5ncwkJQXJyYXkgb2Ygc2V0dGluZ3MgZm9yIHRoaXMgYWRkZWQgc2V0dGluZy4gU2VlICRkZWZhdWx0X3NldHRpbmdzIGZvciBsaXN0IG9mIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGVmaW5lZC4KCSAqCUByZXR1cm4JCQoJICovCglmdW5jdGlvbiBhZGRfc2V0dGluZyggJHNldHRpbmdzICkgewoJCSRkZWZhdWx0X3NldHRpbmdzID0gYXJyYXkgKAoJCQkndHlwZScJCQkJPT4JCScnLAoJCQknbmFtZScJCQkJPT4JCScnLAoJCQkndGl0bGUnCQkJCT0+CQknJywKCQkJJ3RpcCcJCQkJPT4JCScnLAoJCQknY3NzJwkJCQk9PgkJJycsCgkJCSdiZWZvcmUnCQkJPT4JCScnLAoJCQknYWZ0ZXInCQkJCT0+CQknJywKCQkJJ3J1bGVzJwkJCQk9PgkJJycsCgkJCSdkZWZhdWx0JwkJCT0+CQknJywJCQkJCS8vIElNUE9SVEFOVDogT3ZlcnJpZGVzIGRlZmF1bHQgYXJyYXkuIEFsc28gdXNlZnVsIGlmIHNhdmVwb2ludCBpcyA9PT0gZmFsc2UgdG8gb3ZlcnJpZGUuCgkJCSdvcHRpb25zJwkJCT0+CQlhcnJheSgpLAoJCQknb3JpZW50YXRpb24nCQk9PgkJJ2hvcml6b250YWwnLAkJLy8gVXNlZCBieSByYWRpbyBhbmQgY2hlY2tib3hlcy4gVE9ETzogc3RpbGwgbmVlZCB0byBhZGQgdG8gY2hlY2tib3hlcy4KCQkJJ2NsYXNzJwkJCQk9PgkJJycsCgkJCSdjbGFzc2VzJwkJCT0+CQknJywJCQkJCS8vIFN0cmluZyBvZiBhZGRpdGlvbmFsIGNsYXNzZXMuCgkJCSdyb3dfY2xhc3MnCQkJPT4JCScnLAkJCQkJLy8gQ2xhc3MgdG8gYXBwbHkgdG8gcm93IHRkJ3MgaW4gcm93LgoJCSk7CgkJJHNldHRpbmdzID0gYXJyYXlfbWVyZ2UoICRkZWZhdWx0X3NldHRpbmdzLCAkc2V0dGluZ3MgKTsKCQkkdGhpcy0+X3NldHRpbmdzW10gPSAkc2V0dGluZ3M7CgkJCgkJCgkJLy8gRmlndXJlIG91dCBkZWZhdWx0cy4KCQlpZiAoICRzZXR0aW5nc1snZGVmYXVsdCddICE9ICcnICkgeyAvLyBEZWZhdWx0IHdhcyBwYXNzZWQgdG8gYWRkX3NldHRpbmcoKS4KCQkJJGRlZmF1bHRfdmFsdWUgPSAkc2V0dGluZ3NbJ2RlZmF1bHQnXTsKCQl9IGVsc2UgeyAvLyBObyBkZWZhdWx0IGV4cGxpY3RseSBzZXQuCgkJCSRzYXZlcG9pbnQgPSAkdGhpcy0+X3NhdmVwb2ludDsKCQkJJHJhd19uYW1lID0gJHNldHRpbmdzWyduYW1lJ107CgkJCQoJCQlpZiAoIHN0cmlzdHIoICRzZXR0aW5nc1snbmFtZSddLCAnIycgKSApOwoJCQlpZiAoIGZhbHNlICE9PSAoICRsYXN0X2hhc2hwb2ludCA9IHN0cnJwb3MoICRzZXR0aW5nc1snbmFtZSddLCAnIycgKSApICkgewoJCQkJJHRlbXBfc2F2ZXBvaW50ID0gc3Vic3RyKCAkc2V0dGluZ3NbJ25hbWUnXSwgMCwgJGxhc3RfaGFzaHBvaW50ICk7CgkJCQlpZiAoICggJHNhdmVwb2ludCA9PT0gZmFsc2UgKSB8fCAoICRzYXZlcG9pbnQgPT0gJycgKSApIHsKCQkJCQkkc2F2ZXBvaW50ID0gJHRlbXBfc2F2ZXBvaW50OwoJCQkJfSBlbHNlIHsKCQkJCQkkc2F2ZXBvaW50ID0gJHNhdmVwb2ludCAuICcjJyAuICR0ZW1wX3NhdmVwb2ludDsKCQkJCX0KCQkJCSRyYXdfbmFtZSA9IHN1YnN0ciggJHNldHRpbmdzWyduYW1lJ10sICRsYXN0X2hhc2hwb2ludCArIDEgKTsgLy8gSXRlbSBuYW1lIHdpdGggc2F2ZXBvaW50IHBvcnRpb24gc3RyaXBwZWQgb3V0LgoJCQl9CgkJCWlmICggJHNhdmVwb2ludCAhPT0gZmFsc2UgKSB7CgkJCQkKCQkJCWlmICggaXNfYXJyYXkoICRzYXZlcG9pbnQgKSApIHsgLy8gQXJyYXkgb2YgZGVmYXVsdHMgd2FzIHBhc3NlZCBpbnN0ZWFkIG9mIHNhdmVwb2ludC4KCQkJCQlpZiAoIGlzc2V0KCAkc2F2ZXBvaW50WyAkcmF3X25hbWUgXSApICkgewoJCQkJCQkkZGVmYXVsdF92YWx1ZSA9ICRzYXZlcG9pbnRbICRyYXdfbmFtZSBdOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRkZWZhdWx0X3ZhbHVlID0gJyc7CgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gTm8gZGVmYXVsdHMgcHJvdmlkZWQsIHNlZWsgdGhlbSBvdXQgaW4gcGx1Z2lucyBvcHRpb25zIGFycmF5LgoJCQkJCQoJCQkJCS8vIERlZmF1bHQgdmFsdWVzIGFyZSBvdmVyd3JpdHRlbiBhZnRlciBhIHByb2Nlc3MoKSBydW4gd2l0aCB0aGUgbGF0ZXN0IGRhdGEgaWYgYSBmb3JtIHdhcyBzdWJtaXR0ZWQuCgkJCQkJJGdyb3VwID0gcGJfYmFja3VwYnVkZHk6OmdldF9ncm91cCggJHNhdmVwb2ludCApOwoJCQkJCWlmICggJGdyb3VwID09PSBmYWxzZSApIHsKCQkJCQkJJGRlZmF1bHRfdmFsdWUgPSAnJzsKCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoIGlzc2V0KCAkZ3JvdXBbICRyYXdfbmFtZSBdICkgKSB7IC8vIERlZmF1bHQgaXMgZGVmaW5lZC4KCQkJCQkJCSRkZWZhdWx0X3ZhbHVlID0gJGdyb3VwWyAkcmF3X25hbWUgXTsKCQkJCQkJfSBlbHNlIHsgLy8gRGVmYXVsdCBub3QgZGVmaW5lZC4KCQkJCQkJCSRkZWZhdWx0X3ZhbHVlID0gJyc7CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQl9IC8vIGVuZCBmaW5kaW5nIGRlZmF1bHRzIGluIHBsdWdpbiBvcHRpb25zLgoJCQl9IGVsc2UgeyAvLyBDdXN0b20gbW9kZSB3aXRob3V0IGEgc2F2ZXBvaW50IHByb3ZpZGVkIHNvIG5vIGRlZmF1bHQgc2V0IHVubGVzcyBwYXNzZWQgdG8gYWRkX3NldHRpbmcoKS4KCQkJCSRkZWZhdWx0X3ZhbHVlID0gJyc7CgkJCX0KCQl9CgkJCgkJCgkJLy8gUHJvY2VzcyBhZGRpbmcgZm9ybSBpdGVtIGZvciB0aGUgc2V0dGluZyBiYXNlZCBvbiB0eXBlLgoJCXN3aXRjaCggJHNldHRpbmdzWyd0eXBlJ10gKSB7CgkJCWNhc2UgJ3RleHQnOgoJCQkJJHRoaXMtPl9mb3JtLT50ZXh0KCAkc2V0dGluZ3NbJ25hbWUnXSwgJGRlZmF1bHRfdmFsdWUsICRzZXR0aW5nc1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3BsYWludGV4dCc6CgkJCQkkdGhpcy0+X2Zvcm0tPnBsYWludGV4dCggJHNldHRpbmdzWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlICk7CgkJCQlicmVhazsKCQkJY2FzZSAnY29sb3InOgoJCQkJJHRoaXMtPl9mb3JtLT5jb2xvciggJHNldHRpbmdzWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10gKTsKCQkJCWJyZWFrOwoJCQljYXNlICdoaWRkZW4nOgoJCQkJJHRoaXMtPl9mb3JtLT5oaWRkZW4oICRzZXR0aW5nc1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzWydydWxlcyddICk7CgkJCQlicmVhazsKCQkJY2FzZSAnd3lzaXd5Zyc6CgkJCQkkdGhpcy0+X2Zvcm0tPnd5c2l3eWcoICRzZXR0aW5nc1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzWydydWxlcyddLCAkc2V0dGluZ3NbJ3NldHRpbmdzJ10gKTsKCQkJCWJyZWFrOwoJCQljYXNlICd0ZXh0YXJlYSc6CgkJCQkkdGhpcy0+X2Zvcm0tPnRleHRhcmVhKCAkc2V0dGluZ3NbJ25hbWUnXSwgJGRlZmF1bHRfdmFsdWUsICRzZXR0aW5nc1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3NlbGVjdCc6CgkJCQkkdGhpcy0+X2Zvcm0tPnNlbGVjdCggJHNldHRpbmdzWyduYW1lJ10sICRzZXR0aW5nc1snb3B0aW9ucyddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzWydydWxlcyddICk7CgkJCQlicmVhazsKCQkJY2FzZSAncGFzc3dvcmQnOgoJCQkJJHRoaXMtPl9mb3JtLT5wYXNzd29yZCggJHNldHRpbmdzWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10gKTsKCQkJCWJyZWFrOwoJCQljYXNlICdyYWRpbyc6CgkJCQkkdGhpcy0+X2Zvcm0tPnJhZGlvKCAkc2V0dGluZ3NbJ25hbWUnXSwgJHNldHRpbmdzWydvcHRpb25zJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10gKTsKCQkJCWJyZWFrOwoJCQljYXNlICdjaGVja2JveCc6CgkJCQkkdGhpcy0+X2Zvcm0tPmNoZWNrYm94KCAkc2V0dGluZ3NbJ25hbWUnXSwgJHNldHRpbmdzWydvcHRpb25zJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10gKTsKCQkJCWJyZWFrOwoJCQljYXNlICdzdWJtaXQnOgoJCQkJJHRoaXMtPl9mb3JtLT5zdWJtaXQoICRzZXR0aW5nc1snbmFtZSddLCAnREVGQVVMVCcgKTsgLy8gU3VibWl0IGJ1dHRvbiB0ZXh0IGlzIHNldCBpbiBkaXNwbGF5X3NldHRpbmdzKCkgcGFyYW0uCgkJCQlicmVhazsKCQkJY2FzZSAndGl0bGUnOgoJCQkJJHRoaXMtPl9mb3JtLT50aXRsZSggJHNldHRpbmdzWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10gKTsgLy8gU3VibWl0IGJ1dHRvbiB0ZXh0IGlzIHNldCBpbiBkaXNwbGF5X3NldHRpbmdzKCkgcGFyYW0uCgkJCQlicmVhazsKCQkJY2FzZSAnaHRtbCc6IC8vIFJhdyBIVE1MIHRvIGluamVjdCBhdCB0aGlzIHNwb3QuCgkJCQkkdGhpcy0+X2Zvcm0tPmh0bWwoICRzZXR0aW5nc1snbmFtZSddLCAkc2V0dGluZ3NbJ2h0bWwnXSApOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQllY2hvICd7RXJyb3I6IFVua25vd24gc2V0dGluZ3MgdHlwZSBgJyAuICRzZXR0aW5nc1sndHlwZSddIC4gJ2AufSc7CgkJCQlicmVhazsKCQl9IC8vIEVuZCBzd2l0Y2goKS4KCQkKCX0gLy8gRW5kIGFkZF9zZXR0aW5nKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9zZXR0aW5ncy0+cHJvY2VzcygpCgkgKgkKCSAqCVByb2Nlc3NlcyB0aGUgZm9ybSBpZiBhcHBsaWNhYmxlIChpZiBpdCB3YXMgc3VibWl0dGVkKS4KCSAqCVRPRE86IFBlcmhhcHMgYWRkIGNhbGxiYWNrIGFiaWxpdHkgdG8gdGhpcz8KCSAqCVRoaXMgbXVzdCBjb21lIGFmdGVyIGFsbCBmb3JtIGVsZW1lbnRzIGhhdmUgYmVlbiBhZGRlZC4KCSAqCVRoaXMgc2hvdWxkIHVzdWFsbHkgaGFwcGVuIGluIHRoZSBjb250cm9sbGVyIHByaW9yIHRvIGxvYWRpbmcgYSB2aWV3LgoJICoJSU1QT1JUQU5UOiBBcHBsaWVzIHRyaW0oKSB0byBhbGwgc3VibWl0dGVkIGZvcm0gdmFsdWVzIQoJICoJCgkgKglAcmV0dXJuCQludWxsL2FycmF5CQkJCVdoZW4gYSBzYXZlcG9pbnQgd2FzIGRlZmluZWQgaW4gY2xhc3MgY29uc3RydWN0b3Igbm90aGluZyBpcyByZXR1cm5lZC4gKG5vcm1hbCBvcGVyYXRpb24pCgkgKgkJCQkJCQkJCQlXaGVuIHNhdmVwb2ludCA9PT0gZmFsc2UgYW4gYXJyYXkgaXMgcmV0dXJuZWQgZm9yIGN1c3RvbSBmb3JtIHByb2Nlc3NpbmcuCgkgKgkJCQkJCQkJCQlGb3JtYXQ6IGFycmF5KCAnZXJyb3JzJyA9PiBmYWxzZS9hcnJheSwgJ2RhdGEnID0+IGFycmF5KCAnZm9ybV9rZXlzJyA9PiAnZm9ybV92YWx1ZXMnICkgKS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoKSB7CgkJaWYgKCAoICcnICE9ICggJGZvcm1fbmFtZSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJHRoaXMtPl9wcmVmaXggKSApICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4ICkgPT0gJHRoaXMtPl9mb3JtX25hbWUgKSApIHsgLy8gVGhpcyBmb3JtIHdhcyBpbmRlZWQgc3VibWl0dGVkLiBQUk9DRVNTIElUIQoJCQkvLyBUT0RPOgoJCQkkZXJyb3JzID0gYXJyYXkoKTsKCQkJJF9wb3N0cyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCgpOwoJCQkKCQkJLy8gQ2xlYW51cAoJCQlmb3JlYWNoKCAkX3Bvc3RzIGFzICYkcG9zdF92YWx1ZSApIHsKCQkJCSRwb3N0X3ZhbHVlID0gdHJpbSggJHBvc3RfdmFsdWUgKTsKCQkJfQoJCQkKCQkJLy8gbG9vcCB0aHJvdWdoIGFsbCBwb3N0ZWQgdmFyaWFibGVzLCBpZiBpdHMgcHJlZml4IG1hdGNoZXMgdGhpcyBmb3JtJ3MgbmFtZSB0aGVuCgkJCWZvcmVhY2goICRfcG9zdHMgYXMgJHBvc3RfbmFtZSA9PiAkcG9zdF92YWx1ZSApIHsKCQkJCWlmICggc3Vic3RyKCAkcG9zdF9uYW1lLCAwLCBzdHJsZW4oICR0aGlzLT5fcHJlZml4ICkgKSA9PSAkdGhpcy0+X3ByZWZpeCApIHsgLy8gVGhpcyBzZXR0aW5ncyBmb3JtLgoJCQkJCSRpdGVtX25hbWUgPSBzdWJzdHIoICRwb3N0X25hbWUsIHN0cmxlbiggJHRoaXMtPl9wcmVmaXggKSApOwoJCQkJCWlmICggKCAkaXRlbV9uYW1lICE9ICcnICkgJiYgKCAkaXRlbV9uYW1lICE9ICdzZXR0aW5nc19zdWJtaXQnICkgKSB7IC8vIFNraXAgdGhlIGZvcm0gbmFtZSBpbnB1dDsgYWxzbyBzZXR0aW5ncyBzdWJtaXQgYnV0dG9uIHNpbmNlIGl0IGlzIG5vdCByZWdpc3RlcmVkIHVudGlsIHZpZXcuCgkJCQkJCWlmICggdHJ1ZSAhPT0gKCAkdGVzdF9yZXN1bHQgPSAkdGhpcy0+X2Zvcm0tPnRlc3QoICRpdGVtX25hbWUsICRwb3N0X3ZhbHVlICkgKSApIHsKCQkJCQkJCWZvcmVhY2goICR0aGlzLT5fc2V0dGluZ3MgYXMgJHNldHRpbmdfaW5kZXggPT4gJHNldHRpbmcgKSB7CgkJCQkJCQkJaWYgKCAkc2V0dGluZ1sndHlwZSddID09ICd0aXRsZScgKSB7CgkJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoICRzZXR0aW5nWyduYW1lJ10gPT0gJGl0ZW1fbmFtZSApIHsKCQkJCQkJCQkJJHRoaXMtPl9zZXR0aW5nc1skc2V0dGluZ19pbmRleF1bJ2Vycm9yJ10gPSB0cnVlOwoJCQkJCQkJCQkkaXRlbV90aXRsZSA9ICR0aGlzLT5fc2V0dGluZ3NbJHNldHRpbmdfaW5kZXhdWyd0aXRsZSddOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCSRlcnJvcnNbXSA9ICdWYWxpZGF0aW9uIGZhaWx1cmUgb24gYCcgLiAkaXRlbV90aXRsZSAuICdgOiAnIC4gaW1wbG9kZSggJyAnLCAkdGVzdF9yZXN1bHQgKTsKCQkJCQkJCXVuc2V0KCAkX3Bvc3RzWyRwb3N0X25hbWVdICk7IC8vIFJlbW92ZXMgdGhpcyBmb3JtIGl0ZW0gc28gaXQgd2lsbCBub3QgYmUgdXBkYXRlZCBkdXJpbmcgc2F2ZSBsYXRlci4KCQkJCQkJfSBlbHNlIHsgLy8gSXRlbSB2YWxpZGF0ZWQuIFJlbW92ZSBwcmVmaXggZm9yIGxhdGVyIHByb2Nlc3NpbmcuCgkJCQkJCQkkX3Bvc3RzWyRpdGVtX25hbWVdID0gJF9wb3N0c1skcG9zdF9uYW1lXTsKCQkJCQkJCSR0aGlzLT5fZm9ybS0+c2V0X3ZhbHVlKCAkaXRlbV9uYW1lLCAkcG9zdF92YWx1ZSApOyAvLyBTZXQgdmFsdWUgdG8gYmUgZXF1YWwgdG8gc3VibWl0dGVkIHZhbHVlIHNvIGlmIG9uZSBvciBtb3JlIGl0ZW0gZmFpbGVkIHZhbGlkYXRpb24gdGhlIGVudGlyZSBmb3JtIGlzIG5vdCB3aXBlZCBvdXQuIERvbid0IHdhbnQgdXNlciB0byBoYXZlIHRvIHJlLWVudGVyIHZhbGlkIGRhdGEuCgkJCQkJCQl1bnNldCggJF9wb3N0c1skcG9zdF9uYW1lXSApOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsgLy8gU3VibWl0IGJ1dHRvbi4gQ2FuIHVuc2V0IGl0IHRvIGNsZWFuIHVwIGFycmF5IGZvciBsYXRlci4KCQkJCQkJdW5zZXQoICRfcG9zdHNbJHBvc3RfbmFtZV0gKTsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBOb3QgZm9yIHRoaXMgZm9ybS4gQ2FuIHVuc2V0IGl0IHRvIGNsZWFuIHVwIGFycmF5IGZvciBsYXRlci4KCQkJCQl1bnNldCggJF9wb3N0c1skcG9zdF9uYW1lXSApOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBQcm9jZXNzIQoJCQkKCQkJCgkJCS8vIE9ubHkgc2F2ZSBpZiBpbiBub3JtYWwgc2V0dGluZ3MgbW9kZTsgaWYgc2F2ZXBvaW50ID09PSBmYWxzZSBubyBzYXZpbmcgaGVyZS4KCQkJaWYgKCAoICR0aGlzLT5fc2F2ZXBvaW50ID09PSBmYWxzZSApIHx8IGlzX2FycmF5KCAkdGhpcy0+X3NhdmVwb2ludCApICkgewoJCQkJLy9mb3JlYWNoKCAkX3Bvc3RzIGFzICRwb3N0X25hbWUgPT4gJHBvc3RfdmFsdWUgKSB7IC8vIFZhbGlkYXRpb24gYWJvdmUgc2hvdWxkIGhhdmVvIG9ubHkgbGVmdCBpdGVtcyBmb3IgdGhpcyBmb3JtLiBTdHJpcCBwcmVmaXhlcyBiZWZvcmUgcGFzc2luZyBvbi4KCQkJCS8vCSRwb3N0X25hbWUgPSBzdWJzdHIoICRwb3N0X25hbWUsIHN0cmxlbiggJHRoaXMtPl9wcmVmaXggKSApOwoJCQkJLy99CgkJCQkkcmV0dXJuID0gYXJyYXkoCgkJCQkJCQkJJ2Vycm9ycycJPT4JCSRlcnJvcnMsCgkJCQkJCQkJJ2RhdGEnCQk9PgkJJF9wb3N0cywKCQkJCQkJCSk7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfSBlbHNlIHsgLy8gTm9ybWFsIHNldHRpbmdzIHNpbmNlIHNhdmVwb2ludCAhPT0gZmFsc2UuIFNhdmUgaW50byBzYXZlcG9pbnQhCgkJCQkKCQkJCWlmICggY291bnQoICRlcnJvcnMgKSA+IDAgKSB7IC8vIEVycm9ycy4KCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciB2YWxpZGF0aW5nIG9uZSBvciBtb3JlIGZpZWxkcyBhcyBpbmRpY2F0ZWQgYmVsb3cuIEVycm9yKHMpOjxicj4nIC4gaW1wbG9kZSggJzxicj4nLCAkZXJyb3JzICksIHRydWUgKTsKCQkJCX0KCQkJCS8vIFByZXBhcmUgc2F2ZXBvaW50LgoJCQkJaWYgKCAkdGhpcy0+X3NhdmVwb2ludCAhPSAnJyApIHsKCQkJCQkkc2F2ZXBvaW50X3Jvb3QgPSAkdGhpcy0+X3NhdmVwb2ludCAuICcjJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHNhdmVwb2ludF9yb290ID0gJyc7CgkJCQl9CgkJCQkKCQkJCS8vIFRoZSBoYXJkIHdvcmsuCgkJCQlmb3JlYWNoKCAkX3Bvc3RzIGFzICRwb3N0X25hbWUgPT4gJHBvc3RfdmFsdWUgKSB7IC8vIExvb3AgdGhyb3VnaCBhbGwgcG9zdCBpdGVtcyAobm90IGFsbCBtYXkgYmUgb3VyIGZvcm0pLiBAc2VlIDgzNDI5NTk0ODM3NTM0OTg3LgoJCQkJCS8vaWYgKCBzdWJzdHIoICRwb3N0X25hbWUsIDAsIHN0cmxlbiggJHRoaXMtPl9wcmVmaXggKSApID09ICR0aGlzLT5fcHJlZml4ICkgeyAvLyBJZiBwcmVmaXggbWF0Y2hlcywgaXRzIHRoaXMgZm9ybS4KCQkJCQkJLy8kcG9zdF9uYW1lID0gc3Vic3RyKCAkcG9zdF9uYW1lLCBzdHJsZW4oICR0aGlzLT5fcHJlZml4ICkgKTsgLy8gU2V0IHN0cmlwcGVkIHByZWZpeC4KCQkJCQkJLy9pZiAoICRwb3N0X25hbWUgIT0gJycgKSB7IC8vIFNraXBzIHRoZSBlbXB0eSBwcmVmaXggbmFtZSB3ZSB1c2VkIGZvciB2ZXJpZnlpbmcgZm9ybS4gQHNlZSA4MzQyOTU5NDgzNzUzNDk4Ny4KCQkJCQkJCQoJCQkJCQkJLy8gVXBkYXRlIGZvcm0gaXRlbSB2YWx1ZS4KCQkJCQkJCSR0aGlzLT5fZm9ybS0+c2V0X3ZhbHVlKCAkcG9zdF9uYW1lLCAkcG9zdF92YWx1ZSApOwoJCQkJCQkJCgkJCQkJCQkvLyBGcm9tIG9sZCBzYXZlX3NldHRpbmdzKCk6CgkJCQkJCQkkc2F2ZXBvaW50X3N1YnNlY3Rpb24gPSAmcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zOwoJCQkJCQkJJHNhdmVwb2ludF9sZXZlbHMgPSBleHBsb2RlKCAnIycsICRzYXZlcG9pbnRfcm9vdCAuICRwb3N0X25hbWUgKTsKCQkJCQkJCWZvcmVhY2ggKCAkc2F2ZXBvaW50X2xldmVscyBhcyAkc2F2ZXBvaW50X2xldmVsICkgewoJCQkJCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9ICYkc2F2ZXBvaW50X3N1YnNlY3Rpb257JHNhdmVwb2ludF9sZXZlbH07CgkJCQkJCQl9CgkJCQkJCQkvLyBBcHBseSBzZXR0aW5ncy4KCQkJCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9IHN0cmlwc2xhc2hlc19kZWVwKCAkcG9zdF92YWx1ZSApOyAvLyBSZW1vdmUgV29yZFByZXNzJyBtYWdpYy1xdW90ZXMtbm9uc2Vuc2UuCgkJCQkJCS8vfQoJCQkJCS8vfQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgYSBub3RlIHRvIHRoZSBzYXZlIGFsZXJ0IHRoYXQgc29tZSB2YWx1ZXMgYXJlIHNraXBwZWQgZHVlIHRvIGVycm9ycy4KCQkJCSRlcnJvcl9ub3RlID0gJyc7CgkJCQlpZiAoIGNvdW50KCAkZXJyb3JzICkgPiAwICkgewoJCQkJCSRlcnJvcl9ub3RlID0gJyBPbmUgb3IgbW9yZSBmaWVsZHMgc2tpcHBlZCBkdWUgdG8gZXJyb3IuJzsKCQkJCX0KCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggX18oICdTZXR0aW5ncyBzYXZlZC4nIC4gJGVycm9yX25vdGUsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCSRyZXR1cm4gPSBhcnJheSgKCQkJCQkJCQknZXJyb3JzJwk9PgkJJGVycm9ycywKCQkJCQkJCQknZGF0YScJCT0+CQkkX3Bvc3RzLAoJCQkJCQkJKTsKCQkJCXJldHVybiAkcmV0dXJuOwoJCQkJLy99IC8vIGVuZCBubyBlcnJvcnMuCgkJCX0gLy8gRW5kIGlmIHNhdmVwb2ludCAhPT09IGZhbHNlLgoJCX0gLy8gZW5kIHN1Ym1pdHRlZCBmb3JtLgoJCQoJCQoJfSAvLyBFbmQgcHJvY2VzcygpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfc2V0dGluZ3MtPmRpc3BsYXlfc2V0dGluZ3MoKQoJICoJCgkgKglEaXNwbGF5cyBhbGwgdGhlIHJlZ2lzdGVyZWQgc2V0dGluZ3MgaW4gdGhpcyBvYmplY3QuIEVudGlyZSBmb3JtIGFuZCBIVE1MIGlzIGVjaG8nZCBvdXQuCgkgKglAc2VlIHBsdWdpbmJ1ZGR5X3NldHRpbmdzLT5nZXRfc2V0dGluZ3MoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHN1Ym1pdF9idXR0b25fdGl0bGUJCVRleHQgdG8gZGlzcGxheSBpbiB0aGUgc3VibWl0IGJ1dHRvbi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYmVmb3JlCQkJCQkJQ29udGVudCBiZWZvcmUgc3VibWl0IGFmdGVyLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRhZnRlcgkJCQkJCUNvbnRlbnQgYWZ0ZXIgc3VibWl0IGJ1dHRvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpc3BsYXlfc2V0dGluZ3MoICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkYmVmb3JlID0gJycsICRhZnRlciA9ICcnLCAkc2F2ZV9idXR0b25fY2xhc3MgPSAnJyApIHsKCQllY2hvICR0aGlzLT5nZXRfc2V0dGluZ3MoICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkYmVmb3JlLCAkYWZ0ZXIsICRzYXZlX2J1dHRvbl9jbGFzcyApOwoJfSAvLyBFbmQgZGlzcGxheV9zZXR0aW5ncygpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfc2V0dGluZ3MtPmdldF9zZXR0aW5ncygpCgkgKgkKCSAqCVJldHVybnMgYWxsIHRoZSByZWdpc3RlcmVkIHNldHRpbmdzIGluIHRoaXMgb2JqZWN0LiBFbnRpcmUgZm9ybSBhbmQgSFRNTCBpcyByZXR1cm5lZC4KCSAqCUBzZWUgcGx1Z2luYnVkZHlfc2V0dGluZ3MtPmRpc3BsYXlfc2V0dGluZ3MoKQoJICoJcmFkaW8gYnV0dG9uIGFkZGl0aW9uYWwgb3B0aW9uczogIG9yaWVudGF0aW9uIFsgdmVydGljYWwgLyBob3Jpem9udGFsIF0KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzdWJtaXRfYnV0dG9uX3RpdGxlCQlUZXh0IHRvIGRpc3BsYXkgaW4gdGhlIHN1Ym1pdCBidXR0b24uCgkgKglAcGFyYW0JCXN0cmluZwkJJGJlZm9yZQkJCQkJCUNvbnRlbnQgYmVmb3JlIHN1Ym1pdCBhZnRlci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYWZ0ZXIJCQkJCQlDb250ZW50IGFmdGVyIHN1Ym1pdCBidXR0b24uCgkgKglAcmV0dXJuCQlzdHJpbmcJCQkJCQkJCQlSZXR1cm5zIGVudGlyZSBzdHJpbmcgd2l0aCBldmVyeXRoaW5nIGluIGl0IHRvIGRpc3BsYXkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2V0dGluZ3MoICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkYmVmb3JlID0gJycsICRhZnRlciA9ICcnLCAkc2F2ZV9idXR0b25fY2xhc3MgPSAnJyApIHsKCQkkZmlyc3RfdGl0bGUgPSB0cnVlOyAvLyBmaXJzdCB0aXRsZSdzIENTUyB0b3AgcGFkZGluZyBkaWZmZXJzIHNvIG11c3QgdHJhY2suCgkJCgkJJHJldHVybiA9ICR0aGlzLT5fZm9ybS0+c3RhcnQoKTsKCQkkcmV0dXJuIC49ICc8dGFibGUgY2xhc3M9ImZvcm0tdGFibGUiPic7IC8vIHN0eWxlPSJtYXgtd2lkdGg6IDY3NXB4OyI+JzsKCQlmb3JlYWNoICggJHRoaXMtPl9zZXR0aW5ncyBhcyAkc2V0dGluZ3MgKSB7CgkJCSR0aF9jc3MgPSAnJzsKCQkJCgkJCWlmICggJHNldHRpbmdzWyd0aXRsZSddID09ICcnICkgeyAvLyBibGFuayB0aXRsZSBzbyBoaWRlIGxlZnQgY29sdW1uLgoJCQkJJHRoX2NzcyAuPSAnIGRpc3BsYXk6IG5vbmU7JzsKCQkJfQoJCQkKCQkJaWYgKCAkc2V0dGluZ3NbJ3R5cGUnXSA9PSAndGl0bGUnICkgeyAvLyBUaXRsZSBpdGVtLgoJCQkJaWYgKCAkZmlyc3RfdGl0bGUgPT09IHRydWUgKSB7IC8vIEZpcnN0IHRpdGxlIGluIGxpc3QuCgkJCQkJJHJldHVybiAuPSAnPHRyIHN0eWxlPSJib3JkZXI6IDA7Ij48dGggY29sc3Bhbj0iMiIgc3R5bGU9ImJvcmRlcjogMDsgcGFkZGluZy10b3A6IDA7IHBhZGRpbmctYm90dG9tOiAwOyIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyI+PGgzIGNsYXNzPSJ0aXRsZSAnIC4gJHNldHRpbmdzWydjbGFzcyddIC4gJyInOwoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0ibWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMC41ZW07Iic7CgkJCQkJJGZpcnN0X3RpdGxlID0gZmFsc2U7CgkJCQl9IGVsc2UgeyAvLyBTdWJzZXF1ZW50IHRpdGxlcy4KCQkJCQkkcmV0dXJuIC49ICc8dHIgc3R5bGU9ImJvcmRlcjogMDsiPjx0aCBjb2xzcGFuPSIyIiBzdHlsZT0iYm9yZGVyOiAwOyIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyI+PGgzIGNsYXNzPSJ0aXRsZSAnIC4gJHNldHRpbmdzWydjbGFzcyddIC4gJyInOwoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0ibWFyZ2luOiAwLjVlbSAwOyInOwoJCQkJfQoJCQkJCgkJCQkkcmV0dXJuIC49ICc+JyAuICRzZXR0aW5nc1sndGl0bGUnXSAuICc8L2gzPjwvdGg+JzsKCQkJfSBlbHNlaWYgKCAkc2V0dGluZ3NbJ3R5cGUnXSA9PSAnaGlkZGVuJyApIHsgLy8gaGlkZGVuIGZvcm0gaXRlbS4gbm8gdGl0bGUuCgkJCQkkcmV0dXJuIC49ICR0aGlzLT5fZm9ybS0+Z2V0KCAkc2V0dGluZ3NbJ25hbWUnXSwgJHNldHRpbmdzWydjc3MnXSwgJHNldHRpbmdzWydjbGFzc2VzJ10gKTsKCQkJfSBlbHNlIHsgLy8gTm9ybWFsIGl0ZW0uCgkJCQkkcmV0dXJuIC49ICc8dHIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyI+JzsKCQkJCSRyZXR1cm4gLj0gJzx0aCBzY29wZT0icm93IiBjbGFzcz0iJyAuICRzZXR0aW5nc1sncm93X2NsYXNzJ10gLiAnIic7CgkJCQlpZiAoICR0aGlzLT5fY3VzdG9tX3RpdGxlX3dpZHRoICE9ICcnICkgewoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0id2lkdGg6ICcgLiAkdGhpcy0+X2N1c3RvbV90aXRsZV93aWR0aCAuICdweDsgJyAuICR0aF9jc3MgLiAnIic7CgkJCQl9IGVsc2UgewoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0iJyAuICR0aF9jc3MgLiAnIic7CgkJCQl9CgkJCQkkcmV0dXJuIC49ICc+JzsKCQkJCSRyZXR1cm4gLj0gJHNldHRpbmdzWyd0aXRsZSddOwoJCQkJaWYgKCBpc3NldCggJHNldHRpbmdzWyd0aXAnXSApICYmICggJHNldHRpbmdzWyd0aXAnXSAhPSAnJyApICkgewoJCQkJCSRyZXR1cm4gLj0gcGJfYmFja3VwYnVkZHk6OiR1aS0+dGlwKCAkc2V0dGluZ3NbJ3RpcCddLCAnJywgZmFsc2UgKTsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJzwvdGg+JzsKCQkJCWlmICggJHNldHRpbmdzWyd0eXBlJ10gPT0gJ3RpdGxlJyApIHsgLy8gRXh0ZW5kIHdpZHRoIGZ1bGwgbGVuZ3RoIGZvciB0aXRsZSBpdGVtLgoJCQkJCSRyZXR1cm4gLj0gJyBjb2xzcGFuPSIyIic7CgkJCQl9CgkJCQkKCQkJCSRyZXR1cm4gLj0gJzx0ZCBjbGFzcz0iJyAuICRzZXR0aW5nc1sncm93X2NsYXNzJ10gLiAnIic7CgkJCQlpZiAoICRzZXR0aW5nc1sndGl0bGUnXSA9PSAnJyApIHsgLy8gTm8gdGl0bGUgc28gaGlkZSBsZWZ0IGNvbHVtbi4KCQkJCQkkcmV0dXJuIC49ICcgY29sc3Bhbj0iMiInOwoJCQkJfQoJCQkJJHJldHVybiAuPSAnPic7CgkJCQkkcmV0dXJuIC49ICRzZXR0aW5nc1snYmVmb3JlJ107CgkJCQlpZiAoIGlzc2V0KCAkc2V0dGluZ3NbJ2Vycm9yJ10gKSAmJiAoICRzZXR0aW5nc1snZXJyb3InXSA9PT0gdHJ1ZSApICkgewoJCQkJCSRzZXR0aW5nc1snY3NzJ10gLj0gJ2JvcmRlcjogMXB4IGRhc2hlZCByZWQ7JzsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJHRoaXMtPl9mb3JtLT5nZXQoICRzZXR0aW5nc1snbmFtZSddLCAkc2V0dGluZ3NbJ2NzcyddLCAkc2V0dGluZ3NbJ2NsYXNzZXMnXSwgJHNldHRpbmdzWydvcmllbnRhdGlvbiddICk7CgkJCQkkcmV0dXJuIC49ICRzZXR0aW5nc1snYWZ0ZXInXTsKCQkJCSRyZXR1cm4gLj0gJzwvdGQ+JzsKCQkJCSRyZXR1cm4gLj0gJzwvdHI+JzsKCQkJfQoJCQkKCQkJCgkJCQoJCQkvKgoJCQkkZm9ybS0+YWRkX3NldHRpbmcoIGFycmF5KAoJCQkJJ3R5cGUnCQk9PgkJJ3RleHQnLAoJCQkJJ25hbWUnCQk9PgkJJ2ltYWdlX3dpZHRoJywKCQkJCSd0aXRsZScJCT0+CQknSW1hZ2UgV2lkdGgnLAoJCQkJJ3RpcCcJCT0+CQknVGhpcyBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VzIGluIHRoZSBDYXJvdXNlbC4gSW1hZ2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGltYWdlcyB1cGxvYWRlZC4gSW1hZ2VzIHdpbGwgbm90IGJlIHVwc2NhbGVkIGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbHMuIFlvdSBtYXkgY2hhbmdlIHRoaXMgYXQgYW55IHRpbWUuJywKCQkJCSdjc3MnCQk9PgkJJ3RleHQtYWxpZ246IHJpZ2h0OycsCgkJCQknYWZ0ZXInCQk9PgkJJ3B4JywKCQkJCSdydWxlcycJCT0+CQkncmVxdWlyZWQnLAoJCQkpICk7CgkJCSovCgkJfQoJCSRyZXR1cm4gLj0gJzwvdGFibGU+PGJyPic7CgoJCS8vIFN1Ym1pdCBidXR0b24KCQkkcmV0dXJuIC49ICRiZWZvcmU7CgkJJHJldHVybiAuPSAkdGhpcy0+X2Zvcm0tPnN1Ym1pdCggJ3NldHRpbmdzX3N1Ym1pdCcsICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkc2F2ZV9idXR0b25fY2xhc3MgKTsKCQkkcmV0dXJuIC49ICR0aGlzLT5fZm9ybS0+Z2V0KCAnc2V0dGluZ3Nfc3VibWl0JywgJycsICRzYXZlX2J1dHRvbl9jbGFzcyApOyAvLywgJHNldHRpbmdzWyduYW1lJ10sICRzZXR0aW5nc1snY2xhc3NlcyddICk7CgkJJHJldHVybiAuPSAkYWZ0ZXI7CgoJCSRyZXR1cm4gLj0gJHRoaXMtPl9mb3JtLT5lbmQoKTsKCgkJcmV0dXJuICRyZXR1cm47Cgl9IC8vIEVuZCBnZXRfc2V0dGluZ3MoKS4KCQoJCgkKCS8qCWNsZWFyX3ZhbHVlcygpCgkgKgkKCSAqCUNsZWFycyB0aGUgdmFsdWUgb2YgYWxsIGZvcm0gaXRlbXMgc2V0dGluZyB0aGUgdmFsdWUgdG8gYW4gZW1wdHkgc3RyaW5nICcnLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjbGVhcl92YWx1ZXMoKSB7CgkJJHRoaXMtPl9mb3JtLT5jbGVhcl92YWx1ZXMoKTsKCQkKCQlyZXR1cm47Cgl9IC8vIEVuZCBjbGVhcl92YWx1ZXMoKS4KCQoJCgkKCS8qCXNldF92YWx1ZSgpCgkgKgkKCSAqCVJlcGxhY2UgdGhlIHZhbHVlIG9mIGEgZm9ybSBpdGVtLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkkaXRlbV9uYW1lCQlOYW1lIG9mIHRoZSBmb3JtIHNldHRpbmcgaXRlbSB0byB1cGRhdGUuCgkgKglAcGFyYW0JCXN0cmluZwkkdmFsdWUJCQlWYWx1ZSB0byBzZXQgdGhlIGl0ZW0gdG8uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfdmFsdWUoICRpdGVtX25hbWUsICR2YWx1ZSApIHsKCQkkdGhpcy0+X2Zvcm0tPnNldF92YWx1ZSggJGl0ZW1fbmFtZSwgJHZhbHVlICk7CgkJcmV0dXJuOwoJfSAvLyBFbmQgc2V0X3ZhbHVlKCkuCgkKCQp9IC8vIEVuZCBjbGFzcyBwbHVnaW5idWRkeV9zZXR0aW5ncy4KCg== ###PACKDATA,FILE_END,/pluginbuddy/classes/settings.php,importbuddy/pluginbuddy/classes/settings.php ###PACKDATA,FILE_START,/pluginbuddy/classes/ui.php,importbuddy/pluginbuddy/classes/ui.php PD9waHAKCgoKLyoJcGx1Z2luYnVkZHlfdWkgY2xhc3MKICoJCiAqCUhhbmRsZXMgdHlwaWNhbCB1c2VyIGludGVyZmFjZSBpdGVtcyB1c2VkIGluIFdvcmRQcmVzcyBkZXZlbG9wbWVudC4KICoJCiAqCUBhdXRob3IgRHVzdGluIEJvbHRvbgogKglAdmVyc2lvbiAxLjAuMAogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfdWkgewoKCXByaXZhdGUgJF90YWJfaW50ZXJmYWNlX3RhZyA9ICcnOwoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5zdGFydF9tZXRhYm94KCkKCSAqCQoJICoJU3RhcnRzIGEgbWV0YWJveC4gVXNlIHdpdGggZW5kX21ldGFib3goKS4KCSAqCUBzZWUgcGx1Z2luYnVkZHlfdWktPmVuZF9tZXRhYm94CgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkJCSR0aXRsZQkJCQlUaXRsZSB0byBkaXNwbGF5IGZvciB0aGUgbWV0YWJveC4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJCQkkZWNobwkJCQlFY2hvcyBpZiB0cnVlOyBlbHNlIHJldHVybnMuCgkgKglAcGFyYW0JCWJvb2xlYW4vc3RyaW5nCQkkc21hbGxfb3JfY3NzCQl0cnVlOiBzaXplIGlzIGxpbWl0ZWQgc21hbGxlci4gZmFsc2U6IHNpemUgaXMgbGltaXRlZCBsYXJnZXIuIElmIGEgc3RyaW5nIHRoZW4gaW50ZXJwcmV0ZWQgYXMgQ1NTLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQkJCVJldHVybnMgbnVsbCBpZiAkZWNobyBpcyB0cnVlOyBlbHNlIHJldHVybnMgc3RyaW5nIHdpdGggSFRNTC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0X21ldGFib3goICR0aXRsZSwgJGVjaG8gPSB0cnVlLCAkc21hbGxfb3JfY3NzID0gZmFsc2UgKSB7CgkJaWYgKCAkc21hbGxfb3JfY3NzID09PSBmYWxzZSApIHsgLy8gTGFyZ2Ugc2l6ZS4KCQkJJGNzcyA9ICd3aWR0aDogNzAlOyBtaW4td2lkdGg6IDcyMHB4Oyc7CgkJfSBlbHNlaWYgKCAkc21hbGxfb3JfY3NzID09PSB0cnVlICkgeyAvLyBTbWFsbCBzaXplLgoJCQkkY3NzID0gJ3dpZHRoOiAyMCU7IG1pbi13aWR0aDogMjUwcHg7JzsKCQl9IGVsc2UgeyAvLyBTdHJpbmcgc28gaW50ZXJwcmV0IGFzIENTUy4KCQkJJGNzcyA9ICRzbWFsbF9vcl9jc3M7CgkJfQoJCQoJCSRjc3MgLj0gJyBwYWRkaW5nLXRvcDogMDsgbWFyZ2luLXRvcDogMTBweDsgY3Vyc29yOiBhdXRvOyc7CgkJCgkJJHJlc3BvbnNlID0gJzxkaXYgY2xhc3M9Im1ldGFib3gtaG9sZGVyIHBvc3Rib3giIHN0eWxlPSInIC4gJGNzcyAuICciPgoJCQkJCQk8aDMgY2xhc3M9ImhuZGxlIiBzdHlsZT0iY3Vyc29yOiBhdXRvOyI+PHNwYW4+JyAuICR0aXRsZSAuICc8L3NwYW4+PC9oMz4KCQkJCQkJPGRpdiBjbGFzcz0iaW5zaWRlIj4nOwoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJlc3BvbnNlOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmVzcG9uc2U7CgkJfQoJfSAvLyBFbmQgc3RhcnRfbWV0YWJveCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfdWktPmVuZF9tZXRhYm94KCkKCSAqCQoJICoJRW5kcyBhIG1ldGFib3guIFVzZSB3aXRoIHN0YXJ0X21ldGFib3goKS4KCSAqCUBzZWUgcGx1Z2luYnVkZHlfdWktPnN0YXJ0X21ldGFib3gKCSAqCQoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNobwkJRWNob3MgaWYgdHJ1ZTsgZWxzZSByZXR1cm5zLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZW5kX21ldGFib3goICRlY2hvID0gdHJ1ZSApIHsKCQkkcmVzcG9uc2UgPSAnCTwvZGl2PgoJCQkJCTwvZGl2Pic7CgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmVzcG9uc2U7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXNwb25zZTsKCQl9Cgl9IC8vIEVuZCBlbmRfbWV0YWJveCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfdWktPnRpdGxlKCkKCSAqCQoJICoJRGlzcGxheXMgYSBzdHlsZWQsIHByb3Blcmx5IGZvcm1hdHRlZCB0aXRsZSBmb3IgcGFnZXMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGl0bGUJCVRpdGxlIHRvIGRpc3BsYXkuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQlXaGV0aGVyIG9yIG5vdCB0byBlY2hvIHRoZSBzdHJpbmcgb3IgcmV0dXJuLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdGl0bGUoICR0aXRsZSwgJGVjaG8gPSB0cnVlLCAkYnIgPSB0cnVlICkgewoJCSRyZXR1cm4gPSAnPGgxIHN0eWxlPSJ6b29tOiAxLjA1OyI+PHNwYW4gY2xhc3M9ImJhY2t1cGJ1ZGR5LWljb24tZHJpdmUiIHN0eWxlPSJmb250LXNpemU6IDEuMmVtOyB2ZXJ0aWNhbC1hbGlnbjogLTRweDsiPjwvc3Bhbj4gJyAuICR0aXRsZSAuICc8L2gxPic7CgkJaWYgKCB0cnVlID09PSAkYnIgKSB7CgkJCSRyZXR1cm4gLj0gJzxiciAvPic7CgkJfQoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJldHVybjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJldHVybjsKCQl9Cgl9IC8vIEVuZCB0aXRsZSgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfdWktPmJ1dHRvbigpCgkgKgkKCSAqCURpc3BsYXlzIGEgbmljZSBwcmV0dHkgc3R5bGVkIGJ1dHRvbi4gSG93IG5pY2UuIEFsd2F5cyByZXR1cm5zLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHVybAkJCQlVUkwgKGhyZWYpIGZvciB0aGUgYnV0dG9uIHRvIGxpbmsgdG8uCgkgKglAcGFyYW0JCXN0cmluZwkJJHRleHQJCQkJVGV4dCB0byBkaXNwbGF5IGluIHRoZSBidXR0b24uCgkgKglAcGFyYW0JCXN0cmluZwkJJHRpdGxlCQkJCU9wdGlvbmFsIHRpdGxlIHRleHQgdG8gZGlzcGxheSBvbiBob3ZlciBpbiB0aGUgdGl0bGUgdGFnLgoJICoJQHBhcmFtCQlib29sZWFuCQkkcHJpbWFyeQkJCShvcHRpb25hbCkgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIHByaW1hcnkgYnV0dG9uLiBQcmltYXJ5IGJ1dHRvbnMgYXJlIGJsdWUgYW5kIHN0cm9uZyB3aGVyZSBkZWZhdWx0IG5vbi1wcmltYXJ5IGlzIGdyZXkgYW5kIGdlbnRsZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYWRkaXRpb25hbF9jbGFzcwkob3B0aW9uYWwpIEFkZGl0aW9uYWwgQ1NTIGNsYXNzIHRvIGFwcGx5IHRvIGJ1dHRvbi4gVXNlZnVsIGZvciB0aGlja2JveCBvciBvdGhlciBKUyBzdHVmZi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkaWQJCQkJCShvcHRpb25hbCkgSFRNTCBJRCB0byBhcHBseS4gVXNlZnVsIGZvciBKUy4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJCQlIVE1MIHN0cmluZyBmb3IgdGhlIGJ1dHRvbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGJ1dHRvbiggJHVybCwgJHRleHQsICR0aXRsZSA9ICcnLCAkcHJpbWFyeSA9IGZhbHNlLCAkYWRkaXRpb25hbF9jbGFzcyA9ICcnLCAkaWQgPSAnJyApIHsKCQlpZiAoICRwcmltYXJ5ID09PSBmYWxzZSApIHsKCQkJcmV0dXJuICc8YSBjbGFzcz0iYnV0dG9uIHNlY29uZGFyeS1idXR0b24gJyAuICRhZGRpdGlvbmFsX2NsYXNzIC4gJyIgc3R5bGU9Im1hcmdpbi10b3A6IDNweDsiIGlkPSInIC4gJGlkIC4gJyIgdGl0bGU9IicgLiAkdGl0bGUgLiAnIiBocmVmPSInIC4gJHVybCAuICciPicgLiAkdGV4dCAuICc8L2E+JzsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJzxhIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkgJyAuICRhZGRpdGlvbmFsX2NsYXNzIC4gJyIgc3R5bGU9Im1hcmdpbi10b3A6IDNweDsiIGlkPSInIC4gJGlkIC4gJyIgdGl0bGU9IicgLiAkdGl0bGUgLiAnIiBocmVmPSInIC4gJHVybCAuICciPicgLiAkdGV4dCAuICc8L2E+JzsKCQl9Cgl9IC8vIEVuZCBidXR0b24oKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5ub3RlKCkKCSAqCQoJICoJRGlzcGxheSB0ZXh0IGluIGEgc3VidGxlIHdheS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSR0ZXh0CQlUZXh0IG9mIG5vdGUuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQlXaGV0aGVyIG9yIG5vdCB0byBlY2hvIHRoZSBzdHJpbmcgb3IgcmV0dXJuLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vdGUoICR0ZXh0LCAkZWNobyA9IHRydWUgKSB7CgkJJHJldHVybiA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPjxpPicgLiAkdGV4dCAuICc8L2k+PC9zcGFuPic7CgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0gLy8gRW5kIG5vdGUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5saXN0X3RhYmxlKCkKCSAqCQoJICoJRGlzcGxheXMgYSBuaWNlIHRhYmxlIHdpdGggbXVsdGlwbGUgY29sdW1ucywgcm93cywgYnVsayBhY3Rpb25zLCBob3ZlciBhY3Rpb25zLCBldGMgc2ltaWxhciB0byBXb3JkUHJlc3MgcG9zdHMgdGFibGUuCgkgKglDdXJyZW50bHkgb25seSBzdXBwb3J0cyBlY2hvIG9mIG91dHB1dC4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJGl0ZW1zCQlBcnJheSBvZiByb3dzIHRvIGRpc3BsYXkuIEVhY2ggcm93IGFycmF5IGNvbnRhaW5zIGFuIGFycmF5IHdpdGggdGhlIGNvbHVtbnMuIFR5cGljYWxseSBzZXQgaW4gY29udHJvbGxlci4KCSAqCQkJCQkJCQkJCUV4OiBhcnJheSggYXJyYXkoICdibHVlJywgJ3JlZCcgKSwgYXJyYXkoICdicm93bicsICdncmVlbicgKSApLgoJICoJCQkJCQkJCQkJSWYgdGhlIHZhbHVlIGZvciBhbiBpdGVtIGlzIGFuIGFycmF5IHRoZW4gdGhlIGZpcnN0IHZhbHVlIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHJlbCB0YWcgb2YgYW55IGhvdmVyIGFjdGlvbnMuIElmIG5vdAoJICoJCQkJCQkJCQkJYW4gYXJyYXkgdGhlbiB0aGUgdmFsdWUgaXRzZWxmIHdpbGwgYmUgcHV0IGluIHRoZSByZWwgdGFnLiAgSWYgYW4gYXJyYXkgdGhlIHNlY29uZCB2YWx1ZSB3aWxsIGJlIHRoZSBvbmUgZGlzcGxheWVkIGluIHRoZSBjb2x1bW4uCgkgKgkJCQkJCQkJCQlCYWNrdXBCdWRkeSBuZWVkZWQgdGhlIGRpc3BsYXllZCBpdGVtIGluIHRoZSBjb2x1bW4gdG8gYmUgYSBsaW5rIChmb3IgZG93bmxvYWRpbmcgYmFja3VwcykgYnV0IHRoZSBiYWNrdXAgZmlsZSBhcyB0aGUgcmVsLgoJICoJQHBhcmFtCQlhcnJheQkJJHNldHRpbmdzCUFycmF5IG9mIGFsbCB0aGUgdmFyaW91cyBzZXR0aW5ncy4gTWVyZ2VkIHdpdGggZGVmYXVsdHMgcHJpb3IgdG8gdXNhZ2UuIFR5cGljYWxseSBzZXQgaW4gdmlldy4KCSAqCQkJCQkJCQkJCVNlZSAkZGVmYXVsdF9zZXR0aW5ncyBhdCBiZWdpbm5pbmcgb2YgZnVuY3Rpb24gZm9yIGF2YWlsYWJsZSBzZXR0aW5ncy4KCSAqCQkJCQkJCQkJCUV4OiAkc2V0dGluZ3MgPSBhcnJheSgKCSAqCQkJCQkJCQkJCQkJJ2FjdGlvbicJCT0+CQlwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpLAoJICoJCQkJCQkJCQkJCQknY29sdW1ucycJCT0+CQlhcnJheSggJ0dyb3VwIE5hbWUnLCAnSW1hZ2VzJywgJ1Nob3J0Y29kZScgKSwKCSAqCQkJCQkJCQkJCQkJJ2hvdmVyX2FjdGlvbnMnCT0+CQlhcnJheSggJ2VkaXQnID0+ICdFZGl0IEdyb3VwIFNldHRpbmdzJyApLAkJLy8gU2x1ZyBjYW4gYmUgYSBVUkwuIEluIHRoaXMgY2FzZSB0aGUgdmFsdWUgb2YgdGhlIGhvdmVyZWQgcm93IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgVVJMLiBUT0RPOiBNYWtlIHRoZSBmaXJzdCBob3ZlciBhY3Rpb24gYmUgdGhlIGxpbmsgZm9yIHRoZSBmaXJzdCBsaXN0ZWQgaXRlbS4KCSAqCQkJCQkJCQkJCQkJJ2J1bGtfYWN0aW9ucycJPT4JCWFycmF5KCAnZGVsZXRlX2ltYWdlcycgPT4gJ0RlbGV0ZScgKSwKCSAqCQkJCQkJCQkJCQkpOwoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxpc3RfdGFibGUoICRpdGVtcywgJHNldHRpbmdzICkgewoJCSRkZWZhdWx0X3NldHRpbmdzID0gYXJyYXkoCgkJCQkJCQkJJ2NvbHVtbnMnCQkJCQk9PglhcnJheSgpLAoJCQkJCQkJCSdob3Zlcl9hY3Rpb25zJwkJCQk9PglhcnJheSgpLAoJCQkJCQkJCSdidWxrX2FjdGlvbnMnCQkJCT0+CWFycmF5KCksCgkJCQkJCQkJJ2hvdmVyX2FjdGlvbl9jb2x1bW5fa2V5Jwk9PgknJywJCQkvLyBpbnQgb2YgY29sdW1uIHRvIHNldCB2YWx1ZT0gaW4gVVJMIGFuZCByZWwgdGFnPSBmb3IgdXNpbmcgaW4gSlMuCgkJCQkJCQkJJ2FjdGlvbicJCQkJCT0+CScnLAoJCQkJCQkJCSdyZW9yZGVyJwkJCQkJPT4JJycsCgkJCQkJCQkJJ2FmdGVyX2J1bGsnCQkJCT0+CScnLAoJCQkJCQkJCSdjc3MnCQkJCQkJPT4JJycsCgkJCQkJCQkpOwoJCQoJCS8vIE1lcmdlIGRlZmF1bHRzLgoJCSRzZXR0aW5ncyA9IGFycmF5X21lcmdlKCAkZGVmYXVsdF9zZXR0aW5ncywgJHNldHRpbmdzICk7CgkJCgkJLy8gRnVuY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIGJ1bGsgYWN0aW9ucy4gVG9wIGFuZCBib3R0b20gc2V0IGFyZSB0aGUgc2FtZS4KCQlpZiAoICFmdW5jdGlvbl9leGlzdHMoICdidWxrX2FjdGlvbnMnICkgKSB7CgkJCWZ1bmN0aW9uIGJ1bGtfYWN0aW9ucyggJHNldHRpbmdzLCAkaG92ZXJfbm90ZSA9IGZhbHNlICkgewoJCQkJaWYgKCBjb3VudCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSApID4gMCApIHsKCQkJCQllY2hvICc8ZGl2IHN0eWxlPSJwYWRkaW5nLWJvdHRvbTogM3B4OyBwYWRkaW5nLXRvcDogM3B4OyI+JzsKCQkJCQlpZiAoIGNvdW50KCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddICkgPT0gMSApIHsKCQkJCQkJZm9yZWFjaCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSBhcyAkYWN0aW9uX3NsdWcgPT4gJGFjdGlvbl90aXRsZSApIHsKCQkJCQkJCWVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImJ1bGtfYWN0aW9uIiB2YWx1ZT0iJyAuICRhY3Rpb25fc2x1ZyAuICciPic7CgkJCQkJCQllY2hvICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkb19idWxrX2FjdGlvbiIgdmFsdWU9IicgLiAkYWN0aW9uX3RpdGxlIC4gJyIgY2xhc3M9ImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIGJhY2t1cGJ1ZGR5LWRvX2J1bGtfYWN0aW9uIj4nOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJZWNobyAnPHNlbGVjdCBuYW1lPSJidWxrX2FjdGlvbiIgY2xhc3M9ImFjdGlvbnMiPic7CgkJCQkJCWZvcmVhY2ggKCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddIGFzICRhY3Rpb25fc2x1ZyA9PiAkYWN0aW9uX3RpdGxlICkgewoJCQkJCQkJZWNobyAnPG9wdGlvbj5CdWxrIEFjdGlvbnM8L29wdGlvbj4nOwoJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRhY3Rpb25fc2x1ZyAuICciPicgLiAkYWN0aW9uX3RpdGxlIC4gJzwvb3B0aW9uPic7CgkJCQkJCX0KCQkJCQkJZWNobyAnPC9zZWxlY3Q+ICZuYnNwOyc7CgkJCQkJCS8vZWNobyBzZWxmOjpidXR0b24oICcjJywgJ0FwcGx5JyApOwoJCQkJCQllY2hvICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkb19idWxrX2FjdGlvbiIgdmFsdWU9IkFwcGx5IiBjbGFzcz0iYnV0dG9uIHNlY29uZGFyeS1idXR0b24gYmFja3VwYnVkZHktZG9fYnVsa19hY3Rpb24iPic7CgkJCQkJfQoJCQkJCWVjaG8gJyZuYnNwOyZuYnNwOyc7CgkJCQkJZWNobyAkc2V0dGluZ3NbJ2FmdGVyX2J1bGsnXTsKCQkJCQkKCQkJCQllY2hvICc8ZGl2IGNsYXNzPSJhbGlnbnJpZ2h0IGFjdGlvbnMiPic7CgkJCQkJaWYgKCAkaG92ZXJfbm90ZSA9PT0gdHJ1ZSApIHsKCQkJCQkJZWNobyBwYl9iYWNrdXBidWRkeTo6JHVpLT5ub3RlKCAnSG92ZXIgb3ZlciBpdGVtcyBhYm92ZSBmb3IgYWRkaXRpb25hbCBvcHRpb25zLicgKTsKCQkJCQl9CgkJCQkJaWYgKCAkc2V0dGluZ3NbJ3Jlb3JkZXInXSAhPSAnJyApIHsKCQkJCQkJZWNobyAnCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InNhdmVfb3JkZXIiIGlkPSJzYXZlX29yZGVyIiB2YWx1ZT0iU2F2ZSBPcmRlciIgY2xhc3M9ImJ1dHRvbi1zZWNvbmRhcnkiIC8+JzsKCQkJCQl9CgkJCQkJZWNobyAnPC9kaXY+JzsKCQkJCQkKCQkJCQllY2hvICc8L2Rpdj4nOwoJCQkJfQoJCQl9IC8vIEVuZCBzdWJmdW5jdGlvbiBidWxrX2FjdGlvbnMoKS4KCQl9IC8vIEVuZCBpZiBmdW5jdGlvbiBkb2VzIG5vdCBleGlzdC4KCQkKCQlpZiAoICRzZXR0aW5nc1snYWN0aW9uJ10gIT0gJycgKSB7CgkJCWVjaG8gJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInIC4gJHNldHRpbmdzWydhY3Rpb24nXSAuICciPic7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpub25jZSgpOwoJCQlpZiAoICRzZXR0aW5nc1sncmVvcmRlciddICE9ICcnICkgewoJCQkJZWNobyAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ib3JkZXIiIHZhbHVlPSIiIGlkPSJwYl9vcmRlciI+JzsKCQkJfQoJCX0KCQkKCQkKCQllY2hvICc8ZGl2IHN0eWxlPSJ3aWR0aDogNzAlOyBtaW4td2lkdGg6IDcyMHB4OyAnIC4gJHNldHRpbmdzWydjc3MnXSAuICciPic7CgkJCgkJLy8gRGlzcGxheSBidWxrIGFjdGlvbnMgKHRvcCkuCgkJYnVsa19hY3Rpb25zKCAkc2V0dGluZ3MgKTsKCQkKCQllY2hvICc8dGFibGUgY2xhc3M9IndpZGVmYXQgc3RyaXBlZCInOwoJCWVjaG8gJyBpZD0idGVzdCI+JzsKCQllY2hvICcJCTx0aGVhZD4KCQkJCQk8dHIgY2xhc3M9InRoZWFkIj4nOwoJCWlmICggY291bnQoICRzZXR0aW5nc1snYnVsa19hY3Rpb25zJ10gKSA+IDAgKSB7CgkJCWVjaG8nCQk8dGggc2NvcGU9ImNvbCIgY2xhc3M9ImNoZWNrLWNvbHVtbiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2stYWxsLWVudHJpZXMiIC8+PC90aD4nOwoJCX0KCQlmb3JlYWNoICggJHNldHRpbmdzWydjb2x1bW5zJ10gYXMgJGNvbHVtbiApIHsKCQkJZWNobyAnPHRoPicgLiAkY29sdW1uIC4gJzwvdGg+JzsKCQl9CgkJZWNobyAnCQk8L3RyPgoJCQkJPC90aGVhZD4KCQkJPHRmb290PgoJCQkJPHRyIGNsYXNzPSJ0aGVhZCI+JzsKCQlpZiAoIGNvdW50KCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddICkgPiAwICkgewoJCQllY2hvJwk8dGggc2NvcGU9ImNvbCIgY2xhc3M9ImNoZWNrLWNvbHVtbiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY2hlY2stYWxsLWVudHJpZXMiIC8+PC90aD4nOwoJCX0KCQlmb3JlYWNoICggJHNldHRpbmdzWydjb2x1bW5zJ10gYXMgJGNvbHVtbiApIHsKCQkJZWNobyAnPHRoPicgLiAkY29sdW1uIC4gJzwvdGg+JzsKCQl9CgkJZWNobyAnCTwvdHI+CgkJCTwvdGZvb3Q+CgkJCTx0Ym9keSc7CgkJaWYgKCAkc2V0dGluZ3NbJ3Jlb3JkZXInXSAhPSAnJyApIHsKCQkJZWNobyAnIGNsYXNzPSJwYl9yZW9yZGVyIic7CgkJfQoJCWVjaG8gJz4nOwoJCQoJCS8vIExPT1AgVEhST1VHSCBFQUNIIFJPVy4KCQlmb3JlYWNoICggKGFycmF5KSRpdGVtcyBhcyAkaXRlbV9pZCA9PiAkaXRlbSApIHsKCQkJZWNobyAnCTx0ciBjbGFzcz0iZW50cnktcm93IiBpZD0icGJfcm93aXRlbS0nIC4gJGl0ZW1faWQgLiAnIj4nOwoJCQlpZiAoIGNvdW50KCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddICkgPiAwICkgewoJCQkJZWNobycJPHRoIHNjb3BlPSJyb3ciIGNsYXNzPSJjaGVjay1jb2x1bW4iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXRlbXNbXSIgY2xhc3M9ImVudHJpZXMiIHZhbHVlPSInIC4gJGl0ZW1faWQgLiAnIj48L3RoPic7CgkJCX0KCQkJZWNobyAnCQk8dGQ+JzsKCQkJCgkJCWlmICggaXNfYXJyYXkoICRpdGVtWycwJ10gKSApIHsKCQkJCWlmICggJGl0ZW1bJzAnXVsxXSA9PSAnJyApIHsKCQkJCQllY2hvICcmbmJzcDsnOwoJCQkJfSBlbHNlIHsKCQkJCQllY2hvICRpdGVtWycwJ11bMV07CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAoICRpdGVtWycwJ10gPT0gJycgKSB7CgkJCQkJZWNobyAnJm5ic3A7JzsKCQkJCX0gZWxzZSB7CgkJCQkJZWNobyAkaXRlbVsnMCddOwoJCQkJfQoJCQl9CgkJCQoJCQllY2hvICcJCQk8ZGl2IGNsYXNzPSJyb3ctYWN0aW9ucyIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7Ij4nOyAvLyAgc3R5bGU9Im1hcmdpbjowOyBwYWRkaW5nOjA7IgoJCQkkaSA9IDA7CgkJCWZvcmVhY2ggKCAkc2V0dGluZ3NbJ2hvdmVyX2FjdGlvbnMnXSBhcyAkYWN0aW9uX3NsdWcgPT4gJGFjdGlvbl90aXRsZSApIHsgLy8gRGlzcGxheSBhbGwgaG92ZXIgYWN0aW9ucy4KCQkJCSRpKys7CgkJCQlpZiAoICRzZXR0aW5nc1snaG92ZXJfYWN0aW9uX2NvbHVtbl9rZXknXSAhPSAnJyApIHsKCQkJCQlpZiAoIGlzX2FycmF5KCAkaXRlbVskc2V0dGluZ3NbJ2hvdmVyX2FjdGlvbl9jb2x1bW5fa2V5J11dICkgKSB7CgkJCQkJCSRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlID0gJGl0ZW1bJHNldHRpbmdzWydob3Zlcl9hY3Rpb25fY29sdW1uX2tleSddXVswXTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkaG92ZXJfYWN0aW9uX2NvbHVtbl92YWx1ZSA9ICRpdGVtWyRzZXR0aW5nc1snaG92ZXJfYWN0aW9uX2NvbHVtbl9rZXknXV07CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkaG92ZXJfYWN0aW9uX2NvbHVtbl92YWx1ZSA9ICcnOwoJCQkJfQoJCQkJLy9lY2hvICdzbHVnOiAnIC4gJGFjdGlvbl9zbHVnOwoJCQkJaWYgKCBzdHJzdHIoICRhY3Rpb25fc2x1ZywgJy8nICkgPT09IGZhbHNlICkgeyAvLyBXb3JkIGhvdmVyIGFjdGlvbiBzbHVnLgoJCQkJCSRob3Zlcl9saW5rPSBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmJyAuICRhY3Rpb25fc2x1ZyAuICc9JyAuICRpdGVtX2lkIC4gJyZ2YWx1ZT0nIC4gJGhvdmVyX2FjdGlvbl9jb2x1bW5fdmFsdWU7CgkJCQl9IGVsc2UgeyAvLyBVUkwgaG92ZXIgYWN0aW9uIHNsdWcgc28ganVzdCBhcHBlbmQgdmFsdWUgdG8gVVJMLgoJCQkJCSRob3Zlcl9saW5rID0gJGFjdGlvbl9zbHVnIC4gJGhvdmVyX2FjdGlvbl9jb2x1bW5fdmFsdWU7CgkJCQl9CgoJCQkJLy8gU29tZSBob3N0J3MgZG9uJ3QgYWxsb3cgZ2V0IHBhcmFtcyB0aGF0IGVuZCBpbiAuemlwCgkJCQlpZiAoICcuemlwJyA9PSBzdWJzdHIoICRob3Zlcl9saW5rLCAtNCApICkgewoJCQkJCSRob3Zlcl9saW5rIC49ICcmYnViX3JhbmQ9JyAuIHJhbmQoIDEwMCwgOTk5ICk7CgkJCQl9CgkJCQkKCQkJCWVjaG8gJzxhIGhyZWY9IicgLiAkaG92ZXJfbGluayAuICciIGNsYXNzPSJwYl8nIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfaG92ZXJhY3Rpb25fJyAuICRhY3Rpb25fc2x1ZyAuICciIHJlbD0iJyAuICRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlIC4gJyI+JyAuICRhY3Rpb25fdGl0bGUgLiAnPC9hPic7CgkJCQlpZiAoICRpIDwgY291bnQoICRzZXR0aW5nc1snaG92ZXJfYWN0aW9ucyddICkgKSB7CgkJCQkJZWNobyAnIHwgJzsKCQkJCX0KCQkJfQoJCQllY2hvICcJCQk8L2Rpdj4KCQkJCQkJPC90ZD4nOwoJCQkKCQkJCgkJCWlmICggJHNldHRpbmdzWydyZW9yZGVyJ10gIT0gJycgKSB7CgkJCQkkY291bnQgPSBjb3VudCggJGl0ZW0gKSArIDE7IC8vIEV4dHJhIHJvdyBmb3IgcmVvcmRlcmluZy4KCQkJfSBlbHNlIHsKCQkJCSRjb3VudCA9IGNvdW50KCAkaXRlbSApOwoJCQl9CgkJCQoJCQkvLyBMT09QIFRIUk9VR0ggQ09MVU1OUyBGT1IgVEhJUyBST1cuCgkJCWZvciAoICRpID0gMTsgJGkgPCAkY291bnQ7ICRpKysgKSB7CgkJCQlpZiAoICEgaXNzZXQoICRpdGVtWyRpXSApICkgeyBjb250aW51ZTsgfSAvLyBUaGlzIHJvdyBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBpbmRleC1iYXNlZCBpdGVtLiAgSXQgaXMgcHJvYmFibHkgYSBuYW1lZCBrZXkgbm90IGZvciB1c2UgaW4gdGFibGU/CgkJCQllY2hvICc8dGQnOwoJCQkJaWYgKCAkc2V0dGluZ3NbJ3Jlb3JkZXInXSAhPSAnJyApIHsKCQkJCQlpZiAoICRpID09ICRzZXR0aW5nc1sncmVvcmRlciddICkgewoJCQkJCQllY2hvICcgY2xhc3M9InBiX2RyYWdoYW5kbGUiIGFsaWduPSJjZW50ZXIiJzsKCQkJCQl9CgkJCQl9CgkJCQllY2hvICc+JzsKCQkJCQoJCQkJaWYgKCAoICRzZXR0aW5nc1sncmVvcmRlciddICE9ICcnICkgJiYgKCAkaSA9PSAoICRzZXR0aW5nc1sncmVvcmRlciddICkgKSApIHsKCQkJCQllY2hvICc8aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9kcmFnaGFuZGxlLnBuZyIgYWx0PSJDbGljayBhbmQgZHJhZyB0byByZW9yZGVyIj4nOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoICRpdGVtWyRpXSA9PSAnJyApIHsKCQkJCQkJZWNobyAnJm5ic3A7JzsKCQkJCQl9IGVsc2UgewoJCQkJCQllY2hvICRpdGVtWyRpXTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCWVjaG8gJzwvdGQ+JzsKCQkJfQoKCQkJZWNobyAnCTwvdHI+JzsKCQl9CgoJCWVjaG8gJwk8L3Rib2R5Pic7CgkJZWNobyAnPC90YWJsZT4nOwoJCQoJCS8vIERpc3BsYXkgYnVsayBhY3Rpb25zIChib3R0b20pLgoJCWJ1bGtfYWN0aW9ucyggJHNldHRpbmdzLCB0cnVlICk7CgkJCgkJZWNobyAnPC9kaXY+JzsKCQlpZiAoICRzZXR0aW5nc1snYWN0aW9uJ10gIT0gJycgKSB7CgkJCWVjaG8gJzwvZm9ybT4nOwoJCX0KCX0gLy8gRW5kIGxpc3RfdGFibGUoKS4KCQoJCgkvKioKCSAqCXBiX2JhY2t1cGJ1ZGR5OjpnZXRfZmVlZCgpCgkgKgoJICoJR2V0cyBhbiBSU1Mgb3Igb3RoZXIgZmVlZCBhbmQgaW5zZXJ0cyBpdCBhcyBhIGxpc3Qgb2YgbGlua3MuLi4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJGZlZWQJCVVSTCB0byB0aGUgZmVlZC4KCSAqCUBwYXJhbQkJaW50CQkJJGxpbWl0CQlOdW1iZXIgb2YgaXRlbXMgdG8gcmV0cmlldmUuCgkgKglAcGFyYW0JCXN0cmluZwkJJGFwcGVuZAkJSFRNTCB0byBpbmNsdWRlIGluIHRoZSBsaXN0LiBTaG91bGQgdXN1YWxseSBiZSA8bGk+IGl0ZW1zIGluY2x1ZGluZyB0aGUgPGxpPiBjb2RlLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRyZXBsYWNlCVN0cmluZyB0byByZXBsYWNlIGluIGV2ZXJ5IHRpdGxlIHJldHVybmVkLiBpZSB0d2l0dGVyIGluY2x1ZGVzIHlvdXIgb3duIHVzZXJuYW1lIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lLgoJICoJQHJldHVybgkJc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmVlZCggJGZlZWQsICRsaW1pdCwgJGFwcGVuZCA9ICcnLCAkcmVwbGFjZSA9ICcnICkgewoJCSRyZXR1cm4gPSAnJzsKCQkKCQkkZmVlZF9odG1sID0gZ2V0X3RyYW5zaWVudCggbWQ1KCAkZmVlZCApICk7CgkJCgkJaWYgKCBmYWxzZSA9PT0gJGZlZWRfaHRtbCApIHsKCQkJJGZlZWRfaHRtbCA9ICcnOwoJCQlyZXF1aXJlX29uY2UoQUJTUEFUSC5XUElOQy4nL2ZlZWQucGhwJyk7ICAKCQkJJHJzcyA9IGZldGNoX2ZlZWQoICRmZWVkICk7CgkJCWlmICggaXNfd3BfZXJyb3IoICRyc3MgKSApIHsKCQkJCSRyZXR1cm4gLj0gJ3tUZW1wb3JhcmlseSB1bmFibGUgdG8gbG9hZCBmZWVkLn0nOwoJCQkJcmV0dXJuICRyZXR1cm47CgkJCX0KCQkJJG1heGl0ZW1zID0gJHJzcy0+Z2V0X2l0ZW1fcXVhbnRpdHkoICRsaW1pdCApOyAvLyBMaW1pdCAKCQkJJHJzc19pdGVtcyA9ICRyc3MtPmdldF9pdGVtcygwLCAkbWF4aXRlbXMpOyAKCQl9CgkJCgkJJHJldHVybiAuPSAnPHVsIGNsYXNzPSJwbHVnaW5idWRkeS1ub2RlY29yIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Ij4nOwoKCQkKCQlpZiAoICRmZWVkX2h0bWwgPT0gJycgKSB7CgkJCWZvcmVhY2ggKCAoYXJyYXkpICRyc3NfaXRlbXMgYXMgJGl0ZW0gKSB7CgkJCQkkZmVlZF9odG1sIC49ICc8bGkgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogbm9uZTsiPjxhIGhyZWY9IicgLiAkaXRlbS0+Z2V0X3Blcm1hbGluaygpIC4gJyIgdGFyZ2V0PSJfYmxhbmsiPic7CgkJCQkkdGl0bGUgPSAgJGl0ZW0tPmdldF90aXRsZSgpOyAvLywgRU5UX05PUVVPVEVTLCAnVVRGLTgnKTsKCQkJCWlmICggJHJlcGxhY2UgIT0gJycgKSB7CgkJCQkJJHRpdGxlID0gc3RyX3JlcGxhY2UoICRyZXBsYWNlLCAnJywgJHRpdGxlICk7CgkJCQl9CgkJCQlpZiAoIHN0cmxlbiggJHRpdGxlICkgPCAzMCApIHsKCQkJCQkkZmVlZF9odG1sIC49ICR0aXRsZTsKCQkJCX0gZWxzZSB7CgkJCQkJJGZlZWRfaHRtbCAuPSBzdWJzdHIoICR0aXRsZSwgMCwgMzIgKSAuICcgLi4uJzsKCQkJCX0KCQkJCSRmZWVkX2h0bWwgLj0gJzwvYT48L2xpPic7CgkJCX0KCQkJc2V0X3RyYW5zaWVudCggbWQ1KCAkZmVlZCApLCAkZmVlZF9odG1sLCAzMDAgKTsgLy8gZXhwaXJlcyBpbiAzMDBzZWNzIGFrYSA1bWluCgkJfSBlbHNlIHsKCQkJLy9lY2hvICdDQUNIRUQnOwoJCX0KCQkkcmV0dXJuIC49ICRmZWVkX2h0bWw7CgkJCgkJJHJldHVybiAuPSAkYXBwZW5kOwoJCSRyZXR1cm4gLj0gJzwvdWw+JzsKCQoJCQoJCXJldHVybiAkcmV0dXJuOwoJfSAvLyBFbmQgZ2V0X2ZlZWQoKS4KCQoJCgkKCS8qKgoJICoJcGJfYmFja3VwYnVkZHk6OnRpcCgpCgkgKgoJICoJRGlzcGxheXMgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIHdoZW4gdGhleSBob3ZlciBvdmVyIHRoZSBxdWVzdGlvbiBtYXJrLiBHcmFjZWZ1bGx5IGZhbGxzIGJhY2sgdG8gbm9ybWFsIHRvb2x0aXAuCgkgKglIVE1MIGlzIHN1cHBvc2VkIHdpdGhpbiB0b29sdGlwcy4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJCUFjdHVhbCBtZXNzYWdlIHRvIHNob3cgdG8gdXNlci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGl0bGUJCQlUaXRsZSBvZiBtZXNzYWdlIHRvIHNob3cgdG8gdXNlci4gVGhpcyBpcyBkaXNwbGF5ZWQgYXQgdG9wIG9mIHRpcCBpbiBiaWdnZXIgbGV0dGVycy4gRGVmYXVsdCBpcyBibGFuay4gKG9wdGlvbmFsKQoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNob190aXAJCVdoZXRoZXIgdG8gZWNobyB0aGUgdGlwIChkZWZhdWx0OyB0cnVlKSwgb3IgcmV0dXJuIHRoZSB0aXAgKGZhbHNlKS4gKG9wdGlvbmFsKQoJICoJQHJldHVybgkJc3RyaW5nL251bGwJCQkJCUlmIG5vdCBlY2hvaW5nIHRpcCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBlY2hvaW5nIHRoZXJlIGlzIG5vIHJldHVybi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRpcCggJG1lc3NhZ2UsICR0aXRsZSA9ICcnLCAkZWNob190aXAgPSB0cnVlICkgewoJCWlmICggJycgIT0gJHRpdGxlICkgewoJCQkkbWVzc2FnZSA9ICR0aXRsZSAuICcgLSAnIC4gJG1lc3NhZ2U7CgkJfQoJCSR0aXAgPSAnIDxhIGNsYXNzPSJwbHVnaW5idWRkeV90aXAiIHRpdGxlPSInIC4gJG1lc3NhZ2UgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV90aXAucG5nIiBhbHQ9Iig/KSIgLz48L2E+JzsKCQlpZiAoICRlY2hvX3RpcCA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkdGlwOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkdGlwOwoJCX0KCX0gLy8gRW5kIHRpcCgpLgoJCgkKCQoJLyoqCgkgKglwYl9iYWNrdXBidWRkeTo6YWxlcnQoKQoJICoKCSAqCURpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHdoZW4gaW4gdGhlIGRhc2hib2FyZC4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJCU1lc3NhZ2UgeW91IHdhbnQgdG8gZGlzcGxheSB0byB0aGUgdXNlci4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVycm9yCQkJT1BUSU9OQUwhIHRydWUgaW5kaWNhdGVzIHRoaXMgYWxlcnQgaXMgYW4gZXJyb3IgYW5kIGRpc3BsYXlzIGFzIHJlZC4gRGVmYXVsdDogZmFsc2UKCSAqCUBwYXJhbQkJaW50CQkJJGVycm9yX2NvZGUJCU9QVElPTkFMISBFcnJvciBjb2RlIG51bWJlciB0byB1c2UgaW4gbGlua2luZyBpbiB0aGUgd2lraSBmb3IgZWFzeSByZWZlcmVuY2UuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhbGVydCggJG1lc3NhZ2UsICRlcnJvciA9IGZhbHNlLCAkZXJyb3JfY29kZSA9ICcnLCAkcmVsX3RhZyA9ICcnLCAkbW9yZV9jc3MgPSAnJyApIHsKCQkkbG9nX2Vycm9yID0gZmFsc2U7CgoJCWVjaG8gJzxkaXYgaWQ9Im1lc3NhZ2UiIHN0eWxlPSInIC4gJG1vcmVfY3NzIC4gJyIgcmVsPSInIC4gJHJlbF90YWcgLiAnIiBjbGFzcz0icGJfYmFja3VwYnVkZHlfYWxlcnQgJzsKCQlpZiAoICRlcnJvciA9PT0gZmFsc2UgKSB7CgkJCWVjaG8gJ3VwZGF0ZWQgZmFkZSc7CgkJfSBlbHNlIHsKCQkJZWNobyAnZXJyb3InOwoJCQkkbG9nX2Vycm9yID0gdHJ1ZTsKCQl9CgkJaWYgKCAkZXJyb3JfY29kZSAhPSAnJyApIHsKCQkJJG1lc3NhZ2UgLj0gJyA8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vY29kZXgvcGFnZS9CYWNrdXBCdWRkeTpfRXJyb3JfQ29kZXMjJyAuICRlcnJvcl9jb2RlIC4gJyIgdGFyZ2V0PSJfYmxhbmsiPjxpPicgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICduYW1lJyApIC4gJyBFcnJvciBDb2RlICcgLiAkZXJyb3JfY29kZSAuICcgLSBDbGljayBmb3IgbW9yZSBkZXRhaWxzLjwvaT48L2E+JzsKCQkJJGxvZ19lcnJvciA9IHRydWU7CgkJfQoJCWlmICggJGxvZ19lcnJvciA9PT0gdHJ1ZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmxvZyggJG1lc3NhZ2UgLiAnIEVycm9yIENvZGU6ICcgLiAkZXJyb3JfY29kZSwgJ2Vycm9yJyApOwoJCX0KCQllY2hvICciID4nIC4gJG1lc3NhZ2UgLiAnPC9kaXY+JzsKCX0gLy8gRW5kIGFsZXJ0KCkuCgkKCQoJCgkvKioKCSAqCXBiX2JhY2t1cGJ1ZGR5OjpkaXNhbGVydCgpCgkgKgoJICoJRGlzcGxheXMgYSBESVNNSVNTQUJMRSBtZXNzYWdlIHRvIHRoZSB1c2VyIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2Ugd2hlbiBpbiB0aGUgZGFzaGJvYXJkLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbWVzc2FnZQkJTWVzc2FnZSB5b3Ugd2FudCB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLgoJICoJQHBhcmFtCQlib29sZWFuCQkkZXJyb3IJCQlPUFRJT05BTCEgdHJ1ZSBpbmRpY2F0ZXMgdGhpcyBhbGVydCBpcyBhbiBlcnJvciBhbmQgZGlzcGxheXMgYXMgcmVkLiBEZWZhdWx0OiBmYWxzZQoJICoJQHBhcmFtCQlpbnQJCQkkZXJyb3JfY29kZQkJT1BUSU9OQUwhIEVycm9yIGNvZGUgbnVtYmVyIHRvIHVzZSBpbiBsaW5raW5nIGluIHRoZSB3aWtpIGZvciBlYXN5IHJlZmVyZW5jZS4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpc2FsZXJ0KCAkdW5pcXVlX2lkLCAkbWVzc2FnZSwgJGVycm9yID0gZmFsc2UsICRtb3JlX2NzcyA9ICcnICkgewoJCQoJCWlmICggKCAnJyA9PSAkdW5pcXVlX2lkICkgfHwgKCAhIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FsZXJ0cyddWyR1bmlxdWVfaWRdICkgKSApIHsKCQkJJG1lc3NhZ2UgPSAnPGEgc3R5bGU9ImZsb2F0OiByaWdodDsiIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9kaXNhbGVydCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgdGl0bGU9IicgLiBfXyggJ0Rpc21pc3MgdGhpcyBhbGVydC4gVW5oaWRlIGRpc21pc3NlZCBhbGVydHMgb24gdGhlIFNldHRpbmdzIHBhZ2UuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiBhbHQ9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdkaXNhbGVydCcgKSAuICciPjxiPicgLiBfXyggJ0Rpc21pc3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2I+PC9hPjxkaXYgc3R5bGU9Im1hcmdpbi1yaWdodDogMTIwcHg7Ij4nIC4gJG1lc3NhZ2UgLiAnPC9kaXY+JzsKCQkJJHRoaXMtPmFsZXJ0KCAkbWVzc2FnZSwgJGVycm9yLCAnJywgJHVuaXF1ZV9pZCwgJG1vcmVfY3NzICk7CgkJfSBlbHNlIHsKCQkJZWNobyAnPCEtLSBQcmV2aW91c2x5IERpc21pc3NlZCBBbGVydDogYCcgLiBodG1sZW50aXRpZXMoICRtZXNzYWdlICkgLiAnYCAtLT4nOwoJCX0KCQkKCQlyZXR1cm47CgkJCgl9IC8vIEVuZCBhbGVydCgpLgoJCgkKCQoJLyoqCgkgKglwYl9iYWNrdXBidWRkeTo6dmlkZW8oKQoJICoKCSAqCURpc3BsYXlzIGEgWW91VHViZSB2aWRlbyB0byB0aGUgdXNlciB3aGVuIHRoZXkgaG92ZXIgb3ZlciB0aGUgcXVlc3Rpb24gdmlkZW8gbWFyay4KCSAqCUhUTUwgaXMgc3VwcG9zZWQgd2l0aGluIHRvb2x0aXBzLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmlkZW9fa2V5CQlZb3VUdWJlIHZpZGVvIGtleSBmcm9tIHRoZSBVUkwgP3Y9VklERU9fS0VZX0hFUkUgIC0tIFRvIGp1bXAgdG8gYSBjZXJ0YWluIHRpbWVzdGFtcCBhZGQgI1NFQ09ORFMgdG8gdGhlIGVuZCBvZiB0aGUga2V5LCB3aGVyZSBTRUNPTkRTIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbnRvIHRoZSB2aWRlbyB0byBzdGFydCBhdC4gRXhhbXBsZSB0byBzdGFydCA2NSBzZWNvbmRzIGludG8gYSB2aWRlbzogOVpIV0dqQnI4NHMjNjUuIFRoaXMgbXVzdCBiZSBpbiBzZWNvbmRzIGZvcm1hdC4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGl0bGUJCQlUaXRsZSBvZiBtZXNzYWdlIHRvIHNob3cgdG8gdXNlci4gVGhpcyBpcyBkaXNwbGF5ZWQgYXQgdG9wIG9mIHRpcCBpbiBiaWdnZXIgbGV0dGVycy4gRGVmYXVsdCBpcyBibGFuay4gKG9wdGlvbmFsKQoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNob190aXAJCVdoZXRoZXIgdG8gZWNobyB0aGUgdGlwIChkZWZhdWx0OyB0cnVlKSwgb3IgcmV0dXJuIHRoZSB0aXAgKGZhbHNlKS4gKG9wdGlvbmFsKQoJICoJQHJldHVybgkJc3RyaW5nL251bGwJCQkJCUlmIG5vdCBlY2hvaW5nIHRpcCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBlY2hvaW5nIHRoZXJlIGlzIG5vIHJldHVybi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUgPSAnJywgJGVjaG9fdGlwID0gdHJ1ZSApIHsKCQkKCQlzZWxmOjplbnF1ZXVlX3RoaWNrYm94KCk7CgkJCgkJaWYgKCBzdHJzdHIoICR2aWRlb19rZXksICcjJyApICkgewoJCQkkdmlkZW8gPSBleHBsb2RlKCAnIycsICR2aWRlb19rZXkgKTsKCQkJJHZpZGVvWzFdID0gJyZzdGFydD0nIC4gJHZpZGVvWzFdOwoJCX0gZWxzZSB7CgkJCSR2aWRlb1swXSA9ICR2aWRlb19rZXk7CgkJCSR2aWRlb1sxXSA9ICcnOwoJCX0KCQkKCQkkdGlwID0gJzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycgLiB1cmxlbmNvZGUoICR2aWRlb1swXSApIC4gJz9hdXRvcGxheT0xJyAuICR2aWRlb1sxXSAuICcmVEJfaWZyYW1lPTEmd2lkdGg9NjAwJmhlaWdodD00MDAiIGNsYXNzPSJ0aGlja2JveCBwbHVnaW5idWRkeV90aXAiIHRpdGxlPSJWaWRlbyBUdXRvcmlhbCAtICcgLiAkdGl0bGUgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV9wbGF5LnBuZyIgYWx0PSIodmlkZW8pIiAvPjwvYT4nOwoJCWlmICggJGVjaG9fdGlwID09PSB0cnVlICkgewoJCQllY2hvICR0aXA7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICR0aXA7CgkJfQoJfSAvLyBFbmQgdmlkZW8oKS4KCQoJCgkKCS8qKgoJICogcGJfYmFja3VwYnVkZHk6OmVucXVldWVfdGhpY2tib3goKQoJICoKCSAqIEVucXVldWVzIHRoZSByZXF1aXJlZCBzY3JpcHRzIC8gc3R5bGVzIG5lZWRlZCB0byB1c2UgdGhpY2tib3gKCSAqCgkgKiBAcmV0dXJuIG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVucXVldWVfdGhpY2tib3goKSB7CgoJCWlmICggIWRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQkJZ2xvYmFsICR3cF9zY3JpcHRzOwoJCQlpZiAoIGlzX29iamVjdCggJHdwX3NjcmlwdHMgKSApIHsKCQkJCWlmICggIWluX2FycmF5KCAndGhpY2tib3gnLCAkd3Bfc2NyaXB0cy0+ZG9uZSApICkgewoJCQkJCXdwX2VucXVldWVfc2NyaXB0KCAndGhpY2tib3gnICk7CgkJCQkJd3BfcHJpbnRfc2NyaXB0cyggJ3RoaWNrYm94JyApOwoJCQkJCXdwX3ByaW50X3N0eWxlcyggJ3RoaWNrYm94JyApOwoJCQkJfQoJCQl9CgkJfQoJfSAvLyBFbmQgZW5xdWV1ZV90aGlja2JveCgpLgoJCgkKCQoJLyoJc3RhcnRfdGFicygpCgkgKgkKCSAqCVN0YXJ0cyBhIHRhYmJlZCBpbnRlcmZhY2UuCiAJICoJQHNlZSBlbmRfdGFicygpLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJGludGVyZmFjZV90YWcJCVRhZy9zbHVnIGZvciB0aGlzIGVudGlyZSB0YWJiZWQgaW50ZXJmYWNlLiBTaG91bGQgYmUgdW5pcXVlLgoJICoJQHBhcmFtCQlhcnJheQkJJHRhYnMJCQkJQXJyYXkgY29udGFpbmluZyBhbiBhcnJheSBvZiBzZXR0aW5ncyBmb3IgdGhpcyB0YWJiZWQgaW50ZXJmYWNlLiBFeDogIGFycmF5KCBhcnJheSggJ3RpdGxlJz4gJ215IHRpdGxlJywgJ3NsdWcnID0+ICdteXRhYnMnICkgKTsKCSAqCQkJCQkJCQkJCQkJT3B0aW9uYWwgc2V0dGluZyB3aXRoIGtleSBgYWpheF91cmxgIG1heSBkZWZpbmUgYSBVUkwgZm9yIEFKQVggbG9hZGluZy4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkY3NzCQkJCUFkZGl0aW9uYWwgQ1NTIHRvIGFwcGx5IHRvIG1haW4gb3V0ZXIgZGl2LiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWludAkJCSRhY3RpdmVfdGFiX2luZGV4CVRhYiB0byBzdGFydCBhcyBhY3RpdmUvc2VsZWN0ZWQuCgkgKglAcmV0dXJuCQludWxsL3N0cmluZwkJCQkJCW51bGwgaWYgJGVjaG8gPSBmYWxzZSwgYWxsIGRhdGEgb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RhcnRfdGFicyggJGludGVyZmFjZV90YWcsICR0YWJzLCAkY3NzID0gJycsICRlY2hvID0gdHJ1ZSwgJGFjdGl2ZV90YWJfaW5kZXggPSAwICkgewoJCSR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgPSAkaW50ZXJmYWNlX3RhZzsKCQkKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdwYl90YWJzLmpzJywgdHJ1ZSApOwoJCQoJCSRwcmVmaXggPSAncGJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXyc7IC8vIHBiX1BMVUdJTlNMVUdfCgkJJHJldHVybiA9ICcnOwoJCQoJCS8qCgkJJHJldHVybiAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPic7CgkJJHJldHVybiAuPSAnCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7JzsKCQkkcmV0dXJuIC49ICcJCWpRdWVyeSgiIycgLiAkcHJlZml4IC4gJHRoaXMtPl90YWJfaW50ZXJmYWNlX3RhZyAuICdfdGFicyIpLnRhYnMoeyBhY3RpdmU6ICcgLiAkYWN0aXZlX3RhYl9pbmRleCAuICcgfSk7JzsKCQkkcmV0dXJuIC49ICcJfSk7JzsKCQkkcmV0dXJuIC49ICc8L3NjcmlwdD4nOwoJCSovCgkJCgkJJHJldHVybiAuPSAnPGRpdiBjbGFzcz0iYmFja3VwYnVkZHktdGFicy13cmFwIj4nOwoJCQoJCQoJCSRyZXR1cm4gLj0gJzxoMiBjbGFzcz0ibmF2LXRhYi13cmFwcGVyIj4nOwoJCSRpID0gMDsKCQlmb3JlYWNoKCAkdGFicyBhcyAkdGFiICkgewoJCQlpZiAoICEgaXNzZXQoICR0YWJbJ2NzcyddICkgKSB7CgkJCQkkdGFiWydjc3MnXSA9ICcnOwoJCQl9CgkJCSRhY3RpdmVfdGFiX2NsYXNzID0gJyc7CgkJCWlmICggJGFjdGl2ZV90YWJfaW5kZXggPT0gJGkgKSB7CgkJCQkkYWN0aXZlX3RhYl9jbGFzcyA9ICduYXYtdGFiLWFjdGl2ZSc7CgkJCX0KCQkJaWYgKCBpc3NldCggJHRhYlsnYWpheCddICkgJiYgKCAkdGFiWydhamF4X3VybCddICE9ICcnICkgKSB7IC8vIEFKQVggdGFiLgoJCQkJJHJldHVybiAuPSAnPGEgY2xhc3M9Im5hdi10YWIgbmF2LXRhYi0nIC4gJGkgLiAnICcgLiAkYWN0aXZlX3RhYl9jbGFzcyAuICcgYmItdGFiLScgLiAkdGFiWydzbHVnJ10gLiAnIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtYWpheD0iJyAuICR0YWJbJ2FqYXhfdXJsJ10gLiAnIj4nIC4gJHRhYlsndGl0bGUnXSAuICc8L2E+JzsKCQkJfSBlbHNlaWYgKCBpc3NldCggJHRhYlsndXJsJ10gKSAmJiAoICR0YWJbJ3VybCddICE9ICcnICkgKSB7CgkJCQkkcmV0dXJuIC49ICc8YSBjbGFzcz0ibmF2LXRhYiBuYXYtdGFiLScgLiAkaSAuICcgJyAuICRhY3RpdmVfdGFiX2NsYXNzIC4gJyBiYi10YWItJyAuICR0YWJbJ3NsdWcnXSAuICciIGhyZWY9IicgLiAkdGFiWyd1cmwnXSAuICciPicgLiAkdGFiWyd0aXRsZSddIC4gJzwvYT4nOwoJCQl9IGVsc2UgeyAvLyBTdGFuZGFyZDsgTk8gQUpBWC4KCQkJCSRyZXR1cm4gLj0gJzxhIGNsYXNzPSJuYXYtdGFiIG5hdi10YWItJyAuICRpIC4gJyAnIC4gJGFjdGl2ZV90YWJfY2xhc3MgLiAnIGJiLXRhYi0nIC4gJHRhYlsnc2x1ZyddIC4gJyIgc3R5bGU9IicgLiAkdGFiWydjc3MnXSAuICciIGhyZWY9IiMnIC4gJHByZWZpeCAuICR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgLiAnX3RhYl8nIC4gJHRhYlsnc2x1ZyddIC4gJyI+JyAuICR0YWJbJ3RpdGxlJ10gLiAnPC9hPic7CgkJCX0KCQkJJGkrKzsKCQl9CgkJJHJldHVybiAuPSAnPC9oMj4nOwoJCQoJCQoJCS8qCgkJJHJldHVybiAuPSAnPGRpdiBpZD0iJyAuICRwcmVmaXggLiAkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnIC4gJ190YWJzIiBzdHlsZT0iJyAuICRjc3MgLiAnIj4nOwoJCSRyZXR1cm4gLj0gJzx1bD4nOwoJCWZvcmVhY2goICR0YWJzIGFzICR0YWIgKSB7CgkJCWlmICggISBpc3NldCggJHRhYlsnY3NzJ10gKSApIHsKCQkJCSR0YWJbJ2NzcyddID0gJyc7CgkJCX0KCQkJaWYgKCBpc3NldCggJHRhYlsnYWpheCddICkgJiYgKCAkdGFiWydhamF4X3VybCddICE9ICcnICkgKSB7IC8vIEFKQVggdGFiLgoJCQkJJHJldHVybiAuPSAnPGxpPjxhIGhyZWY9IicgLiAkdGFiWydhamF4X3VybCddIC4gJyI+PHNwYW4+JyAuICR0YWJbJ3RpdGxlJ10gLiAnPC9zcGFuPjwvYT48L2xpPic7CgkJCX0gZWxzZSB7IC8vIFN0YW5kYXJkOyBOTyBBSkFYLgoJCQkJJHJldHVybiAuPSAnPGxpIHN0eWxlPSInIC4gJHRhYlsnY3NzJ10gLiAnIj48YSBocmVmPSIjJyAuICRwcmVmaXggLiAkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnIC4gJ190YWJfJyAuICR0YWJbJ3NsdWcnXSAuICciPjxzcGFuPicgLiAkdGFiWyd0aXRsZSddIC4gJzwvc3Bhbj48L2E+PC9saT4nOwoJCQl9CgkJfQoJCSRyZXR1cm4gLj0gJzwvdWw+JzsKCQkkcmV0dXJuIC49ICc8YnI+JzsKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJ0YWJzLWJvcmRlcndyYXAiPic7CgkJKi8KCQkKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJiYWNrdXBidWRkeS10YWItYmxvY2tzIj4nOwoJCQoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJldHVybjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJCgl9IC8vIEVuZCBzdGFydF90YWJzKCkuCgkKCQoJCgkvKgllbmRfdGFicygpCgkgKgkKCSAqCUNsb3NlcyBvZmYgYSB0YWJiZWQgaW50ZXJmYWNlLgoJICoJQHNlZSBzdGFydF90YWJzKCkuCgkgKgkKCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVjaG8JCQkJRWNobyBvdXRwdXQgaW5zdGVhZCBvZiByZXR1cm5pbmcuICAob3B0aW9uYWwpCgkgKglAcmV0dXJuCQludWxsL3N0cmluZwkJCQkJCW51bGwgaWYgJGVjaG8gPSBmYWxzZSwgYWxsIGRhdGEgb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZW5kX3RhYnMoICRlY2hvID0gdHJ1ZSApIHsKCQkKCQkvKgoJCSRyZXR1cm4gPSAnJzsKCQkkcmV0dXJuIC49ICcJPC9kaXY+JzsKCQkkcmV0dXJuIC49ICc8L2Rpdj4nOwoJCSovCgkJJHJldHVybiA9ICc8L2Rpdj48L2Rpdj4nOwoJCQoJCSR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgPSAnJzsKCQkKCQlpZiAoICRlY2hvID09PSB0cnVlICkgewoJCQllY2hvICRyZXR1cm47CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXR1cm47CgkJfQoJCQoJfSAvLyBFbmQgZW5kX3RhYnMoKS4KCQoJCgkKCS8qCXN0YXJ0X3RhYigpCgkgKgkKCSAqCU9wZW5zIHRoZSBzdGFydCBvZiBhbiBpbmRpdmlkdWFsIHBhZ2UgdG8gYmUgbG9hZGVkIGJ5IGEgdGFiLgoJICoJQHNlZSBlbmRfdGFiKCkuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFiX3RhZwkJCVVuaXF1ZSB0YWcgZm9yIHRoaXMgdGFiIHNlY3Rpb24uIE11c3QgbWF0Y2ggdGhlIHRhZyBkZWZpbmVkIHdoZW4gY3JlYXRpbmcgdGhlIHRhYiBpbnRlcmZhY2UuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKG9wdGlvbmFsKQoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0X3RhYiggJHRhYl90YWcsICRlY2hvID0gdHJ1ZSApIHsKCQkKCQkkcHJlZml4ID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nOyAvLyBwYl9QTFVHSU5TTFVHXwoJCSRyZXR1cm4gPSAnJzsKCQkKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJiYWNrdXBidWRkeS10YWIiIGlkPSInIC4gJHByZWZpeCAuICR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgLiAnX3RhYl8nIC4gJHRhYl90YWcgLiAnIj4nOwoJCQoJCQoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJldHVybjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJCgl9IC8vIEVuZCBzdGFydF90YWIoKS4KCQoJCgkKCS8qCWVuZF90YWIoKQoJICoJCgkgKglDbG9zZXMgdGhpcyB0YWIgc2VjdGlvbi4KCSAqCUBzZWUgc3RhcnRfdGFiKCkuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFiX3RhZwkJCVVuaXF1ZSB0YWcgZm9yIHRoaXMgdGFiIHNlY3Rpb24uIE11c3QgbWF0Y2ggdGhlIHRhZyBkZWZpbmVkIHdoZW4gY3JlYXRpbmcgdGhlIHRhYiBpbnRlcmZhY2UuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKG9wdGlvbmFsKQoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVuZF90YWIoICRlY2hvID0gdHJ1ZSApIHsKCQkKCQkkcmV0dXJuID0gJzwvZGl2Pic7CgkJCgkJCgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQkKCX0gLy8gRW5kIGVuZF90YWIoKS4KCQoJCgkKCS8qCWFqYXhfaGVhZGVyKCkKCSAqCQoJICoJT3V0cHV0IEhUTUwgaGVhZGVycyB3aGVuIHVzaW5nIEFKQVguCgkgKgkKCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGpzCQkJV2hldGhlciBvciBub3QgdG8gbG9hZCBqYXZhc2NyaXB0LiBEZWZhdWx0IGZhbHNlLgoJICoJQHBhcmFtCQlib29sCQkkcGFkZGluZwlXaGV0aGVyIG9yIG5vdCB0byBwYWRkIHdyYXBwZXIgZGl2LiBEZWZhdWx0IGhhcyBwYWRkaW5nLgoJICoJQHJldHVybgkJCgkgKi8KCWZ1bmN0aW9uIGFqYXhfaGVhZGVyKCAkanMgPSB0cnVlLCAkcGFkZGluZyA9IHRydWUgKSB7CgkJZWNobyAnPGhlYWQ+JzsKCQllY2hvICc8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4nOwoJCWVjaG8gJzx0aXRsZT5QbHVnaW5CdWRkeTwvdGl0bGU+JzsKCQkKCQl3cF9wcmludF9zdHlsZXMoICd3cC1hZG1pbicgKTsKCQl3cF9wcmludF9zdHlsZXMoICdkYXNoaWNvbnMnICk7CgkJd3BfcHJpbnRfc3R5bGVzKCAnYnV0dG9ucycgKTsKCQl3cF9wcmludF9zdHlsZXMoICdjb2xvcnMnICk7CgkJCgkJaWYgKCAkanMgPT09IHRydWUgKSB7CgkJCXdwX2VucXVldWVfc2NyaXB0KCAnanF1ZXJ5JyApOwoJCQl3cF9wcmludF9zY3JpcHRzKCAnanF1ZXJ5JyApOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ3dwLWFkbWluLmNzcycgKTsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ3RoaWNrYm94ZWQuY3NzJyApOwoJCQoJCS8vZWNobyAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgLiAnL2Nzcy9hZG1pbi5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPic7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnYWRtaW4uanMnLCB0cnVlICk7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnICk7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnanF1ZXJ5LXVpLXRvb2x0aXAnLCBmYWxzZSApOwoJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnalF1ZXJ5LXVpLTEuMTEuMi5jc3MnLCB0cnVlICk7CgkJCgkJZWNobyAnPGJvZHkgY2xhc3M9IndwLWNvcmUtdWkiIHN0eWxlPSJiYWNrZ3JvdW5kOiBpbmhlcml0OyI+JzsKCQlpZiAoICRwYWRkaW5nID09PSB0cnVlICkgewoJCQllY2hvICc8ZGl2IGNsYXNzPSJiYi1pZnJhbWUtZGl2cGFkZGluZy1ub3Njcm9sbCIgc3R5bGU9InBhZGRpbmc6IDEycHg7IHBhZGRpbmctbGVmdDogMjBweDsgcGFkZGluZy1yaWdodDogMjBweDsgb3ZlcmZsb3c6IHNjcm9sbDsiPic7CgkJfSBlbHNlIHsKCQkJZWNobyAnPGRpdj4nOwoJCX0KCQkKCX0gLy8gRW5kIGFqYXhfaGVhZGVyKCkuCgkKCQoJZnVuY3Rpb24gYWpheF9mb290ZXIoICRqc19jb21tb24gPSB0cnVlICkgewoJCWVjaG8gJzwvYm9keT4nOwoJCWVjaG8gJzwvZGl2Pic7CgkJZWNobyAnPC9oZWFkPic7CgkJCgkJaWYgKCB0cnVlID09PSAkanNfY29tbW9uICkgewoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdjb21tb24nICk7IC8vIE5lZWRlZCBmb3IgdGFibGUgJ3NlbGVjdCBhbGwnIGZlYXR1cmUuCgkJfQoJCQoJCWVjaG8gJzwvaHRtbD4nOwoJfSAvLyBFbmQgYWpheF9mb290ZXIoKS4KCQoJCgkKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHlfdWkuCgo= ###PACKDATA,FILE_END,/pluginbuddy/classes/ui.php,importbuddy/pluginbuddy/classes/ui.php ###PACKDATA,FILE_START,/pluginbuddy/css/index.php,importbuddy/pluginbuddy/css/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/pluginbuddy/css/index.php,importbuddy/pluginbuddy/css/index.php ###PACKDATA,FILE_START,/pluginbuddy/css/jQuery-ui-1.11.2.css,importbuddy/pluginbuddy/css/jQuery-ui-1.11.2.css LnVpLXRvb2x0aXAgewoJcGFkZGluZzogOHB4OwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTsKCW1heC13aWR0aDogMzAwcHg7Cgktd2Via2l0LWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsKCWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsKCXdvcmQtd3JhcDogYnJlYWstd29yZDsKfQpib2R5IC51aS10b29sdGlwIHsKCWJvcmRlci13aWR0aDogMnB4Owp9Ci51aS13aWRnZXQgewoJcGFkZGluZzogMTBweDsKCWxpbmUtaGVpZ2h0OiAxLjZlbTsKfQoudWktd2lkZ2V0IC51aS13aWRnZXQgewoJZm9udC1zaXplOiAxZW07Cn0KLnVpLXdpZGdldC1jb250ZW50IHsKCWJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7CgliYWNrZ3JvdW5kOiAjZmZmZmZmOwoJY29sb3I6ICMyMjIyMjI7Cn0K ###PACKDATA,FILE_END,/pluginbuddy/css/jQuery-ui-1.11.2.css,importbuddy/pluginbuddy/css/jQuery-ui-1.11.2.css ###PACKDATA,FILE_START,/pluginbuddy/css/jquery.miniColors.css,importbuddy/pluginbuddy/css/jquery.miniColors.css Lm1pbmlDb2xvcnMtdHJpZ2dlciB7CgloZWlnaHQ6IDIycHg7Cgl3aWR0aDogMjJweDsKCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgltYXJnaW46IDAgLjI1ZW07CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CglvdXRsaW5lOiBub25lOwp9CgoubWluaUNvbG9ycy1zZWxlY3RvciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl3aWR0aDogMTc1cHg7CgloZWlnaHQ6IDE1MHB4OwoJYmFja2dyb3VuZDogI0ZGRjsKCWJvcmRlcjogc29saWQgMXB4ICNCQkI7CgktbW96LWJveC1zaGFkb3c6IDAgMCA2cHggcmdiYSgwLCAwLCAwLCAuMjUpOwoJLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IHJnYmEoMCwgMCwgMCwgLjI1KTsKCWJveC1zaGFkb3c6IDAgMCA2cHggcmdiYSgwLCAwLCAwLCAuMjUpOwoJLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKCWJvcmRlci1yYWRpdXM6IDVweDsKCXBhZGRpbmc6IDVweDsKCXotaW5kZXg6IDk5OTk5OTsKfQoKLm1pbmlDb2xvcnMtc2VsZWN0b3IuYmxhY2sgewoJYmFja2dyb3VuZDogIzAwMDsKCWJvcmRlci1jb2xvcjogIzAwMDsKfQoKLm1pbmlDb2xvcnMtY29sb3JzIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNXB4OwoJbGVmdDogNXB4OwoJd2lkdGg6IDE1MHB4OwoJaGVpZ2h0OiAxNTBweDsKCWN1cnNvcjogY3Jvc3NoYWlyOwp9CgoubWluaUNvbG9ycy1odWVzIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNXB4OwoJbGVmdDogMTYwcHg7Cgl3aWR0aDogMjBweDsKCWhlaWdodDogMTUwcHg7CgljdXJzb3I6IGNyb3NzaGFpcjsKfQoKLm1pbmlDb2xvcnMtY29sb3JQaWNrZXIgewoJcG9zaXRpb246IGFic29sdXRlOwoJd2lkdGg6IDExcHg7CgloZWlnaHQ6IDExcHg7Cn0KCi5taW5pQ29sb3JzLWh1ZVBpY2tlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglsZWZ0OiAtM3B4OwoJd2lkdGg6IDI2cHg7CgloZWlnaHQ6IDNweDsKfQ== ###PACKDATA,FILE_END,/pluginbuddy/css/jquery.miniColors.css,importbuddy/pluginbuddy/css/jquery.miniColors.css ###PACKDATA,FILE_START,/pluginbuddy/images/draghandle.png,importbuddy/pluginbuddy/images/draghandle.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9oHHRIvI8D7+LoAAALwSURBVDjLrZTNa11FGMZ/78ycnPvVNG3QlqTxkiuYxaUFQVMoLqqCilD6H0gFF4W4EbdduHDbnbisIIiCtOBKs9GNVKziouoiFmOTtOKtJNE093tmXhdzqpeeuNJZznmf33mfmXceUVUmlgEqwHGgBZwo9u8A68BvwACIDwRuQixADhwDTgLL71/ffArglTOPfQvUAZ2AKID76t3XFARjLa46TX12num5JdbvZ3xysw5Ay996oXVozN6va3S37+L7e8QQAMUpwpln22ArkB+F2gK7oymufOfxhb0rtxpcfskxd+Iw9LZguANhwPUvfsTFKCCGzz/9gaMLS9SPVXlnbYbtXva3t+2e8tZqj9eX/qDb6bCztcZzLz5BjIIJGECwLqN9foXVYZvb3YyH1+1uxuqwTfv8CtZlgBAwmKAGUNSPALh4dpGrK6dLgKsrp7l4dhGgqFWCGpxXAxrxox4+KlZApKRHVVGFoIof9ZJGDc5JBDG4qRrOCHKQGhARREAU3FQtaST+Dx1EbHEGY3xQMGBMmRAVYlR8TLWgRCzOR5tm2GgCAO6ADqImsQ+KManOR4vrDCsAVOs5Wzt9arnlUMWVAHt9z/2BpzcMVOs5AJ1h5cEcgLGOUYioKj7EEsAX30YhYmz6QcBgxlEAwU1VCitC0LKFoP+cTaoVxlFwXtMoZ9U6QdKT/LcOBDACtloHMXgVjBMFjYz7XaKmN+qsKQGcNWhxG+N+FzTiRP97BwmAYLOcKMKHX9/hxi+7JcAbH33P8uIRXj51HJvlgCQLCaBoDMysX+PCwiat6VACtKYDFxY2mVm/hsYUJl4FFxTQyMkn5yFvQK3BpdmMNz/z7PaT+EgVLj2fM5sbmGnA3DyEAUHBRRXe/vhPrN2n0RjwyKNjms0m55qGD9bStZ1rKj9tDtnY2OD3e/fY398nhAAIMpHKMpHIp4Dl977ceBrg1Wea3wA3gJsPh6ocEOvVIpkfB+aL/bvAz0AH6E/G+l/J23lk4gYAJAAAAABJRU5ErkJggg== ###PACKDATA,FILE_END,/pluginbuddy/images/draghandle.png,importbuddy/pluginbuddy/images/draghandle.png ###PACKDATA,FILE_START,/pluginbuddy/images/email.png,importbuddy/pluginbuddy/images/email.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAITSURBVBgZpcHLThNhGIDh9/vn7/RApwc5VCmFWBPi1mvwAlx7BW69Afeu3bozcSE7E02ILjCRhRrds8AEbKVS2gIdSjvTmf+TYqLu+zyiqszDMCf75PnnnVwhuNcLpwsXk8Q4BYeSOsWpkqrinJI6JXVK6lSRdDq9PO+19vb37XK13Hj0YLMUTVVyWY//Cf8IVwQEGEeJN47S1YdPo4npDpNmnDh5udOh1YsZRcph39EaONpnjs65oxsqvZEyTaHdj3n2psPpKDLBcuOOGUWpZDOG+q0S7751ObuYUisJGQ98T/Ct4Fuo5IX+MGZr95jKjRKLlSxXxFxOEmaaN4us1Upsf+1yGk5ZKhp8C74H5ZwwCGO2drssLZZo1ouIcs2MJikz1oPmapHlaoFXH1oMwphyTghyQj+MefG+RblcoLlaJG/5y4zGCTMikEwTctaxXq/w9kuXdm9Cuzfh9acujXqFwE8xmuBb/hCwl1GKAnGccDwIadQCfD9DZ5Dj494QA2w2qtQW84wmMZ1eyFI1QBVQwV5GiaZOpdsPaSwH5HMZULi9UmB9pYAAouBQbMHHrgQcnQwZV/KgTu1o8PMgipONu2t5KeaNiEkxgAiICDMCCFeEK5aNauAOfoXx8KR9ZOOLk8P7j7er2WBhwWY9sdbDeIJnwBjBWBBAhGsCmiZxPD4/7Z98b/0QVWUehjkZ5vQb/Un5e/DIsVsAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/pluginbuddy/images/email.png,importbuddy/pluginbuddy/images/email.png ###PACKDATA,FILE_START,/pluginbuddy/images/feed.png,importbuddy/pluginbuddy/images/feed.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJFSURBVBgZBcHda5V1AADg5/d733Oc7tjOaNs5GC6KdrEwmpPRxG7spoKghOim7oK8y0MIEQRL+geGEIQ3UXQvSJ8IafZxUbjQhRDZoU60iYsSc9t5v87b84TsVe3mrBWpHoCICIAIACixYTUfOJM2Z62YO97TOULSIKaEQAyESAzEgISAgLpi48de87MLUqmezhGyhO4SCW7f4O81YiSJiCQIkbqmNcXMIjMXeilIGsQxDp8AnKDY5teL3PyU6h4CdY3Av7cYu58R0QghZWeT9fP0v2V7i8Y4j77As2c5sAwIFAXDgjInJxURAzub/PwxMZBGphZYeIWJWZ44xdo5bl4kK8kzioohUUREd4kXP+Kpd3nkee72+epNBleAxdfoLJBlDEuKkpxoBAkBjXGm53n8ZZ45S/shrr7P75eBo6eo9zAsKCqGRBEB/1zj89e5eo7tLRr7ePJtWg9wZZV7t2i2OPQcw5JiRE4UESN1ZPc2g0tceos/LtPYx9HTaPDNe8Dhl9gtyStyUiMIJDXLp2m0GHzN2gdMzdPq0F3k+pcc/4+x/UwepKzIiSDWTB/iwBLT8xw8xt07rJ8HHj7GbkX/B+DBxyhrciIQ2N2i2AG2fiPL+OsXoNVlWPDnDaC5l6qiJJWjLlHxxRs0JhhcIyvp/8SHJylKdiu++4Tr31NW7B8nkrwzp627d9nkHM0Wsea+GSY6tDvESEyY6TIxyZ4GSUp/nTubqyF7WrvZtaKrZ4QSQ+TIMUSJHCVypGhaHW448z+h1tLAgvKk7gAAAABJRU5ErkJggg== ###PACKDATA,FILE_END,/pluginbuddy/images/feed.png,importbuddy/pluginbuddy/images/feed.png ###PACKDATA,FILE_START,/pluginbuddy/images/index.php,importbuddy/pluginbuddy/images/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/pluginbuddy/images/index.php,importbuddy/pluginbuddy/images/index.php ###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy.png,importbuddy/pluginbuddy/images/pluginbuddy.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAktJREFUeNp0k01IVFEUx3/3vfvmzTjKmKNp2ARiioG4C8IWJURE5EYXgxu3UotqVcvAtlG0cVGk0FLBoE3QStpUCy2SCgwiUJNxPswZdb7ee6fFvBmdyf5w4Z57Pvif/7lHxeNxG2gFwoDBIYR6qCN3DzgAdjQQmbn7aikcLA0oKyYgCIJtK0Q1AQoleYpFF4UCFFJeV4WS3ph6PH5eA6GAdrvNjjuY7bcUCEoJu04nq5s/EYRzXTHa7Z1Ksijc9HOC249OA03ap61E97jK7jerHGeXU8wuRxGBsUGP6ZGBWh9i9bqACRi62q9Isa7hJx9/s57LA5BaCXD/YhfhgC+DV6jF1UTTZr1ikdDh3bYgZB1qaB6JNRo1/vWnjACzo71MDEa50dfK/HgfSlV8jfPQDaPi5ustVjNphmPN9LdVaDxb2WZs4QdDbVHeTJ6pi9eNZEZ6DN5tlln4toOhMr5AirBV8VUejLosAXDLWRMnyb3hIHPXbZq1hSfgCQSNADNXQ9wbDoGTxHOy1QqigVKhpLetxMOWYmYOiwLXYovO2VZXf06GAaG7ZZ8L7XnXW7tilr0AlDdUvmglgIIGcpupyNypaHZCJG0pxH3/YWp+L/fgNvSeAIUqbOx8fTv9NDKQjQvKVCpY3kq3LAJ7Kh6Pm0CTvwsm4AAdS0OTSwmnIwrQqZPpy19eXgJSvm4usA8cVI2cf2qjT5Y6bUyn8pFKJwPAHpBonJrB8TgIeplPVSMgu9/97fsH+j8FsqNrL8aBZt/eB3aPC/w7AI6b1V5KLAy/AAAAAElFTkSuQmCC ###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy.png,importbuddy/pluginbuddy/images/pluginbuddy.png ###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy_play.png,importbuddy/pluginbuddy/images/pluginbuddy_play.png iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAB7klEQVR42oWRT4gSURzHZ9u9tKmHos4WBB0VscPSEuEloot2yEsHIRE8hEIHQbBUEFSQQVBQ0EMHRRAvoh78OySMBMqSYKh7URDZg6mYLrK6r28DbjPTxn7gc3nz+7z3Zoa6jmq1+gi+hK/hE3iLuolisfgC0t9At9v90e/3u01QKpVqhULhzX/DXC5nZBiGnc1mUyJitVr9ajQazXQ6/RGjwltkMpnn5XK5sdlsLnbBdrslfC4BNjiJRCLvkexfxYlEIjCZTH7yh7PZLFksFuIbnKdSKUYul9/nwlgs9gDXYYmIaDRK4vE4GY/HgvVarfbdaDS+RXpAhUKh40ql0hbHwWCQ+P1+EggESLv993Gr1To1mUyfEEspDBzl8/l/Yq/XS1wuFyc2v1pnWfZUr9d7EN+j3G63FLvXLwE/djqdxOFwcKfySSaTLbVa/YGL/2Cz2T73er0z/pDP5yODwUAQjkajqcFgyCHRwDtcbLFYFDipPp/Pz3eDy+VSEK7X6wu8CotT/UgeC34XvuA7u91e73Q6Z0TEcDicejyehkaj+YLRZ1ACBezpdLojfAzabDYzNE03w+HwidVq/arVarMKhcKHmWN4F+5BMdzioUQikatUKp1SqTTIZLJXWHsKH0LpLryJfXgbHsKD66Lfk7TS2QhfFGsAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy_play.png,importbuddy/pluginbuddy/images/pluginbuddy_play.png ###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy_tip.png,importbuddy/pluginbuddy/images/pluginbuddy_tip.png iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAB/ElEQVR42n2RPYgaQRiG585rclGLhKQ2gYOUipjiyBGCTQhpNEVsrhAigsWhkEKwSEQQjCBroSBiYQpFEBv/Cn+XCLsElOMCBvUaFYWARoXgKSc3eVlQ9jY/LzwwzHzPzDczJJPJCOTzeVIqlQRqtdpj8BK8Bk/AfrFYJOl0mogjlV8A5ivS6XS+93q9ThMpl8t1yG/+J1tYluXm8/mMSrJcLn/xPN+E/B7KvlR+XqlU+M1mc03/kRsEG5xHIpF30GSCHIvFSCKRCEyn05/bwsFgQLPZLI3H4xQ3EHdwlUqlWJVK9WArP0Q7HBUll8sJTCYTGo1G6Xg83q3V6/ULi8XyFuoBCYVCJ9Vq9ZtYXq1WdDgcChsEg0G6WCx2a61W69JqtX6ArCB+v/+4UChAvhWhXWxM+/0+FYfjuEuTyeSFfJ94PB5FIBBo3CCiGqFVdESlSSaTLZ1Od7aVidPp/Njtdn+Ii/Bt1OVy3RJHo9HMbDbnIerBXWK32wlQu93uBu52JS7GD+zG6/X62ufzcTjVD/EIyLYywQue4qRGu93edSD6upnX6+X1ev1nSM+AnEiyZzQaj/EYjM1mYxmGaYbD4XOHw/HFYDBk1Wr1J9ScgHtgD0gjTB7K5XKVVqs1ajQas1KpfIW5p+ARUEjEPwOZIDJwBxyCg79JvwFn8/sITKnYXQAAAABJRU5ErkJggg== ###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy_tip.png,importbuddy/pluginbuddy/images/pluginbuddy_tip.png ###PACKDATA,FILE_START,/pluginbuddy/images/rawr.gif,importbuddy/pluginbuddy/images/rawr.gif R0lGODlhLwA9ALMAAP//////AMbGxgDXAP8AAABLAL0AAFkAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQAJACwKAA4AHAAqAAAEzTAlNKm8OGtJ7f5fN2FIWYKZ2JVC25rhZVqmC6e0TApsH+c7l+3HSbUIAiRPoyoGhUvcaZQKIKxYT0onnU2ZTqlhfNuGL4UrYmxQb7TfwqDAy0ZJb4R8joDqZ2cZe3w2cgUyWhqDcwWNe4coaAOTlJWUkJGLlpWYKJqbk50gn6CiH6SbphuolqqKoKmRkrChsrO0rqu0tbYSrLkhpGm9OpqHibIWjo1cvch4xM/NydS20tDVkdfYKNscXyFlYCJEVGbkb0XPOddA6d7cFxEAIfkECRQACQAsCAAJABwAKgAABM0wJTSpvDhrSe3+XzdhSFmCmdiVQtua4WVapguntEwKbB/nO5ftx0m1CAIkT6MqBoVL3GmUCiCsWE9KJ51NmU6pYXzbhi+HK2JsUG+03wPhwMtGSW+EfI6A6mdnGXt8NnIHMloag3MHjXuHKGgEk5SVlJCRi5aVmCiam5OdIJ+goh+km6YbqJaqiqCpkZKwobKztK6rtLW2Eqy5IaRpvTqah4myFo6NXL3IeMTPzcnUttLQ1ZHX2CjbHF8hZWAiRFRm5G9FzznXQOne3BcRACH5BAkFAAkALAkADAAcACoAAATNMCU0qbw4a0nt/l83YUhZgpnYlULbmuFlWqYLp7RMCmwf5zuX7cdJtQgCJE+jKgaFS9xplAogrFhPSiedTZlOqWF824YvhStibFBvtN/CoMDLRklvhHyOgOpnZxl7fDZyBTJaGoNzBY17hyhoA5OUlZSQkYuWlZgompuTnSCfoKIfpJumG6iWqoqgqZGSsKGys7Suq7S1thKsuSGkab06moeJshaOjVy9yHjEz83J1LbS0NWR19go2xxfIWVgIkRUZuRvRc8510Dp3twXEQAh+QQJFAAJACwIABIAIAAoAAAExBClJKe9OGtZUdUg6I1hGXoZN3Lm9bmIIMuoqb7TOJNibuEUgUcYA/4oGFxstisBlTKCQCoUrV5YZjP5MXavvNwz9QsgzOiO8SQ+u1FrZ+JQXBFboAPhoKXhNXp7dDsHdH8YgQSChYEHhxeJipKSjo9zk5iTlYeRmZSWnZ57oKKYm3+hnqd4qZmrLa2mlpelo7Oxiq+stba3pbp/CKmGsz6dlXE2E4yFLrPJPpbQSNIt02TKj2EbK3gka3DRJyzWweJyJREAOw== ###PACKDATA,FILE_END,/pluginbuddy/images/rawr.gif,importbuddy/pluginbuddy/images/rawr.gif ###PACKDATA,FILE_START,/pluginbuddy/images/twitter.png,importbuddy/pluginbuddy/images/twitter.png iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiUlEQVR42pWTTWgTQRTH/7MfadLUmoZqjURoq1i0gaBBKSKoCKKipadevHnwoBcvgiC6Sw8KWmitoFDRg3joQYKIYKUqKghFLW0pQVraWEpCWVOTpjabj83uOjNpQipV8M/s7syb937z5s0sOfpiNrjdLT9fyBSbBUJAG0TQh3VKjdrYe712uMR5LVvsIofCM8p4MqeaNiALBKIg0C8g8UBAoGMCuwSsUo1I0OyWVNL6NKJEV/IqC5T0HHbOx6m7jR9tLZDcDhBmp2MeXgVhC9bLgkp8jyeVxdW8SkQRAZeNqyEPd+gdSyNOQ1kMy4ZlUq20YaHBQQFNg2OKlimooIDOls24tn8rd7j1Nor3s6lKTZjEehdkbx3NB1jUi9jmFFXivf9FSeoMIKC7bQv6jzRz58noTyRS2XWrzmsrGIxnkHTI0IsWGmsowHNvVFnOUgChgL1NGDjWin/p4ps5hKNJ3vewGtT1fVJW84bKDN3tPgwc3/XX4KWsgbPhCL6nc3xcxwCuOx+VXBkQ8OHuiTY+eWVkBh9iaZRrt1owkcqbMC27AnQxgOPmO8XIFzmga08THnQG+GTPy294MrcEg5asYFobZuSQKEDqGVFMw+QA3yYnvl46DHYjl2m66rMIprVM1RYKiEkmPdPSfRAZQLg+rNiWpZadek+349w+/4YrGjSTU49GEUn84mMiUoD7xislu7YFJqckYKAriDO0oBvp/NAYhqc13pdleozB2yN9U1rm8p+OIX8DOlq8FChWbPFlHUMTMWCtjrsbXf1kdCZmn3z4GSsFG/+jepng9YWDIFpiKTU+MemZml2AruucLgjst15/923bgsWOkNavtrYW7a1+dBwI4TeMlfCatrT3RgAAAABJRU5ErkJggg== ###PACKDATA,FILE_END,/pluginbuddy/images/twitter.png,importbuddy/pluginbuddy/images/twitter.png ###PACKDATA,FILE_START,/pluginbuddy/js/admin.js,importbuddy/pluginbuddy/js/admin.js alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCWpRdWVyeSgnLmJhY2t1cGJ1ZGR5LWRvX2J1bGtfYWN0aW9uJykuY2xpY2soIGZ1bmN0aW9uKCl7CgkJaWYgKCAhIGNvbmZpcm0oICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG8gdGhpcyB0byBhbGwgc2VsZWN0ZWQgaXRlbXM/JyApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfSk7CgkKCQoJCglqUXVlcnkoJy5wYl9kZWJ1Z19zaG93JykuY2xpY2soZnVuY3Rpb24oZSkgewoJCWpRdWVyeSh0aGlzKS5oaWRlKCk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNoaWxkcmVuKCAnLnBiX2RlYnVnX2hpZGUnKS5zaG93KCk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNzcyggJ2Zsb2F0JywgJ2xlZnQnICk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNzcyggJ3dpZHRoJywgJzgwJScgKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY2hpbGRyZW4oICdkaXYnKS5zaG93KCk7Cgl9KTsKCWpRdWVyeSgnLnBiX2RlYnVnX2hpZGUnKS5jbGljayhmdW5jdGlvbihlKSB7CgkJalF1ZXJ5KHRoaXMpLmhpZGUoKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY2hpbGRyZW4oICcucGJfZGVidWdfc2hvdycpLnNob3coKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY3NzKCAnZmxvYXQnLCAncmlnaHQnICk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNzcyggJ3dpZHRoJywgJzQwcHgnICk7CgkJalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmNoaWxkcmVuKCAnZGl2JykuaGlkZSgpOwoJfSk7CgkKCWpRdWVyeSggJy5hZHZhbmNlZC10b2dnbGUtdGl0bGUnICkuY2xpY2soZnVuY3Rpb24oKXsKCQljb250YWluZXJXcmFwID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICdmb3JtJyApOwoJCXRpdGxlVG9nZ2xlID0gY29udGFpbmVyV3JhcC5maW5kKCAnLmFkdmFuY2VkLXRvZ2dsZS10aXRsZScgKTsKCQlyaWdodEFycm93ID0gdGl0bGVUb2dnbGUuZmluZCggJy5kYXNoaWNvbnMtYXJyb3ctcmlnaHQnICk7CgkJaWYgKCByaWdodEFycm93Lmxlbmd0aCA+IDAgKSB7CgkJCXJpZ2h0QXJyb3cucmVtb3ZlQ2xhc3MoICdkYXNoaWNvbnMtYXJyb3ctcmlnaHQnICkuYWRkQ2xhc3MoICdkYXNoaWNvbnMtYXJyb3ctZG93bicgKTsKCQl9IGVsc2UgewoJCQl0aXRsZVRvZ2dsZS5maW5kKCAnLmRhc2hpY29ucy1hcnJvdy1kb3duJyApLnJlbW92ZUNsYXNzKCAnZGFzaGljb25zLWFycm93LWRvd24nICkuYWRkQ2xhc3MoICdkYXNoaWNvbnMtYXJyb3ctcmlnaHQnICk7CgkJfQoJCWNvbnRhaW5lcldyYXAuZmluZCggJy5hZHZhbmNlZC10b2dnbGUnICkudG9nZ2xlKCk7Cgl9KTsKCQoJCglqUXVlcnkoJy5wbHVnaW5idWRkeV90aXAnKS50b29sdGlwKCk7IC8vIE5vdyB1c2luZyBqUXVlcnkgVUkgdG9vbHRpcC4KCQoJCglpZiAodHlwZW9mIGpRdWVyeS50YWJsZURuRCAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gSWYgdGFibGVEbkQgZnVuY3Rpb24gbG9hZGVkLgoJCWpRdWVyeSgnLnBiX3Jlb3JkZXInKS50YWJsZURuRCh7CgkJCW9uRHJvcDogZnVuY3Rpb24odGJvZHksIHJvdykgewoJCQkJdmFyIG5ld19vcmRlciA9IG5ldyBBcnJheSgpOwoJCQkJdmFyIHJvd3MgPSB0Ym9keS5yb3dzOwoJCQkJZm9yICh2YXIgaT0wOyBpPHJvd3MubGVuZ3RoOyBpKyspIHsKCQkJCQluZXdfb3JkZXIucHVzaCggcm93c1tpXS5pZC5zdWJzdHJpbmcoMTEpICk7CgkJCQl9CgkJCQluZXdfb3JkZXIgPSBuZXdfb3JkZXIuam9pbiggJywnICk7CgkJCQlqUXVlcnkoICcjcGJfb3JkZXInICkudmFsKCBuZXdfb3JkZXIgKQoJCQl9LAoJCQlkcmFnSGFuZGxlOiAicGJfZHJhZ2hhbmRsZSIKCQl9KTsKCX0KCQoJalF1ZXJ5KCcucGJfdG9nZ2xlJykuY2xpY2soZnVuY3Rpb24oZSkgewoJCWpRdWVyeSggJyNwYl90b2dnbGUtJyArIGpRdWVyeSh0aGlzKS5hdHRyKCdpZCcpICkuc2xpZGVUb2dnbGUoKTsKCX0pOwoJCgkKfSk7 ###PACKDATA,FILE_END,/pluginbuddy/js/admin.js,importbuddy/pluginbuddy/js/admin.js ###PACKDATA,FILE_START,/pluginbuddy/js/index.php,importbuddy/pluginbuddy/js/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/pluginbuddy/js/index.php,importbuddy/pluginbuddy/js/index.php ###PACKDATA,FILE_START,/pluginbuddy/js/jquery.miniColors.min.js,importbuddy/pluginbuddy/js/jquery.miniColors.min.js LyoKICogalF1ZXJ5IG1pbmlDb2xvcnM6IEEgc21hbGwgY29sb3Igc2VsZWN0b3IKICoKICogQ29weXJpZ2h0IDIwMTEgQ29yeSBMYVZpc2thIGZvciBBIEJlYXV0aWZ1bCBTaXRlLCBMTEMuIChodHRwOi8vYWJlYXV0aWZ1bHNpdGUubmV0LykKICoKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMKICoKKi8KaWYoalF1ZXJ5KShmdW5jdGlvbigkKXskLmV4dGVuZCgkLmZuLHttaW5pQ29sb3JzOmZ1bmN0aW9uKG8sZGF0YSl7dmFyIGNyZWF0ZT1mdW5jdGlvbihpbnB1dCxvLGRhdGEpe3ZhciBjb2xvcj1leHBhbmRIZXgoaW5wdXQudmFsKCkpO2lmKCFjb2xvciljb2xvcj0nZmZmZmZmJzt2YXIgaHNiPWhleDJoc2IoY29sb3IpO3ZhciB0cmlnZ2VyPSQoJzxhIGNsYXNzPSJtaW5pQ29sb3JzLXRyaWdnZXIiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjJytjb2xvcisnIiBocmVmPSIjIj48L2E+Jyk7dHJpZ2dlci5pbnNlcnRBZnRlcihpbnB1dCk7aW5wdXQuYWRkQ2xhc3MoJ21pbmlDb2xvcnMnKS5kYXRhKCdvcmlnaW5hbC1tYXhsZW5ndGgnLGlucHV0LmF0dHIoJ21heGxlbmd0aCcpfHxudWxsKS5kYXRhKCdvcmlnaW5hbC1hdXRvY29tcGxldGUnLGlucHV0LmF0dHIoJ2F1dG9jb21wbGV0ZScpfHxudWxsKS5kYXRhKCdsZXR0ZXJDYXNlJywndXBwZXJjYXNlJykuZGF0YSgndHJpZ2dlcicsdHJpZ2dlcikuZGF0YSgnaHNiJyxoc2IpLmRhdGEoJ2NoYW5nZScsby5jaGFuZ2U/by5jaGFuZ2U6bnVsbCkuYXR0cignbWF4bGVuZ3RoJyw3KS5hdHRyKCdhdXRvY29tcGxldGUnLCdvZmYnKS52YWwoJyMnK2NvbnZlcnRDYXNlKGNvbG9yLG8ubGV0dGVyQ2FzZSkpO2lmKG8ucmVhZG9ubHkpaW5wdXQucHJvcCgncmVhZG9ubHknLHRydWUpO2lmKG8uZGlzYWJsZWQpZGlzYWJsZShpbnB1dCk7dHJpZ2dlci5iaW5kKCdjbGljay5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihpbnB1dC52YWwoKT09PScnKWlucHV0LnZhbCgnIycpO3Nob3coaW5wdXQpfSk7aW5wdXQuYmluZCgnZm9jdXMubWluaUNvbG9ycycsZnVuY3Rpb24oZXZlbnQpe2lmKGlucHV0LnZhbCgpPT09JycpaW5wdXQudmFsKCcjJyk7c2hvdyhpbnB1dCl9KTtpbnB1dC5iaW5kKCdibHVyLm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXt2YXIgaGV4PWV4cGFuZEhleChpbnB1dC52YWwoKSk7aW5wdXQudmFsKGhleD8nIycrY29udmVydENhc2UoaGV4LGlucHV0LmRhdGEoJ2xldHRlckNhc2UnKSk6JycpfSk7aW5wdXQuYmluZCgna2V5ZG93bi5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7aWYoZXZlbnQua2V5Q29kZT09PTkpaGlkZShpbnB1dCl9KTtpbnB1dC5iaW5kKCdrZXl1cC5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7c2V0Q29sb3JGcm9tSW5wdXQoaW5wdXQpfSk7aW5wdXQuYmluZCgncGFzdGUubWluaUNvbG9ycycsZnVuY3Rpb24oZXZlbnQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRDb2xvckZyb21JbnB1dChpbnB1dCl9LDUpfSl9O3ZhciBkZXN0cm95PWZ1bmN0aW9uKGlucHV0KXtoaWRlKCk7aW5wdXQ9JChpbnB1dCk7aW5wdXQuZGF0YSgndHJpZ2dlcicpLnJlbW92ZSgpO2lucHV0LmF0dHIoJ2F1dG9jb21wbGV0ZScsaW5wdXQuZGF0YSgnb3JpZ2luYWwtYXV0b2NvbXBsZXRlJykpLmF0dHIoJ21heGxlbmd0aCcsaW5wdXQuZGF0YSgnb3JpZ2luYWwtbWF4bGVuZ3RoJykpLnJlbW92ZURhdGEoKS5yZW1vdmVDbGFzcygnbWluaUNvbG9ycycpLnVuYmluZCgnLm1pbmlDb2xvcnMnKTskKGRvY3VtZW50KS51bmJpbmQoJy5taW5pQ29sb3JzJyl9O3ZhciBlbmFibGU9ZnVuY3Rpb24oaW5wdXQpe2lucHV0LnByb3AoJ2Rpc2FibGVkJyxmYWxzZSkuZGF0YSgndHJpZ2dlcicpLmNzcygnb3BhY2l0eScsMSl9O3ZhciBkaXNhYmxlPWZ1bmN0aW9uKGlucHV0KXtoaWRlKGlucHV0KTtpbnB1dC5wcm9wKCdkaXNhYmxlZCcsdHJ1ZSkuZGF0YSgndHJpZ2dlcicpLmNzcygnb3BhY2l0eScsMC41KX07dmFyIHNob3c9ZnVuY3Rpb24oaW5wdXQpe2lmKGlucHV0LnByb3AoJ2Rpc2FibGVkJykpcmV0dXJuIGZhbHNlO2hpZGUoKTt2YXIgc2VsZWN0b3I9JCgnPGRpdiBjbGFzcz0ibWluaUNvbG9ycy1zZWxlY3RvciI+PC9kaXY+Jyk7c2VsZWN0b3IuYXBwZW5kKCc8ZGl2IGNsYXNzPSJtaW5pQ29sb3JzLWNvbG9ycyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkY7Ij48ZGl2IGNsYXNzPSJtaW5pQ29sb3JzLWNvbG9yUGlja2VyIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmQoJzxkaXYgY2xhc3M9Im1pbmlDb2xvcnMtaHVlcyI+PGRpdiBjbGFzcz0ibWluaUNvbG9ycy1odWVQaWNrZXIiPjwvZGl2PjwvZGl2PicpLmNzcyh7dG9wOmlucHV0LmlzKCc6dmlzaWJsZScpP2lucHV0Lm9mZnNldCgpLnRvcCtpbnB1dC5vdXRlckhlaWdodCgpOmlucHV0LmRhdGEoJ3RyaWdnZXInKS5vZmZzZXQoKS50b3AraW5wdXQuZGF0YSgndHJpZ2dlcicpLm91dGVySGVpZ2h0KCksbGVmdDppbnB1dC5pcygnOnZpc2libGUnKT9pbnB1dC5vZmZzZXQoKS5sZWZ0OmlucHV0LmRhdGEoJ3RyaWdnZXInKS5vZmZzZXQoKS5sZWZ0LGRpc3BsYXk6J25vbmUnfSkuYWRkQ2xhc3MoaW5wdXQuYXR0cignY2xhc3MnKSk7dmFyIGhzYj1pbnB1dC5kYXRhKCdoc2InKTtzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1jb2xvcnMnKS5jc3MoJ2JhY2tncm91bmRDb2xvcicsJyMnK2hzYjJoZXgoe2g6aHNiLmgsczoxMDAsYjoxMDB9KSk7dmFyIGNvbG9yUG9zaXRpb249aW5wdXQuZGF0YSgnY29sb3JQb3NpdGlvbicpO2lmKCFjb2xvclBvc2l0aW9uKWNvbG9yUG9zaXRpb249Z2V0Q29sb3JQb3NpdGlvbkZyb21IU0IoaHNiKTtzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1jb2xvclBpY2tlcicpLmNzcygndG9wJyxjb2xvclBvc2l0aW9uLnkrJ3B4JykuY3NzKCdsZWZ0Jyxjb2xvclBvc2l0aW9uLngrJ3B4Jyk7dmFyIGh1ZVBvc2l0aW9uPWlucHV0LmRhdGEoJ2h1ZVBvc2l0aW9uJyk7aWYoIWh1ZVBvc2l0aW9uKWh1ZVBvc2l0aW9uPWdldEh1ZVBvc2l0aW9uRnJvbUhTQihoc2IpO3NlbGVjdG9yLmZpbmQoJy5taW5pQ29sb3JzLWh1ZVBpY2tlcicpLmNzcygndG9wJyxodWVQb3NpdGlvbi55KydweCcpO2lucHV0LmRhdGEoJ3NlbGVjdG9yJyxzZWxlY3RvcikuZGF0YSgnaHVlUGlja2VyJyxzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1odWVQaWNrZXInKSkuZGF0YSgnY29sb3JQaWNrZXInLHNlbGVjdG9yLmZpbmQoJy5taW5pQ29sb3JzLWNvbG9yUGlja2VyJykpLmRhdGEoJ21vdXNlYnV0dG9uJywwKTskKCdCT0RZJykuYXBwZW5kKHNlbGVjdG9yKTtzZWxlY3Rvci5mYWRlSW4oMTAwKTtzZWxlY3Rvci5iaW5kKCdzZWxlY3RzdGFydCcsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KTskKGRvY3VtZW50KS5iaW5kKCdtb3VzZWRvd24ubWluaUNvbG9ycyB0b3VjaHN0YXJ0Lm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXtpbnB1dC5kYXRhKCdtb3VzZWJ1dHRvbicsMSk7aWYoJChldmVudC50YXJnZXQpLnBhcmVudHMoKS5hbmRTZWxmKCkuaGFzQ2xhc3MoJ21pbmlDb2xvcnMtY29sb3JzJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7aW5wdXQuZGF0YSgnbW92aW5nJywnY29sb3JzJyk7bW92ZUNvbG9yKGlucHV0LGV2ZW50KX1pZigkKGV2ZW50LnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5oYXNDbGFzcygnbWluaUNvbG9ycy1odWVzJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7aW5wdXQuZGF0YSgnbW92aW5nJywnaHVlcycpO21vdmVIdWUoaW5wdXQsZXZlbnQpfWlmKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmhhc0NsYXNzKCdtaW5pQ29sb3JzLXNlbGVjdG9yJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWlmKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuO2hpZGUoaW5wdXQpfSk7JChkb2N1bWVudCkuYmluZCgnbW91c2V1cC5taW5pQ29sb3JzIHRvdWNoZW5kLm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2lucHV0LmRhdGEoJ21vdXNlYnV0dG9uJywwKS5yZW1vdmVEYXRhKCdtb3ZpbmcnKX0pLmJpbmQoJ21vdXNlbW92ZS5taW5pQ29sb3JzIHRvdWNobW92ZS5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihpbnB1dC5kYXRhKCdtb3VzZWJ1dHRvbicpPT09MSl7aWYoaW5wdXQuZGF0YSgnbW92aW5nJyk9PT0nY29sb3JzJyltb3ZlQ29sb3IoaW5wdXQsZXZlbnQpO2lmKGlucHV0LmRhdGEoJ21vdmluZycpPT09J2h1ZXMnKW1vdmVIdWUoaW5wdXQsZXZlbnQpfX0pfTt2YXIgaGlkZT1mdW5jdGlvbihpbnB1dCl7aWYoIWlucHV0KWlucHV0PScubWluaUNvbG9ycyc7JChpbnB1dCkuZWFjaChmdW5jdGlvbigpe3ZhciBzZWxlY3Rvcj0kKHRoaXMpLmRhdGEoJ3NlbGVjdG9yJyk7JCh0aGlzKS5yZW1vdmVEYXRhKCdzZWxlY3RvcicpOyQoc2VsZWN0b3IpLmZhZGVPdXQoMTAwLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmUoKX0pfSk7JChkb2N1bWVudCkudW5iaW5kKCdtb3VzZWRvd24ubWluaUNvbG9ycyB0b3VjaHN0YXJ0Lm1pbmlDb2xvcnMnKS51bmJpbmQoJ21vdXNlbW92ZS5taW5pQ29sb3JzIHRvdWNobW92ZS5taW5pQ29sb3JzJyl9O3ZhciBtb3ZlQ29sb3I9ZnVuY3Rpb24oaW5wdXQsZXZlbnQpe3ZhciBjb2xvclBpY2tlcj1pbnB1dC5kYXRhKCdjb2xvclBpY2tlcicpO2NvbG9yUGlja2VyLmhpZGUoKTt2YXIgcG9zaXRpb249e3g6ZXZlbnQucGFnZVgseTpldmVudC5wYWdlWX07aWYoZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyl7cG9zaXRpb24ueD1ldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO3Bvc2l0aW9uLnk9ZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWX1wb3NpdGlvbi54PXBvc2l0aW9uLngtaW5wdXQuZGF0YSgnc2VsZWN0b3InKS5maW5kKCcubWluaUNvbG9ycy1jb2xvcnMnKS5vZmZzZXQoKS5sZWZ0LTU7cG9zaXRpb24ueT1wb3NpdGlvbi55LWlucHV0LmRhdGEoJ3NlbGVjdG9yJykuZmluZCgnLm1pbmlDb2xvcnMtY29sb3JzJykub2Zmc2V0KCkudG9wLTU7aWYocG9zaXRpb24ueDw9LTUpcG9zaXRpb24ueD0tNTtpZihwb3NpdGlvbi54Pj0xNDQpcG9zaXRpb24ueD0xNDQ7aWYocG9zaXRpb24ueTw9LTUpcG9zaXRpb24ueT0tNTtpZihwb3NpdGlvbi55Pj0xNDQpcG9zaXRpb24ueT0xNDQ7aW5wdXQuZGF0YSgnY29sb3JQb3NpdGlvbicscG9zaXRpb24pO2NvbG9yUGlja2VyLmNzcygnbGVmdCcscG9zaXRpb24ueCkuY3NzKCd0b3AnLHBvc2l0aW9uLnkpLnNob3coKTt2YXIgcz1NYXRoLnJvdW5kKChwb3NpdGlvbi54KzUpKjAuNjcpO2lmKHM8MClzPTA7aWYocz4xMDApcz0xMDA7dmFyIGI9MTAwLU1hdGgucm91bmQoKHBvc2l0aW9uLnkrNSkqMC42Nyk7aWYoYjwwKWI9MDtpZihiPjEwMCliPTEwMDt2YXIgaHNiPWlucHV0LmRhdGEoJ2hzYicpO2hzYi5zPXM7aHNiLmI9YjtzZXRDb2xvcihpbnB1dCxoc2IsdHJ1ZSl9O3ZhciBtb3ZlSHVlPWZ1bmN0aW9uKGlucHV0LGV2ZW50KXt2YXIgaHVlUGlja2VyPWlucHV0LmRhdGEoJ2h1ZVBpY2tlcicpO2h1ZVBpY2tlci5oaWRlKCk7dmFyIHBvc2l0aW9uPXt5OmV2ZW50LnBhZ2VZfTtpZihldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzKXtwb3NpdGlvbi55PWV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVl9cG9zaXRpb24ueT1wb3NpdGlvbi55LWlucHV0LmRhdGEoJ3NlbGVjdG9yJykuZmluZCgnLm1pbmlDb2xvcnMtY29sb3JzJykub2Zmc2V0KCkudG9wLTE7aWYocG9zaXRpb24ueTw9LTEpcG9zaXRpb24ueT0tMTtpZihwb3NpdGlvbi55Pj0xNDkpcG9zaXRpb24ueT0xNDk7aW5wdXQuZGF0YSgnaHVlUG9zaXRpb24nLHBvc2l0aW9uKTtodWVQaWNrZXIuY3NzKCd0b3AnLHBvc2l0aW9uLnkpLnNob3coKTt2YXIgaD1NYXRoLnJvdW5kKCgxNTAtcG9zaXRpb24ueS0xKSoyLjQpO2lmKGg8MCloPTA7aWYoaD4zNjApaD0zNjA7dmFyIGhzYj1pbnB1dC5kYXRhKCdoc2InKTtoc2IuaD1oO3NldENvbG9yKGlucHV0LGhzYix0cnVlKX07dmFyIHNldENvbG9yPWZ1bmN0aW9uKGlucHV0LGhzYix1cGRhdGVJbnB1dCl7aW5wdXQuZGF0YSgnaHNiJyxoc2IpO3ZhciBoZXg9aHNiMmhleChoc2IpO2lmKHVwZGF0ZUlucHV0KWlucHV0LnZhbCgnIycrY29udmVydENhc2UoaGV4LGlucHV0LmRhdGEoJ2xldHRlckNhc2UnKSkpO2lucHV0LmRhdGEoJ3RyaWdnZXInKS5jc3MoJ2JhY2tncm91bmRDb2xvcicsJyMnK2hleCk7aWYoaW5wdXQuZGF0YSgnc2VsZWN0b3InKSlpbnB1dC5kYXRhKCdzZWxlY3RvcicpLmZpbmQoJy5taW5pQ29sb3JzLWNvbG9ycycpLmNzcygnYmFja2dyb3VuZENvbG9yJywnIycraHNiMmhleCh7aDpoc2IuaCxzOjEwMCxiOjEwMH0pKTtpZihpbnB1dC5kYXRhKCdjaGFuZ2UnKSl7aWYoaGV4PT09aW5wdXQuZGF0YSgnbGFzdENoYW5nZScpKXJldHVybjtpbnB1dC5kYXRhKCdjaGFuZ2UnKS5jYWxsKGlucHV0LCcjJytoZXgsaHNiMnJnYihoc2IpKTtpbnB1dC5kYXRhKCdsYXN0Q2hhbmdlJyxoZXgpfX07dmFyIHNldENvbG9yRnJvbUlucHV0PWZ1bmN0aW9uKGlucHV0KXtpbnB1dC52YWwoJyMnK2NsZWFuSGV4KGlucHV0LnZhbCgpKSk7dmFyIGhleD1leHBhbmRIZXgoaW5wdXQudmFsKCkpO2lmKCFoZXgpcmV0dXJuIGZhbHNlO3ZhciBoc2I9aGV4MmhzYihoZXgpO3ZhciBjdXJyZW50SFNCPWlucHV0LmRhdGEoJ2hzYicpO2lmKGhzYi5oPT09Y3VycmVudEhTQi5oJiZoc2Iucz09PWN1cnJlbnRIU0IucyYmaHNiLmI9PT1jdXJyZW50SFNCLmIpcmV0dXJuIHRydWU7dmFyIGNvbG9yUG9zaXRpb249Z2V0Q29sb3JQb3NpdGlvbkZyb21IU0IoaHNiKTt2YXIgY29sb3JQaWNrZXI9JChpbnB1dC5kYXRhKCdjb2xvclBpY2tlcicpKTtjb2xvclBpY2tlci5jc3MoJ3RvcCcsY29sb3JQb3NpdGlvbi55KydweCcpLmNzcygnbGVmdCcsY29sb3JQb3NpdGlvbi54KydweCcpO2lucHV0LmRhdGEoJ2NvbG9yUG9zaXRpb24nLGNvbG9yUG9zaXRpb24pO3ZhciBodWVQb3NpdGlvbj1nZXRIdWVQb3NpdGlvbkZyb21IU0IoaHNiKTt2YXIgaHVlUGlja2VyPSQoaW5wdXQuZGF0YSgnaHVlUGlja2VyJykpO2h1ZVBpY2tlci5jc3MoJ3RvcCcsaHVlUG9zaXRpb24ueSsncHgnKTtpbnB1dC5kYXRhKCdodWVQb3NpdGlvbicsaHVlUG9zaXRpb24pO3NldENvbG9yKGlucHV0LGhzYik7cmV0dXJuIHRydWV9O3ZhciBjb252ZXJ0Q2FzZT1mdW5jdGlvbihzdHJpbmcsbGV0dGVyQ2FzZSl7aWYobGV0dGVyQ2FzZT09PSdsb3dlcmNhc2UnKXJldHVybiBzdHJpbmcudG9Mb3dlckNhc2UoKTtpZihsZXR0ZXJDYXNlPT09J3VwcGVyY2FzZScpcmV0dXJuIHN0cmluZy50b1VwcGVyQ2FzZSgpO3JldHVybiBzdHJpbmd9O3ZhciBnZXRDb2xvclBvc2l0aW9uRnJvbUhTQj1mdW5jdGlvbihoc2Ipe3ZhciB4PU1hdGguY2VpbChoc2Iucy8wLjY3KTtpZih4PDApeD0wO2lmKHg+MTUwKXg9MTUwO3ZhciB5PTE1MC1NYXRoLmNlaWwoaHNiLmIvMC42Nyk7aWYoeTwwKXk9MDtpZih5PjE1MCl5PTE1MDtyZXR1cm57eDp4LTUseTp5LTV9fTt2YXIgZ2V0SHVlUG9zaXRpb25Gcm9tSFNCPWZ1bmN0aW9uKGhzYil7dmFyIHk9MTUwLShoc2IuaC8yLjQpO2lmKHk8MCloPTA7aWYoeT4xNTApaD0xNTA7cmV0dXJue3k6eS0xfX07dmFyIGNsZWFuSGV4PWZ1bmN0aW9uKGhleCl7cmV0dXJuIGhleC5yZXBsYWNlKC9bXkEtRjAtOV0vaWcsJycpfTt2YXIgZXhwYW5kSGV4PWZ1bmN0aW9uKGhleCl7aGV4PWNsZWFuSGV4KGhleCk7aWYoIWhleClyZXR1cm4gbnVsbDtpZihoZXgubGVuZ3RoPT09MyloZXg9aGV4WzBdK2hleFswXStoZXhbMV0raGV4WzFdK2hleFsyXStoZXhbMl07cmV0dXJuIGhleC5sZW5ndGg9PT02P2hleDpudWxsfTt2YXIgaHNiMnJnYj1mdW5jdGlvbihoc2Ipe3ZhciByZ2I9e307dmFyIGg9TWF0aC5yb3VuZChoc2IuaCk7dmFyIHM9TWF0aC5yb3VuZChoc2IucyoyNTUvMTAwKTt2YXIgdj1NYXRoLnJvdW5kKGhzYi5iKjI1NS8xMDApO2lmKHM9PT0wKXtyZ2Iucj1yZ2IuZz1yZ2IuYj12fWVsc2V7dmFyIHQxPXY7dmFyIHQyPSgyNTUtcykqdi8yNTU7dmFyIHQzPSh0MS10MikqKGglNjApLzYwO2lmKGg9PT0zNjApaD0wO2lmKGg8NjApe3JnYi5yPXQxO3JnYi5iPXQyO3JnYi5nPXQyK3QzfWVsc2UgaWYoaDwxMjApe3JnYi5nPXQxO3JnYi5iPXQyO3JnYi5yPXQxLXQzfWVsc2UgaWYoaDwxODApe3JnYi5nPXQxO3JnYi5yPXQyO3JnYi5iPXQyK3QzfWVsc2UgaWYoaDwyNDApe3JnYi5iPXQxO3JnYi5yPXQyO3JnYi5nPXQxLXQzfWVsc2UgaWYoaDwzMDApe3JnYi5iPXQxO3JnYi5nPXQyO3JnYi5yPXQyK3QzfWVsc2UgaWYoaDwzNjApe3JnYi5yPXQxO3JnYi5nPXQyO3JnYi5iPXQxLXQzfWVsc2V7cmdiLnI9MDtyZ2IuZz0wO3JnYi5iPTB9fXJldHVybntyOk1hdGgucm91bmQocmdiLnIpLGc6TWF0aC5yb3VuZChyZ2IuZyksYjpNYXRoLnJvdW5kKHJnYi5iKX19O3ZhciByZ2IyaGV4PWZ1bmN0aW9uKHJnYil7dmFyIGhleD1bcmdiLnIudG9TdHJpbmcoMTYpLHJnYi5nLnRvU3RyaW5nKDE2KSxyZ2IuYi50b1N0cmluZygxNildOyQuZWFjaChoZXgsZnVuY3Rpb24obnIsdmFsKXtpZih2YWwubGVuZ3RoPT09MSloZXhbbnJdPScwJyt2YWx9KTtyZXR1cm4gaGV4LmpvaW4oJycpfTt2YXIgaGV4MnJnYj1mdW5jdGlvbihoZXgpe2hleD1wYXJzZUludCgoKGhleC5pbmRleE9mKCcjJyk+LTEpP2hleC5zdWJzdHJpbmcoMSk6aGV4KSwxNik7cmV0dXJue3I6aGV4Pj4xNixnOihoZXgmMHgwMEZGMDApPj44LGI6KGhleCYweDAwMDBGRil9fTt2YXIgcmdiMmhzYj1mdW5jdGlvbihyZ2Ipe3ZhciBoc2I9e2g6MCxzOjAsYjowfTt2YXIgbWluPU1hdGgubWluKHJnYi5yLHJnYi5nLHJnYi5iKTt2YXIgbWF4PU1hdGgubWF4KHJnYi5yLHJnYi5nLHJnYi5iKTt2YXIgZGVsdGE9bWF4LW1pbjtoc2IuYj1tYXg7aHNiLnM9bWF4IT09MD8yNTUqZGVsdGEvbWF4OjA7aWYoaHNiLnMhPT0wKXtpZihyZ2Iucj09PW1heCl7aHNiLmg9KHJnYi5nLXJnYi5iKS9kZWx0YX1lbHNlIGlmKHJnYi5nPT09bWF4KXtoc2IuaD0yKyhyZ2IuYi1yZ2IucikvZGVsdGF9ZWxzZXtoc2IuaD00KyhyZ2Iuci1yZ2IuZykvZGVsdGF9fWVsc2V7aHNiLmg9LTF9aHNiLmgqPTYwO2lmKGhzYi5oPDApe2hzYi5oKz0zNjB9aHNiLnMqPTEwMC8yNTU7aHNiLmIqPTEwMC8yNTU7cmV0dXJuIGhzYn07dmFyIGhleDJoc2I9ZnVuY3Rpb24oaGV4KXt2YXIgaHNiPXJnYjJoc2IoaGV4MnJnYihoZXgpKTtpZihoc2Iucz09PTApaHNiLmg9MzYwO3JldHVybiBoc2J9O3ZhciBoc2IyaGV4PWZ1bmN0aW9uKGhzYil7cmV0dXJuIHJnYjJoZXgoaHNiMnJnYihoc2IpKX07c3dpdGNoKG8pe2Nhc2UncmVhZG9ubHknOiQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuOyQodGhpcykucHJvcCgncmVhZG9ubHknLGRhdGEpfSk7cmV0dXJuICQodGhpcyk7Y2FzZSdkaXNhYmxlZCc6JCh0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykuaGFzQ2xhc3MoJ21pbmlDb2xvcnMnKSlyZXR1cm47aWYoZGF0YSl7ZGlzYWJsZSgkKHRoaXMpKX1lbHNle2VuYWJsZSgkKHRoaXMpKX19KTtyZXR1cm4gJCh0aGlzKTtjYXNlJ3ZhbHVlJzppZihkYXRhPT09dW5kZWZpbmVkKXtpZighJCh0aGlzKS5oYXNDbGFzcygnbWluaUNvbG9ycycpKXJldHVybjt2YXIgaW5wdXQ9JCh0aGlzKSxoZXg9ZXhwYW5kSGV4KGlucHV0LnZhbCgpKTtyZXR1cm4gaGV4PycjJytjb252ZXJ0Q2FzZShoZXgsaW5wdXQuZGF0YSgnbGV0dGVyQ2FzZScpKTpudWxsfSQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuOyQodGhpcykudmFsKGRhdGEpO3NldENvbG9yRnJvbUlucHV0KCQodGhpcykpfSk7cmV0dXJuICQodGhpcyk7Y2FzZSdkZXN0cm95JzokKHRoaXMpLmVhY2goZnVuY3Rpb24oKXtpZighJCh0aGlzKS5oYXNDbGFzcygnbWluaUNvbG9ycycpKXJldHVybjtkZXN0cm95KCQodGhpcykpfSk7cmV0dXJuICQodGhpcyk7ZGVmYXVsdDppZighbylvPXt9OyQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcylbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpIT09J2lucHV0JylyZXR1cm47aWYoJCh0aGlzKS5kYXRhKCd0cmlnZ2VyJykpcmV0dXJuO2NyZWF0ZSgkKHRoaXMpLG8sZGF0YSl9KTtyZXR1cm4gJCh0aGlzKX19fSl9KShqUXVlcnkpOw== ###PACKDATA,FILE_END,/pluginbuddy/js/jquery.miniColors.min.js,importbuddy/pluginbuddy/js/jquery.miniColors.min.js ###PACKDATA,FILE_START,/pluginbuddy/js/pb_tabs.js,importbuddy/pluginbuddy/js/pb_tabs.js alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQoJLy8gQ2hhbmdlIHRhYiBvbiBjbGljay4KCWpRdWVyeSggJy5iYWNrdXBidWRkeS10YWJzLXdyYXAgLm5hdi10YWJbaHJlZl49IiMiXScgKS5jbGljayggZnVuY3Rpb24oZSl7IC8qIGlnbm9yZXMgYW55IG5vbiBoYXNodGFnIGxpbmtzIHNpbmNlIHRoZXkgZ28gZGlyZWN0IHRvIGEgVVJMLi4uICovCgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQoJCS8vIEhpZGUgYWxsIHRhYiBibG9ja3MuCgkJdGhpc1RhYkJsb2NrID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICcuYmFja3VwYnVkZHktdGFicy13cmFwJyApOwoJCXRoaXNUYWJCbG9jay5maW5kKCAnLmJhY2t1cGJ1ZGR5LXRhYicgKS5oaWRlKCk7CgkJCgkJLy8gVXBkYXRlIHNlbGVjdGVkIHRhYi4KCQl0aGlzVGFiQmxvY2suZmluZCggJy5uYXYtdGFiLWFjdGl2ZScgKS5yZW1vdmVDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCWpRdWVyeSh0aGlzKS5hZGRDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCQoJCS8vIFNob3cgdGhlIGNvcnJlY3QgdGFiIGJsb2NrLgoJCS8vdGFyZ2V0RGl2SUQgPSBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkuc3Vic3RyaW5nKDEpOwoJCXRoaXNUYWJCbG9jay5maW5kKCBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkgKS5zaG93KCk7Cgl9KTsKCQoJLy8gQ2hhbmdlIHRhYiBvbiBjbGljayAtLSBBSkFYIHZlcnNpb24uCglqUXVlcnkoICcuYmFja3VwYnVkZHktdGFicy13cmFwIC5uYXYtdGFiW2hyZWZePSJqYXZhc2NyaXB0Il0nICkuY2xpY2soIGZ1bmN0aW9uKGUpeyAvKiBpZ25vcmVzIGFueSBub24gaGFzaHRhZyBsaW5rcyBzaW5jZSB0aGV5IGdvIGRpcmVjdCB0byBhIFVSTC4uLiAqLwoJCS8vIEhpZGUgYWxsIHRhYiBibG9ja3MuCgkJdGhpc1RhYkJsb2NrID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICcuYmFja3VwYnVkZHktdGFicy13cmFwJyApOwoJCXRoaXNUYWJCbG9jay5maW5kKCAnLmJhY2t1cGJ1ZGR5LXRhYicgKS5oaWRlKCk7CgkJCgkJLy8gVXBkYXRlIHNlbGVjdGVkIHRhYi4KCQl0aGlzVGFiQmxvY2suZmluZCggJy5uYXYtdGFiLWFjdGl2ZScgKS5yZW1vdmVDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCWpRdWVyeSh0aGlzKS5hZGRDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCQoJCS8vIFNob3cgdGhlIGNvcnJlY3QgdGFiIGJsb2NrLgoJCS8vdGFyZ2V0RGl2SUQgPSBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkuc3Vic3RyaW5nKDEpOwoJCXRoaXNUYWJCbG9jay5maW5kKCBqUXVlcnkodGhpcykuYXR0ciggJ2RhdGEtYWpheCcgKSApLnNob3coKTsKCX0pOwoJCgkvLyBBdXRvLWRpc3BsYXkgdGhlIGNvcnJlY3QgdGFiIG9uIGxvYWQgaWYgc3BlY2lmeWluZyBhIG5vbi1kZWZhdWx0LgoJalF1ZXJ5KCAnLm5hdi10YWItYWN0aXZlJyApLmVhY2goIGZ1bmN0aW9uKCl7CgkJalF1ZXJ5KHRoaXMpLmNsaWNrKCk7Cgl9KTsKfSk7 ###PACKDATA,FILE_END,/pluginbuddy/js/pb_tabs.js,importbuddy/pluginbuddy/js/pb_tabs.js ###PACKDATA,FILE_START,/pluginbuddy/js/tablednd.js,importbuddy/pluginbuddy/js/tablednd.js LyoqCiAqIFRhYmxlRG5EIHBsdWctaW4gZm9yIEpRdWVyeSwgYWxsb3dzIHlvdSB0byBkcmFnIGFuZCBkcm9wIHRhYmxlIHJvd3MKICogWW91IGNhbiBzZXQgdXAgdmFyaW91cyBvcHRpb25zIHRvIGNvbnRyb2wgaG93IHRoZSBzeXN0ZW0gd2lsbCB3b3JrCiAqIENvcHlyaWdodCAoYykgRGVuaXMgSG93bGV0dCA8ZGVuaXNoQGlzb2NyYS5jb20+CiAqIExpY2Vuc2VkIGxpa2UgalF1ZXJ5LCBzZWUgaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlLgogKi8KalF1ZXJ5LnRhYmxlRG5EID0gewogICAgLyoqIEtlZXAgaG9sZCBvZiB0aGUgY3VycmVudCB0YWJsZSBiZWluZyBkcmFnZ2VkICovCiAgICBjdXJyZW50VGFibGUgOiBudWxsLAogICAgLyoqIEtlZXAgaG9sZCBvZiB0aGUgY3VycmVudCBkcmFnIG9iamVjdCBpZiBhbnkgKi8KICAgIGRyYWdPYmplY3Q6IG51bGwsCiAgICAvKiogVGhlIGN1cnJlbnQgbW91c2Ugb2Zmc2V0ICovCiAgICBtb3VzZU9mZnNldDogbnVsbCwKICAgIC8qKiBSZW1lbWJlciB0aGUgb2xkIHZhbHVlIG9mIFkgc28gdGhhdCB3ZSBkb24ndCBkbyB0b28gbXVjaCBwcm9jZXNzaW5nICovCiAgICBvbGRZOiAwLAoKICAgIC8qKiBBY3R1YWxseSBidWlsZCB0aGUgc3RydWN0dXJlICovCiAgICBidWlsZDogZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIFNldCB1cCB0aGUgZGVmYXVsdHMgaWYgYW55CgogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBib3VuZCB0byBlYWNoIG1hdGNoaW5nIHRhYmxlLCBzZXQgdXAgdGhlIGRlZmF1bHRzIGFuZCBvdmVycmlkZSB3aXRoIHVzZXIgb3B0aW9ucwogICAgICAgICAgICB0aGlzLnRhYmxlRG5EQ29uZmlnID0galF1ZXJ5LmV4dGVuZCh7CiAgICAgICAgICAgICAgICBvbkRyYWdTdHlsZTogbnVsbCwKICAgICAgICAgICAgICAgIG9uRHJvcFN0eWxlOiBudWxsLAoJCQkJLy8gQWRkIGluIHRoZSBkZWZhdWx0IGNsYXNzIGZvciB3aGlsZURyYWdnaW5nCgkJCQlvbkRyYWdDbGFzczogInREbkRfd2hpbGVEcmFnIiwKICAgICAgICAgICAgICAgIG9uRHJvcDogbnVsbCwKICAgICAgICAgICAgICAgIG9uRHJhZ1N0YXJ0OiBudWxsLAogICAgICAgICAgICAgICAgc2Nyb2xsQW1vdW50OiA1LAoJCQkJc2VyaWFsaXplUmVnZXhwOiAvW15cLV0qJC8sIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIHRvIHRyaW0gcm93IElEcwoJCQkJc2VyaWFsaXplUGFyYW1OYW1lOiBudWxsLCAvLyBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGFub3RoZXIgcGFyYW1ldGVyIG5hbWUgaW5zdGVhZCBvZiB0aGUgdGFibGUgSUQKICAgICAgICAgICAgICAgIGRyYWdIYW5kbGU6IG51bGwgLy8gSWYgeW91IGdpdmUgdGhlIG5hbWUgb2YgYSBjbGFzcyBoZXJlLCB0aGVuIG9ubHkgQ2VsbHMgd2l0aCB0aGlzIGNsYXNzIHdpbGwgYmUgZHJhZ2dhYmxlCiAgICAgICAgICAgIH0sIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgICAvLyBOb3cgbWFrZSB0aGUgcm93cyBkcmFnZ2FibGUKICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1ha2VEcmFnZ2FibGUodGhpcyk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNhcHR1cmUgdGhlIG1vdXNlIHVwIGFuZCBtb3VzZSBtb3ZlIGV2ZW50CiAgICAgICAgLy8gV2UgY2FuIHVzZSBiaW5kIHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgZXZlbnQgaGFuZGxlcnMKICAgICAgICBqUXVlcnkoZG9jdW1lbnQpCiAgICAgICAgICAgIC5iaW5kKCdtb3VzZW1vdmUnLCBqUXVlcnkudGFibGVEbkQubW91c2Vtb3ZlKQogICAgICAgICAgICAuYmluZCgnbW91c2V1cCcsIGpRdWVyeS50YWJsZURuRC5tb3VzZXVwKTsKCiAgICAgICAgLy8gRG9uJ3QgYnJlYWsgdGhlIGNoYWluCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIC8qKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGFsbCB0aGUgcm93cyBvbiB0aGUgdGFibGUgZHJhZ2dhYmxlIGFwYXJ0IGZyb20gdGhvc2UgbWFya2VkIGFzICJOb0RyYWciICovCiAgICBtYWtlRHJhZ2dhYmxlOiBmdW5jdGlvbih0YWJsZSkgewogICAgICAgIHZhciBjb25maWcgPSB0YWJsZS50YWJsZURuRENvbmZpZzsKCQlpZiAodGFibGUudGFibGVEbkRDb25maWcuZHJhZ0hhbmRsZSkgewoJCQkvLyBXZSBvbmx5IG5lZWQgdG8gYWRkIHRoZSBldmVudCB0byB0aGUgc3BlY2lmaWVkIGNlbGxzCgkJCXZhciBjZWxscyA9IGpRdWVyeSgidGQuIit0YWJsZS50YWJsZURuRENvbmZpZy5kcmFnSGFuZGxlLCB0YWJsZSk7CgkJCWNlbGxzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkvLyBUaGUgY2VsbCBpcyBib3VuZCB0byAidGhpcyIKICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5tb3VzZWRvd24oZnVuY3Rpb24oZXYpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlID0gdGFibGU7CiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0ID0galF1ZXJ5LnRhYmxlRG5ELmdldE1vdXNlT2Zmc2V0KHRoaXMsIGV2KTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uRHJhZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIG9uRHJvcCBtZXRob2QgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkRyYWdTdGFydCh0YWJsZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoJCQl9KQoJCX0gZWxzZSB7CgkJCS8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWRkIHRoZSBldmVudCB0byB0aGUgd2hvbGUgcm93CgkgICAgICAgIHZhciByb3dzID0galF1ZXJ5KCJ0ciIsIHRhYmxlKTsgLy8gZ2V0IGFsbCB0aGUgcm93cyBhcyBhIHdyYXBwZWQgc2V0CgkgICAgICAgIHJvd3MuZWFjaChmdW5jdGlvbigpIHsKCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHJvdywgdGhlIHJvdyBpcyBib3VuZCB0byAidGhpcyIKCQkJCXZhciByb3cgPSBqUXVlcnkodGhpcyk7CgkJCQlpZiAoISByb3cuaGFzQ2xhc3MoIm5vZHJhZyIpKSB7CgkgICAgICAgICAgICAgICAgcm93Lm1vdXNlZG93bihmdW5jdGlvbihldikgewoJICAgICAgICAgICAgICAgICAgICBpZiAoZXYudGFyZ2V0LnRhZ05hbWUgPT0gIlREIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QgPSB0aGlzOwoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSA9IHRhYmxlOwoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0ID0galF1ZXJ5LnRhYmxlRG5ELmdldE1vdXNlT2Zmc2V0KHRoaXMsIGV2KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25EcmFnU3RhcnQpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBvbkRyb3AgbWV0aG9kIGlmIHRoZXJlIGlzIG9uZQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkRyYWdTdGFydCh0YWJsZSwgdGhpcyk7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9KS5jc3MoImN1cnNvciIsICJtb3ZlIik7IC8vIFN0b3JlIHRoZSB0YWJsZURuRCBvYmplY3QKCQkJCX0KCQkJfSk7CgkJfQoJfSwKCgl1cGRhdGVUYWJsZXM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdGhpcyBpcyBub3cgYm91bmQgdG8gZWFjaCBtYXRjaGluZyB0YWJsZQoJCQlpZiAodGhpcy50YWJsZURuRENvbmZpZykgewoJCQkJalF1ZXJ5LnRhYmxlRG5ELm1ha2VEcmFnZ2FibGUodGhpcyk7CgkJCX0KCQl9KQoJfSwKCiAgICAvKiogR2V0IHRoZSBtb3VzZSBjb29yZGluYXRlcyBmcm9tIHRoZSBldmVudCAoYWxsb3dpbmcgZm9yIGJyb3dzZXIgZGlmZmVyZW5jZXMpICovCiAgICBtb3VzZUNvb3JkczogZnVuY3Rpb24oZXYpewogICAgICAgIGlmKGV2LnBhZ2VYIHx8IGV2LnBhZ2VZKXsKICAgICAgICAgICAgcmV0dXJuIHt4OmV2LnBhZ2VYLCB5OmV2LnBhZ2VZfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDpldi5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IC0gZG9jdW1lbnQuYm9keS5jbGllbnRMZWZ0LAogICAgICAgICAgICB5OmV2LmNsaWVudFkgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCAgLSBkb2N1bWVudC5ib2R5LmNsaWVudFRvcAogICAgICAgIH07CiAgICB9LAoKICAgIC8qKiBHaXZlbiBhIHRhcmdldCBlbGVtZW50IGFuZCBhIG1vdXNlIGV2ZW50LCBnZXQgdGhlIG1vdXNlIG9mZnNldCBmcm9tIHRoYXQgZWxlbWVudC4KICAgICAgICBUbyBkbyB0aGlzIHdlIG5lZWQgdGhlIGVsZW1lbnQncyBwb3NpdGlvbiBhbmQgdGhlIG1vdXNlIHBvc2l0aW9uICovCiAgICBnZXRNb3VzZU9mZnNldDogZnVuY3Rpb24odGFyZ2V0LCBldikgewogICAgICAgIGV2ID0gZXYgfHwgd2luZG93LmV2ZW50OwoKICAgICAgICB2YXIgZG9jUG9zICAgID0gdGhpcy5nZXRQb3NpdGlvbih0YXJnZXQpOwogICAgICAgIHZhciBtb3VzZVBvcyAgPSB0aGlzLm1vdXNlQ29vcmRzKGV2KTsKICAgICAgICByZXR1cm4ge3g6bW91c2VQb3MueCAtIGRvY1Bvcy54LCB5Om1vdXNlUG9zLnkgLSBkb2NQb3MueX07CiAgICB9LAoKICAgIC8qKiBHZXQgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgYnkgZ29pbmcgdXAgdGhlIERPTSB0cmVlIGFuZCBhZGRpbmcgdXAgYWxsIHRoZSBvZmZzZXRzICovCiAgICBnZXRQb3NpdGlvbjogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIGxlZnQgPSAwOwogICAgICAgIHZhciB0b3AgID0gMDsKICAgICAgICAvKiogU2FmYXJpIGZpeCAtLSB0aGFua3MgdG8gTHVpcyBDaGF0byBmb3IgdGhpcyEgKi8KICAgICAgICBpZiAoZS5vZmZzZXRIZWlnaHQgPT0gMCkgewogICAgICAgICAgICAvKiogU2FmYXJpIDIgZG9lc24ndCBjb3JyZWN0bHkgZ3JhYiB0aGUgb2Zmc2V0VG9wIG9mIGEgdGFibGUgcm93CiAgICAgICAgICAgIHRoaXMgaXMgZGV0YWlsZWQgaGVyZToKICAgICAgICAgICAgaHR0cDovL2phY29iLnBlYXJncm92ZS5jb20vYmxvZy8yMDA2L3RlY2huaWNhbC90YWJsZS1yb3ctb2Zmc2V0dG9wLWJ1Zy1pbi1zYWZhcmkvCiAgICAgICAgICAgIHRoZSBzb2x1dGlvbiBpcyBsaWtld2lzZSBub3RlZCB0aGVyZSwgZ3JhYiB0aGUgb2Zmc2V0IG9mIGEgdGFibGUgY2VsbCBpbiB0aGUgcm93IC0gdGhlIGZpcnN0Q2hpbGQuCiAgICAgICAgICAgIG5vdGUgdGhhdCBmaXJlZm94IHdpbGwgcmV0dXJuIGEgdGV4dCBub2RlIGFzIGEgZmlyc3QgY2hpbGQsIHNvIGRlc2lnbmluZyBhIG1vcmUgdGhvcm91Z2gKICAgICAgICAgICAgc29sdXRpb24gbWF5IG5lZWQgdG8gdGFrZSB0aGF0IGludG8gYWNjb3VudCwgZm9yIG5vdyB0aGlzIHNlZW1zIHRvIHdvcmsgaW4gZmlyZWZveCwgc2FmYXJpLCBpZSAqLwogICAgICAgICAgICBlID0gZS5maXJzdENoaWxkOyAvLyBhIHRhYmxlIGNlbGwKICAgICAgICB9CgogICAgICAgIHdoaWxlIChlLm9mZnNldFBhcmVudCl7CiAgICAgICAgICAgIGxlZnQgKz0gZS5vZmZzZXRMZWZ0OwogICAgICAgICAgICB0b3AgICs9IGUub2Zmc2V0VG9wOwogICAgICAgICAgICBlICAgICA9IGUub2Zmc2V0UGFyZW50OwogICAgICAgIH0KCiAgICAgICAgbGVmdCArPSBlLm9mZnNldExlZnQ7CiAgICAgICAgdG9wICArPSBlLm9mZnNldFRvcDsKCiAgICAgICAgcmV0dXJuIHt4OmxlZnQsIHk6dG9wfTsKICAgIH0sCgogICAgbW91c2Vtb3ZlOiBmdW5jdGlvbihldikgewogICAgICAgIGlmIChqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBkcmFnT2JqID0galF1ZXJ5KGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0KTsKICAgICAgICB2YXIgY29uZmlnID0galF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS50YWJsZURuRENvbmZpZzsKICAgICAgICB2YXIgbW91c2VQb3MgPSBqUXVlcnkudGFibGVEbkQubW91c2VDb29yZHMoZXYpOwogICAgICAgIHZhciB5ID0gbW91c2VQb3MueSAtIGpRdWVyeS50YWJsZURuRC5tb3VzZU9mZnNldC55OwogICAgICAgIC8vYXV0byBzY3JvbGwgdGhlIHdpbmRvdwoJICAgIHZhciB5T2Zmc2V0ID0gd2luZG93LnBhZ2VZT2Zmc2V0OwoJIAlpZiAoZG9jdW1lbnQuYWxsKSB7CgkgICAgICAgIC8vIFdpbmRvd3MgdmVyc2lvbgoJICAgICAgICAvL3lPZmZzZXQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuY29tcGF0TW9kZSAhPSAndW5kZWZpbmVkJyAmJgoJICAgICAgICAgICAgIGRvY3VtZW50LmNvbXBhdE1vZGUgIT0gJ0JhY2tDb21wYXQnKSB7CgkgICAgICAgICAgIHlPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5ICE9ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgIHlPZmZzZXQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkgICAgICAgIH0KCgkgICAgfQoJCSAgICAKCQlpZiAobW91c2VQb3MueS15T2Zmc2V0IDwgY29uZmlnLnNjcm9sbEFtb3VudCkgewoJICAgIAl3aW5kb3cuc2Nyb2xsQnkoMCwgLWNvbmZpZy5zY3JvbGxBbW91bnQpOwoJICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgPyB3aW5kb3cuaW5uZXJIZWlnaHQKICAgICAgICAgICAgICAgICAgICA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDogZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgIGlmICh3aW5kb3dIZWlnaHQtKG1vdXNlUG9zLnkteU9mZnNldCkgPCBjb25maWcuc2Nyb2xsQW1vdW50KSB7CiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgY29uZmlnLnNjcm9sbEFtb3VudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICAgICBpZiAoeSAhPSBqUXVlcnkudGFibGVEbkQub2xkWSkgewogICAgICAgICAgICAvLyB3b3JrIG91dCBpZiB3ZSdyZSBnb2luZyB1cCBvciBkb3duLi4uCiAgICAgICAgICAgIHZhciBtb3ZpbmdEb3duID0geSA+IGpRdWVyeS50YWJsZURuRC5vbGRZOwogICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICBqUXVlcnkudGFibGVEbkQub2xkWSA9IHk7CiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc3R5bGUgdG8gc2hvdyB3ZSdyZSBkcmFnZ2luZwoJCQlpZiAoY29uZmlnLm9uRHJhZ0NsYXNzKSB7CgkJCQlkcmFnT2JqLmFkZENsYXNzKGNvbmZpZy5vbkRyYWdDbGFzcyk7CgkJCX0gZWxzZSB7CgkgICAgICAgICAgICBkcmFnT2JqLmNzcyhjb25maWcub25EcmFnU3R5bGUpOwoJCQl9CiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG92ZXIgYSByb3cgdGhlbiBtb3ZlIHRoZSBkcmFnZ2VkIHJvdyB0byB0aGVyZSBzbyB0aGF0IHRoZSB1c2VyIHNlZXMgdGhlCiAgICAgICAgICAgIC8vIGVmZmVjdCBkeW5hbWljYWxseQogICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IGpRdWVyeS50YWJsZURuRC5maW5kRHJvcFRhcmdldFJvdyhkcmFnT2JqLCB5KTsKICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8gd29ycnkgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIFRCT0RJRVMKICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdEb3duICYmIGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0ICE9IGN1cnJlbnRSb3cpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCwgY3VycmVudFJvdy5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgbW92aW5nRG93biAmJiBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCAhPSBjdXJyZW50Um93KSB7CiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QsIGN1cnJlbnRSb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKiBXZSdyZSBvbmx5IHdvcnJpZWQgYWJvdXQgdGhlIHkgcG9zaXRpb24gcmVhbGx5LCBiZWNhdXNlIHdlIGNhbiBvbmx5IG1vdmUgcm93cyB1cCBhbmQgZG93biAqLwogICAgZmluZERyb3BUYXJnZXRSb3c6IGZ1bmN0aW9uKGRyYWdnZWRSb3csIHkpIHsKICAgICAgICB2YXIgcm93cyA9IGpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGUucm93czsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8cm93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcm93ID0gcm93c1tpXTsKICAgICAgICAgICAgdmFyIHJvd1kgICAgPSB0aGlzLmdldFBvc2l0aW9uKHJvdykueTsKICAgICAgICAgICAgdmFyIHJvd0hlaWdodCA9IHBhcnNlSW50KHJvdy5vZmZzZXRIZWlnaHQpLzI7CiAgICAgICAgICAgIGlmIChyb3cub2Zmc2V0SGVpZ2h0ID09IDApIHsKICAgICAgICAgICAgICAgIHJvd1kgPSB0aGlzLmdldFBvc2l0aW9uKHJvdy5maXJzdENoaWxkKS55OwogICAgICAgICAgICAgICAgcm93SGVpZ2h0ID0gcGFyc2VJbnQocm93LmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0KS8yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgYWx3YXlzIGhhdmUgdG8gaW5zZXJ0IGJlZm9yZSwgd2UgbmVlZCB0byBvZmZzZXQgdGhlIGhlaWdodCBhIGJpdAogICAgICAgICAgICBpZiAoKHkgPiByb3dZIC0gcm93SGVpZ2h0KSAmJiAoeSA8IChyb3dZICsgcm93SGVpZ2h0KSkpIHsKICAgICAgICAgICAgICAgIC8vIHRoYXQncyB0aGUgcm93IHdlJ3JlIG92ZXIKCQkJCS8vIElmIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgcm93LCBpZ25vcmUgaXQKCQkJCWlmIChyb3cgPT0gZHJhZ2dlZFJvdykge3JldHVybiBudWxsO30KICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLnRhYmxlRG5EQ29uZmlnOwogICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkFsbG93RHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25BbGxvd0Ryb3AoZHJhZ2dlZFJvdywgcm93KSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJCQkJLy8gSWYgYSByb3cgaGFzIG5vZHJvcCBjbGFzcywgdGhlbiBkb24ndCBhbGxvdyBkcm9wcGluZyAoaW5zcGlyZWQgYnkgSm9obiBUYXJyIGFuZCBGYW1pYykKICAgICAgICAgICAgICAgICAgICB2YXIgbm9kcm9wID0galF1ZXJ5KHJvdykuaGFzQ2xhc3MoIm5vZHJvcCIpOwogICAgICAgICAgICAgICAgICAgIGlmICghIG5vZHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIG1vdXNldXA6IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAoalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSAmJiBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCkgewogICAgICAgICAgICB2YXIgZHJvcHBlZFJvdyA9IGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0OwogICAgICAgICAgICB2YXIgY29uZmlnID0galF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS50YWJsZURuRENvbmZpZzsKICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGRyYWdPYmplY3QsIHRoZW4gd2UgbmVlZCB0byByZWxlYXNlIGl0LAogICAgICAgICAgICAvLyBUaGUgcm93IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbW92ZWQgdG8gdGhlIHJpZ2h0IHBsYWNlIHNvIHdlIGp1c3QgcmVzZXQgc3R1ZmYKCQkJaWYgKGNvbmZpZy5vbkRyYWdDbGFzcykgewoJICAgICAgICAgICAgalF1ZXJ5KGRyb3BwZWRSb3cpLnJlbW92ZUNsYXNzKGNvbmZpZy5vbkRyYWdDbGFzcyk7CgkJCX0gZWxzZSB7CgkgICAgICAgICAgICBqUXVlcnkoZHJvcHBlZFJvdykuY3NzKGNvbmZpZy5vbkRyb3BTdHlsZSk7CgkJCX0KICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QgICA9IG51bGw7CiAgICAgICAgICAgIGlmIChjb25maWcub25Ecm9wKSB7CiAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBvbkRyb3AgbWV0aG9kIGlmIHRoZXJlIGlzIG9uZQogICAgICAgICAgICAgICAgY29uZmlnLm9uRHJvcChqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLCBkcm9wcGVkUm93KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlID0gbnVsbDsgLy8gbGV0IGdvIG9mIHRoZSB0YWJsZSB0b28KICAgICAgICB9CiAgICB9LAoKICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS50YWJsZURuRC5zZXJpYWxpemVUYWJsZShqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIkVycm9yOiBObyBUYWJsZSBpZCBzZXQsIHlvdSBuZWVkIHRvIHNldCBhbiBpZCBvbiB5b3VyIHRhYmxlIGFuZCBldmVyeSByb3ciOwogICAgICAgIH0KICAgIH0sCgoJc2VyaWFsaXplVGFibGU6IGZ1bmN0aW9uKHRhYmxlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgIHZhciB0YWJsZUlkID0gdGFibGUuaWQ7CiAgICAgICAgdmFyIHJvd3MgPSB0YWJsZS5yb3dzOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxyb3dzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgcmVzdWx0ICs9ICImIjsKICAgICAgICAgICAgdmFyIHJvd0lkID0gcm93c1tpXS5pZDsKICAgICAgICAgICAgaWYgKHJvd0lkICYmIHJvd0lkICYmIHRhYmxlLnRhYmxlRG5EQ29uZmlnICYmIHRhYmxlLnRhYmxlRG5EQ29uZmlnLnNlcmlhbGl6ZVJlZ2V4cCkgewogICAgICAgICAgICAgICAgcm93SWQgPSByb3dJZC5tYXRjaCh0YWJsZS50YWJsZURuRENvbmZpZy5zZXJpYWxpemVSZWdleHApWzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXN1bHQgKz0gdGFibGVJZCArICdbXT0nICsgcm93SWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7Cgl9LAoKCXNlcmlhbGl6ZVRhYmxlczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdGhpcyBpcyBub3cgYm91bmQgdG8gZWFjaCBtYXRjaGluZyB0YWJsZQoJCQlyZXN1bHQgKz0galF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZVRhYmxlKHRoaXMpOwoJCX0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Cgp9CgpqUXVlcnkuZm4uZXh0ZW5kKAoJewoJCXRhYmxlRG5EIDogalF1ZXJ5LnRhYmxlRG5ELmJ1aWxkLAoJCXRhYmxlRG5EVXBkYXRlIDogalF1ZXJ5LnRhYmxlRG5ELnVwZGF0ZVRhYmxlcywKCQl0YWJsZURuRFNlcmlhbGl6ZTogalF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZVRhYmxlcwoJfQopOw== ###PACKDATA,FILE_END,/pluginbuddy/js/tablednd.js,importbuddy/pluginbuddy/js/tablednd.js ###PACKDATA,FILE_START,/pluginbuddy/js/tooltip.js,importbuddy/pluginbuddy/js/tooltip.js LyoKICogalF1ZXJ5IFRvb2x0aXAgcGx1Z2luIDEuMwogKgogKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi10b29sdGlwLwogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvVG9vbHRpcAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IErDtnJuIFphZWZmZXJlcgogKgogKiAkSWQ6IGpxdWVyeS50b29sdGlwLmpzIDU3NDEgMjAwOC0wNi0yMSAxNToyMjoxNlogam9lcm4uemFlZmZlcmVyICQKICogCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqLwogCiAKIAogCiBpZiAoICd1bmRlZmluZWQnID09IHR5cGVvZiBqUXVlcnkuYnJvd3NlciApIHsKCWpRdWVyeS5icm93c2VyPXt9OyhmdW5jdGlvbigpe2pRdWVyeS5icm93c2VyLm1zaWU9ZmFsc2U7CglqUXVlcnkuYnJvd3Nlci52ZXJzaW9uPTA7aWYobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoWzAtOV0rKVwuLykpewoJalF1ZXJ5LmJyb3dzZXIubXNpZT10cnVlO2pRdWVyeS5icm93c2VyLnZlcnNpb249UmVnRXhwLiQxO319KSgpOwp9CiAKIDsoZnVuY3Rpb24oJCl7dmFyIGhlbHBlcj17fSxjdXJyZW50LHRpdGxlLHRJRCxJRT0kLmJyb3dzZXIubXNpZSYmL01TSUVccyg1XC41fDZcLikvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdHJhY2s9ZmFsc2U7JC50b29sdGlwPXtibG9ja2VkOmZhbHNlLGRlZmF1bHRzOntkZWxheToyMDAsZmFkZTpmYWxzZSxzaG93VVJMOnRydWUsZXh0cmFDbGFzczoiIix0b3A6MTUsbGVmdDoxNSxpZDoidG9vbHRpcCJ9LGJsb2NrOmZ1bmN0aW9uKCl7JC50b29sdGlwLmJsb2NrZWQ9ISQudG9vbHRpcC5ibG9ja2VkO319OyQuZm4uZXh0ZW5kKHt0b29sdGlwOmZ1bmN0aW9uKHNldHRpbmdzKXtzZXR0aW5ncz0kLmV4dGVuZCh7fSwkLnRvb2x0aXAuZGVmYXVsdHMsc2V0dGluZ3MpO2NyZWF0ZUhlbHBlcihzZXR0aW5ncyk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQuZGF0YSh0aGlzLCJ0b29sdGlwIixzZXR0aW5ncyk7dGhpcy50T3BhY2l0eT1oZWxwZXIucGFyZW50LmNzcygib3BhY2l0eSIpO3RoaXMudG9vbHRpcFRleHQ9dGhpcy50aXRsZTskKHRoaXMpLnJlbW92ZUF0dHIoInRpdGxlIik7dGhpcy5hbHQ9IiI7fSkubW91c2VvdmVyKHNhdmUpLm1vdXNlb3V0KGhpZGUpLmNsaWNrKGhpZGUpO30sZml4UE5HOklFP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBpbWFnZT0kKHRoaXMpLmNzcygnYmFja2dyb3VuZEltYWdlJyk7aWYoaW1hZ2UubWF0Y2goL151cmxcKFsiJ10/KC4qXC5wbmcpWyInXT9cKSQvaSkpe2ltYWdlPVJlZ0V4cC4kMTskKHRoaXMpLmNzcyh7J2JhY2tncm91bmRJbWFnZSc6J25vbmUnLCdmaWx0ZXInOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihlbmFibGVkPXRydWUsIHNpemluZ01ldGhvZD1jcm9wLCBzcmM9JyIraW1hZ2UrIicpIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgcG9zaXRpb249JCh0aGlzKS5jc3MoJ3Bvc2l0aW9uJyk7aWYocG9zaXRpb24hPSdhYnNvbHV0ZScmJnBvc2l0aW9uIT0ncmVsYXRpdmUnKSQodGhpcykuY3NzKCdwb3NpdGlvbicsJ3JlbGF0aXZlJyk7fSk7fX0pO306ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LHVuZml4UE5HOklFP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnZmlsdGVyJzonJyxiYWNrZ3JvdW5kSW1hZ2U6Jyd9KTt9KTt9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fSxoaWRlV2hlbkVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQodGhpcylbJCh0aGlzKS5odG1sKCk/InNob3ciOiJoaWRlIl0oKTt9KTt9LHVybDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHIoJ2hyZWYnKXx8dGhpcy5hdHRyKCdzcmMnKTt9fSk7ZnVuY3Rpb24gY3JlYXRlSGVscGVyKHNldHRpbmdzKXtpZihoZWxwZXIucGFyZW50KXJldHVybjtoZWxwZXIucGFyZW50PSQoJzxkaXYgaWQ9Iicrc2V0dGluZ3MuaWQrJyI+PGgzPjwvaDM+PGRpdiBjbGFzcz0iYm9keSI+PC9kaXY+PGRpdiBjbGFzcz0idXJsIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5oaWRlKCk7aWYoJC5mbi5iZ2lmcmFtZSloZWxwZXIucGFyZW50LmJnaWZyYW1lKCk7aGVscGVyLnRpdGxlPSQoJ2gzJyxoZWxwZXIucGFyZW50KTtoZWxwZXIuYm9keT0kKCdkaXYuYm9keScsaGVscGVyLnBhcmVudCk7aGVscGVyLnVybD0kKCdkaXYudXJsJyxoZWxwZXIucGFyZW50KTt9ZnVuY3Rpb24gc2V0dGluZ3MoZWxlbWVudCl7cmV0dXJuICQuZGF0YShlbGVtZW50LCJ0b29sdGlwIik7fWZ1bmN0aW9uIGhhbmRsZShldmVudCl7aWYoc2V0dGluZ3ModGhpcykuZGVsYXkpdElEPXNldFRpbWVvdXQoc2hvdyxzZXR0aW5ncyh0aGlzKS5kZWxheSk7ZWxzZQpzaG93KCk7dHJhY2s9ISFzZXR0aW5ncyh0aGlzKS50cmFjazskKGRvY3VtZW50LmJvZHkpLmJpbmQoJ21vdXNlbW92ZScsdXBkYXRlKTt1cGRhdGUoZXZlbnQpO31mdW5jdGlvbiBzYXZlKCl7aWYoJC50b29sdGlwLmJsb2NrZWR8fHRoaXM9PWN1cnJlbnR8fCghdGhpcy50b29sdGlwVGV4dCYmIXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyKSlyZXR1cm47Y3VycmVudD10aGlzO3RpdGxlPXRoaXMudG9vbHRpcFRleHQ7aWYoc2V0dGluZ3ModGhpcykuYm9keUhhbmRsZXIpe2hlbHBlci50aXRsZS5oaWRlKCk7dmFyIGJvZHlDb250ZW50PXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyLmNhbGwodGhpcyk7aWYoYm9keUNvbnRlbnQubm9kZVR5cGV8fGJvZHlDb250ZW50LmpxdWVyeSl7aGVscGVyLmJvZHkuZW1wdHkoKS5hcHBlbmQoYm9keUNvbnRlbnQpfWVsc2V7aGVscGVyLmJvZHkuaHRtbChib2R5Q29udGVudCk7fWhlbHBlci5ib2R5LnNob3coKTt9ZWxzZSBpZihzZXR0aW5ncyh0aGlzKS5zaG93Qm9keSl7dmFyIHBhcnRzPXRpdGxlLnNwbGl0KHNldHRpbmdzKHRoaXMpLnNob3dCb2R5KTtoZWxwZXIudGl0bGUuaHRtbChwYXJ0cy5zaGlmdCgpKS5zaG93KCk7aGVscGVyLmJvZHkuZW1wdHkoKTtmb3IodmFyIGk9MCxwYXJ0OyhwYXJ0PXBhcnRzW2ldKTtpKyspe2lmKGk+MCloZWxwZXIuYm9keS5hcHBlbmQoIjxici8+Iik7aGVscGVyLmJvZHkuYXBwZW5kKHBhcnQpO31oZWxwZXIuYm9keS5oaWRlV2hlbkVtcHR5KCk7fWVsc2V7aGVscGVyLnRpdGxlLmh0bWwodGl0bGUpLnNob3coKTtoZWxwZXIuYm9keS5oaWRlKCk7fWlmKHNldHRpbmdzKHRoaXMpLnNob3dVUkwmJiQodGhpcykudXJsKCkpaGVscGVyLnVybC5odG1sKCQodGhpcykudXJsKCkucmVwbGFjZSgnaHR0cDovLycsJycpKS5zaG93KCk7ZWxzZQpoZWxwZXIudXJsLmhpZGUoKTtoZWxwZXIucGFyZW50LmFkZENsYXNzKHNldHRpbmdzKHRoaXMpLmV4dHJhQ2xhc3MpO2lmKHNldHRpbmdzKHRoaXMpLmZpeFBORyloZWxwZXIucGFyZW50LmZpeFBORygpO2hhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fWZ1bmN0aW9uIHNob3coKXt0SUQ9bnVsbDtpZigoIUlFfHwhJC5mbi5iZ2lmcmFtZSkmJnNldHRpbmdzKGN1cnJlbnQpLmZhZGUpe2lmKGhlbHBlci5wYXJlbnQuaXMoIjphbmltYXRlZCIpKWhlbHBlci5wYXJlbnQuc3RvcCgpLnNob3coKS5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSxjdXJyZW50LnRPcGFjaXR5KTtlbHNlCmhlbHBlci5wYXJlbnQuaXMoJzp2aXNpYmxlJyk/aGVscGVyLnBhcmVudC5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSxjdXJyZW50LnRPcGFjaXR5KTpoZWxwZXIucGFyZW50LmZhZGVJbihzZXR0aW5ncyhjdXJyZW50KS5mYWRlKTt9ZWxzZXtoZWxwZXIucGFyZW50LnNob3coKTt9dXBkYXRlKCk7fWZ1bmN0aW9uIHVwZGF0ZShldmVudCl7aWYoJC50b29sdGlwLmJsb2NrZWQpcmV0dXJuO2lmKGV2ZW50JiZldmVudC50YXJnZXQudGFnTmFtZT09Ik9QVElPTiIpe3JldHVybjt9aWYoIXRyYWNrJiZoZWxwZXIucGFyZW50LmlzKCI6dmlzaWJsZSIpKXskKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlJyx1cGRhdGUpfWlmKGN1cnJlbnQ9PW51bGwpeyQoZG9jdW1lbnQuYm9keSkudW5iaW5kKCdtb3VzZW1vdmUnLHVwZGF0ZSk7cmV0dXJuO31oZWxwZXIucGFyZW50LnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1yaWdodCIpLnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTt2YXIgbGVmdD1oZWxwZXIucGFyZW50WzBdLm9mZnNldExlZnQ7dmFyIHRvcD1oZWxwZXIucGFyZW50WzBdLm9mZnNldFRvcDtpZihldmVudCl7bGVmdD1ldmVudC5wYWdlWCtzZXR0aW5ncyhjdXJyZW50KS5sZWZ0O3RvcD1ldmVudC5wYWdlWStzZXR0aW5ncyhjdXJyZW50KS50b3A7dmFyIHJpZ2h0PSdhdXRvJztpZihzZXR0aW5ncyhjdXJyZW50KS5wb3NpdGlvbkxlZnQpe3JpZ2h0PSQod2luZG93KS53aWR0aCgpLWxlZnQ7bGVmdD0nYXV0byc7fWhlbHBlci5wYXJlbnQuY3NzKHtsZWZ0OmxlZnQscmlnaHQ6cmlnaHQsdG9wOnRvcH0pO312YXIgdj12aWV3cG9ydCgpLGg9aGVscGVyLnBhcmVudFswXTtpZih2Lngrdi5jeDxoLm9mZnNldExlZnQraC5vZmZzZXRXaWR0aCl7bGVmdC09aC5vZmZzZXRXaWR0aCsyMCtzZXR0aW5ncyhjdXJyZW50KS5sZWZ0O2hlbHBlci5wYXJlbnQuY3NzKHtsZWZ0OmxlZnQrJ3B4J30pLmFkZENsYXNzKCJ2aWV3cG9ydC1yaWdodCIpO31pZih2Lnkrdi5jeTxoLm9mZnNldFRvcCtoLm9mZnNldEhlaWdodCl7dG9wLT1oLm9mZnNldEhlaWdodCsyMCtzZXR0aW5ncyhjdXJyZW50KS50b3A7aGVscGVyLnBhcmVudC5jc3Moe3RvcDp0b3ArJ3B4J30pLmFkZENsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTt9fWZ1bmN0aW9uIHZpZXdwb3J0KCl7cmV0dXJue3g6JCh3aW5kb3cpLnNjcm9sbExlZnQoKSx5OiQod2luZG93KS5zY3JvbGxUb3AoKSxjeDokKHdpbmRvdykud2lkdGgoKSxjeTokKHdpbmRvdykuaGVpZ2h0KCl9O31mdW5jdGlvbiBoaWRlKGV2ZW50KXtpZigkLnRvb2x0aXAuYmxvY2tlZClyZXR1cm47aWYodElEKWNsZWFyVGltZW91dCh0SUQpO2N1cnJlbnQ9bnVsbDt2YXIgdHNldHRpbmdzPXNldHRpbmdzKHRoaXMpO2Z1bmN0aW9uIGNvbXBsZXRlKCl7aGVscGVyLnBhcmVudC5yZW1vdmVDbGFzcyh0c2V0dGluZ3MuZXh0cmFDbGFzcykuaGlkZSgpLmNzcygib3BhY2l0eSIsIiIpO31pZigoIUlFfHwhJC5mbi5iZ2lmcmFtZSkmJnRzZXR0aW5ncy5mYWRlKXtpZihoZWxwZXIucGFyZW50LmlzKCc6YW5pbWF0ZWQnKSloZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlVG8odHNldHRpbmdzLmZhZGUsMCxjb21wbGV0ZSk7ZWxzZQpoZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlT3V0KHRzZXR0aW5ncy5mYWRlLGNvbXBsZXRlKTt9ZWxzZQpjb21wbGV0ZSgpO2lmKHNldHRpbmdzKHRoaXMpLmZpeFBORyloZWxwZXIucGFyZW50LnVuZml4UE5HKCk7fX0pKGpRdWVyeSk7Cg== ###PACKDATA,FILE_END,/pluginbuddy/js/tooltip.js,importbuddy/pluginbuddy/js/tooltip.js ###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/circle.gif,importbuddy/pluginbuddy/images/minicolors/circle.gif R0lGODlhCwALAJECAAAAAP///////wAAACH5BAEAAAIALAAAAAALAAsAAAIflINoG+AeGFgGxEaXxVns2X2dh4CZJXBadDxQlihGAQA7 ###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/circle.gif,importbuddy/pluginbuddy/images/minicolors/circle.gif ###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/gradient.png,importbuddy/pluginbuddy/images/minicolors/gradient.png iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHotAACAlQAA+NcAAIhSAABxRQAA6mYAADkHAAAh+QMnhVYAACf5SURBVHja7H3LjuRIkqQaJ+e0wB72T/s7+w/qOKduoLBd3ZVZmeEP0z0UjSUUiqqpuUf1AoMJIBDuTjrdwyhUERVVMzZ3/y8z+99m9jAz33/7/hs97vb7zzv7qff54n7HNncv7Vc9nnjuf/Ixsv2i7y/328eii/EMP9vd5fjvr3cc4/Fa793dvffe+/P57Pf73b99+9b/8pe/9C+99/9jZv9rB8Dsn3kWT9RsQCIgzE7Us3r8le+Ig/fqMRKAp8cAEPAY4/Gy93l2cY393P0J+/nYBtvH8+e+rfXe246cBr/+eDz68/m0+/3uHx8f9v37d/v69av9/PPP/tNPP9lf//pX+9J7f+ygenzCSfPZgLxz0l48oeEvXKVv7fPisU4/v28yM7O2/5q7t+A5P3Y8hvq772/u3nYQjdePfXbgbDuYxmv+fD7t+Xza4/Gwx+Ph9/vdbreb3W43//79u/3666/2z3/+0/72t7/5Tz/9ZN++fbMv8A+Vfmj/ZmZtf63hgLXWVo7z0ueOgQ0enwY9+MH9Kp99+Vw8wcG2bQc+7+cF8BgcC4957EevNwDRRgByAFYbQILIdIDI3e35fFrvvY2/j8ejPR6P7X6/++1284+Pj/bjxw/79u1b+/XXX9s//vGP9ve//91+/vnn9ng82pfe+8qJ5YH1FeAEJ28KEPpsg5NyArEA3+lEtdaOE8MXQvBZDBKbAYv3w+PhNnhsapu7W2tt671ba63vf1vvPQQWRaUjUu2/B9D2c34C0YhSO5B8j1B9/9uez2e73++2/247BfrXr1/tX//6l/3yyy/2yy+/+NevX+35fNoUWDAwKZCKESYEZyGCpSdeAEnRTRW4YSQKgJQBy+HxRkHUOZrtwEGAMICOY/wRhE60NsDTB7DGMZHuzMx778Zgcnd7PB4DWPZ8Pn0A6na79dvtZvf7fbvf7/bbb78dwPr111/t69ev/ttvv1nvfQqs8Y/5Im2VIluR3sag+uQ7toDi5PcQ39FEVLqALgNW8HgDJPWE0i5gIp00ANSZ0sxs0BkCyDBCjef7376/NgT51ns/IhYCCzXV/X63j48P//HjR//4+Gj3+719+/bNxu/379/9drv9DqwoUlQBpehnIk6jSOSr+ir4jnysCCDZ+46T1FrDk+2tNcOLESN6AKzTRwFQZsByEteK7hrS3R6ZBngaRizQUcfj5/PZdh01QDWe266p2uPxsPv93m632/i179+/t99++619fHwMrdV+/PjRbrebPR6PZmZaY1WFNdFkKwCqLYjriI48SCAqkU5RldJEXtBLBhGpR8AiACGNdd4v0EuH+GZggd7aRJTqCKRBhyN6YYQaVLhrqra/tokscEQs+/j4sG/fvg0hbz9+/LDb7eaPx8Pc/UKFHlz1L9GkONk+iXQZ9UnwKKApQNIxWyGVtxkV9t7bHsGOyBYAq+3jzGDCCHWIa6C+Jva9ZHs7tWEE25D6CEwDaObu2wDW8/n0XVPZ4/FAkLUBKgTWANK3b9/6x8fHtuuwASy/UOEMT8paSFJzn2WEETjpODK4Bd6PR1GVhT1mZgIUjhdYkt35hOKG3cD7oDVw8pYYdOOYw7AkXXWiwmEbDDpES2Hoqp3ybKfAE/09n8+2R6p2v9/brrdOVIiPPz4+2sfHhz0ej+3xePQRGTliTb2fLErR1e0FjeQB2CLqi7Ix3keefBF5HPZzYQd4JNCVfzRokSmTQDYcbtZU214iMQBiI5G+Daug//5zimSwDS2Ek0AHj2oYn0dk6r0fgn3XVna/3/1+v/fn87kNU3QI+X2bff/+vd/vd3s8HkekvGisiVGYgSoDVEsiT2iyigzsopeQgnbvx/Gqx+PTtgiATQBGelCUwTUGDBxzUxkd6qMByID6DEouaG6iN9VRoO9AQyBhJriBV3VQ4W6EbgJYdr/f++Px2G63G2aJvgNxZJI+wH0CFmc8k2wrjXJIQXBCj9d3s/L0VgDJBcScKJzMIG0BuNJ5FKkuEXCAqxClsowuMi3VYxbiJ62EYAIgDVrrHLH2KIXaagBpRCnctiGwBqD2yLXtUWgAaQAMjdIDgB8fHw4R96yxXgBV5rAfJ1fQravPGumyos8MaALUlwwPwYRCXgGNdZWyDlico/YR9oADAE7uusr20DkHf8r2E8flmAFMh+cbRqjn83lsez6f296NcESpkQkOnXS/3we42g6utkerfr/ffddhbQflQaPj89y9lahwxesKKC0T4XiVSwOTNJLyiDLt1DIdJQS82rYSlSLfaRNU2MAaQOd9i7K9AUb0o0a0IothwzLN8/kc20YmeGis/bUTre1Z4TYi1g4wu91uDr6X7zRruw5rkgoDEKlolUWKCCAVoEURxZSQJ8CYMk5VticikQEFSkc9K/4yeJSOQ0obQh6jFdoSqLcITJ0tBQTT0FXjdbQUIAvsz+ezuXvbW1+s9953CtzAbrDb7dZHlENb4na79cfjsaFFMT5jnI+S3VDcJwJPRG2evB+BEkU4BTKPaJIozIPOAUWBzlEIvxcBS+2LOglFuTM4oeRy2m8/YRdLAbRVH71S6LSzdwUdC0iPB609Hg9398NuGIVnduL3bUcHBEdPM+vTiFWNYBOgWGYh0L6H97MQiZTx6YHYNnDLEUwciYztAlWjE/ttlME5ZXlHJBrWA9b5JhGLHfROADuAhNFrWAoAtpHFdXcfAh47Ghr0YA09tqGRumutkwE7LA4z2xBYUQmkUqbxLCIJY1JRIeopT7SUKUCojI7KMxYArqExySZn1gfFAAs01sm7wmwPTE9JjQCyEaUYZNu+30AYgqcrd33fZxuFZtZYe4RyyBjb7XbroMl8aCoE6gDr+O5fVIE0A0zv3aGJ7wjp+2tH9rJbB6ayqQb+Az8fINn7jxToOCPzSG8RxTXhtl/cdwCnTwT7MR4ELG6oc5HtObnpp/4poJWTFTGi0XjfSO/JAPVdQw2v6jnApOyGYTOAI98AiIdbPxx4LFbvugw7Kw5cfBGV+ik1BtX6qB32orH4GIKO0ZJQ1MmRT1Irl0w4SkJDnZHmMWETXLwxtgYIdJjhdUGF3IhnAJgjGRj6CemPxLtDG8ygvw6txdtOhaOp73gO9oPt4NqGyN8j0jaAOOgSW5VHZOMCOFPhTF8p51s994QOmfqUPvJApB/utqBJRX0bTBy4RC/x/GRaMkgmlsJF3KOFEBidbG4iNSItbnDS0EbAks62U1pD8xTAZgAutBs6UJ7v+2yot0D0H/qLitqnwvnQsFVgqZpd9FxZES0CUKSjqLxigYnJ2VhEmS6EOReAT811rL8WgLXh8Vg3ofWwA+mSNQLINmExdDBFEWRSvA/AjegzBHvkY8H+p6gEYv6IbFjGuUQsprAqLSYgs4mQtwmNeUCfyvl2bo6j6KLc9YstwPvS+0xYAxcdFbjsjaLVoHjpvKPdgJoKAMcaC2fXODbwPZ9PN7OGzvjYd4js4aADiNpuJRwZ6PCp0LLgRIUK7meNNfOZEjBkJRaOVJdSSkSTIqM7rgZBca5qjMpZh6Jw5+iV1fJWtqFews8D7WSsozgqiVrhAEDn/SBadSjpDCAeVEjUeNo2DFLY5rhtHHOPdCNK+U6XGwD/bDfMIlY1WhE4PHHNI4A1dYxAU4XHUIYoHwMjmSpCZ6BT9Dd6pLDTYUxcIJpE6uukqzpMdjhto8cdvKpOvesH3cF+h/OOtIglHnDtj5LOHgEdmgZP+yEFAtuUqLAFnQtyP8iyuMB8WBJgR1yyxgGAkakFwLlENkFpRkLc4AQbgc0n+51oblAOfO4lewQKc4peWFh2ENzOzXy4DaIWuutO7cdD6xx0ho+HVTDEOLxnFKbZUjg04E6Bg2o9MIevdgObo4UIFWmrBuhN9QtrGQQI+EPsVXUVEVkHBd7UpeeKIo8JbYXFYRP2ggmLAT2ok8M+ohmA01QkwuiFpihEqUYRa2Mq3CMNUmFjWtyp7JQtDsCOrHAHU8dmweGZjYwSorSdSjpF6otqgCXARTQ5iUycBQ7dwVkh7yd9LAYaG6WTDHD6GgOL/KqTjUBA6kpjsa1AuoofH5kgPwbnHUE3PCoGXaPCNb5/dDQ4jLFjQpSJ9xmwLAFVn4AtAowFYPGkM8ECC8Gw15wzFirhOLnkTdT4PAIbFIgjMDkbqUizkN1dtou+9Q7PO2WGG7bGoI8VAM0hCrGYd0oAnH0rBBOiKrUbkozPFwA3jWbZZwsgeTKBIXL2I+q1RNzPgHbyvYbmEdmeilJOFsXIFk009xnPA6TuBnyM2grfh1rqpLmoHnn6HlBQvui28b7xOWKisIxYF7tAgKklloGanOBFoLRk1ktEY5445JZkf1GdEBfQkBYD1sXIp7pQoXjM2R33sOO+LcoKdzBjScfJee9QG+SscPRnjcenyIbvo3LQhiCmHvsOLTMW2g0TuptFuAs4lI5SACRwc8lF+VZNUaYQ9TMtZYGQb0Hr8Ba0w1QfH5po2ApCsGMJp2OGBuDBiIVA29DvejwekgrBQkCN5ZCVnqgOaRLXi4DEb5yDlApLYCIxHwnxVyjPgga8GXg8oEDuS3dM8xNKPOk9thCGTqJJppbQX4Pow/sZ2wtAPyb621FjOTb3DbpCehs2whhLbPaDx2pSa4eGANSXijFi8f4GmEyUY6Jow3pHinoB1Ma1uARIDF6mxVeimQVCHP0tg8LyicbAuzpFL9jviF7Q/tKhsH0yQckQ7QAiJyo8KA0jFACpg9vuoiLg6MqTIXpcV6tUaNEMYUVbKu2f7RcBSWR/GTVeQJFto8euwMRZ57hyx7iRWMcGvosgB7P40GVDXOMx0I8S1Gg4E4eywE1RIWaFBJDDx+LskUE2to3pZSozBJDNs8IJpZ0a/9TJ3534sV9pG9sNTE0U9bB/yYVRe9nGrcojonDNUVkUUTSb6SoCz0Ws4zGSbQg6zgLlNnTY99c6l35GZCI6RN13lG6gG3YjmwGXw6xHrGx71uxHK6ZY5G5Tx4EFUUxFPVetLcEyQKps48JB5++EeuJSHcBtrLfAjmg41ii8iU6noKOuBuPno8MBvC+MbidLAnSd4TR/ZWUgaOm8vq6xotphdKJFS0oTGaAFYLKgCM0n10UHQ0aLbFq66HDwaMlF9Rqk2a40VqCrsCW57ye0K/CwxsIeLKKtC90hLY7C86DXPZrhhAvH/i+0Mjh6EQ2ySeqr4l3ZCGo61ax3KrMfPNFHHmgsfu+lyMxLA0WinCjPlaNOkQdLMZfIQ89PugomWaDzPhz1LTipJ10FNgQ+b1w7xONNjn8CJOspFvNUysEVoXONNel8UK3HvmAtmABGRrGtCC7V0WDsSzHdcQE9mFjBFoKiTAvsBiedhfbCKVoCHbH9cBLwAU3iMRCIbCOw/jqKyWhhiPmQp+yXHPe8VhgBYCWyiQxy9tcUpTGNFo7VAi2XUiE77qp7Qbjrp3mHSGdAb5sAlQQFWgoYXiArRKrifixTVoTICtFuONEpRCaHibK8aK7D3Mlxg4JtSbwHLTGhXprNoIkiV9BLlQEwshRc1ASjKV3Sn1JCP8r8gomopuwGKuEgWNhtv1Am05aIRsP34udHBgfgQQCdgKkoEj0tBJT9cVMEEzdPuFLhrDwza/KLAEZzDUfjXybW8X1oSRj3rcMqNU10MKi7MrRoHiF3JYCzfsr88H1oVSC10usnpx7pMrMb4DV23Q93HVeiYRrjKfmDEqF33Uk3Oq0WqHrcj4xY0KCmwqh9Zva3oNOauEOCV8Q7ao/EL1MWA9Of6njgRj4X7cdGRWjpwuNECIpUHkS+jQDNrTKYKXJDIEYsIz8Ko9RGbcUYlRymxWON0Fig49pb4pYpuEqhpsKqYRqUbFINlYh8SXcBeCzyoQJH3YLGPksoMivjXPQW7XeiuERHZRHqoEVw0Lnxj+2Fk/OO1IeuOWZ36HGx5hL7bwxAPK0DjO8AK1vJxSagU4150eKwFpRvLlYA2xFKZwn91YLPOhWTsYwzsxTgdiJhNIs0G0QJg5PEpRvOItEcPYEJdJPNwMMrKw8A9T/C0waAOmmeEcna7+WXksaKIs4sml0AtmgjqC4GGcnUcRSlUshW7noDB91EZuk0+cEFxbONEIl+ZyCJ/YymrV9KQ+TOG82W9ijikuNvgcbEi+k/MPJyVeEljVWIYiH4koJxtmZV1sulsj3LqFFEM349ctRN0aJ6zuBlW6FChaKDAd9zoSRhYLLxqaIXZ5ONi9M4NY1tDl5c1/Jb6r0NrOo2bpO53CcmAODqtkukigCnthGNZVEJqaHT+0KNhdqJhbly14nqTpYFLfxh7HFRDfGizSjCskiX20TUisCV2w3FTFD2ZbGPla02o3rXZ9FsITNUjX6RQGeLIRL6FkyYcCXsxW1LVCZ4cegJOMYOvIq+2Iajoi5aHXa+odPlQsXvwKsfTvR3q4p3dsSz5j++8SJ/KZt0Mlh0jCgaTWgwms4VaQwP9mui/yqNRASyTLybcNeV3trIGe9KwON+ogUGC9enY1BN8RSFqIpwMUrtfOfY17LCpI041EbBzGSV0cmisOipsgJFqrZi9X+kuinTYgJA8jhMd7iUJMyQOQGVTzIDieyGkz4iUc/Oe4dVbzZBh05FZ4/oTznxEljD5c6iUmQrDGc9obGmoh4CZEzFh8YyC3wsizI3Me39otPIdc78rBBYTBViZo4pK0LNI6RtRgC69E+hpQDH3sR0fKepXXwHi4bgIMA79Iixj4WPOxWjrxqrUjuMSjdqra2kPhjZBvgdwvmEAd15ZoKSpSAb1hD4Qo+5yh4ZmFFEEyCRjjyPI/tg4II3QZenLJPAPsZno2LypXKA27MVHVliKLshKwRPxbuKSgkoZRdnRndCw10ojyOiaitOIl00jT6kPWE/lEDF2eOgrsBuiKyHjagLb9WLJR0T9oOLzPVEjQN8SnO11oab31prDu77MErnGqvappzMPK4CzZXADmwJi6Z8BdrsYpAGNcx3gSXFexVkILw70h2e+KGbRNaIgn0LANRoRcBO+25KN4F+6sQiKFcODyu1G16xHxIDVa1Eo1aJ8cmxs2JytGJfVIy2aA6hinJEd0p/+cwgnbjrJhoDjaZfScCDFJH/B72u5kBmcxPUvAE1sfi0ul8UseQUeBLtbRKFZhNTLZh5YyrDg5MrJ66Kx9Iby05M9lwtYzSJYivg2qA+N8vSkO4syBJNUSG56CzAnZr1Tlnh6Mfax+J4PBr9IKot+VgVSyFccDaqNRZn9yhATgGzAKooWqkZOjh3sAUa5ZLdLYLM1DHIrnBlEzAQry93pNcGqwaeqBZ1GtCcUfXkdFqXqTCYfm6VVWMyAEZrZgWWRhM9QKlrn0U1sbAarzBzWbVPTNBwtSQR2wsq26YSUGQtyP0R5ERxFyqcPVa2h8iYnTLSU8Mle5IV5z2cqJoJ74Du1H6WzGbOKLMUkYIZzp5Qps9Ee0XMs3e1Eqn4GJn7zk2EahtMyjhFupHBcXZKrceZu47UucmI9Q4VfvJfZSuE0Yw0oCXlnFRDrWx7RU+xF5WBh+wG1Dboe3UwP7swQtuMFvE1BAr2YkU/qMHUtjKwVrRWBArVnCeOO41YybZoTXYLANlIY83mH34KsKIINekm5ULxBvTEBucmOhTYYO2Be99QsEcRKrMjXrIbXphqP5soMRXyiZg3RasqokW99up4yj4Q/fIl2syi1mT/6cSKV6IprlHBvmCwOLGpIKDmRXCTXykrnAjyCyWpGdAV0CjjM3hPGKHQkpjMal61Ilql0BzpLdHa0oniD8oTC3Hw1HY+tjJSp1SGnQ404/mwFPx8oy2eMCF11ytUyECyqp8ljhFRYaWmmIl4FxHKkt72ioeljMRNZamRcBelGgWWLTBfsU345C0xILhZT0THxmUdpZlGnRCSNxf2g9Rd7zjvLeppd73YbATIMt0FlDa1FqJIJ+qRlixZxHXFavuyqYwz6Yl3VYxG519M0PDo+yYTPGZlL3nBk9OeUWWJCtMidAYK9cWSfipTglropdPxsZk/MTgtG8hKJlh9raK5YKVlhzIQrliTaS+MKEq8MzU20eqy8RQuFO+RG09rjI5WmRaI95LznkYo3xdPE6CoUKFHi3cosKjOhYjiou/AV3kCqtmV3agzIQNXqxSnDe7uEGilMLsTq7+EoEt0Fy9LEFkNNko6YVY4A9ZouptRGO8HzxtZ/5dUO4lYYRbHa55y8Ve1xwRTuySgKDJmIMzmFWYTYC8aCBaNVYYrg0KKegJPn2Sfl/YZO995TYEQI5W9bDcks3iiKFJp+rPA85rpNBOTMyT1ZdqJVgEMPS7XyyCFES1q3OMEYFbsTioIVun7Clx1NYMZP2cjAW/BxInNzjekr9sNb04Bk6I5ocJSVHKx0GxgP6T/C1JhJGgrmip4LqMIZoUFw3QaibDLAxYekTqKoq3KJi/RS0yOUKUcL1PhZ80trHphKvIks3iiWUItiy4V8LzTUrPw+ibm53G/uSfU52w9FKiQPSZTAl2BhyZHRHXCnAor0+SjSDHRR+E6Ddl0MY5Y1W0ZZfp16e1wichkgZGs5TmkqmSbqwkbLC9YqwoAnjRitE1Eqct71HlJlgNQoG7u/jsVvhOhViOYJ2tofWbEUgD8jIj1KlVSppVGpUm2p7apblZ0wtMoJaZ0WVILtGRq/VljfTKwShpL2As+mZg6O36a7U2cd59NvCj6XS3SWMpVT7LHkOKo5SUCYIOJppca6OwYag4h02miuUIqjIDliRHqlanzZEOEWWHi9l8ilrp5wMTNP9FJkFm2QlaYeWxhVljVbOJ3KSuEC5QjVsggOzi6KMifzldrrSeF6OWI1SbT6ytZoru+l2BGhe0zIpZoRmwTz6tNJhfMjiGn2WfbJkDjyNRmVMhzBFgrCfozmEvITvvJfE1o8o+s0Oc3DLBocY+CeJ/tF3VFmOijT8V61NEgDNCmJmEm8w3D4nIwuZUjVIkKwc2faSk1u4n3a5GjruhOtQ2prJDbygVNloDVBAVeXo8yPdHWosxNTzLElgl2MfO5VP5h2npFyE8ojW/FYolgj3RYKwj2BnP9VGRrQv031Fi4YiECRL0naJHREWumsWbZnOtbyVXc9WxF5iZmgmRWwgWoCb2qmUVRd4NP9JYHzr4pLRY0FFo0z4+zWnH/aY9aeFTHBHZJiHmBPjQwfz6v3Ke+47LGyiJV0CLsSYdpEyvMRCc++tzmwXpbijYnAJveVzoo8zTuREhotWXGaBKxGBRIbU3onsox25giDxNlT5ke9MM3YbC2SdRa0lih2A5626OZzjZZlC1qObaJWPcos0sshmmbdHEGUNgZkfTYN+WiD6AyVRKgZsKedZSzrlLgEZJBaimIXNENBNbtBhfLDlWjmxdX96uUgsS8xjbRZekcxSBCSr00KVaXgTabdDKZDGIqeqpedLXOgud3SruMu6JBoj2nx8t2w2UtiFdn6aw+T2ZYS4DNTlTyOWHr8gs98j6ZNCspTFBatB2bBi9ZZXRRctZo55uKXgzW3Xf8/cXf9VdUoLYMWDNB7QUd5olm8SjqqTbjZJ0IOWs6Wj0mWg9iZZbQqxljYkmE0VNZA5HGUtsYJGSOKpo8ZYEIJlHCacqFh225xsoMUdN3hOeTnE4sLYhxD45XmXoW+VHHohXQWhvdE3oGKmcdmCxkEiYK1QQAszkRsXwCzBZotsu5YC2Fj1U7MtwPqZ+A5fkNAaKsrBK50tVrZms3JAuLyAgQbTO9Zle4hGREw4XJr6WW5yxdp0bJTApEU+V4llKLLq7J3ED+Xkc7DGfe8LOV7IZK94Ja4sjyNbCmvV8RKAmIrThP0YNo5gVwHItf0KSNbCGT2WODe0TPoll2T+pTdiZ0WESFFwolf8wpU22ZnhJF6andICNUEm0yYW/ZdHkFSl7hRZmZ6vssAHC6yFtkJ7ygv0K7wa73f7yARzy+lIjUeWMqBM3UAr01Lib2uKaUKrLDuvMujE6vrOOQTXCd7avmrLlYzJ9S3Wx57xBkQdboonzkgQ2hwDKL0O76lnd8k/aQwuiejyEVqpJWQGkRDVZ/1px3RnoAlnQlwEADhTOdg2wuA4O6430YRZJk4aXF3Cy/eVQKas7qmJJEs1/o8NNYuIp6UbSEJQqixr6WWA2SCmW5xvRdvGS0CGgypEX6otFM53BFP/E+lXmqyNGoU7KtmLaFRU3k8YN9WpDVZced0mTCBsp6uFBxpOdIXzXx2vZqEfpIkyEMZ9nd6R8e97UjUSp77llEi6jHt+xNbyhgtM57Eh0vjXmV8g/eQKE6jS6iyaizZDETHrZKmHTtjX3KcR/foQdO+xoVFhr6mpiXl7YsGy3g7ws3MVflC4+X4bbAT4vuPOHqs5NJIWGPF2dukT8nwOau762YabNwfATItqxDlywEFYk2/r8m0WuLgFWxGUoAFNGsfC8dNTMoygotuZcOR6wCjdmsnvnqJF/qXvWZLlNue0WjTVqUXF1QykIItke9WgbA2krAssLdVhO9ZUJQZ9tkCSiaK8hRrgCeyv2r24y+kszykqREyxREYprXlA/GP5y0IRItj7ZlIFNRifcTrTdaY0WaqkJzE701NUhnJ00lCQEwsruQtaQtR1GiKX0XZcSq3x9Ape6tqDJbaTvw+7m7IehAiNgntCCqVkRQOWhlKpwAa+VWKFlkakmWWB5wC27bG2SIL93Z1ea3zCttq1wkynmPji0incxARWRSkccCZ139fZkKU8c40UcZ3aQDLpz/sLZXAJm6OtOLYWX5gJVtxRM/pdkK3RFlVujfo0SENNccWEkEyoCQvged+eL0MC+K2PTkUEZ5cuOD+YvRhaHc9ugv949faI7oFFN5eZfXzPkOdFgUwdOCd8AW2b4hZVbshupKyZXV/ppK+UUnwZQu+OQVqGsq7JPoMt03atku7hutKJ2uv5pF90CUl6IeZ3wiK6zQYY0KZzbDRD+F1FeJNsWsLdNA4Y2eIkG+AKQl8BSpMFpLtfRX7R9kdDITRCciyvyULvtsYL26nQvXK6DhbC2LSrLSb/mtVyyLhivabEWjTcpIUaG/VTUTue8ntx3/CuB07l6ZAQp7tsysZRortQsyWgw0i7+wXxrBJkapnASQNPXNXn/17+zzKxNIZEeE0l7B9LqNvtcmXHd83zaZO5h1Pcw1lriyohM9i0rT6MXiepH+lujzE+julUXnymAU9cyZxOA+9EaNchcao6zPIvqLsmwKEKi//iOkwkRHVeiwqrlUCC6DJaHLyrpdHvRNyWiyApwsSnv9tjBLEVFNfXshqjrNxpK0V9Bfsd1QHUhlAUyc33DwTawFUb3iA41Volo66ThnsXxh8ISRzC2HDojliykzgCsXjZr8gdO2ZvT6VqPf7MQWoluoubIu0iwardb4qE1aDlRB21T2LS/tZGICb9Jq3YQf5rNxy8xhQXkyYwyikE0MUrtErGwyRdKk5wG4wmn4BX1mBZqcgilq3KPHFwO18v6F5QeyMcnqmCt+XoUaS9osiXQp0FJgsTgfwvH3fjyb9rejm7yH+Sk1BS65Rc452gCT99nEeA09rFmf/4rVUJUT1WJ81vxXKIJ70KDHTn8nK2IWnaJt799hddaxUNFfq1d7YOAp8LcJrVc1nK1GjVmnwCSNXynuz8Y9M2952wYRp3x88Tn5vXQy8R2d8IS2ImBYRI8FqktnoVQj0qSNZOkkW2Eyb2G/ENAe30CrelFENGkzGgz0Va6xFoBlBdMzsx+sAMw2+8ez42VC3q7rPFgFdK+8JjRlJTpbpbtDXAipPgoqDyFIFsAUAat9mWUxFe0xEdvlq3ySGEyv6iIgLSiCX6h1ov2y/WRL9IsXxiXlL1BuutbF7DiJLVFx3+tUOANJAZAvAUFllJOBtSJNlibmJu8vj0ehM6Q6HlaRDOyoT4Dq3NIjHHULMsQocmkqTNLRWYSJ/pmVfavcz5liBRQrYCtnigWQTcfrxfctA+mNCzKjWN7+h92QDeCLUWsm6itXepT1hSvYvXhS1bHlehKFx+r/qZysGeVYVqoqHqN8Yb1QeJ5TYeWERf1Z1cczWqtQwgsAj56Xv8vKZ70g9g26S18Z5yVGwGhXAL0XBXxKhauRoBTiI4p9ZUCKgLQKgF8By+Ljy8JmwRKas/F4aayidbImGiuqF8p1Q98GVvZPRxMpOPNKsrCLo6s4vBgRo8FV6028FfU+8z0JMK3yv2ZjIKKTPJYAzyyKaWAVwrP0qWb7FY8XtuNUo1oVeFWRXDhRSyd0Ieq+StcWRN9IXL+roS4rKb+ssYoRbAVAFaBcwLUIIp8BYuVkV9qBXvn/3rhIOBq98v+FUWghQtWpcAYYE1O7FgfOViJCcHWWBi/L0lYo6819qxdgCZQTvfbKxcUyJKPEGQBjKlxMQzM6e2dQl04AaUr1vALiFcCvnECbXQR0wlqwQNzKBZPNE1QgerfB7xRcoog1PakU/lKAvHuyiiG9fKzZSXklYolWlYo9sxLVo/PwKcCOnos7U2QUOaXCtL3lVXAt/OP2Zw3UKuheeT4By2dfiC9duG+MXUv01RxYBYpLwQZNf2NVvsNRV8/Ve2YDhfuLIvClKEz2gnz+DrDwlmxOt2hzccu2NwE6u1iWLnjTyxGkIAqAlmusd8Bm8U0yj31oichsUZHsua1ShSooF6l/etUnd+IwS+Y8zjLOYvTl/1U+V3qouNpQVXed7QabtKysgE3RpLqSKldb9SpNTpjP3le1WCqvBRfa7AKogPnVqJXtUx7HSrQ6LW6b1KaWgFR9TXzJV8BTeQ3D+yVqBO9NFxyrjo8ARBlwn/jadHwqF+KCthqvnanwzcFcAZeKaMvgLAz0pbRUOAGlzymcQCu44y9fNCsAiFzyBQC9Yje0acRaOLnLJz07cew7rZ7kyeBZdVALBfmXx2p1TFZBTp5eNbq/PFbGq828GKHSiLQKxhWQUSZnnzAgqwBafv2dC1QIeV+JrquRsxC9PImAVyqcXYkjZVb7i22n9hnYdnHXs22RNmOHXXzfYQGE08f3z22R6SeuePx8qTnE6+G2JFJE52TFTa9E42XqK7zn7LxPIlBkCagaVmWbXL5xEsGq0c3oam9R1lNJ6YvR6E/ZlnhOKxGqHKWK22ZRrE6FVeAFYCiD5Z3BenfQKlfjnzk2s/cuXmjLY/fu2EyBNRmg0vY3BupdMK0O2lIPeqXHXLnwq/tkOq0KpM+4EBcuuHgyxeIAzsBV3mcCwqV9XgBrKwJ6+eSJIndqylYnRiwAwQoXin/GPvSzXeyGPwsUk5NVOWHVaPUpA754oqvezn/LsQr7sQJgrUwtaoXBWBmUTxucKh28eZVWLsK3x2oFlCsR992xsqi74QWP6t0r8933rAz4CkDfeU8LLJeq1qy8b+WiWAFGaHu8eAG2jArfAcorJ3/1arIXrqxXr8iXxPtqlMre9xkX0rvRbAG8ORV+EsBWuNzeHbDPHLw35cFnSIG3xuGViPxJ0bAOLFrd7+DVVwZahPxy2UCl68k+lcHzxYFtK//fZHw+PZH4BEB68XNnwGpf3g3vq1ffK0nBm9T06VfuvzGb/LOBtGwzFT+3fem9f/n/+c/8Gwa+2X/zn38DSFd//vNL7/3/mtnD/ufnf34+7+df/28AkXg9KZ7Ze3oAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/gradient.png,importbuddy/pluginbuddy/images/minicolors/gradient.png ###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/index.php,importbuddy/pluginbuddy/images/minicolors/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/index.php,importbuddy/pluginbuddy/images/minicolors/index.php ###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/line.gif,importbuddy/pluginbuddy/images/minicolors/line.gif R0lGODlhGgADAIAAAP///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3QUM5NzJGODM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3QUM5NzJGOTM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjdBQzk3MkY2MzRBRTExRTA4NTRDRkRFMTEwOTI0OTNEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjdBQzk3MkY3MzRBRTExRTA4NTRDRkRFMTEwOTI0OTNEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAABoAAwAAAguEj6ka7Q+jW7SeAgA7 ###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/line.gif,importbuddy/pluginbuddy/images/minicolors/line.gif ###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/rainbow.png,importbuddy/pluginbuddy/images/minicolors/rainbow.png iVBORw0KGgoAAAANSUhEUgAAABQAAACWCAIAAABRkz+JAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N0FDOTcyRjQzNEFFMTFFMDg1NENGREUxMTA5MjQ5M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0FDOTcyRjUzNEFFMTFFMDg1NENGREUxMTA5MjQ5M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3QUM5NzJGMjM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3QUM5NzJGMzM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnzKFbcAAAcCSURBVHjanFnbcttGDMVZsbVlp0knb52+9/8/qh/QNrElpxVR7B3YxVJOlExCUQviDhyA+POPTyfsoPhh5vQ/If2h8k3+ZwDyI1DvMN0obL/TG/FO4yeeH79WDuX5jI3oM5Eizg/XXPoT0s3yiHhSiD8RdiJ7VDMRAk3WDwgxPsbntOfpT4A6ytOBSPyh02F4Bso/XAQlsBKMROxnpR4XQqBf98PGAUlnPCuelJ5dlWxHy7W1f+RcxKbRYN1CnPmoi0YcnpNVtbawMmZzotu1yiI6nwufrsygKo0/1YeK2E/Fk01zLIIEKk7i+UgsnENXj6y2TYD8dO153pO1u2F1GLFRfn4chHN4jJyZfJvn82GMrejRfU86y5cw8KtWoEoZJoOFSPyYxA7KKzacMNm/PEKIQ+JcMtGm1BCVQYlTXaV0DiqMoNO4Kd8sL38j53OUGZOd5q/mgrOrHovCQw3pF9kWqnx1P2fOzbxBx7YNDMM/i00PFE69vmk7B1W6eIoEZM4xPK2EONSZtM6ROPQIYZtcNpN6egrxjoeA0PUE+R8MD+JdxL4SnZrx29Nh8pobZ1XCpFxvV24alxLG7JVh2xR2TsQX5mxr1rnIo4V6gUg/7Yl+e0vcYMXT9bt5qpTAeiBzppZT3d5syrFWuNklchbiQKqKsAoSnmtYfVrjHKDsVLU31rYtIN+JnK8SH6oVS6seUwAqtZUeSeydA3oCsS0n3RA89psktliLVVx7tV6naTNNJH7JOu+JGDVOJptn5NH9nM6In9HhhxtVbJu0+myvPEVfrWI8N3wYg2+vka+yBdPywlxHI0fOcEsfe+GhwljkE86mqvmfhRTR2rpyur1q1L8aL3LOMTCgoHaTFLYZjm1fvdTV4anTbbDJ9pJShBXu0dczpOipImJ/mTm44TFFiNzfvmTc5QIXT2BWyCNxttk3aq57Loy/t3+AG4MNFLZgCE7PyYVeSi8XWi6JBbJAnXqesnXKFqHrFEJsI5K1HdAh5bb/PIbuUPxYFT1YYLzRWSaPZVCvYrxE2P7AujzpMJ5doNM+5jOfTa43AGzEHqo/crETsH6e4DIvEtuYJpbFRLwqBvNXOzgoziuz0CR2Mxg9dujoVxMeG1W1mOj8dFB+Dr2WdIYD6t/ncSHmOg554q3URmxWSWd4R/nenUQMAxB5crXr9ogrkMQO/P1Gi929+hmr4WmN6XbtZ1fIVdhy9vND0tnpRuoazjiXxU6uCjhqbq44RmxMYvNhbHc/BzoCB3PO7UXnWkiPbcvT5uLGifNJKTYHKRaRc2s6Y3Iv1onNzWDbjU78HYnVXRWnmwuxVboBxgPJ9zIaXYvcDVoMVb/VXtbLE+F8U8T8vkq/94SuxDxhgWGfZLZN+XTWmcIIh2CjmedFQiZma7DWFIfg5EkXbpxbfDLTMsVG7YX4rSwElmpzx2Lm1yh2gq7jqA4zJ7ECNax3Brjk8m8GRj1wr4BWNZgqoHrJxDCzZQM1BbsUg2HcoQxzvoYsbZhkqsRubHgDtJopIucXszpyNpZeryl7Enrtk/fdZISecTkZbJZ2XtjMw3tssSI2T6WTbW3BVJXr6vKrOT3X6gmKtDMSJC+qP9u5j21U98QsAF90/qrmiaGAkGvlirGRxd4XOyWL1sdVSdy4/p22zPeqD6vZvngriNh/xRE1DNMC+z2K9U3Jh9d1u8HhaLuXTdhBJByF3OZnLN9DRmrltd7buR2rSrR9JvrXzhg4RLA5lITnT0L8m3mXcK+/q6lL6Ldftf3ttMt2eczzOPhx2gS4WB9ebmy/2CjsxKqQs9qf9HxHJmbP1RMUNGVqT2I/z4CCj2CFKiRCPHHGEMU+AkzjYAS9YewtZpBFH7kApbno/KG998ilXr8DodFCw/i2naFEdper3tI5d5HtadoEz0M62x1khdvCua370d8sEdaDluZ8bpl1dyJxrJ0LyQF2XCwjo9hPKJt8fwFl/dz3T3G4oe2xLdPt3hUDUICt3HvaPp651j+owNIYZGqxGYVEsWUmO7UcgvfGyEZbfg3BCesng3FZrPtZ5cVMAvpZZ4wjRu5k/oatqnXLnE/wqgyc6UafiTqHb/FNxLuAPtunyJiANwU9ecL1q75TZoyrwa3LKXg25y0Tz6t1WkyUA2dcCWG9pFg0fOQdYBsxlmK7snSd1Vu2OyOwT+zisKPXoWnjiuuPLVky54tX7vhwos5QVYhlSkC4h0DceHN0dlcy3uSPovOcMjjcUzWDGZ158dp5seraCg5zXYL1VgzN2uEQOy3addq4XhbrBdDxkisW/TZi3EFArs64eGF8sPBAx82JM99bXS72H0nnY6S53rwkzu+pG16vT+HJP5RVWLmK3pEkQnz9zzZ3OCUacBwhvep/AQYA/fsCsjFZHQIAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/rainbow.png,importbuddy/pluginbuddy/images/minicolors/rainbow.png ###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/trigger.png,importbuddy/pluginbuddy/images/minicolors/trigger.png iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjU3RTU1MzIzNERFMTFFMDg1NENGREUxMTA5MjQ5M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjU3RTU1MzMzNERFMTFFMDg1NENGREUxMTA5MjQ5M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEQxNkIyMTM0REUxMUUwODU0Q0ZERTExMDkyNDkzRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEQxNkIyMjM0REUxMUUwODU0Q0ZERTExMDkyNDkzRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiDK9P0AAAHySURBVHjarJVBasJAFIYnyVgXtrorusgdXOrWZaHgFbooegv1EoI7j+AtXLsXFFy0FFRs0LYxmXT+YV6YxIgpzcDzJcN73/z5M06s4XD4zBhrsGLHGxdCNEaj0aRI6mAw6AFs4SaKokKglmUxMHkYhgqKaDabvf9AF4vFBBwwAbbkCgpcqVTYfD7/kjWnjD6BB9MZEeocyLhrt9suOBhgJhRXq1WmodsrMBNo5gfZ65KdpFhBsVqtVmO6MLwBEkYdwkZvAhwEgUXgUqmEeV/Gzw1Q+l71EhhMpRhQBOcc8986TAgWg/dHfU3zaiPIuEev4XFSsQYfNSTUC3xq38WVzQCZPnoTivGTUnzScE9nkWOnCVMxgdNWAPiht1HekQZnWrHNAeXaArIiurDifD7Hih3HYTmgzng8floul/XEpOwlxWAmFGtwwlN5+qkwX9ZqtarLg2aCt28OWADGtZcnTGhGVn4C4vt+5iEUW0GKbduOwSmVMRj1qKOe2WzGNpsNc12XdbtdNa9q0las12uRBaWBfxjqqEeeiGy326lMh5lS7HmeTYcQlEyn09dbe4sUI6C01WqpTHNg8v1+b5PH/X4/95cE/tIu6HQ68TUymPxwODh4tHK5/KevCHr0LrqYB9OSwBf5aI9FfvOk6vdfAQYA4jTPF9eEdoEAAAAASUVORK5CYII= ###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/trigger.png,importbuddy/pluginbuddy/images/minicolors/trigger.png ###PACKDATA,FILE_START,/controllers/pages/server_info/_cron.php,importbuddy/controllers/pages/server_info/_cron.php PD9waHAKLy8gT1VUUFVUOiAkY3JvbnMgcG9wdWxhdGVkCgppZiAoICEgaXNzZXQoICRjcm9uICkgKSB7CgkkY3JvbiA9IGdldF9vcHRpb24oJ2Nyb24nKTsKfQppZiAoICEgaXNzZXQoICRjcm9uX3dhcm5pbmdzICkgKSB7CgkkY3Jvbl93YXJuaW5ncyA9IGFycmF5KCk7Cn0KCi8vIExvb3AgdGhyb3VnaCBlYWNoIGNyb24gdGltZSB0byBjcmVhdGUgJGNyb25zIGFycmF5IGZvciBkaXNwbGF5aW5nIGxhdGVyLgokY3JvbnMgPSBhcnJheSgpOwpmb3JlYWNoICggKGFycmF5KSAkY3JvbiBhcyAkdGltZSA9PiAkY3Jvbl9pdGVtICkgewoJaWYgKCBpc19udW1lcmljKCAkdGltZSApICkgewoJCS8vIExvb3AgdGhyb3VnaCBlYWNoIHNjaGVkdWxlIGZvciB0aGlzIHRpbWUKCQlmb3JlYWNoICggKGFycmF5KSAkY3Jvbl9pdGVtIGFzICRob29rX25hbWUgPT4gJGV2ZW50ICkgewoJCQlmb3JlYWNoICggKGFycmF5KSAkZXZlbnQgYXMgJGl0ZW1fbmFtZSA9PiAkaXRlbSApIHsKCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIHBlcmlvZC4KCQkJCWlmICggIWVtcHR5KCAkaXRlbVsnc2NoZWR1bGUnXSApICkgeyAvLyBSZWN1cnJpbmcgc2NoZWR1bGUuCgkJCQkJJHBlcmlvZCA9ICcnOwoJCQkJCWlmICggZmFsc2UgIT09ICggJHByZXR0eUludGVydmFsID0gYmFja3VwYnVkZHlfY29yZTo6cHJldHR5Q3JvbkludGVydmFsKCAkaXRlbVsnaW50ZXJ2YWwnXSApICkgKSB7CgkJCQkJCSRwZXJpb2QgLj0gJzxzcGFuIHRpdGxlPSJJbnRlcnZhbCB0YWc6IGAnIC4gJHByZXR0eUludGVydmFsWzBdIC4gJ2AuIj4nIC4gJHByZXR0eUludGVydmFsWzFdIC4gJzwvc3Bhbj4nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRwZXJpb2QgLj0gJzxzcGFuIHRpdGxlPSJJbnRlcnZhbCB0YWc6IGAnIC4gJGl0ZW1bJ3NjaGVkdWxlJ10gLiAnYC4iPicgLiAkaXRlbVsnc2NoZWR1bGUnXSAuICc8L3NwYW4+JzsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBPbmUtdGltZSBvbmx5IGNyb24uCgkJCQkJJHBlcmlvZCA9IF9fKCdvbmUgdGltZSBvbmx5JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCQl9CgkJCQkKCQkJCS8vIERldGVybWluZSBpbnRlcnZhbC4KCQkJCWlmICggISBlbXB0eSggJGl0ZW1bJ2ludGVydmFsJ10gKSApIHsKCQkJCQkkaW50ZXJ2YWwgPSAkaXRlbVsnaW50ZXJ2YWwnXSAuICcgc2Vjb25kcyc7CgkJCQl9IGVsc2UgewoJCQkJCSRpbnRlcnZhbCA9IF9fKCdvbmUgdGltZSBvbmx5JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCQl9CgkJCQkKCQkJCS8vIERldGVybWluZSBhcmd1bWVudHMuCgkJCQlpZiAoICFlbXB0eSggJGl0ZW1bJ2FyZ3MnXSApICkgewoJCQkJCS8vJGFyZ3VtZW50cyA9IGltcGxvZGUoICcsJywgJGl0ZW1bJ2FyZ3MnXSApOwoJCQkJCSRhcmd1bWVudHMgPSAnJzsKCQkJCQlmb3JlYWNoKCAkaXRlbVsnYXJncyddIGFzICRhcmdzICkgewoJCQkJCQkkYXJndW1lbnRzX2lubmVyID0gYXJyYXkoKTsKCQkJCQkJJGlzX2FycmF5ID0gZmFsc2U7CgkJCQkJCWlmICggISBpc19hcnJheSggJGFyZ3MgKSApIHsKCQkJCQkJCSRhcmd1bWVudHNfaW5uZXJbXSA9ICRhcmdzOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGlzX2FycmF5ID0gdHJ1ZTsKCQkJCQkJCWZvcmVhY2goICRhcmdzIGFzICRhcmcgKSB7CgkJCQkJCQkJaWYgKCBpc19hcnJheSggJGFyZyApICkgewoJCQkJCQkJCQkkYXJndW1lbnRzX2lubmVyW10gPSBwcmludF9yKCAkYXJnLCB0cnVlICk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJJGFyZ3VtZW50c19pbm5lcltdID0gJGFyZzsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJaWYgKCB0cnVlID09PSAkaXNfYXJyYXkgKSB7CgkJCQkJCQkkYXJndW1lbnRzX2lubmVyID0gJ0FycmF5KCAnIC4gaW1wbG9kZSggJywgJywgJGFyZ3VtZW50c19pbm5lciApIC4gJyApJzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRhcmd1bWVudHNfaW5uZXIgPSBpbXBsb2RlKCAnLCAnLCAkYXJndW1lbnRzX2lubmVyICk7CgkJCQkJCX0KCQkJCQkJJGFyZ3VtZW50cyAuPSAnPHRleHRhcmVhIHdyYXA9Im9mZiI+JyAuICRhcmd1bWVudHNfaW5uZXIgLiAnPC90ZXh0YXJlYT4nOwoJCQkJCQkvKgoJCQkJCQlpZiAoIGlzX2FycmF5KCAkYXJnICkgKSB7CgkJCQkJCQkkYXJndW1lbnRzIC49ICAnWycgLiBwcmludF9yKCAkYXJnLCB0cnVlICkgLiAnXSc7Ly9wYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bXVsdGlfaW1wbG9kZSggJGFyZyAsICc7ICcgKQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGFyZ3VtZW50cyAuPSAkYXJnOwoJCQkJCQl9CgkJCQkJCSovCgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkYXJndW1lbnRzID0gX18oJ25vbmUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCX0KCQkJCQoJCQkJLy8gSWYgcnVuIHRpbWUgaXMgaW4gdGhlIHBhc3QsIG5vdGUgdGhpcy4KCQkJCSRwYXN0X3RpbWUgPSAnJzsKCQkJCWlmICggJHRpbWUgPCB0aW1lKCkgKSB7CgkJCQkJJHdhcm5pbmcgPSAnV0FSTklORzogTmV4dCBydW4gdGltZSBoYXMgcGFzc2VkLiBJdCBzaG91bGQgaGF2ZSBydW4gJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT50aW1lX2FnbyggJHRpbWUgKSAuICcgYWdvLiBDcm9uIHByb2JsZW0/JzsKCQkJCQkkbXNnID0gJ1NvbWV0aGluZyBtYXkgYmUgd3Jvbmcgd2l0aCB5b3VyIFdvcmRQcmVzcyBjcm9uIHN1Y2ggYXMgYSBtYWxmdW5jdGlvbmluZyBjYWNoaW5nIHBsdWdpbiBvciB3ZWJob3N0IHByb2JsZW1zLic7CgkJCQkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiR1aSApICYmIGlzX29iamVjdCggcGJfYmFja3VwYnVkZHk6OiR1aSApICkgewoJCQkJCQkkdGlwID0gcGJfYmFja3VwYnVkZHk6OiR1aS0+dGlwKCAkbXNnLCAnJywgZmFsc2UgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGlwID0gJygnIC4gJG1zZyAuICcpJzsKCQkJCQl9CgkJCQkJJHBhc3RfdGltZSA9ICc8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4gKiogJyAuICR3YXJuaW5nIC4gJyAqKiAnIC4gJHRpcCAuICc8L3NwYW4+JzsKCQkJCQkkY3Jvbl93YXJuaW5nc1tdID0gJHdhcm5pbmc7CgkJCQl9CgkJCQkKCQkJCS8vIFBvcHVsYXRlIGNyb25zIGFycmF5IGZvciBkaXNwbGF5aW5nIGxhdGVyLgoJCQkJJGNyb25zWyAkdGltZSAuICd8JyAuICRob29rX25hbWUgLiAnfCcgLiAkaXRlbV9uYW1lXSA9IGFycmF5KAoJCQkJCSc8c3BhbiB0aXRsZT1cJ0tleTogJyAuICRpdGVtX25hbWUgLiAnXCc+JyAuICRob29rX25hbWUgLiAnPC9zcGFuPicsCgkJCQkJcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAkdGltZSApICkgLiAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+IFRpbWVzdGFtcDogJyAuICR0aW1lIC4gJzwvc3Bhbj4nIC4gJHBhc3RfdGltZSwKCQkJCQkkcGVyaW9kLAoJCQkJCSRpbnRlcnZhbCwKCQkJCQkkYXJndW1lbnRzLAoJCQkJKTsKCQkJCQoJCQl9IC8vIEVuZCBmb3JlYWNoLgoJCQl1bnNldCggJGl0ZW0gKTsKCQkJdW5zZXQoICRpdGVtX25hbWUgKTsKCQl9IC8vIEVuZCBmb3JlYWNoLgoJCXVuc2V0KCAkZXZlbnQgKTsKCQl1bnNldCggJGhvb2tfbmFtZSApOwoJfSAvLyBFbmQgaWYgaXNfbnVtZXJpYy4KfSAvLyBFbmQgZm9yZWFjaC4KdW5zZXQoICRjcm9uX2l0ZW0gKTsKdW5zZXQoICR0aW1lICk7 ###PACKDATA,FILE_END,/controllers/pages/server_info/_cron.php,importbuddy/controllers/pages/server_info/_cron.php ###PACKDATA,FILE_START,/controllers/pages/server_info/_remote_sends.php,importbuddy/controllers/pages/server_info/_remote_sends.php PD9waHAKLy8gSU5QVVQ6IG9wdGlvbmFsICR0cm91Ymxlc2hvb3Rpbmc9PXRydWUgdG8gcHV0IGluIExpdmUgdHJvdWJsZXNob290aW5nIHRleHQgbW9kZS4KLy8gT1VUUFVUOiAkc2VuZHMgcG9wdWxhdGVkLgoKCmlmICggISBpc3NldCggJHRyb3VibGVzaG9vdGluZyApICkgewoJJHRyb3VibGVzaG9vdGluZyA9IGZhbHNlOwp9CgokcmVtb3RlX3NlbmRzID0gYXJyYXkoKTsKJHNlbmRfZmlsZW9wdGlvbnMgPSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmdsb2JfYnlfZGF0ZSggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvc2VuZC0qLnR4dCcgKTsKaWYgKCAhIGlzX2FycmF5KCAkc2VuZF9maWxlb3B0aW9ucyApICkgewoJJHNlbmRfZmlsZW9wdGlvbnMgPSBhcnJheSgpOwp9CmZvcmVhY2goICRzZW5kX2ZpbGVvcHRpb25zIGFzICRzZW5kX2ZpbGVvcHRpb24gKSB7CgkKCSRzZW5kX2lkID0gc3RyX3JlcGxhY2UoICcudHh0JywgJycsIHN0cl9yZXBsYWNlKCAnc2VuZC0nLCAnJywgYmFzZW5hbWUoICRzZW5kX2ZpbGVvcHRpb24gKSApICk7CgkKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIGxvYWQgZmlsZW9wdGlvbnMgZGF0YS4nICk7CglyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMyMy4nICk7CgkkZmlsZW9wdGlvbnNfb2JqID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2ZpbGVvcHRpb25zKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy9zZW5kLScgLiAkc2VuZF9pZCAuICcudHh0JywgJHJlYWRfb25seSA9IHRydWUsICRpZ25vcmVfbG9jayA9IHRydWUsICRjcmVhdGVfZmlsZSA9IGZhbHNlICk7CglpZiAoIHRydWUgIT09ICggJHJlc3VsdCA9ICRmaWxlb3B0aW9uc19vYmotPmlzX29rKCkgKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCBfXygnRmF0YWwgRXJyb3IgIzkwMzQuMjMzMjM5MzMzLiBVbmFibGUgdG8gYWNjZXNzIGZpbGVvcHRpb25zIGRhdGEuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIEVycm9yOiAnIC4gJHJlc3VsdCApOwoJCXJldHVybiBmYWxzZTsKCX0KCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGRhdGEgbG9hZGVkLicgKTsKCQoJJHJlbW90ZV9zZW5kc1skc2VuZF9pZF0gPSAkZmlsZW9wdGlvbnNfb2JqLT5vcHRpb25zOwoJdW5zZXQoICRmaWxlb3B0aW9uc19vYmogKTsKCQp9CgoKCiRzZW5kcyA9IGFycmF5KCk7CmZvcmVhY2goICRyZW1vdGVfc2VuZHMgYXMgJHNlbmRfaWQgPT4gJHJlbW90ZV9zZW5kICkgewoJLy8gQ29ycnVwdCBmaWxlb3B0aW9ucyBmaWxlLiBTa2lwLgoJaWYgKCAhIGlzc2V0KCAkcmVtb3RlX3NlbmRbJ3N0YXJ0X3RpbWUnXSApICkgewoJCS8vcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnVHJhbnNmZXIgZGF0YSBtaXNzaW5nIGV4cGVjdGVkIGRhdGEuIERldGFpbHM6IGAnIC4gcHJpbnRfciggJHJlbW90ZV9zZW5kLCB0cnVlICkgLiAnYC4nICk7CgkJY29udGludWU7Cgl9CgkKCS8vIFNldCB1cCBzb21lIHZhcmlhYmxlcyBiYXNlZCBvbiB3aGV0aGVyIGZpbGUgZmluaXNoZWQgc2VuZGluZyB5ZXQgb3Igbm90LgoJaWYgKCAkcmVtb3RlX3NlbmRbJ2ZpbmlzaF90aW1lJ10gPiAwICkgeyAvLyBGaW5pc2hlZCBzZW5kaW5nLgoJCSR0aW1lX2FnbyA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT50aW1lX2FnbyggJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddICkgLiAnIGFnbzsgPGI+dG9vayAnOwoJCSRkdXJhdGlvbiA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT50aW1lX2R1cmF0aW9uKCAkcmVtb3RlX3NlbmRbJ2ZpbmlzaF90aW1lJ10gLSAkcmVtb3RlX3NlbmRbJ3N0YXJ0X3RpbWUnXSApIC4gJzwvYj4nOwoJCSRmaW5pc2hfdGltZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddICkgKTsKCX0gZWxzZSB7IC8vIERpZCBub3QgZmluaXNoICh5ZXQ/KS4KCQkkdGltZV9hZ28gPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oICRyZW1vdGVfc2VuZFsnc3RhcnRfdGltZSddICkgLiAnIGFnbzsgPGI+dW5maW5pc2hlZDwvYj4nOwoJCSRkdXJhdGlvbiA9ICcnOwoJCSRmaW5pc2hfdGltZSA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPlVua25vd248L3NwYW4+ICgnIC4gJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddIC4gJyknOwoJfQoJCgkvLyBIYW5kbGUgc2hvd2luZyBzZW50IEltcG9ydEJ1ZGR5IChpZiBzZW50KS4KCWlmICggaXNzZXQoICRyZW1vdGVfc2VuZFsnc2VuZF9pbXBvcnRidWRkeSddICkgJiYgKCAkcmVtb3RlX3NlbmRbJ3NlbmRfaW1wb3J0YnVkZHknXSA9PT0gdHJ1ZSApICkgewoJCSRzZW5kX2ltcG9ydGJ1ZGR5ID0gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPisgaW1wb3J0YnVkZHkucGhwPC9zcGFuPic7Cgl9IGVsc2UgewoJCSRzZW5kX2ltcG9ydGJ1ZGR5ID0gJyc7Cgl9CgkKCQoJLy8gU2hvdyBmaWxlIHNpemUgKGlmIGF2YWlsYWJsZSkuCglpZiAoIGlzc2V0KCAkcmVtb3RlX3NlbmRbJ2ZpbGVfc2l6ZSddICkgKSB7CgkJJGZpbGVfc2l6ZSA9ICc8YnI+PHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Ij5TaXplOiAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHJlbW90ZV9zZW5kWydmaWxlX3NpemUnXSApIC4gJzwvc3Bhbj4nOwoJfSBlbHNlIHsKCQkkZmlsZV9zaXplID0gJyc7Cgl9CgkKCWlmICggaXNzZXQoICRyZW1vdGVfc2VuZFsnZXJyb3InXSApICkgewoJCSRlcnJvcl9kZXRhaWxzID0gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIHN0eWxlPSIKICBtYXJnaW4tbGVmdDogMTBweDsKICBkaXNwbGF5OiBibG9jazsKICBtYXgtd2lkdGg6IDUwMHB4OwogIG1heC1oZWlnaHQ6IDI1MHB4OwogIG92ZXJmbG93OiBzY3JvbGw7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBwYWRkaW5nOiAxMHB4OyI+JyAuICRyZW1vdGVfc2VuZFsnZXJyb3InXSAuICc8L3NwYW4+JzsKCX0gZWxzZSB7CgkJJGVycm9yX2RldGFpbHMgPSAnJzsKCX0KCQoJCgkvLyBTdGF0dXMgdmVyYmFnZSAmIHN0eWxpbmcgYmFzZWQgb24gc2VuZCBzdGF0dXMuCgkkZmFpbGVkID0gZmFsc2U7CglpZiAoICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gPT0gJ3N1Y2Nlc3MnICkgewoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXN1Y2Nlc3MiPlN1Y2Nlc3M8L3NwYW4+JzsKCX0gZWxzZWlmICggJHJlbW90ZV9zZW5kWydzdGF0dXMnXSA9PSAncnVubmluZycgKSB7CgkJJHN0YXR1cyA9ICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtaW5mbyI+SW4gcHJvZ3Jlc3Mgb3IgdGltZWQgb3V0PC9zcGFuPic7IC8vIDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZW1vdGVzZW5kX2Fib3J0IiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVtb3Rlc2VuZF9hYm9ydCcgKSAuICcmc2VuZF9pZD0nIC4gJHNlbmRfaWQgIC4gJyI+KCBBYm9ydCApPC9hPic7Cgl9IGVsc2VpZiAoICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gPT0gJ3RpbWVvdXQnICkgewoJCSRmYWlsZWQgPSB0cnVlOwoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWVycm9yIj5GYWlsZWQgKGxpa2VseSB0aW1lb3V0KTwvc3Bhbj4nOyAvLyA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVtb3Rlc2VuZF9hYm9ydCIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlbW90ZXNlbmRfYWJvcnQnICkgLiAnJnNlbmRfaWQ9JyAuICRzZW5kX2lkICAuICciPiggQWJvcnQgKTwvYT4nOwoJfSBlbHNlaWYgKCAkcmVtb3RlX3NlbmRbJ3N0YXR1cyddID09ICdmYWlsZWQnICkgewoJCSRmYWlsZWQgPSB0cnVlOwoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWVycm9yIj5GYWlsZWQ8L3NwYW4+JzsKCX0gZWxzZWlmICggJHJlbW90ZV9zZW5kWydzdGF0dXMnXSA9PSAnYWJvcnRlZCcgKSB7CgkJJGZhaWxlZCA9IHRydWU7CgkJJHN0YXR1cyA9ICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyI+QWJvcnRlZCBieSB1c2VyPC9zcGFuPic7Cgl9IGVsc2VpZiAoICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gPT0gJ211bHRpcGFydCcgKSB7CgkJJHN0YXR1cyA9ICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtaW5mbyI+TXVsdGlwYXJ0IHRyYW5zZmVyPC9zcGFuPic7IC8vIDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZW1vdGVzZW5kX2Fib3J0IiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVtb3Rlc2VuZF9hYm9ydCcgKSAuICcmc2VuZF9pZD0nIC4gJHNlbmRfaWQgIC4gJyI+KCBBYm9ydCApPC9hPic7Cgl9IGVsc2UgewoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWltcG9ydGFudCI+JyAuIHVjZmlyc3QoICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gKSAuICc8L3NwYW4+JzsKCX0KCWlmICggaXNzZXQoICRyZW1vdGVfc2VuZFsnX211bHRpcGFydF9zdGF0dXMnXSApICkgewoJCSRzdGF0dXMgLj0gJzxicj4nIC4gJHJlbW90ZV9zZW5kWydfbXVsdGlwYXJ0X3N0YXR1cyddOwoJfQoJCgkvLyBEaXNwbGF5ICdWaWV3IExvZycgbGluayBpZiBsb2cgYXZhaWxhYmxlIGZvciB0aGlzIHNlbmQuCgkkbG9nX2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdzdGF0dXMtcmVtb3RlX3NlbmQtJyAuICRzZW5kX2lkIC4gJ18nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CglpZiAoIGZhbHNlID09PSAkdHJvdWJsZXNob290aW5nICkgewoJCSRzdGF0dXMgLj0gJzxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIj4nOwoJCQoJCWlmICggZmlsZV9leGlzdHMoICRsb2dfZmlsZSApICkgewoJCQkkc3RhdHVzIC49ICc8YSB0aXRsZT0iJyAuIF9fKCAnVmlldyBSZW1vdGUgU2VuZCBMb2cnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdyZW1vdGVzZW5kX2RldGFpbHMnICkgLiAnJnNlbmRfaWQ9JyAuICRzZW5kX2lkIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94Ij5WaWV3IExvZzwvYT4nOwoJCX0KCQkKCQkkc3RhdHVzIC49ICcgfCA8YSB0aXRsZT0iJyAuIF9fKCAnUmVtb3RlIFNlbmQgVGVjaG5pY2FsIERldGFpbHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdzZW5kX3N0YXR1cycgKSAuICcmc2VuZF9pZD0nIC4gJHNlbmRfaWQgLiAnJiMwMzg7VEJfaWZyYW1lPTEmIzAzODt3aWR0aD02NDAmIzAzODtoZWlnaHQ9NjAwIiBjbGFzcz0idGhpY2tib3giPlZpZXcgRGV0YWlsczwvYT4nOwoJCQoJCWlmICggJ3N1Y2Nlc3MnICE9ICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gKSB7CgkJCSRzdGF0dXMgLj0gJyB8IDxhIHRpdGxlPSInIC4gX18oICdGb3JjZSByZXNlbmQgYXR0ZW1wdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlbW90ZXNlbmRfcmV0cnknICkgLiAnJnNlbmRfaWQ9JyAuICRzZW5kX2lkIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94Ij5SZXRyeSBTZW5kIE5vdzwvYT4nOwoJCX0KCQkKCQkkc3RhdHVzIC49ICc8L2Rpdj4nOwoJfQoJCgkKCQoJLy8gRGV0ZXJtaW5lIGRlc3RpbmF0aW9uLgoJJGRlc3RpbmF0aW9uX3R5cGUgPSAnJzsKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncmVtb3RlX2Rlc3RpbmF0aW9ucyddWyRyZW1vdGVfc2VuZFsnZGVzdGluYXRpb24nXV0gKSApIHsgLy8gVmFsaWQgZGVzdGluYXRpb24uCgkJJGRlc3RpbmF0aW9uID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfZGVzdGluYXRpb25zJ11bJHJlbW90ZV9zZW5kWydkZXN0aW5hdGlvbiddXVsndGl0bGUnXSAuICcgKCcgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9kZXN0aW5hdGlvbnMnXVskcmVtb3RlX3NlbmRbJ2Rlc3RpbmF0aW9uJ11dWyd0eXBlJ10gLiAnKSc7CgkJJGRlc3RpbmF0aW9uX3R5cGUgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9kZXN0aW5hdGlvbnMnXVskcmVtb3RlX3NlbmRbJ2Rlc3RpbmF0aW9uJ11dWyd0eXBlJ107Cgl9IGVsc2UgeyAvLyBJbnZhbGlkIGRlc3RpbmF0aW9uIChiZWVuIGRlbGV0ZWQgc2luY2Ugc2VuZD8pLgoJCSRkZXN0aW5hdGlvbiA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPlVua25vd248L3NwYW4+JzsKCX0KCQoJJHdyaXRlX3NwZWVkID0gJyc7CglpZiAoIGlzc2V0KCAkcmVtb3RlX3NlbmRbJ3dyaXRlX3NwZWVkJ10gKSAmJiAoICcnICE9ICRyZW1vdGVfc2VuZFsnd3JpdGVfc3BlZWQnXSApICkgewoJCSR3cml0ZV9zcGVlZCA9ICdUcmFuc2ZlciBTcGVlZDogJmd0OyAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHJlbW90ZV9zZW5kWyd3cml0ZV9zcGVlZCddICkgLiAnL3NlYzxicj4nOwoJfQoJCgkkdHJpZ2dlciA9IHVjZmlyc3QoICRyZW1vdGVfc2VuZFsndHJpZ2dlciddICk7CgkkYmFzZV9maWxlID0gYmFzZW5hbWUoICRyZW1vdGVfc2VuZFsnZmlsZSddICk7CglpZiAoICdyZW1vdGUtc2VuZC10ZXN0LnBocCcgPT0gJGJhc2VfZmlsZSApIHsKCQkkYmFzZV9maWxlID0gX18oICdSZW1vdGUgZGVzdGluYXRpb24gdGVzdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPihTZW5kICYgZGVsZXRlIHRlc3QgZmlsZSByZW1vdGUtc2VuZC10ZXN0LnBocCk8L3NwYW4+JzsKCQkkZmlsZV9zaXplID0gJyc7CgkJJHRyaWdnZXIgPSBfXyggJ01hbnVhbCBzZXR0aW5ncyB0ZXN0JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJJGRlc3RpbmF0aW9uID0gJzxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+VGVzdCBzZXR0aW5nczwvc3Bhbj4nOwoJfQoJCgkvLyBQdXNoIGludG8gYXJyYXkuCglpZiAoIGZhbHNlID09PSAkdHJvdWJsZXNob290aW5nICkgewoJCSRzZW5kc1tdID0gYXJyYXkoCgkJCSRiYXNlX2ZpbGUgLiAkZmlsZV9zaXplIC4gJHNlbmRfaW1wb3J0YnVkZHkgLiAkZXJyb3JfZGV0YWlscywKCQkJJGRlc3RpbmF0aW9uLAoJCQkkdHJpZ2dlciwKCQkJJHdyaXRlX3NwZWVkIC4KCQkJJ1N0YXJ0OiAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAgJHJlbW90ZV9zZW5kWydzdGFydF90aW1lJ10gKSApIC4gJzxicj4nIC4KCQkJJ0ZpbmlzaDogJyAuICRmaW5pc2hfdGltZSAuICc8YnI+JyAuCgkJCSc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPicgLiAkdGltZV9hZ28gIC4gJGR1cmF0aW9uIC4gJzwvc3Bhbj4nLAoJCQkkc3RhdHVzLAoJCSk7Cgl9IGVsc2UgeyAvLyBUcm91Ymxlc2hvb3RpbmcgbW9kZS4KCQkkZXJyb3IgPSAnJzsKCQlpZiAoIGlzc2V0KCAkcmVtb3RlX3NlbmRbJ2Vycm9yJ10gKSApIHsKCQkJJGVycm9yID0gJHJlbW90ZV9zZW5kWydlcnJvciddOwoJCX0KCQkkc2VuZHNbXSA9IGFycmF5KAoJCQkndHlwZScgPT4gJGRlc3RpbmF0aW9uX3R5cGUsCgkJCSdmaWxlJyA9PiAkcmVtb3RlX3NlbmRbJ2ZpbGUnXSwKCQkJJ2ZhaWxlZCcgPT4gJGZhaWxlZCwgLy8gYm9vbCBpZiBmb3Igc3VyZSBmYWlsZWQuCgkJCSdzZW5kX3NwZWVkJyA9PiAkd3JpdGVfc3BlZWQsCgkJCSdzdGFydCcgPT4gJHJlbW90ZV9zZW5kWydzdGFydF90aW1lJ10sCgkJCSdmaW5pc2gnID0+ICRyZW1vdGVfc2VuZFsnZmluaXNoX3RpbWUnXSwKCQkJJ2R1cmF0aW9uJyA9PiAkZHVyYXRpb24sCgkJCSdsb2dfZmlsZScgPT4gJGxvZ19maWxlLAoJCQknZXJyb3InID0+ICRlcnJvciwKCQkpOwoJfQp9IC8vIEVuZCBmb3JlYWNoLg== ###PACKDATA,FILE_END,/controllers/pages/server_info/_remote_sends.php,importbuddy/controllers/pages/server_info/_remote_sends.php ###PACKDATA,FILE_START,/controllers/pages/server_info/_server_tests.php,importbuddy/controllers/pages/server_info/_server_tests.php PD9waHAKLy8gT1VUUFVUOiBwb3B1bGF0ZXMgJHRlc3RzLgoKCi8qCiAqCUlNUE9SVEFOVCBOT1RFOgogKgogKglUaGlzIGZpbGUgaXMgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgcHJvamVjdHMgLyBwdXJwb3NlczoKICoJCSsgQmFja3VwQnVkZHkgKHRoaXMgcGx1Z2luKSBTZXJ2ZXIgSW5mbyBwYWdlLgogKgkJKyBJbXBvcnRCdWRkeS5waHAgKEJhY2t1cEJ1ZGR5IGltcG9ydGVyKSBTZXJ2ZXIgSW5mb3JtYXRpb24gYnV0dG9uIGRyb3Bkb3duIGRpc3BsYXkuCiAqCQkrIFNlcnZlckJ1ZGR5IChwbHVnaW4pCiAqCiAqCVVzZSBjYXV0aW9uIHdoZW4gdXBkYXRlZCB0byBwcmV2ZW50IGJyZWFraW5nIG90aGVyIHByb2plY3RzLgogKgogKi8KCgoKLy8gUmV0dXJuIGFycmF5KCBsb2NhbCwgbWFzdGVyICk7CmZ1bmN0aW9uIHBocGluZm9fYXJyYXkoICRtb2RlID0gLTEgKSB7IAogICAgb2Jfc3RhcnQoKTsgCiAgICBwaHBpbmZvKCAkbW9kZSApOyAKICAgICRzID0gb2JfZ2V0X2NvbnRlbnRzKCk7IAogICAgb2JfZW5kX2NsZWFuKCk7IAogICAgJGEgPSAkbXRjID0gYXJyYXkoKTsgCiAgICBpZiAocHJlZ19tYXRjaF9hbGwoJy88dHI+PHRkIGNsYXNzPSJlIj4oLio/KTxcL3RkPjx0ZCBjbGFzcz0idiI+KC4qPyk8XC90ZD4oOj88dGQgY2xhc3M9InYiPiguKj8pPFwvdGQ+KT88XC90cj4vJywkcywkbXRjLFBSRUdfU0VUX09SREVSKSkgewogICAgICAgIGZvcmVhY2goJG10YyBhcyAkdil7IAogICAgICAgICAgICBpZigkdlsyXSA9PSAnPGk+bm8gdmFsdWU8L2k+JykgY29udGludWU7IAogICAgICAgICAgICAkbWFzdGVyID0gJyc7CiAgICAgICAgICAgIGlmICggaXNzZXQoICR2WzNdICkgKSB7CiAgICAgICAgICAgIAkkbWFzdGVyID0gc3RyaXBfdGFncyggJHZbM10gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYVskdlsxXV0gPSBhcnJheSggJHZbMl0sICRtYXN0ZXIgKTsKICAgICAgICB9IAogICAgfSAKICAgIHJldHVybiAkYTsgCn0gCgoKLy8gaW5pX2dldF9ib29sKCkgY3JlZGl0OiBuaWNvbGFzIGRvdCBncmVrYXMrcGhwIGF0IGdtYWlsIGRvdCBjb20KZnVuY3Rpb24gaW5pX2dldF9ib29sKCAkYSApIHsKCSRiID0gaW5pX2dldCgkYSk7Cglzd2l0Y2ggKHN0cnRvbG93ZXIoJGIpKSB7CgkJY2FzZSAnb24nOgoJCWNhc2UgJ3llcyc6CgkJY2FzZSAndHJ1ZSc6CgkJCXJldHVybiAnYXNzZXJ0LmFjdGl2ZScgIT09ICRhOwoJCQkKCQljYXNlICdzdGRvdXQnOgoJCWNhc2UgJ3N0ZGVycic6CgkJCXJldHVybiAnZGlzcGxheV9lcnJvcnMnID09PSAkYTsKCQkJCgkJZGVmYXVsdDoKCQkJcmV0dXJuIChib29sKSAoaW50KSAkYjsKCX0KfQoKCgpmdW5jdGlvbiBwYl9iYWNrdXBidWRkeV9nZXRfbG9hZGF2ZygpIHsKCSRyZXN1bHQgPSBhcnJheSggJ24vYScsICduL2EnLCAnbi9hJyApOwoJaWYgKCBmdW5jdGlvbl9leGlzdHMoJ3N5c19nZXRsb2FkYXZnJykgKSB7CgkJJGxvYWQgPSBAc3lzX2dldGxvYWRhdmcoKTsKCQlpZiAoaXNfYXJyYXkoJGxvYWQpKSB7CgkJCWlmKGNvdW50KCRsb2FkKSA9PSAzKQoJCQkJcmV0dXJuICRsb2FkOwoJCQllbHNlIHsKCQkJCWZvcigkaT0wOyRpPGNvdW50KCRsb2FkKTskaSsrKQoJCQkJCSRyZXN1bHRbJGldID0gJGxvYWRbJGldOwoJCQl9CgkJfQoJfQoJaWYgKCBzdWJzdHIoIFBIUF9PUywgMCwgMyApID09ICdXSU4nICkgeyAvLyBXSU5ET1dTLgoJCW9iX3N0YXJ0KCk7CgkJJHN0YXR1cyA9IG51bGw7CgkJQHBhc3N0aHJ1KCd0eXBlcGVyZiAtc2MgMSAiXHByb2Nlc3NvcihfdG90YWwpXCUgcHJvY2Vzc29yIHRpbWUiJywkc3RhdHVzKTsKCQkkY29udGVudCA9IG9iX2dldF9jb250ZW50cygpOwoJCW9iX2VuZF9jbGVhbigpOwoJCWlmICgkc3RhdHVzID09PSAwKSB7CgkJCWlmIChwcmVnX21hdGNoKCIvXCxcIihbMC05XStcLlswLTldKylcIi8iLCRjb250ZW50LCRsb2FkKSkgewkJCQkJCgkJCQkkcmVzdWx0WzBdID0gbnVtYmVyX2Zvcm1hdF9pMThuKCRsb2FkWzFdLDIpLicgJSc7CgkJCQkkcmVzdWx0WzFdID0gJ24vYSc7CgkJCQkkcmVzdWx0WzJdID0gJ24vYSc7CgkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJfQoJCX0JCQkKCX0gZWxzZSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9nZXRfY29udGVudHMnKSAmJiBAZmlsZV9leGlzdHMoJy9wcm9jL2xvYWRhdmcnKSkgewoJCQkkbG9hZCA9IGV4cGxvZGUoY2hyKDMyKSwgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvcHJvYy9sb2FkYXZnJykpOwoJCQlpZiAoaXNfYXJyYXkoJGxvYWQpICYmIChjb3VudCgkbG9hZCkgPj0gMykpIHsKCQkJCSRyZXN1bHQgPSBhcnJheV9zbGljZSgkbG9hZCwgMCwgMyk7CgkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJfQoJCX0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKCQkJJHN0ciA9IHN1YnN0cihzdHJyY2hyKEBzaGVsbF9leGVjKCd1cHRpbWUnKSwiOiIpLDEpOwoJCQlyZXR1cm4gYXJyYXlfbWFwKCJ0cmltIixleHBsb2RlKCIsIiwkc3RyKSk7CgkJfQoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KCgoJCiR0ZXN0cyA9IGFycmF5KCk7CgoKLy8gU2tpcCB0aGVzZSB0ZXN0cyBpbiBpbXBvcnRidWRkeS4KaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCgkvLyBCQUNLVVBCVUREWSBWRVJTSU9OCgkvLyBUT0RPOiBQdXQgQkIgdmVyc2lvbiBoZXJlLiBBZnRlciBKb3JkYW4gZml4ZXMgdXBkYXRlciBBUEkgdG8gYWx3YXlzIHByb3ZpZGUgbGF0ZXN0IHZlcnNpb24gaW5mbyB0aGVuIHdlIGNhbiBjb21wYXJlIGFuZCB3YXJuIGlmIHRvbyBvdXQgb2YgZGF0YS4KCS8qCgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdCYWNrdXBCdWRkeSBWZXJzaW9uJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSc+PSAnIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnd3BfbWluaW11bScgKSAuICcgKGxhdGVzdCBiZXN0KScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQkkd3BfdmVyc2lvbiwKCQkJCQkndGlwJwkJCT0+CQlfXygnVmVyc2lvbiBvZiBXb3JkUHJlc3MgY3VycmVudGx5IHJ1bm5pbmcuIEl0IGlzIGltcG9ydGFudCB0byBrZWVwIHlvdXIgV29yZFByZXNzIHVwIHRvIGRhdGUgZm9yIHNlY3VyaXR5ICYgZmVhdHVyZXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cF92ZXJzaW9uLCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd3cF9taW5pbXVtJyApLCAnPD0nICkgKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdGQUlMJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJKi8KCQoJCgkKCS8vIEJBQ0tVUEJVRERZIFZFUlNJT04KCWlmICggZmFsc2UgPT09ICggJGxhdGVzdFZlcnNpb24gPSBiYWNrdXBidWRkeV9jb3JlOjpkZXRlcm1pbmVMYXRlc3RWZXJzaW9uKCAkYnlwYXNzQ2FjaGUgPSB0cnVlICkgKSApIHsKCQkkc3VnZ2VzdGlvbl90ZXh0ID0gJ1tpbmZvcm1hdGlvbiB1bmF2YWlsYWJsZV0nOwoJCSRsYXRlc3RfYmFja3VwYnVkZHlfbm9ubWlub3JfdmVyc2lvbiA9IDA7Cgl9IGVsc2UgewoJCSRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiA9ICRsYXRlc3RWZXJzaW9uWzBdOwoJCSRsYXRlc3RfYmFja3VwYnVkZHlfbm9ubWlub3JfdmVyc2lvbiA9ICRsYXRlc3RWZXJzaW9uWzFdOwoJCQoJCSRzdWdnZXN0aW9uX3RleHQgPSAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X25vbm1pbm9yX3ZlcnNpb247CgkJaWYgKCAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gPT0gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSApIHsgLy8gQXQgYWJzb2x1dGUgbGF0ZXN0IGluY2x1ZGluZyBtaW5vci4KCQkJJHN1Z2dlc3Rpb25fdGV4dCAuPSAnIChtYWpvciB2ZXJzaW9uKSBvciAnIC4gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uIC4gJyAoPGEgaHJlZj0ib3B0aW9ucy1nZW5lcmFsLnBocD9wYWdlPWl0aGVtZXMtbGljZW5zaW5nIiB0aXRsZT0iWW91IG1heSBlbmFibGUgdXBncmFkaW5nIHRvIHRoZSBxdWljayByZWxlYXNlIHZlcnNpb24gb24gdGhlIGlUaGVtZXMgTGljZW5zaW5nIHBhZ2UuIj5xdWljayByZWxlYXNlPC9hPiknOwoJCX0gZWxzZWlmICggJGxhdGVzdF9iYWNrdXBidWRkeV9ub25taW5vcl92ZXJzaW9uICE9ICRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiApIHsgLy8gTWlub3IgdmVyc2lvbiBhdmFpbGFibGUgdGhhdCBpcyBuZXdlciB0aGFuIGxhdGVzdCBtYWpvci4KCQkJJHN1Z2dlc3Rpb25fdGV4dCAuPSAnIChtYWpvciB2ZXJzaW9uKSBvciAnIC4gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uIC4gJyAoPGEgaHJlZj0icGx1Z2lucy5waHA/aXRoZW1lcy11cGRhdGVyLWZvcmNlLW1pbm9yLXVwZGF0ZT0xIiB0aXRsZT0iWW91IG1heSBlbmFibGUgdXBncmFkaW5nIHRvIHRoZSBxdWljayByZWxlYXNlIHZlcnNpb24gb24gdGhlIGlUaGVtZXMgTGljZW5zaW5nIHBhZ2UuIj5xdWljayByZWxlYXNlIHZlcnNpb248L2E+OyA8YSBocmVmPSJvcHRpb25zLWdlbmVyYWwucGhwP3BhZ2U9aXRoZW1lcy1saWNlbnNpbmciIHRpdGxlPSJPbmNlIHlvdSBoYXZlIGxpY2Vuc2VkIEJhY2t1cEJ1ZGR5IHlvdSBtYXkgc2VsZWN0IHRoaXMgdG8gZ28gdG8gdGhlIFBsdWdpbnMgcGFnZSB0byB1cGdyYWRlIHRvIHRoZSBsYXRlc3QgcXVpY2sgcmVsZWFzZSB2ZXJzaW9uLiBUeXBpY2FsbHkgb25seSB0aGUgbWFpbiBtYWpvciB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhdXRvbWF0aWMgdXBkYXRlcyBidXQgdGhpcyBvcHRpb24gaW5zdHJ1Y3RzIHRoZSB1cGRhdGVyIHRvIGRpc3BsYXkgbWlub3IgdmVyc2lvbiB1cGRhdGVzIGZvciBhcHByb3hpbWF0ZWx5IG9uZSBob3VyLiBJZiBpdCBkb2VzIG5vdCBpbW1lZGlhdGVseSBiZWNvbWUgYXZhaWxhYmxlIG9uIHRoZSBQbHVnaW5zIHBhZ2UsIHRyeSByZWZyZXNoaW5nIGEgY291cGxlIG9mIHRpbWVzLiI+cXVpY2sgcmVsZWFzZSBzZXR0aW5nczwvYT4pJzsKCQl9IGVsc2UgewoJCQkkc3VnZ2VzdGlvbl90ZXh0IC49ICcgKGxhdGVzdCknOwoJCX0KCX0KCQoJJHZlcnNpb25fc3RyaW5nID0gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKTsKCS8vIElmIG9uIERFViBzeXN0ZW0gKC5naXQgZGlyIGV4aXN0cykgdGhlbiBhcHBlbmQgc29tZSBkZXRhaWxzIG9uIGN1cnJlbnQuCglpZiAoIEBmaWxlX2V4aXN0cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnLy5naXQvbG9ncy9IRUFEJyApICkgewoJCSRjb21taXRfbG9nID0gZXNjYXBlc2hlbGxhcmcoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy8uZ2l0L2xvZ3MvSEVBRCcgKTsKCQkkY29tbWl0X2xpbmUgPSBzdHJfcmVwbGFjZSggJ1wnJywgJ2AnLCBleGVjKCAidGFpbCAtbiAxIHskY29tbWl0X2xvZ30iICkgKTsKCQkkdmVyc2lvbl9zdHJpbmcgLj0gJyA8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXgtd2lkdGg6IDI1MHB4OyBmb250LXNpemU6IDhweDsiPltERVY6ICcgLiAkY29tbWl0X2xpbmUgLiAnXTwvc3Bhbj4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknQmFja3VwQnVkZHkgVmVyc2lvbicsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQkkc3VnZ2VzdGlvbl90ZXh0LAoJCQkJCSd2YWx1ZScJCQk9PgkJJHZlcnNpb25fc3RyaW5nLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdWZXJzaW9uIG9mIEJhY2t1cEJ1ZGR5IGN1cnJlbnRseSBydW5uaW5nIG9uIHRoaXMgc2l0ZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CglpZiAoIHZlcnNpb25fY29tcGFyZSggcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSwgJGxhdGVzdF9iYWNrdXBidWRkeV9ub25taW5vcl92ZXJzaW9uLCAnPCcgKSApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkvLyBXT1JEUFJFU1MgVkVSU0lPTgoJZ2xvYmFsICR3cF92ZXJzaW9uOwoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknV29yZFByZXNzIFZlcnNpb24nLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJz49ICcgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd3cF9taW5pbXVtJyApIC4gJyAobGF0ZXN0IGJlc3QpJywKCQkJCQkndmFsdWUnCQkJPT4JCSR3cF92ZXJzaW9uLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdWZXJzaW9uIG9mIFdvcmRQcmVzcyBjdXJyZW50bHkgcnVubmluZy4gSXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgeW91ciBXb3JkUHJlc3MgdXAgdG8gZGF0ZSBmb3Igc2VjdXJpdHkgJiBmZWF0dXJlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CglpZiAoIHZlcnNpb25fY29tcGFyZSggJHdwX3ZlcnNpb24sIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3dwX21pbmltdW0nICksICc8PScgKSApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ0ZBSUwnOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoJLy8gTVlTUUwgVkVSU0lPTgoJZ2xvYmFsICR3cGRiOwoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknTXlTUUwgVmVyc2lvbicsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknPj0gNS42LjAgKFdvcmRQcmVzcyByZWNvbW1lbmRzIDUuNispJywKCQkJCQkndmFsdWUnCQkJPT4JCSR3cGRiLT5kYl92ZXJzaW9uKCksCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ1ZlcnNpb24gb2YgeW91ciBkYXRhYmFzZSBzZXJ2ZXIgKG15c3FsKSBhcyByZXBvcnRlZCB0byB0aGlzIHNjcmlwdCBieSBXb3JkUHJlc3MuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cGRiLT5kYl92ZXJzaW9uKCksICc1LjAuMTUnLCAnPD0nICkgKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdGQUlMJzsKCX0gZWxzZWlmICggdmVyc2lvbl9jb21wYXJlKCAkd3BkYi0+ZGJfdmVyc2lvbigpLCAnNS42LjAnLCAnPD0nICkgKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCS8vIEFEREhBTkRMRVIgSFRBQ0NFU1MgQ0hFQ0sKCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ0FkZEhhbmRsZXIgaW4gLmh0YWNjZXNzJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSdob3N0IGRlcGVuZGFudCAobm9uZSBiZXN0IHVubGVzcyByZXF1aXJlZCknLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdJZiBkZXRlY3RlZCB0aGVuIHlvdSBtYXkgaGF2ZSBkaWZmaWN1bHR5IG1pZ3JhdGluZyB5b3VyIHNpdGUgdG8gc29tZSBob3N0cyB3aXRob3V0IGZpcnN0IHJlbW92aW5nIHRoZSBBZGRIYW5kbGVyIGxpbmUuIFNvbWUgaG9zdHMgd2lsbCBtYWxmdW5jdGlvbiB3aXRoIHRoaXMgbGluZSBpbiB0aGUgLmh0YWNjZXNzIGZpbGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICcuaHRhY2Nlc3MnICkgKSB7CgkJJGFkZGhhbmRsZXJfbm90ZSA9ICcnOwoJCSRodGFjY2Vzc19saW5lcyA9IGZpbGUoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApOwoJCWZvcmVhY2ggKCAkaHRhY2Nlc3NfbGluZXMgYXMgJGh0YWNjZXNzX2xpbmUgKSB7CgkJCWlmICggcHJlZ19tYXRjaCggJy9eKFxzKilBZGRIYW5kbGVyKC4qKS9pJywgJGh0YWNjZXNzX2xpbmUsICRtYXRjaGVzICkgPiAwICkgewoJCQkJJGFkZGhhbmRsZXJfbm90ZSA9IHBiX2JhY2t1cGJ1ZGR5Ojp0aXAoIGh0bWxlbnRpdGllcyggJG1hdGNoZXNbMF0gKSwgX18oICdBZGRIYW5kbGVyIFZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksIGZhbHNlICk7CgkJCX0KCQl9CgkJdW5zZXQoICRodGFjY2Vzc19saW5lcyApOwoJCQoJCWlmICggJGFkZGhhbmRsZXJfbm90ZSA9PSAnJyApIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsndmFsdWUnXSA9IF9fKCdub25lLCBuL2EnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQl9IGVsc2UgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3ZhbHVlJ10gPSBfXygnZXhpc3RzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkYWRkaGFuZGxlcl9ub3RlOwoJCX0KCQl1bnNldCggJGh0YWNjZXNzX2NvbnRlbnRzICk7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsndmFsdWUnXSA9IF9fKCduL2EnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJLy8gU2V0IHVwIFppcEJ1ZGR5IHdoZW4gd2l0aGluIEJhY2t1cEJ1ZGR5CglyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApOwoJCglyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvbXlzcWxidWRkeS9teXNxbGJ1ZGR5LnBocCcgKTsKCWdsb2JhbCAkd3BkYjsKCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X215c3FsYnVkZHkoIERCX0hPU1QsIERCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JELCAkd3BkYi0+cHJlZml4ICk7IC8vICRkYXRhYmFzZV9ob3N0LCAkZGF0YWJhc2VfbmFtZSwgJGRhdGFiYXNlX3VzZXIsICRkYXRhYmFzZV9wYXNzLCAkb2xkX3ByZWZpeCwgJGZvcmNlX21ldGhvZCA9IGFycmF5KCkKfQoKCi8vIFBIUCBWRVJTSU9OCmlmICggIWRlZmluZWQoICdwbHVnaW5idWRkeV9pbXBvcnRidWRkeScgKSApIHsKCSRwaHBfbWluaW11bSA9ICc1LjMnOyAvL3BiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3BocF9taW5pbXVtJyApOwp9IGVsc2UgeyAvLyBpbXBvcnRidWRkeSB2YWx1ZS4KCSRwaHBfbWluaW11bSA9IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3BocF9taW5pbXVtJyApOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIFZlcnNpb24nLAoJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknPj0gJyAuICRwaHBfbWluaW11bSAuICcgKFdvcmRQcmVzcyByZWNvbW1lbmRzIDcuMCspJywKCQkJCSd2YWx1ZScJCQk9PgkJcGhwdmVyc2lvbigpLAoJCQkJJ3RpcCcJCQk9PgkJX18oJ1ZlcnNpb24gb2YgUEhQIGN1cnJlbnRseSBydW5uaW5nIG9uIHRoaXMgc2l0ZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJKTsKaWYgKCB2ZXJzaW9uX2NvbXBhcmUoIFBIUF9WRVJTSU9OLCAkcGhwX21pbmltdW0sICc8PScgKSApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnRkFJTCc7Cn0gZWxzZWlmICggdmVyc2lvbl9jb21wYXJlKCBQSFBfVkVSU0lPTiwgJzUuNicsICc8PScgKSApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCi8vIFBIUCBtYXhfZXhlY3V0aW9uX3RpbWUKJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkndGl0bGUnCQkJPT4JCSdQSFAgbWF4X2V4ZWN1dGlvbl90aW1lIChzZXJ2ZXItcmVwb3J0ZWQpJywKCQkJCSdzdWdnZXN0aW9uJwk9PgkJJz49ICcgLiAnMzAgc2Vjb25kcyAoMzArIGJlc3QpJywKCQkJCSd2YWx1ZScJCQk9PgkJaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSwKCQkJCSd0aXAnCQkJPT4JCV9fKCdNYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgUEhQIGFsbG93cyBzY3JpcHRzIHRvIHJ1bi4gQWZ0ZXIgdGhpcyBsaW1pdCBpcyByZWFjaGVkIHRoZSBzY3JpcHQgaXMga2lsbGVkLiBUaGUgbW9yZSB0aW1lIGF2YWlsYWJsZSB0aGUgYmV0dGVyLiAzMCBzZWNvbmRzIGlzIG1vc3QgY29tbW9uIHRob3VnaCA2MCBzZWNvbmRzIGlzIGlkZWFsLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkpOwppZiAoIHN0cl9pcmVwbGFjZSggJ3MnLCAnJywgaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSApIDwgMzAgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoKLy8gTWF4aW11bSBQSFAgUnVudGltZSAoQUNUVUFMIFRFU1RFRCEpCmlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CglpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gPiAwICkgewoJCSRsYXN0X3Rlc3RlZCA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+bG9jYWxpemVfdGltZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfcnVudGltZSddICkgKSAuICcgKCcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbGFzdF90ZXN0ZWRfcGhwX3J1bnRpbWUnXSApIC4gJyAnIC4gX18oICdhZ28nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcpJzsKCQkkdGVzdGVkX3J1bnRpbWVfdmFsdWUgPSAnPHNwYW4gaWQ9InBiX3N0YXRzX3J1bl9waHBfcnVudGltZV90ZXN0IiB0aXRsZT0iTGFzdCB0ZXN0ZWQ6IGAnIC4gJGxhc3RfdGVzdGVkIC4gJ2AiPicgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfcnVudGltZSddIC4gJyAnIC4gX18oICdzZWNzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9zcGFuPic7Cgl9IGVsc2UgewoJCSR0ZXN0ZWRfcnVudGltZV92YWx1ZSA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIGlkPSJwYl9zdGF0c19ydW5fcGhwX3J1bnRpbWVfdGVzdCI+JyAuIF9fKCAnUGVuZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvc3Bhbj4nOwoJfQoJJGRpc2FibGVkID0gJyc7CglpZiAoIDAgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfcnVudGltZV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSApIHsKCQkkZGlzYWJsZWQgPSAnPHNwYW4gdGl0bGU9IicgLiBfXyggJ0Rpc2FibGVkIGJhc2VkIG9uIEFkdmFuY2VkIFNldHRpbmdzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+JyAuIF9fKCAnRGlzYWJsZWQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L3NwYW4+JzsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ1Rlc3RlZCBQSFAgTWF4IEV4ZWN1dGlvbiBUaW1lJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSc+PSAzMCBzZWNvbmRzICgzMCsgYmVzdCknLAoJCQkJCSd2YWx1ZScJCQk9PgkJJHRlc3RlZF9ydW50aW1lX3ZhbHVlIC4gJGRpc2FibGVkIC4gJyA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyBwYl9iYWNrdXBidWRkeV90ZXN0UEhQUnVudGltZSIgcmVsPSJydW5fcGhwX3J1bnRpbWVfdGVzdCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncnVuX3BocF9ydW50aW1lX3Rlc3QnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSdW4gVGVzdCAobWF5IHRha2Ugc2V2ZXJhbCBtaW51dGVzKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ1RoaXMgaXMgdGhlIFRFU1RFRCBhbW91bnQgb2YgdGltZSB0aGF0IFBIUCBhbGxvd3Mgc2NyaXB0cyB0byBydW4uIFRoZSB0ZXN0IHdhcyBwZXJmb3JtZWQgYnkgb3V0cHV0dGluZyAvIGxvZ2dpbmcgdGhlIHNjcmlwdCB0aW1lIGVsYXBzZWQgb25jZSBwZXIgc2Vjb25kIHVudGlsIFBIUCB0aW1lZCBvdXQgYW5kIHRodXMgdGhlIHRpbWUgcmVwb3J0ZWQgc3RvcHBlZC4gVGhpcyBnaXZlcyBhIGZhaXJseSBhY2N1cmF0ZSBudW1iZXIgY29tcGFyZWQgdG8gdGhlIHJlcG9ydGVkIG51bWJlciB3aGljaCBpcyBtb3N0IG9mdGVuIG92ZXJyaWRlbiBhdCB0aGUgc2VydmVyIHdpdGggYSBsaW1pdC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgJyAuICdUaGlzIHRlc3QgaXMgbGltaXRlZCB0byBgJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwX3J1bnRpbWVfdGVzdF9taW5pbXVtX2ludGVydmFsJ10gLiAnYCBzZWNvbmRzIGJhc2VkIG9uIHlvdXIgYWR2YW5jZWQgc2V0dGluZ3MgKDAgPSBkaXNhYmxlZCkuIEF1dG9tYXRpY2FsbHkgcmVzY2FucyBkdXJpbmcgaG91c2VrZWVwaW5nIGFmdGVyIGAnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfcnVudGltZV90ZXN0X21pbmltdW1faW50ZXJ2YWwnXSAuICdgIHNlY29uZHMgZWxhcHNlIGJldHdlZW4gdGVzdHMgYXMgd2VsbCBhbHdheXMgb24gcGx1Z2luIGFjdGl2YXRpb24uJywKCQkJCSk7CglpZiAoIGlzX251bWVyaWMoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gKSAmJiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9ydW50aW1lJ10gPCAyOSApICkgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnRkFJTCc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKfQoKCgovLyBNYXhpbXVtIFBIUCBSdW50aW1lIChBQ1RVQUwgVEVTVEVEISkKCiRiYl9waHBfbWF4X2V4ZWN1dGlvbiAgICAgICAgPSBiYWNrdXBidWRkeV9jb3JlOjpkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCk7IC8vIExlc3NlciBvZiBQSFAgcmVwb3J0ZWQgYW5kIHRlc3RlZC4gRmxvYXQuCiRiYl9waHBfbWF4X2V4ZWN1dGlvbl9zdHJpbmcgPSAkYmJfcGhwX21heF9leGVjdXRpb24gLiAnICcgLiBfXyggJ3NlY3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgLy8gU3RyaW5nLgoKaWYgKCBiYWNrdXBidWRkeV9jb3JlOjphZGp1c3RlZE1heEV4ZWN1dGlvblRpbWUoKSAhPSAkYmJfcGhwX21heF9leGVjdXRpb24gKSB7IC8vIFRha2VzIGludG8gYWNjb3VudCB1c2VyIG92ZXJyaWRlLgoJJGJiX3BocF9tYXhfZXhlY3V0aW9uX3N0cmluZyA9ICc8c3RyaWtlPicgLiAkYmJfcGhwX21heF9leGVjdXRpb25fc3RyaW5nIC4gJzwvc3RyaWtlPiAnIC4gX18oICdPdmVycmlkZGVuIGluIHNldHRpbmdzIHRvOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gYmFja3VwYnVkZHlfY29yZTo6YWRqdXN0ZWRNYXhFeGVjdXRpb25UaW1lKCkgLiAgJyAnIC4gX18oICdzZWNzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cn0KaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ0JhY2t1cEJ1ZGR5IFBIUCBNYXggRXhlY3V0aW9uIFRpbWUnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJz49IDMwIHNlY29uZHMgKDMwKyBiZXN0KScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQkkYmJfcGhwX21heF9leGVjdXRpb25fc3RyaW5nLAoJCQkJCSd0aXAnCQkJPT4JCWVzY19hdHRyX18oJ1RoaXMgaXMgdGhlIG1heCBleGVjdXRpb24gdGltZSBCYWNrdXBCdWRkeSBpcyB1c2luZyBmb3IgY2h1bmtpbmcuIEl0IGlzIHRoZSBsZXNzZXIgb2YgdGhlIHZhbHVlcyBvZiB0aGUgcmVwb3J0ZWQgUEhQIGV4ZWN1dGlvbiB0aW1lIGFuZCBhY3R1YWwgdGVzdGVkIGV4ZWN1dGlvbiB0aW1lLiBJZiB0aGUgQmFja3VwQnVkZHkgIk1heCB0aW1lIHBlciBjaHVuayIgQWR2YW5jZWQgU2V0dGluZyBpcyBzZXQgdGhlbiB0aGF0IHZhbHVlIGlzIHVzZWQgaW5zdGVhZC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CglpZiAoICRiYl9waHBfbWF4X2V4ZWN1dGlvbiA8IDI4ICkgeyAvLyAgSGFzIGEgbGl0dGxlIHdpZ2dsZSByb29tLgoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnRkFJTCc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKfQoKCgokcGhwaW5mb19hcnJheSA9IHBocGluZm9fYXJyYXkoIDQgKTsKCgoKLy8gTUVNT1JZIExJTUlUCgpmdW5jdGlvbiBiYl9yZXR1cm5fYnl0ZXMoJHZhbCkgewogICAgJHZhbCA9IHRyaW0oJHZhbCk7CiAgICAkbGFzdCA9IHN0cnRvbG93ZXIoJHZhbFtzdHJsZW4oJHZhbCktMV0pOwogICAgc3dpdGNoKCRsYXN0KSB7CiAgICAgICAgLy8gVGhlICdHJyBtb2RpZmllciBpcyBhdmFpbGFibGUgc2luY2UgUEhQIDUuMS4wCiAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICR2YWwgKj0gMTAyNDsKICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgJHZhbCAqPSAxMDI0OwogICAgICAgIGNhc2UgJ2snOgogICAgICAgICAgICAkdmFsICo9IDEwMjQ7CiAgICB9CgogICAgcmV0dXJuICR2YWw7Cn0KCiRtZW1fbGltaXRzID0gYXJyYXkoKTsKaWYgKCAhIGlzc2V0KCAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J10gKSApIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ3Vua25vd24nOwp9IGVsc2UgewoJZ2xvYmFsICRiYl9sb2NhbF9tZW0sICRiYl9tYXN0ZXJfbWVtOwoJJGJiX2xvY2FsX21lbSA9IGJiX3JldHVybl9ieXRlcyggJHBocGluZm9fYXJyYXlbJ21lbW9yeV9saW1pdCddWzBdICkgLyAxMDI0IC8gMTAyNDsKCSRtZW1fbGltaXRzW10gPSAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMF07CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICRwaHBpbmZvX2FycmF5WydtZW1vcnlfbGltaXQnXVswXTsKCWlmICggaXNzZXQoICRwaHBpbmZvX2FycmF5WydtZW1vcnlfbGltaXQnXVsxXSApICkgewoJCSRiYl9tYXN0ZXJfbWVtID0gYmJfcmV0dXJuX2J5dGVzKCAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMV0gKSAvIDEwMjQgLyAxMDI0OwoJCSRtZW1fbGltaXRzW10gPSAkcGhwaW5mb19hcnJheVsnbWVtb3J5X2xpbWl0J11bMV07CgkJJHBhcmVudF9jbGFzc192YWwgLj0gJyAobG9jYWwpIC8gJyAuICRwaHBpbmZvX2FycmF5WydtZW1vcnlfbGltaXQnXVsxXS4gJyAobWFzdGVyKSc7Cgl9Cn0KCgoKCiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJJ3RpdGxlJwkJCT0+CQknUmVwb3J0ZWQgUEhQIE1lbW9yeSBMaW1pdCcsCgkJCQknc3VnZ2VzdGlvbicJPT4JCSc+PSAyNTYgTUInLAoJCQkJJ3ZhbHVlJwkJCT0+CQkkcGFyZW50X2NsYXNzX3ZhbCwKCQkJCSd0aXAnCQkJPT4JCV9fKCdUaGUgYW1vdW50IG9mIG1lbW9yeSB0aGlzIHNpdGUgaXMgYWxsb3dlZCB0byBjb25zdW1lLiBOb3RlIHRoYXQgc29tZSBob3N0XCdzIG1hc3RlciB2YWx1ZSBtYXkgb3ZlcnJpZGUgdGhlIGxvY2FsIHNldHRpbmcsIGNhcHBpbmcgaXQgYXQgYSBsb3dlciB2YWx1ZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJKTsKZm9yZWFjaCggJG1lbV9saW1pdHMgYXMgJG1lbV9saW1pdCApIHsKCWlmICggcHJlZ19tYXRjaCggJy8oXGQrKShcdyopLycsICRtZW1fbGltaXQsICRtYXRjaGVzICkgKSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSAkbWF0Y2hlc1sxXTsKCQkkdW5pdCA9ICRtYXRjaGVzWzJdOwoJCS8vIFVwIG1lbW9yeSBsaW1pdCBpZiBjdXJyZW50bHkgbG93ZXIgdGhhbiAyNTZNLgoJCWlmICggJ2cnICE9PSBzdHJ0b2xvd2VyKCAkdW5pdCApICkgewoJCQlpZiAoICdtJyAhPT0gc3RydG9sb3dlciggJHVuaXQgKSApIHsKCQkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7CgkJCX0gZWxzZWlmICggJHBhcmVudF9jbGFzc192YWwgPCAxMjUgKSB7CgkJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ0ZBSUwnOwoJCQl9IGVsc2VpZiAoICRwYXJlbnRfY2xhc3NfdmFsIDwgMjUwICkgewoJCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCQkJfSBlbHNlIHsKCQkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJfQoJCgkvLyBPbmNlIHNldCB0byB3YXJuaW5nLCBkb24ndCBwcm9jZXNzIGFueSBtb3JlLgoJaWYgKCAkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID09ICdXQVJOSU5HJyApIHsKCQlicmVhazsKCX0KfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBUZXN0ZWQgUEhQIE1lbW9yeSBMaW1pdCAoQUNUVUFMIFRFU1RFRCEpCmlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CglpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9tZW1vcnknXSA+IDAgKSB7CgkJJGxhc3RfdGVzdGVkID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfdGVzdGVkX3BocF9tZW1vcnknXSApICkgLiAnICgnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnRpbWVfYWdvKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfdGVzdGVkX3BocF9tZW1vcnknXSApIC4gJyAnIC4gX18oICdhZ28nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcpJzsKCQkkdGVzdGVkX21lbW9yeV92YWx1ZSA9ICc8c3BhbiBpZD0icGJfc3RhdHNfcnVuX3BocF9tZW1vcnlfdGVzdCIgdGl0bGU9Ikxhc3QgdGVzdGVkOiBgJyAuICRsYXN0X3Rlc3RlZCAuICdgIj4nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyd0ZXN0ZWRfcGhwX21lbW9yeSddIC4gJyAnIC4gX18oICdNQicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvc3Bhbj4nOwoJfSBlbHNlIHsKCQkkdGVzdGVkX21lbW9yeV92YWx1ZSA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIGlkPSJwYl9zdGF0c19ydW5fcGhwX21lbW9yeV90ZXN0Ij4nIC4gX18oICdQZW5kaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9zcGFuPic7Cgl9CglnbG9iYWwgJGJiX3Rlc3RlZF9tZW0sICRiYl90ZXN0ZWRfbWVtX2FnbzsKCQoJJGRpc2FibGVkID0gJyc7CglpZiAoIDAgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfbWVtb3J5X3Rlc3RfbWluaW11bV9pbnRlcnZhbCddICkgewoJCSRkaXNhYmxlZCA9ICc8c3BhbiB0aXRsZT0iJyAuIF9fKCAnRGlzYWJsZWQgYmFzZWQgb24gQWR2YW5jZWQgU2V0dGluZ3MuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj4nIC4gX18oICdEaXNhYmxlZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvc3Bhbj4nOwoJCSRiYl90ZXN0ZWRfbWVtID0gMDsKCQkkYmJfdGVzdGVkX21lbV9hZ28gPSAtMTsKCX0gZWxzZSB7CgkJJGJiX3Rlc3RlZF9tZW0gPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfbWVtb3J5J107CgkJJGJiX3Rlc3RlZF9tZW1fYWdvID0gdGltZSgpIC0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X3Rlc3RlZF9waHBfbWVtb3J5J107Cgl9CgkKCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ1Rlc3RlZCBQSFAgTWVtb3J5IExpbWl0JywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSc+PSAyNTYgTUInLAoJCQkJCSd2YWx1ZScJCQk9PgkJJHRlc3RlZF9tZW1vcnlfdmFsdWUgLiAkZGlzYWJsZWQgLiAnIDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIHBiX2JhY2t1cGJ1ZGR5X3Rlc3RQSFBNZW1vcnkiIHJlbD0icnVuX3BocF9tZW1vcnlfdGVzdCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncnVuX3BocF9tZW1vcnlfdGVzdCcgKSAuICciIHRpdGxlPSInIC4gX18oJ1J1biBUZXN0IChtYXkgdGFrZSBzZXZlcmFsIG1pbnV0ZXMpJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkndGlwJwkJCT0+CQlfXygnVGhpcyBpcyB0aGUgVEVTVEVEIGFtb3VudCBvZiBtZW1vcnkgYWxsb3dlZCB0byBQSFAgc2NyaXB0cy4gVGhlIHRlc3Qgd2FzIHBlcmZvcm1lZCBieSBvdXRwdXR0aW5nIC8gbG9nZ2luZyB0aGUgc2NyaXB0IG1lbW9yeSB1c2FnZSB3aGlsZSBtZW1vcnkgdXNhZ2Ugd2FzIGluY3JlYXNlZC4gVGhpcyBnaXZlcyBhIGZhaXJseSBhY2N1cmF0ZSBudW1iZXIgY29tcGFyZWQgdG8gdGhlIHJlcG9ydGVkIG51bWJlciB3aGljaCBpcyBjb21tb25seSBvdmVycmlkZW4gYXQgdGhlIHNlcnZlciB3aXRoIGEgbGltaXQsIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gYXNjZXJ0YWluLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gJ1RoaXMgdGVzdCBpcyBsaW1pdGVkIHRvIHJ1bm5pbmcgbm8gbW9yZSBvZnRlbiB0aGFuIGV2ZXJ5IGAnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBfbWVtb3J5X3Rlc3RfbWluaW11bV9pbnRlcnZhbCddIC4gJ2Agc2Vjb25kcyBiYXNlZCBvbiB5b3VyIGFkdmFuY2VkIHNldHRpbmdzICgwID0gZGlzYWJsZWQpLiBSdW5zIGR1cmluZyBob3VzZWtlZXBpbmcgYXMgd2VsbCBhbHdheXMgb24gcGx1Z2luIGFjdGl2YXRpb24uJywKCQkJCSk7CglpZiAoIGlzX251bWVyaWMoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9tZW1vcnknXSApICkgewoJCWlmICggMCA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Rlc3RlZF9waHBfbWVtb3J5J10gKSB7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJIAl9IGVsc2VpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9tZW1vcnknXSA8IDEyMyApIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdGQUlMJzsKCQl9IGVsc2VpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVzdGVkX3BocF9tZW1vcnknXSA8IDI0NSApIHsgLy8gMjQ1IGluc3RlYWQgb2YgMjU2IHRvIGdpdmUgdGhlIHRlc3Qgc29tZSB3aWdnbGUgcm9vbS4KCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCQl9IGVsc2UgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCQl9Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwp9CgoKCi8vIEVSUk9SIExPR0dJTkcgRU5BQkxFRC9ESVNBQkxFRAppZiAoIHRydWUgPT0gaW5pX2dldCggJ2xvZ19lcnJvcnMnICkgKSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCSd0aXRsZScJCQk9PgkJJ1BIUCBFcnJvciBMb2dnaW5nIChsb2dfZXJyb3JzKScsCgknc3VnZ2VzdGlvbicJPT4JCSdlbmFibGVkJywKCSd2YWx1ZScJCQk9PgkJJHBhcmVudF9jbGFzc192YWwgLiAnIFs8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGNsYXNzPSJwYl9iYWNrdXBidWRkeV90ZXN0RXJyb3JMb2ciIHJlbD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3Rlc3RFcnJvckxvZycgKSAuICciIHRpdGxlPSInIC4gX18oJ1Rlc3RpbmcgdGhpcyB3aWxsIHRyaWdnZXIgYW4gZXJyb3JfbG9nKCkgZXZlbnQgd2l0aCB0aGUgY29udGVudCAiQmFja3VwQnVkZHkgVGVzdCAtIFRoaXMgaXMgb25seSBhIHRlc3QuIEEgdXNlciB0cmlnZ2VyZWQgQmFja3VwQnVkZHkgdG8gZGV0ZXJtaW5lIGlmIHdyaXRpbmcgdG8gdGhlIFBIUCBlcnJvciBsb2cgaXMgd29ya2luZyBhcyBleHBlY3RlZC4iJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj5UZXN0PC9hPl0nLAoJJ3RpcCcJCQk9PgkJX18oJ1doZXRoZXIgb3Igbm90IFBIUCBlcnJvcnMgYXJlIGxvZ2dlZCB0byBhIGZpbGUgb3Igbm90LiBTZXQgYnkgcGhwLmluaSBsb2dfZXJyb3JzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CiRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBFUlJPUiBMT0cgRklMRQppZiAoICFpbmlfZ2V0KCAnZXJyb3JfbG9nJyApICkgewoJJHBhcmVudF9jbGFzc192YWwgPSAndW5rbm93bic7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9IGluaV9nZXQoICdlcnJvcl9sb2cnICk7Cn0KJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkndGl0bGUnCQkJPT4JCSdQSFAgRXJyb3IgTG9nIEZpbGUgKGVycm9yX2xvZyknLAoJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCSd2YWx1ZScJCQk9PgkJJzxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1heC13aWR0aDogMjUwcHg7Ij4nIC4gJHBhcmVudF9jbGFzc192YWwgLiAnPC9zcGFuPicsCgkndGlwJwkJCT0+CQlfXygnRmlsZSB3aGVyZSBQSFAgZXJyb3JzIGFyZSBsb2dnZWQgdG8gaWYgUEhQIEVycm9yIExvZ2dpbmcgaXMgZW5hYmxlZCAocmVjb21tZW5kZWQpLiBTZXQgYnkgcGhwLmluaSBlcnJvcl9sb2cnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKKTsKJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CmFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCi8vIERJU1BMQVlfRVJST1JTIFNFVFRJTkcKaWYgKCB0cnVlID09IGluaV9nZXQoICdkaXNwbGF5X2Vycm9ycycgKSApIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2VuYWJsZWQnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZGlzYWJsZWQnOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJJ3RpdGxlJwkJCT0+CQknUEhQIERpc3BsYXkgRXJyb3JzIHRvIFNjcmVlbiAoZGlzcGxheV9lcnJvcnMpJywKCSdzdWdnZXN0aW9uJwk9PgkJJ2Rpc2FibGVkJywKCSd2YWx1ZScJCQk9PgkJJHBhcmVudF9jbGFzc192YWwsCgkndGlwJwkJCT0+CQlfXygnV2hldGhlciBvciBub3QgUEhQIGVycm9ycyBhcmUgZGlzcGxheWVkIG9uIHNjcmVlbiB0byB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZyBQSFAgcHJvYmxlbXMgYnV0IGRpc2FibGluZyBieSBkZWZhdWx0IGlzIG1vcmUgc2VjdXJlIGZvciBwcm9kdWN0aW9uLiBTZXQgYnkgcGhwLmluaSBkaXNwbGF5X2Vycm9ycycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAopOwokcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKLyoKaWYgKCAnZW5hYmxlZCcgIT0gJHBhcmVudF9jbGFzc192YWwgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0KKi8KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoKaWYgKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CglpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddICkgKSB7CgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIEFCU1BBVEggKTsKCX0KfQokemlwX21ldGhvZHMgPSBpbXBsb2RlKCAnLCAnLCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPl96aXBfbWV0aG9kcyApOwoKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCSR6aXBtZXRob2RfcmVmcmVzaCA9ICc8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX3ppcF9tZXRob2RzIiBhbHQ9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdyZWZyZXNoX3ppcF9tZXRob2RzJyApIC4gJyIgdGl0bGU9IicgLiBfXygnUmVmcmVzaCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPic7Cn0gZWxzZSB7CgkkemlwbWV0aG9kX3JlZnJlc2ggPSAnJzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCSd0aXRsZScJCQk9PgkJJ1ppcCBNZXRob2RzJywKCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ0NvbW1hbmQgbGluZSBbZmFzdGVzdF0gPiB6aXBhcmNoaXZlID4gUEhQLWJhc2VkIChwY2x6aXApIFtzbG93ZXN0XScsCgkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF96aXBfbWV0aG9kcyI+JyAuICR6aXBfbWV0aG9kcyAuICc8L3NwYW4+ICcgLiAkemlwbWV0aG9kX3JlZnJlc2gsCgkJCQkndGlwJwkJCT0+CQlfXygnTWV0aG9kcyB5b3VyIHNlcnZlciBzdXBwb3J0cyBmb3IgY3JlYXRpbmcgWklQIGZpbGVzLiBUaGVzZSB3ZXJlIHRlc3RlZCAmIHZlcmlmaWVkIHRvIG9wZXJhdGUuIENvbW1hbmQgbGluZSBpcyBtYWduaXR1ZGVzIGJldHRlciB0aGFuIG90aGVyIG1ldGhvZHMgYW5kIG9wZXJhdGVzIHZpYSBleGVjKCkgb3Igb3RoZXIgZXhlY3V0aW9uIGZ1bmN0aW9ucy4gWmlwQXJjaGl2ZSBpcyBhIFBIUCBleHRlbnNpb24uIFBIUC1iYXNlZCBaSVAgY29tcHJlc3Npb24vZXh0cmFjdGlvbiBpcyBwZXJmb3JtZWQgdmlhIGEgUEhQIHNjcmlwdCBjYWxsZWQgcGNsemlwIGJ1dCBpdCBpcyBzbG93ZXIgYW5kIGNhbiBiZSBtZW1vcnkgaW50ZW5zaXZlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkpOwppZiAoIGluX2FycmF5KCAnZXhlYycsIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXS0+X3ppcF9tZXRob2RzICkgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgppZiAoICFkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkKCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ0RhdGFiYXNlIER1bXAgTWV0aG9kcycsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknQ29tbWFuZCBsaW5lIGFuZC9vciBQSFAtYmFzZWQnLAoJCQkJCSd2YWx1ZScJCQk9PgkJaW1wbG9kZSggJywgJywgcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydteXNxbGJ1ZGR5J10tPmdldF9tZXRob2RzKCkgKSwKCQkJCQkndGlwJwkJCT0+CQlfXygnTWV0aG9kcyB5b3VyIHNlcnZlciBzdXBwb3J0cyBmb3IgZHVtcGluZyAoYmFja2luZyB1cCkgeW91ciBteXNxbCBkYXRhYmFzZS4gVGhlc2Ugd2VyZSB0ZXN0ZWQgdmFsdWVzIHVubGVzcyBjb21wYXRpYmlsaXR5IC8gdHJvdWJsZXNob290aW5nIHNldHRpbmdzIG92ZXJyaWRlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCSRkYl9tZXRob2RzID0gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydteXNxbGJ1ZGR5J10tPmdldF9tZXRob2RzKCk7CglpZiAoIGluX2FycmF5KCAnY29tbWFuZGxpbmUnLCAkZGJfbWV0aG9kcyApIHx8IGluX2FycmF5KCAncGhwJywgJGRiX21ldGhvZHMgKSApIHsgLy8gUEhQIGlzIGNvbnNpZGVyZWQganVzdCBhcyBnb29kIGFzIG9mIEJCIHY1LjAuCgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCQoJLy8gU2l0ZSBTaXplCglpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9zaXplJ10gPiAwICkgewoJCSRzaXRlX3NpemUgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfc2l6ZSddICk7Cgl9IGVsc2UgewoJCSRzaXRlX3NpemUgPSAnPGk+VW5rbm93bjwvaT4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknU2l0ZSBTaXplJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJzxzcGFuIGlkPSJwYl9zdGF0c19yZWZyZXNoX3NpdGVfc2l6ZSI+JyAuICRzaXRlX3NpemUgLiAnPC9zcGFuPiA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX3NpdGVfc2l6ZSIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9zaXRlX3NpemUnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkndGlwJwkJCT0+CQlfXygnVG90YWwgc2l6ZSBvZiB5b3VyIHNpdGUgKHN0YXJ0aW5nIGluIHlvdXIgV29yZFByZXNzIG1haW4gZGlyZWN0b3J5KSBJTkNMVURJTkcgYW55IGV4Y2x1ZGVkIGRpcmVjdG9yaWVzIC8gZmlsZXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCQoJLy8gU2l0ZSBzaXplIFdJVEggRVhDTFVTSU9OUyBhY2NvdW50ZWQgZm9yLgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfc2l6ZV9leGNsdWRlZCddID4gMCApIHsKCQkkc2l0ZV9zaXplX2V4Y2x1ZGVkID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemVfZXhjbHVkZWQnXSApOwoJfSBlbHNlIHsKCQkkc2l0ZV9zaXplX2V4Y2x1ZGVkID0gJzxpPlVua25vd248L2k+JzsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ1NpdGUgU2l6ZSAoRGVmYXVsdCBFeGNsdXNpb25zIGFwcGxpZWQpJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJzxzcGFuIGlkPSJwYl9zdGF0c19yZWZyZXNoX3NpdGVfc2l6ZV9leGNsdWRlZCI+JyAuICRzaXRlX3NpemVfZXhjbHVkZWQgLiAnPC9zcGFuPiA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX3NpdGVfc2l6ZV9leGNsdWRlZCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9zaXRlX3NpemVfZXhjbHVkZWQnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkndGlwJwkJCT0+CQlfXygnVG90YWwgc2l6ZSBvZiB5b3VyIHNpdGUgKHN0YXJ0aW5nIGluIHlvdXIgV29yZFByZXNzIG1haW4gZGlyZWN0b3J5KSBFWENMVURJTkcgYW55IGRpcmVjdG9yaWVzIC8gZmlsZXMgeW91IGhhdmUgbWFya2VkIGZvciBleGNsdXNpb24uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCS8vIFNpdGUgT2JqZWN0cwoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX29iamVjdHMnXSApICYmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX29iamVjdHMnXSA+IDAgKSApIHsKCQkkc2l0ZV9vYmplY3RzID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX29iamVjdHMnXTsKCX0gZWxzZSB7CgkJJHNpdGVfb2JqZWN0cyA9ICc8aT5Vbmtub3duPC9pPic7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdTaXRlIG51bWJlciBvZiBmaWxlcycsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9vYmplY3RzIj4nIC4gJHNpdGVfb2JqZWN0cyAuICc8L3NwYW4+IDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIiByZWw9InJlZnJlc2hfb2JqZWN0cyIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9zaXRlX29iamVjdHMnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkndGlwJwkJCT0+CQlfXygnVG90YWwgbnVtYmVyIG9mIGZpbGVzL2ZvbGRlcnMgaW4geW91ciBzaXRlIChzdGFydGluZyBpbiB5b3VyIFdvcmRQcmVzcyBtYWluIGRpcmVjdG9yeSkgSU5DTFVESU5HIGFueSBleGNsdWRlZCBkaXJlY3RvcmllcyAvIGZpbGVzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIFNpdGUgb2JqZWN0cyBXSVRIIEVYQ0xVU0lPTlMgYWNjb3VudGVkIGZvci4KCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkJ10gKSAmJiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkJ10gPiAwICkgKSB7CgkJJHNpdGVfb2JqZWN0c19leGNsdWRlZCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkJ107Cgl9IGVsc2UgewoJCSRzaXRlX29iamVjdHNfZXhjbHVkZWQgPSAnPGk+VW5rbm93bjwvaT4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknU2l0ZSBudW1iZXIgb2YgZmlsZXMgKERlZmF1bHQgRXhjbHVzaW9ucyBhcHBsaWVkKScsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9vYmplY3RzX2V4Y2x1ZGVkIj4nIC4gJHNpdGVfb2JqZWN0c19leGNsdWRlZCAuICc8L3NwYW4+IDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIiByZWw9InJlZnJlc2hfb2JqZWN0c19leGNsdWRlZCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9zaXRlX29iamVjdHNfZXhjbHVkZWQnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkndGlwJwkJCT0+CQlfXygnVG90YWwgbnVtYmVyIG9mIGZpbGVzL2ZvbGRlcnMgc2l0ZSAoc3RhcnRpbmcgaW4geW91ciBXb3JkUHJlc3MgbWFpbiBkaXJlY3RvcnkpIEVYQ0xVRElORyBhbnkgZGlyZWN0b3JpZXMgLyBmaWxlcyB5b3UgaGF2ZSBtYXJrZWQgZm9yIGV4Y2x1c2lvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkvLyBEYXRhYmFzZSBTaXplCgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdEYXRhYmFzZSBTaXplJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJzxzcGFuIGlkPSJwYl9zdGF0c19yZWZyZXNoX2RhdGFiYXNlX3NpemUiPicgLnBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnZGJfc2l6ZSddICkgLiAnPC9zcGFuPiA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX2RhdGFiYXNlX3NpemUiIGFsdD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlZnJlc2hfZGF0YWJhc2Vfc2l6ZScgKSAuICciIHRpdGxlPSInIC4gX18oJ1JlZnJlc2gnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3JlZnJlc2hfZ3JheS5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTFweDsiPiA8c3BhbiBjbGFzcz0icGJfYmFja3VwYnVkZHlfbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxMHB4OyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvbG9hZGluZy5naWYiIGFsdD0iJyAuIF9fKCdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdMb2FkaW5nLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiIC8+PC9zcGFuPjwvYT4nLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdUb3RhbCBzaXplIG9mIHlvdXIgZGF0YWJhc2UgSU5DTFVESU5HIGFueSBleGNsdWRlZCB0YWJsZXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCQoJLy8gRGF0YWJhc2Ugc2l6ZSBXSVRIIEVYQ0xVU0lPTlMgYWNjb3VudGVkIGZvci4KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ0RhdGFiYXNlIFNpemUgKERlZmF1bHQgRXhjbHVzaW9ucyBhcHBsaWVkKScsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9kYXRhYmFzZV9zaXplX2V4Y2x1ZGVkIj4nIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplX2V4Y2x1ZGVkJ10gKSAuICc8L3NwYW4+IDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIiByZWw9InJlZnJlc2hfZGF0YWJhc2Vfc2l6ZV9leGNsdWRlZCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9kYXRhYmFzZV9zaXplX2V4Y2x1ZGVkJyApIC4gJyIgdGl0bGU9IicgLiBfXygnUmVmcmVzaCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ1RvdGFsIHNpemUgb2YgeW91ciBkYXRhYmFzZSBFWENMVURJTkcgYW55IHRhYmxlcyB5b3UgaGF2ZSBtYXJrZWQgZm9yIGV4Y2x1c2lvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkvKioqKiogQkVHSU4gQVZFUkFHRSBXUklURSBTUEVFRCAqKioqKi8KCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJyApOwoJCgkkd3JpdGVfc3BlZWRfc2FtcGxlcyA9IDA7Cgkkd3JpdGVfc3BlZWRfc3VtID0gMDsKCSRiYWNrdXBzID0gZ2xvYiggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgLiAnKi56aXAnICk7CglpZiAoICEgaXNfYXJyYXkoICRiYWNrdXBzICkgKSB7CgkJJGJhY2t1cHMgPSBhcnJheSgpOwoJfQoJZm9yZWFjaCggJGJhY2t1cHMgYXMgJGJhY2t1cCApIHsKCQkKCQkkc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRiYWNrdXAgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMjIuJyApOwoJCSRiYWNrdXBfb3B0aW9ucyA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuICRzZXJpYWwgLiAnLnR4dCcsICRyZWFkX29ubHkgPSB0cnVlICk7CgkJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSAkYmFja3VwX29wdGlvbnMtPmlzX29rKCkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnVW5hYmxlIHRvIG9wZW4gZmlsZW9wdGlvbnMgZmlsZSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiAkc2VyaWFsIC4gJy50eHQnIC4gJ2AuIERldGFpbHM6IGAnIC4gJHJlc3VsdCAuICdgLicgKTsKCQl9IAoJCQkKCQkJCgkJaWYgKCBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydpbnRlZ3JpdHknXSApICYmIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2ludGVncml0eSddWydzaXplJ10gKSApIHsKCQkJJHdyaXRlX3NwZWVkX3NhbXBsZXMrKzsKCQkJCgkJCSRzaXplID0gJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydpbnRlZ3JpdHknXVsnc2l6ZSddOwoJCQkkdGltZV90YWtlbiA9IDA7CgkJCWlmICggaXNzZXQoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snc3RlcHMnXSApICkgewoJCQkJZm9yZWFjaCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddIGFzICRzdGVwICkgewoJCQkJCWlmICggJHN0ZXBbJ2Z1bmN0aW9uJ10gPT0gJ2JhY2t1cF96aXBfZmlsZXMnICkgewoJCQkJCQkkdGltZV90YWtlbiA9ICRzdGVwWydmaW5pc2hfdGltZSddIC0gJHN0ZXBbJ3N0YXJ0X3RpbWUnXTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfSAvLyBFbmQgZm9yZWFjaC4KCQkJfSAvLyBFbmQgaWYgc3RlcHMgaXNzZXQuCgkJCQoJCQlpZiAoICR0aW1lX3Rha2VuID09IDAgKSB7CgkJCQkvLyR3cml0ZV9zcGVlZF9zdW0gKz0gMDsKCQkJCSR3cml0ZV9zcGVlZF9zYW1wbGVzID0gJHdyaXRlX3NwZWVkX3NhbXBsZXMgLSAxOyAvLyBJZ25vcmUgdGhpcyBzYW1wbGUgc2luY2UgaXQncyB0b28gc21hbGwgdG8gY291bnQuCgkJCX0gZWxzZSB7CgkJCQkkd3JpdGVfc3BlZWRfc3VtICs9ICRzaXplIC8gJHRpbWVfdGFrZW47IC8vIFN1bSB1cCB3cml0ZSBzcGVlZHMuCgkJCX0KCQkJCgkJfQoJfQoJCglpZiAoICR3cml0ZV9zcGVlZF9zdW0gPiAwICkgewoJCSRmaW5hbF93cml0ZV9zcGVlZCA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICR3cml0ZV9zcGVlZF9zdW0gLyAkd3JpdGVfc3BlZWRfc2FtcGxlcyApIC4gJy9zZWMnOwoJCSRmaW5hbF93cml0ZV9zcGVlZF9ndWVzcyA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICggJHdyaXRlX3NwZWVkX3N1bSAvICR3cml0ZV9zcGVlZF9zYW1wbGVzICkgKiBpbmlfZ2V0KCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApICk7Cgl9IGVsc2UgewoJCSRmaW5hbF93cml0ZV9zcGVlZCA9ICc8aT5Vbmtub3duPC9pPic7CgkJJGZpbmFsX3dyaXRlX3NwZWVkX2d1ZXNzID0gJzxpPlVua25vd248L2k+JzsKCX0KCQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknQXZlcmFnZSBXcml0ZSBTcGVlZCcsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSAkZmluYWxfd3JpdGVfc3BlZWQsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ0F2ZXJhZ2UgWklQIGZpbGUgY3JlYXRpb24gd3JpdGUgc3BlZWQuIEJhY2t1cCBmaWxlIHNpemVzIGRpdmlkZWQgYnkgdGhlIHRpbWUgdGFrZW4gdG8gY3JlYXRlIGVhY2guIFNhbXBsZXM6IGAnIC4gJHdyaXRlX3NwZWVkX3NhbXBsZXMgLiAnYC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkvKioqKiogRU5EIEFWRVJBR0UgV1JJVEUgU1BFRUQgKioqKiovCgkKCQoJLy8gR3Vlc3MgbWF4IHNpdGUgc2l6ZSB0byBiZSBhYmxlIHRvIGJhY2t1cC4KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ0d1ZXNzdGltYXRlIG9mIG1heCBaSVAgc2l6ZScsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSRmaW5hbF93cml0ZV9zcGVlZF9ndWVzcywKCQkJCQkndGlwJwkJCT0+CQlfXygnQ2FsY3VsYXRlZCBlc3RpbWF0ZSBvZiB0aGUgbGFyZ2VzdCAuWklQIGJhY2t1cCBmaWxlIHRoYXQgbWF5IGJlIGNyZWF0ZWQuIEFzIFpJUCBmaWxlcyBhcmUgY29tcHJlc3NlZCB0aGUgc2l0ZSBzaXplIHRoYXQgbWF5IGJlIGJhY2tlZCB1cCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gdGhpcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkvLyBIdHRwIGxvb3BiYWNrcy4KCWlmICggKCAkbG9vcGJhY2tfcmVzcG9uc2UgPSBiYWNrdXBidWRkeV9jb3JlOjpsb29wYmFja190ZXN0KCkgKSA9PT0gdHJ1ZSApIHsKCQkkbG9vcGJhY2tfc3RhdHVzID0gJ2VuYWJsZWQnOwoJCSRzdGF0dXMgPSAnT0snOwoJfSBlbHNlIHsKCQkkbG9vcGJhY2tfc3RhdHVzID0gJ2Rpc2FibGVkIChlbmFibGUgYWx0ZXJuYXRlIGNyb24pJzsKCQkkc3RhdHVzID0gJ1dBUk5JTkcnOwoJfQoJZ2xvYmFsICRiYWNrdXBidWRkeV9sb29wYmFja19kZXRhaWxzOwoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknSHR0cCBMb29wYmFja3MnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ2VuYWJsZWQnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJGxvb3BiYWNrX3N0YXR1cyAuICc8YnI+PHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWF4LWhlaWdodDogMjAwcHg7IiByZWFkb25seT0idHJ1ZSI+JyAuICRiYWNrdXBidWRkeV9sb29wYmFja19kZXRhaWxzIC4gJzwvdGV4dGFyZWE+JywKCQkJCQkndGlwJwkJCT0+CQlfXygnU29tZSBzZXJ2ZXJzIGRvIGFyZSBub3QgY29uZmlndXJlZCBwcm9wZXJseSB0byBhbGxvdyBXb3JkUHJlc3MgdG8gY29ubmVjdCBiYWNrIHRvIGl0c2VsZiB2aWEgdGhlIHNpdGUgVVJMIChpZTogaHR0cDovL3lvdXIuY29tIGNvbm5lY3RzIGJhY2sgdG8gaXRzZWxmIG9uIHRoZSBzYW1lIHNlcnZlciBhdCBodHRwOi8veW91ci5jb20vIHRvIHRyaWdnZXIgYSBzaW11bGF0ZWQgY3JvbiBzdGVwKS4gSWYgdGhpcyBpcyB0aGUgY2FzZSB5b3UgbXVzdCBlaXRoZXIgYXNrIHlvdXIgaG9zdGluZyBwcm92aWRlciB0byBmaXggdGhpcyBvciBlbmFibGUgV29yZFByZXMgQWx0ZXJuYXRlIENyb24gbW9kZSBpbiB5b3VyIHdwLWNvbmZpZy5waHAgZmlsZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oICRzdGF0dXMsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIHdwLWNyb24ucGhwIGh0dHAgbG9vcGJhY2tzLgoJaWYgKCAoICRjcm9uYmFja19yZXNwb25zZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmNyb25iYWNrX3Rlc3QoKSApID09PSB0cnVlICkgewoJCSRjcm9uYmFja19zdGF0dXMgPSAnZW5hYmxlZCc7CgkJJHN0YXR1cyA9ICdPSyc7Cgl9IGVsc2UgewoJCSRjcm9uYmFja19zdGF0dXMgPSAnZGlzYWJsZWQgKGVuYWJsZSBhbHRlcm5hdGUgY3JvbiknOwoJCSRzdGF0dXMgPSAnV0FSTklORyc7Cgl9CglnbG9iYWwgJGJhY2t1cGJ1ZGR5X2Nyb25iYWNrX2RldGFpbHM7CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSd3cC1jcm9uLnBocCBMb29wYmFja3MnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ2VuYWJsZWQnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJGNyb25iYWNrX3N0YXR1cyAuICc8YnI+PHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWF4LWhlaWdodDogMjAwcHg7IiByZWFkb25seT0idHJ1ZSI+JyAuICRiYWNrdXBidWRkeV9jcm9uYmFja19kZXRhaWxzIC4gJzwvdGV4dGFyZWE+JywKCQkJCQkndGlwJwkJCT0+CQlfXygnU29tZSBzZXJ2ZXJzIGRvIGFyZSBub3QgY29uZmlndXJlZCBwcm9wZXJseSB0byBhbGxvdyBXb3JkUHJlc3MgdG8gY29ubmVjdCBiYWNrIHRvIGl0c2VsZiB2aWEgdGhlIHNpdGUgVVJMIChpZTogaHR0cDovL3lvdXIuY29tIGNvbm5lY3RzIGJhY2sgdG8gaXRzZWxmIG9uIHRoZSBzYW1lIHNlcnZlciBhdCBodHRwOi8veW91ci5jb20vIHRvIHRyaWdnZXIgYSBzaW11bGF0ZWQgY3JvbiBzdGVwKS4gSWYgdGhpcyBpcyB0aGUgY2FzZSB5b3UgbXVzdCBlaXRoZXIgYXNrIHlvdXIgaG9zdGluZyBwcm92aWRlciB0byBmaXggdGhpcyBvciBlbmFibGUgV29yZFByZXMgQWx0ZXJuYXRlIENyb24gbW9kZSBpbiB5b3VyIHdwLWNvbmZpZy5waHAgZmlsZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oICRzdGF0dXMsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIEh0dHAgbG9vcGJhY2sgVVJMICYgSVAuCgkkc3RhdHVzID0gJ09LJzsKCSRwYXJzZWRfdXJsID0gcGFyc2VfdXJsKCBzaXRlX3VybCgpICk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCAkcGFyc2VkX3VybFsnaG9zdCddICk7CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdMb29wYmFjayBEb21haW4gJiBJUCcsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSRwYXJzZWRfdXJsWydob3N0J10gLiAnID0mZ3Q7ICcgLiAkaXAsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ1NvbWV0aW1lcyBkdWUgdG8gRE5TIGRlbGF5cyB0aGUgc2VydmVyIG1heSBkZXRlY3QgdGhlIG9sZCBJUCBhZGRyZXNzIGFzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHNpdGUgZG9tYWluIHVzZWQgaW4gdGhlIGxvb3BiYWNrIFVSTC4gVGhpcyBjYW4gcmVzdWx0IGluIGxvb3BiYWNrIHByb2JsZW1zIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGVuYWJsZWQuIENvbnRhY3QgeW91ciBob3N0IG9yIHdhaXQgbG9uZ2VyIGlmIHRoZSBJUCBhZGRyZXNzIHRoaXMgc2VydmVyIHJlcG9ydHMgaXMgaW5jb3JyZWN0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXyggJHN0YXR1cywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCQoJLy8gQ1JPTiBkaXNhYmxlZD8KCWlmICggZGVmaW5lZCgnRElTQUJMRV9XUF9DUk9OJykgJiYgRElTQUJMRV9XUF9DUk9OICkgewoJCSRjcm9uX3N0YXR1cyA9ICdkaXNhYmxlZCc7CgkJJHN0YXR1cyA9ICdGQUlMJzsKCX0gZWxzZSB7CgkJJGNyb25fc3RhdHVzID0gJ2VuYWJsZWQnOwoJCSRzdGF0dXMgPSAnT0snOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknV29yZFByZXNzIENyb24nLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ2VuYWJsZWQnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJGNyb25fc3RhdHVzLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCAnVGhpcyBjaGVjayB2ZXJpZmllcyB0aGF0IHRoZSBjcm9uIHN5c3RlbSBoYXMgbm90IGJlZW4gZGlzYWJsZWQgYnkgdGhlIERJU0FCTEVfV1BfQ1JPTiBjb25zdGFudC4gVGhpcyBtYXkgYmUgZGVmaW5lZCBieSBhIHBsdWdpbiBvciBvdGhlciBtZXRob2QgdG8gZGlzYWJsZSB0aGUgY3JvbiBzeXN0ZW0gd2hpY2ggbWF5IHJlc3VsdCBpbiBhdXRvbWF0ZWQgZnVuY3Rpb25hbGl0eSBub3QgYmVpbmcgYXZhaWxhYmxlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXyggJHN0YXR1cywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCQoJLy8gQWx0ZXJuYXRlIGNyb24gb24/CglpZiAoIGRlZmluZWQoICdBTFRFUk5BVEVfV1BfQ1JPTicgKSAmJiAoIEFMVEVSTkFURV9XUF9DUk9OID09PSB0cnVlICkgKSB7CgkJJGFsdGVybmF0ZV9jcm9uX3N0YXR1cyA9ICdlbmFibGVkJzsKCX0gZWxzZSB7CgkJJGFsdGVybmF0ZV9jcm9uX3N0YXR1cyA9ICdkaXNhYmxlZCAoZGVmYXVsdCknOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknV29yZFByZXNzIEFsdGVybmF0ZSBDcm9uJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSdWYXJpZXMgKHNlcnZlci1kZXBlbmRlbnQpJywKCQkJCQkndmFsdWUnCQkJPT4JCSRhbHRlcm5hdGVfY3Jvbl9zdGF0dXMsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ1NvbWUgc2VydmVycyBkbyBub3QgYWxsb3cgc2l0ZXMgdG8gY29ubmVjdCBiYWNrIHRvIHRoZW1zZWx2ZXMgYXQgdGhlaXIgb3duIFVSTC4gIFdvcmRQcmVzcyBhbmQgQmFja3VwQnVkZHkgbWFrZSB1c2Ugb2YgdGhlc2UgIkh0dHAgTG9vcGJhY2tzIiBmb3Igc2V2ZXJhbCB0aGluZ3MuICBXaXRob3V0IHRoZW0geW91IG1heSBlbmNvdW50ZXIgaXNzdWVzLiBJZiB5b3VyIHNlcnZlciBuZWVkcyBpdCBvciB5b3UgYXJlIGRpcmVjdGVkIGJ5IHN1cHBvcnQgeW91IG1heSBlbmFibGUgQWx0ZXJuYXRlIENyb24gaW4geW91ciB3cC1jb25maWcucGhwIGZpbGUuICBXaGVuIGVuYWJsZWQgdGhpcyBzZXR0aW5nIHdpbGwgZGlzcGxheSAiRW5hYmxlZCIgdG8gcmVtaW5kIHlvdS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkKfSAvLyBFbmQgbm9uLWltcG9ydGJ1ZGR5IHRlc3RzLgoKCgovLyBESVNBQkxFRCBGVU5DVElPTlMKJGRpc2FibGVkX2Z1bmN0aW9ucyA9IGluaV9nZXQoICdkaXNhYmxlX2Z1bmN0aW9ucycgKTsKaWYgKCAkZGlzYWJsZWRfZnVuY3Rpb25zID09ICcnICkgewoJJGRpc2FibGVkX2Z1bmN0aW9ucyA9ICcobm9uZSknOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJJ3RpdGxlJwkJCT0+CQknRGlzYWJsZWQgUEhQIEZ1bmN0aW9ucycsCgkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJJ3ZhbHVlJwkJCT0+CQknPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWF4LWhlaWdodDogMjAwcHg7IiByZWFkb25seT0idHJ1ZSI+JyAuIHN0cl9yZXBsYWNlKCAnLCcsICcsICcsICRkaXNhYmxlZF9mdW5jdGlvbnMgKSAuICc8L3RleHRhcmVhPicsCgkJCQkndGlwJwkJCT0+CQlfXygnU29tZSBob3N0cyBibG9jayBjZXJ0YWluIFBIUCBmdW5jdGlvbnMgZm9yIHZhcmlvdXMgcmVhc29ucy4gU29tZXRpbWVzIGhvc3RzIGJsb2NrIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIFdvcmRQcmVzcyBvciBwbHVnaW5zLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkpOwokZGlzYWJsZWRfZnVuY3Rpb25zID0gc3RyX3JlcGxhY2UoICcsICcsICcsJywgJGRpc2FibGVkX2Z1bmN0aW9ucyApOyAvLyBOb3JtYWxpemUgc3BhY2VzIG9yIGxhY2sgb2Ygc3BhY2VzIGJldHdlZW4gZGlzYWJsZWQgZnVuY3Rpb25zLgokZGlzYWJsZWRfZnVuY3Rpb25zX2FycmF5ID0gZXhwbG9kZSggJywnLCAkZGlzYWJsZWRfZnVuY3Rpb25zICk7CiRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwppZiAoCgkoIHRydWUgPT09IGluX2FycmF5KCAnZXhlYycsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApCgl8fAoJKCB0cnVlID09PSBpbl9hcnJheSggJ2luaV9zZXQnLCAkZGlzYWJsZWRfZnVuY3Rpb25zX2FycmF5ICkgKQoJKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9CmFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCi8vIE1ZU1FMX0NPTk5FQ1QKaWYgKCBpc19jYWxsYWJsZSggJ215c3FsX2Nvbm5lY3QnICkgKSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCSd0aXRsZScgPT4gJ1BIUCBmdW5jdGlvbjogbXlzcWxfY29ubmVjdCgpJywKCSdzdWdnZXN0aW9uJyA9PiAnbi9hJywKCSd2YWx1ZScgICAgICA9PiAkcGFyZW50X2NsYXNzX3ZhbCwKCSd0aXAnICAgICAgICA9PiBfXyggJ0RlcHJlY2F0ZWQgaW4gUEhQIDUuNS4wIGFuZCByZW1vdmVkIGluIFBIUCA3LjAuMC4gUmVwbGFjZWQgYnkgbXlzcWxpX2Nvbm5lY3Qgb3IgUERPOjpfX2NvbnN0cnVjdCgpJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCik7CiRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBSRUdJU1RFUiBHTE9CQUxTCmlmICggaW5pX2dldF9ib29sKCAncmVnaXN0ZXJfZ2xvYmFscycgKSA9PT0gdHJ1ZSApIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2VuYWJsZWQnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZGlzYWJsZWQnOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIFJlZ2lzdGVyIEdsb2JhbHMnLAoJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknZGlzYWJsZWQnLAoJCQkJJ3ZhbHVlJwkJCT0+CQkkcGFyZW50X2NsYXNzX3ZhbCwKCQkJCSd0aXAnCQkJPT4JCV9fKCdBdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyB1c2VyIGlucHV0IGFzIHZhcmlhYmxlcy4gSElHSExZIGRpc2NvdXJhZ2VkLiBSZW1vdmVkIGZyb20gUEhQIGluIFBIUCA2IGZvciBzZWN1cml0eS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJKTsKaWYgKCAkcGFyZW50X2NsYXNzX3ZhbCAhPSAnZGlzYWJsZWQnICkgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdGQUlMJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwp9CmFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCi8vIE1BR0lDIFFVT1RFUyBHUEMKaWYgKCBpbmlfZ2V0X2Jvb2woICdtYWdpY19xdW90ZXNfZ3BjJyApID09PSB0cnVlICkgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZW5hYmxlZCc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdkaXNhYmxlZCc7Cn0KJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkndGl0bGUnCQkJPT4JCSdQSFAgTWFnaWMgUXVvdGVzIEdQQycsCgkJCQknc3VnZ2VzdGlvbicJPT4JCSdkaXNhYmxlZCcsCgkJCQkndmFsdWUnCQkJPT4JCSRwYXJlbnRfY2xhc3NfdmFsLAoJCQkJJ3RpcCcJCQk9PgkJX18oJ0F1dG9tYXRpY2FsbHkgZXNjYXBlcyB1c2VyIGlucHV0dGVkIGRhdGEuIE5vdCBuZWVkZWQgd2hlbiB1c2luZyBwcm9wZXJseSBjb2RlZCBzb2Z0d2FyZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJKTsKaWYgKCAkcGFyZW50X2NsYXNzX3ZhbCAhPSAnZGlzYWJsZWQnICkgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwp9CmFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgovLyBNQUdJQyBRVU9URVMgUlVOVElNRQppZiAoIGluaV9nZXRfYm9vbCggJ21hZ2ljX3F1b3Rlc19ydW50aW1lJyApID09PSB0cnVlICkgewoJJHBhcmVudF9jbGFzc192YWwgPSAnZW5hYmxlZCc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdkaXNhYmxlZCc7Cn0KJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkndGl0bGUnCQkJPT4JCSdQSFAgTWFnaWMgUXVvdGVzIFJ1bnRpbWUnLAoJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknZGlzYWJsZWQnLAoJCQkJJ3ZhbHVlJwkJCT0+CQkkcGFyZW50X2NsYXNzX3ZhbCwKCQkJCSd0aXAnCQkJPT4JCV9fKCdBdXRvbWF0aWNhbGx5IGVzY2FwZXMgdXNlciBpbnB1dHRlZCBkYXRhLiBOb3QgbmVlZGVkIHdoZW4gdXNpbmcgcHJvcGVybHkgY29kZWQgc29mdHdhcmUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCSk7CmlmICggJHBhcmVudF9jbGFzc192YWwgIT0gJ2Rpc2FibGVkJyApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBTQUZFIE1PREUKaWYgKCBpbmlfZ2V0X2Jvb2woICdzYWZlX21vZGUnICkgPT09IHRydWUgKSB7CgkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKfSBlbHNlIHsKCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCSd0aXRsZScJCQk9PgkJJ1BIUCBTYWZlIE1vZGUnLAoJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknZGlzYWJsZWQnLAoJCQkJJ3ZhbHVlJwkJCT0+CQkkcGFyZW50X2NsYXNzX3ZhbCwKCQkJCSd0aXAnCQkJPT4JCV9fKCdUaGlzIG1vZGUgaXMgSElHSExZIGRpc2NvdXJhZ2VkIGFuZCBpcyBhIHNpZ24gb2YgYSBwb29ybHkgY29uZmlndXJlZCBob3N0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkpOwppZiAoICRwYXJlbnRfY2xhc3NfdmFsICE9ICdkaXNhYmxlZCcgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoKLy8gUEhQIEFQSQokcGhwX2FwaSA9ICdVbmtub3duJzsKaWYgKCBpc19jYWxsYWJsZSggJ3BocF9zYXBpX25hbWUnICkgKSB7CgkkcGhwX2FwaSA9IHBocF9zYXBpX25hbWUoKTsKfQokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCSd0aXRsZScJCQk9PgkJJ1BIUCBBUEknLAoJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCSd2YWx1ZScJCQk9PgkJJHBocF9hcGksCgkJCQkndGlwJwkJCT0+CQlfXygnQVBJIG1vZGUgUEhQIGlzIHJ1bm5pbmcgdW5kZXIuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCSk7CiRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBQSFAgQml0cwokYml0cyA9ICggUEhQX0lOVF9TSVpFICogOCApOwokcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCSd0aXRsZScJCQk9PgkJJ1BIUCBBcmNoaXRlY3R1cmUnLAoJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknNjQtYml0JywKCQkJCSd2YWx1ZScJCQk9PgkJJGJpdHMgLiAnLWJpdCcsCgkJCQkndGlwJwkJCT0+CQlfXygnV2hldGhlciBQSFAgaXMgcnVubmluZyBpbiAzMiBvciA2NCBiaXQgbW9kZS4gNjQtYml0IGlzIHJlY29tbWVuZGVkIG92ZXIgMzItYml0LiBOb3RlOiBUaGlzIG9ubHkgZGV0ZXJtaW5lcyBQSFAgc3RhdHVzIE5PVCBzdGF0dXMgb2Ygb3RoZXIgc2VydmVyIGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyBmaWxlc3lzdGVtLCBjb21tYW5kIGxpbmUgemlwLCBldGMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCSk7CmlmICggJGJpdHMgPCA2MCApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBodHRwIFNlcnZlciBTb2Z0d2FyZQppZiAoIGlzc2V0KCAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10gKSApIHsKCSRzZXJ2ZXJfc29mdHdhcmUgPSAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ107Cn0gZWxzZSB7Cgkkc2VydmVyX3NvZnR3YXJlID0gJ1Vua25vd24nOwp9CiRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJJ3RpdGxlJwkJCT0+CQknSHR0cCBTZXJ2ZXIgU29mdHdhcmUnLAoJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCSd2YWx1ZScJCQk9PgkJJHNlcnZlcl9zb2Z0d2FyZSwKCQkJCSd0aXAnCQkJPT4JCV9fKCdTb2Z0d2FyZSBydW5uaW5nIHRoaXMgaHR0cCB3ZWIgc2VydmVyLCBzdWNoIGFzIEFwYWNoZSwgSUlTLCBvciBOZ2lueC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJKTsKJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CmFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgoKCi8vIExvYWQgQXZlcmFnZQppZiAoICFkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkkbG9hZF9hdmVyYWdlID0gcGJfYmFja3VwYnVkZHlfZ2V0X2xvYWRhdmcoKTsKCWZvcmVhY2goICRsb2FkX2F2ZXJhZ2UgYXMgJiR0aGlzX2xvYWQgKSB7CgkJJHRoaXNfbG9hZCA9IHJvdW5kKCAkdGhpc19sb2FkLCAyICk7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdTZXJ2ZXIgTG9hZCBBdmVyYWdlJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCSd2YWx1ZScJCQk9PgkJaW1wbG9kZSggJywgJywgJGxvYWRfYXZlcmFnZSApLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdTZXJ2ZXIgQ1BVIHVzZSBpbiBpbnRlcnZhbHM6IDEgbWludXRlLCA1IG1pbnV0ZXMsIDE1IG1pbnV0ZXMuIEUuZy4gLjQ1IGJhc2ljYWxseSBlcXVhdGVzIHRvIDQ1JSBDUFUgdXNhZ2UuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwp9CgoKCi8vIFNGVFAgc3VwcG9ydD8KaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJJGNvbm5lY3QgPSAnbm8nOwoJJHNmdHAgPSAnbm8nOwoJaWYgKCBpc19jYWxsYWJsZSggJ3NzaDJfY29ubmVjdCcgKSAmJiAoIGZhbHNlID09PSBpbl9hcnJheSggJ3NzaDJfY29ubmVjdCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApICkgewoJCSRjb25uZWN0ID0gJ3llcyc7Cgl9CglpZiAoIGlzX2NhbGxhYmxlKCAnc3NoMl9mdHAnICkgJiYgKCBmYWxzZSA9PT0gaW5fYXJyYXkoICdzc2gyX2Z0cCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApICkgewoJCSRjb25uZWN0ID0gJ3llcyc7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdQSFAgU1NIMiwgU0ZUUCBTdXBwb3J0JywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJGNvbm5lY3QgLiAnLCAnIC4gJHNmdHAsCgkJCQkJJ3RpcCcJCQk9PgkJX18oICdXaGV0aGVyIG9yIG5vdCB5b3VyIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIGFsbG93IFNTSDIgY29ubmVjdGlvbnMgb3ZlciBQSFAgb3IgU0ZUUCBjb25uZWN0aW9ucyBvciBQSFAuIE1vc3QgaG9zdHMgZG8gbm90IGN1cnJlbnRseSBwcm92aWRlIHRoaXMgZmVhdHVyZS4gSW5mb3JtYXRpb24gb25seTsgQmFja3VwQnVkZHkgY2Fubm90IG1ha2UgdXNlIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBhdCB0aGlzIHRpbWUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwp9CgoKCi8vIEFCU1BBVEgKJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkndGl0bGUnCQkJPT4JCSdXb3JkUHJlc3MgQUJTUEFUSCcsCgkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJJ3ZhbHVlJwkJCT0+CQknPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgbWF4LXdpZHRoOiAyNTBweDsiPicgLiBBQlNQQVRIIC4gJzwvc3Bhbj4nLAoJCQkJJ3RpcCcJCQk9PgkJX18oICdUaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hpY2ggV29yZFByZXNzIHJlcG9ydHMgdG8gQmFja3VwQnVkZHkgaXQgaXMgaW5zdGFsbGVkIGluLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkpOwppZiAoICEgQGZpbGVfZXhpc3RzKCBBQlNQQVRIICkgKSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwp9IGVsc2UgewoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdPSyc7Cn0KYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCgoKLy8gT1MKJHBocF91bmFtZSA9ICcnOwppZiAoIGlzX2NhbGxhYmxlKCAncGhwX3VuYW1lJyApICkgewoJJHBocF91bmFtZSA9ICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgbWF4LXdpZHRoOiAyNTBweDsgZm9udC1zaXplOiA4cHg7Ij4oJyAuIEBwaHBfdW5hbWUoKSAuICcpPC9zcGFuPic7Cn0KJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkndGl0bGUnCQkJPT4JCSdPcGVyYXRpbmcgU3lzdGVtJywKCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ0xpbnV4JywKCQkJCSd2YWx1ZScJCQk9PgkJUEhQX09TIC4gJHBocF91bmFtZSwKCQkJCSd0aXAnCQkJPT4JCV9fKCdUaGUgc2VydmVyIG9wZXJhdGluZyBzeXN0ZW0gcnVubmluZyB0aGlzIHNpdGUuIExpbnV4IGJhc2VkIHN5c3RlbXMgYXJlIGVuY291cmFnZWQuIFdpbmRvd3MgdXNlcnMgbWF5IG5lZWQgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIHN0ZXBzIHRvIGdldCBwbHVnaW5zIHRvIHBlcmZvcm0gcHJvcGVybHkuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCSk7CmlmICggc3Vic3RyKCBQSFBfT1MsIDAsIDMgKSA9PSAnV0lOJyApIHsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cn0gZWxzZSB7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKfQphcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoKCgovLyBJcyB0aGlzIHBvc3NpYmx5IEdvRGFkZHkgTWFuYWdlZCBXb3JkUHJlc3MgSG9zdGluZz8KaWYgKCBkZWZpbmVkKCAnR0RfU1lTVEVNX1BMVUdJTl9ESVInICkgfHwgY2xhc3NfZXhpc3RzKCAnXFxXUGFhU1xcUGx1Z2luJyApICkgewoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknR29EYWRkeSBNYW5hZ2VkIFdvcmRQcmVzcyBIb3N0aW5nIERldGVjdGVkJywKCQkJCQknc3VnZ2VzdGlvbicJCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSdQb3RlbnRpYWxseSBEZXRlY3RlZCcsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ0dvRGFkZHlcJ3MgTWFuYWdlZCBXb3JkUHJlc3MgSG9zdGluZyByZWNlbnRseSBleHBlcmllbmNlZCBwcm9ibGVtcyByZXN1bHRpbmcgaW4gdGhlIFdvcmRQcmVzcyBjcm9uIG5vdCB3b3JraW5nIHByb3Blcmx5IHJlc3VsdGluZyBpbiBXb3JkUHJlc3NcJyBidWlsdC1pbiBzY2hlZHVsaW5nIGFuZCBhdXRvbWF0aW9uIGZ1bmN0aW9uYWxpdHkgbWFsZnVuY3Rpb25pbmcuIEdvRGFkZHkgaGFzIGFkZHJlc3NlZCB0aGlzIGlzc3VlIGZvciBVUy1iYXNlZCBjdXN0b21lcnMgYW5kIHdlIGJlbGlldmUgaXQgdG8gYmUgcmVzb2x2ZWQgZm9yIHRob3NlIGhvc3RlZCBpbiB0aGUgVVNBLiBOb24tVVMgY3VzdG9tZXJzIHNob3VsZCBjb250YWN0IEdvRGFkZHkgc3VwcG9ydC4gSG93ZXZlciwgaWYgeW91IHN0aWxsIGV4cGVyaWVuY2UgaXNzdWVzIGFuZCByZXF1aXJlIGEgcGFydGlhbCB3b3JrYXJvdW5kIGdvIHRvIEJhY2t1cEJ1ZGR5IC0+IFNldHRpbmdzIHBhZ2UgLT4gQWR2YW5jZWQgU2V0dGluZ3MgLyBUcm91Ymxlc2hvb3RpbmcgdGFiIC0+IENoZWNrIHRoZSBib3ggRm9yY2UgaW50ZXJuYWwgY3JvbiAtPiBTY3JvbGwgZG93biBhbmQgU2F2ZSB0aGUgc2V0dGluZ3MuICBUaGlzIG1heSBoZWxwIHlvdSBiZSBhYmxlIHRvIG1ha2UgYSBtYW51YWwgdHJhZGl0aW9uYWwgYmFja3VwIHRob3VnaCBpdCBtYXkgYmUgc2xvdyBhbmQgaXMgbm90IGd1YXJhbnRlZWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9ICdXQVJOSU5HJzsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cn0KCgovLyBBY3RpdmUgcGx1Z2lucyBsaXN0LgppZiAoICFkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkvLyBBY3RpdmUgUGx1Z2lucwoJJHN1Y2Nlc3MgPSB0cnVlOwoJJGFjdGl2ZV9wbHVnaW5zID0gc2VyaWFsaXplKCBnZXRfb3B0aW9uKCAnYWN0aXZlX3BsdWdpbnMnICkgKTsKCSRmb3VuZF9wbHVnaW5zID0gYXJyYXkoKTsKCWZvcmVhY2goIGJhY2t1cGJ1ZGR5X2NvcmU6OiR3YXJuX3BsdWdpbnMgYXMgJHdhcm5fcGx1Z2luID0+ICR3YXJuX3BsdWdpbl90aXRsZSApIHsKCQlpZiAoIEZBTFNFICE9PSBzdHJwb3MoICRhY3RpdmVfcGx1Z2lucywgJHdhcm5fcGx1Z2luICkgKSB7IC8vIFBsdWdpbiBhY3RpdmUuCgkJCSRmb3VuZF9wbHVnaW5zW10gPSAkd2Fybl9wbHVnaW5fdGl0bGU7CgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJfQoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknQWN0aXZlIFdvcmRQcmVzcyBQbHVnaW5zJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJzx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogNzBweDsiIHJlYWRvbmx5PSJ0cnVlIj4nIC4gaW1wbG9kZSggJywgJywgdW5zZXJpYWxpemUoICRhY3RpdmVfcGx1Z2lucyApICkgLiAnPC90ZXh0YXJlYT4nLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCAnUGx1Z2lucyBjdXJyZW50bHkgYWN0aXZhdGVkIGZvciB0aGlzIHNpdGUuIEEgd2FybmluZyBkb2VzIG5vdCBndWFyZW50ZWUgcHJvYmxlbXMgd2l0aCBhIHBsdWdpbiBidXQgaW5kaWNhdGVzIHRoYXQgYSBwbHVnaW4gaXMgYWN0aXZhdGVkIHRoYXQgYXQgb25lIHBvaW50IG1heSBoYXZlIGNhdXNlZCBvcGVyYXRpb25hbCBpc3N1ZXMuICBQbHVnaW4gY29uZmxpY3RzIGNhbiBiZSBzcGVjaWZpYyBhbmQgbWF5IG9ubHkgb2NjdXIgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIHN1Y2ggYXMgY2VydGFpbiBwbHVnaW4gdmVyc2lvbnMsIHBsdWdpbiBjb25maWd1cmF0aW9ucywgYW5kIHNlcnZlciBzZXR0aW5ncy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CglpZiAoIGZhbHNlID09PSAkc3VjY2VzcyApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ1dBUk5JTkcnOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gJ09LJzsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cn0KCgoKLy8gUEhQIFByb2Nlc3MgdXNlci9ncm91cC4KaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJJHN1Y2Nlc3MgPSB0cnVlOwoJJHBocF91c2VyID0gJzxpPicgLiBfXyggJ1Vua25vd24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2k+JzsKCSRwaHBfdWlkID0gJzxpPicgLiBfXyggJ1Vua25vd24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2k+JzsKCSRwaHBfZ2lkID0gJzxpPicgLiBfXyggJ1Vua25vd24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2k+JzsKCQoJaWYgKCBpc19jYWxsYWJsZSggJ3Bvc2l4X2dldGV1aWQnICkgJiYgKCBmYWxzZSA9PT0gaW5fYXJyYXkoICdwb3NpeF9nZXRldWlkJywgJGRpc2FibGVkX2Z1bmN0aW9uc19hcnJheSApICkgKSB7CgkJJHBocF91aWQgPSBAcG9zaXhfZ2V0ZXVpZCgpOwoJCWlmICggaXNfY2FsbGFibGUoICdwb3NpeF9nZXRwd3VpZCcgKSAmJiAoIGZhbHNlID09PSBpbl9hcnJheSggJ3Bvc2l4X2dldHB3dWlkJywgJGRpc2FibGVkX2Z1bmN0aW9uc19hcnJheSApICkgKSB7CgkJCSRwaHBfdXNlciA9IEBwb3NpeF9nZXRwd3VpZCggJHBocF91aWQgKTsKCQkJJHBocF91c2VyID0gJHBocF91c2VyWyduYW1lJ107CgkJfQoJfQoJaWYgKCBpc19jYWxsYWJsZSggJ3Bvc2l4X2dldGVnaWQnICkgJiYgKCBmYWxzZSA9PT0gaW5fYXJyYXkoICdwb3NpeF9nZXRlZ2lkJywgJGRpc2FibGVkX2Z1bmN0aW9uc19hcnJheSApICkgKSB7CgkJJHBocF9naWQgPSBAcG9zaXhfZ2V0ZWdpZCgpOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIFByb2Nlc3MgVXNlciAoVUlEOkdJRCknLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ24vYScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQkkcGhwX3VzZXIgLiAnICgnIC4gJHBocF91aWQgLiAnOicgLiAkcGhwX2dpZCAuICcpJywKCQkJCQkndGlwJwkJCT0+CQlfXyggJ0N1cnJlbnQgdXNlciwgdXNlciBJRCwgYW5kIGdyb3VwIElEIHVuZGVyIHdoaWNoIHRoaXMgUEhQIHByb2Nlc3MgaXMgcnVubmluZy4gVGhpcyB1c2VyIG11c3QgaGF2ZSBwcm9wZXIgYWNjZXNzIHRvIHlvdXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiBJZiB0aGUgUEhQIHVzZXIgaXMgbm90IHlvdXIgb3duIHRoZW4gc2V0dGluZyB1cCBhIHN5c3RlbSBzdWNoIGFzIHN1cGhwIGlzIGVuY291cmFnZWQgdG8gZW5zdXJlIHByb3BlciBhY2Nlc3MgYW5kIHNlY3VyaXR5LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCWlmICggZmFsc2UgPT09ICRzdWNjZXNzICkgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnV0FSTklORyc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSAnT0snOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKfQo= ###PACKDATA,FILE_END,/controllers/pages/server_info/_server_tests.php,importbuddy/controllers/pages/server_info/_server_tests.php ###PACKDATA,FILE_START,/controllers/pages/server_info/cron.php,importbuddy/controllers/pages/server_info/cron.php QWxsIHNjaGVkdWxlZCBXb3JkUHJlc3MgdGFza3MgKENST04gam9icykgYXJlIGxpc3RlZCBiZWxvdy4gVXNlIGNhdXRpb24gd2hlbiBtYW51YWxseSBydW5uaW5nIG9yIGRlbGV0aW5nIHNjaGVkdWxlZCBDUk9OCmpvYnMgYXMgcGx1Z2lucywgdGhlbWVzLCBvciBXb3JkUHJlc3MgaXRzZWxmIG1heSBleHBlY3QgdGhlc2UgdG8gcmVtYWluIGluIHBsYWNlLiBXb3JkUHJlc3Mgd2lsbCByZWNyZWF0ZSBhbnkgbWFuZGF0b3J5CmludGVybmFsIENST04gam9icyBhdXRvbWF0aWNhbGx5IGlmIHRoZXkgYXJlIHJlbW92ZWQuPGJyPjxicj4KPD9waHAKaWYgKCBpc19udW1lcmljKCBnZXRfb3B0aW9uKCAnX3RyYW5zaWVudF9kb2luZ19jcm9uJyApICkgJiYgKCBnZXRfb3B0aW9uKCAnX3RyYW5zaWVudF9kb2luZ19jcm9uJyApID4gMCApICkgewoJJGxhc3RfY3Jvbl9ydW4gPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oIGdldF9vcHRpb24oICdfdHJhbnNpZW50X2RvaW5nX2Nyb24nICkgKSAuICcgYWdvICgnIC4gcm91bmQoIGdldF9vcHRpb24oICdfdHJhbnNpZW50X2RvaW5nX2Nyb24nICkgKSAuICcpJzsKfSBlbHNlIHsKCSRsYXN0X2Nyb25fcnVuID0gX18oICdOb3QgcnVubmluZyAoY29tcGxldGVkKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwp9CgplY2hvICc8Y2VudGVyPicgLiBfXygnQ3VycmVudCBUaW1lJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHRpbWUoKSArICggZ2V0X29wdGlvbiggJ2dtdF9vZmZzZXQnICkgKiAzNjAwICkgKSAuICcgKCcgLiB0aW1lKCkgLiAnKTwvY2VudGVyPic7CmVjaG8gJzxjZW50ZXI+JyAuIF9fKCdDdXJyZW50bHkgcnVubmluZyBsYXN0IGNyb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbGFzdF9jcm9uX3J1biAuICc8L2NlbnRlcj4nOwo/Pgo8ZGl2IHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbi1ib3R0b206IDFweDsiPgoJPGEgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmViYzY7ICFpbXBvcnRhbnQ7IiBocmVmPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpOyA/PiZjbGVhcl9jcm9uPXllcyZ0YWI9MyIgY2xhc3M9ImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIiBvbkNsaWNrPSJpZiAoIGZhbHNlID09PSBjb25maXJtKCAnPD9waHAgX2UoICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xlYXIgYWxsIGNyb24gZW50cmllcz8gV29yZFByZXNzIHdpbGwgYXV0b21hdGljYWxseSByZWdlbmVyYXRlIGNyb25zIGJ1dCBzb21lIDNyZCBwYXJ0eSBwbHVnaW5zIG1heSBub3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7ID8+JyApICkgeyByZXR1cm4gZmFsc2U7IH0iPjw/cGhwIF9lKCdEZWxldGUgQWxsIENyb24gRW50cmllcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOz8+PC9hPgo8L2Rpdj4KPD9waHAKCmlmICggJ3llcycgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdjbGVhcl9jcm9uJyApICkgewoJZGVsZXRlX29wdGlvbiggJ2Nyb24nICk7CglwYl9iYWNrdXBidWRkeTo6YWxlcnQoIF9fKCAnQWxsIGNyb24gZW50cmllcyBoYXZlIGJlZW4gZGVsZXRlZC4nICkgKTsKfQoKCiRjcm9uID0gZ2V0X29wdGlvbignY3JvbicpOwoKCi8vIEhhbmRsZSBDUk9OIGRlbGV0aW9ucy4KaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdidWxrX2FjdGlvbicgKSA9PSAnZGVsZXRlX2Nyb24nICkgewoJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0FjY2VzcyBkZW5pZWQgaW4gZGVtbyBtb2RlLicsIHRydWUgKTsKCX0gZWxzZSB7CgkJJGRlbGV0ZV9pdGVtcyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2l0ZW1zJyApOwoJCQoJCSRkZWxldGVkX2Nyb25zID0gYXJyYXkoKTsgLy8gRm9yIGxpc3RpbmcgaW4gYWxlcnQuCgkJZm9yZWFjaCggJGRlbGV0ZV9pdGVtcyBhcyAkZGVsZXRlX2l0ZW0gKSB7CgkJCSRjcm9uX3BhcnRzID0gZXhwbG9kZSggJ3wnLCAkZGVsZXRlX2l0ZW0gKTsKCQkJJHRpbWVzdGFtcCA9ICRjcm9uX3BhcnRzWzBdOwoJCQkkY3Jvbl9ob29rID0gJGNyb25fcGFydHNbMV07CgkJCSRjcm9uX2tleSA9ICRjcm9uX3BhcnRzWzJdOwoJCQkKCQkJaWYgKCBpc3NldCggJGNyb25bICR0aW1lc3RhbXAgXVsgJGNyb25faG9vayBdWyAkY3Jvbl9rZXkgXSApICkgeyAvLyBSdW4gY3Jvbi4KCQkJCQoJCQkJJGNyb25fYXJyYXkgPSAkY3JvblsgJHRpbWVzdGFtcCBdWyAkY3Jvbl9ob29rIF1bICRjcm9uX2tleSBdOyAvLyBHZXQgY3JvbiBhcnJheSBiYXNlZCBvbiBwYXNzZWQgdmFsdWVzLgoJCQkJJHJlc3VsdCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OnVuc2NoZWR1bGVfZXZlbnQoICR0aW1lc3RhbXAsICRjcm9uX2hvb2ssICRjcm9uX2FycmF5WydhcmdzJ10gKTsgLy8gRGVsZXRlIHRoZSBzY2hlZHVsZWQgY3Jvbi4KCQkJCWlmICggJHJlc3VsdCA9PT0gRkFMU0UgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzU2NTc2Njc2NzUuIFVuYWJsZSB0byBkZWxldGUgQ1JPTiBqb2IuIFBsZWFzZSBzZWUgeW91ciBCYWNrdXBCdWRkeSBlcnJvciBsb2cgZm9yIGRldGFpbHMuJyApOwoJCQkJfQoJCQkJJGRlbGV0ZWRfY3JvbnNbXSA9ICRjcm9uX2hvb2sgLiAnIC8gJyAuICRjcm9uX2tleTsgLy8gQWRkIGRlbGV0ZWQgY3JvbiB0byBsaXN0IG9mIGRlbGV0aW9ucyBmb3IgZGlzcGxheS4KCQkJCQoJCQl9IGVsc2UgeyAvLyBDcm9uIG5vdCBmb3VuZCwgZXJyb3IuCgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdJbnZhbGlkIENST04gam9iLiBOb3QgZm91bmQuJywgdHJ1ZSApOwoJCQl9CgkJCQoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoIF9fKCdEZWxldGVkIHNjaGVkdWxlZCBDUk9OIGV2ZW50KHMpOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzxicj4nIC4gaW1wbG9kZSggJzxicj4nLCAkZGVsZXRlZF9jcm9ucyApICk7CgkJJGNyb24gPSBnZXRfb3B0aW9uKCdjcm9uJyk7IC8vIFJlc2V0IHRvIG1vc3QgdXAgdG8gZGF0ZSBzdGF0dXMgZm9yIGNyb24gbGlzdGluZyBiZWxvdy4gVGFrZXMgaW50byBhY2NvdW50IGRlbGV0aW9ucy4KCX0KfQoKCgovLyBIYW5kbGUgUlVOTklORyBjcm9uIGpvYnMgbWFudWFsbHkuCmlmICggIWVtcHR5KCAkX0dFVFsncnVuX2Nyb24nXSApICkgewoJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0FjY2VzcyBkZW5pZWQgaW4gZGVtbyBtb2RlLicsIHRydWUgKTsKCX0gZWxzZSB7CgkJJGNyb25fcGFydHMgPSBleHBsb2RlKCAnfCcsIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncnVuX2Nyb24nICkgKTsKCQkkdGltZXN0YW1wID0gJGNyb25fcGFydHNbMF07CgkJJGNyb25faG9vayA9ICRjcm9uX3BhcnRzWzFdOwoJCSRjcm9uX2tleSA9ICRjcm9uX3BhcnRzWzJdOwoJCQoJCWlmICggaXNzZXQoICRjcm9uWyAkdGltZXN0YW1wIF1bICRjcm9uX2hvb2sgXVsgJGNyb25fa2V5IF0gKSApIHsgLy8gUnVuIGNyb24uCgkJCSRjcm9uX2FycmF5ID0gJGNyb25bICR0aW1lc3RhbXAgXVsgJGNyb25faG9vayBdWyAkY3Jvbl9rZXkgXTsgLy8gR2V0IGNyb24gYXJyYXkgYmFzZWQgb24gcGFzc2VkIHZhbHVlcy4KCQkJCgkJCS8qCgkJCWlmICggY291bnQoICRjcm9uX2FycmF5WydhcmdzJ10gKSA9PSAxICkgewoJCQkJJGFyZ3MgPSAkY3Jvbl9hcnJheVsnYXJncyddWzBdOwoJCQl9IGVsc2UgewoJCQkJJGFyZ3MgPSAkY3Jvbl9hcnJheVsnYXJncyddOwoJCQl9CgkJCSovCgkJCQoJCQlkb19hY3Rpb25fcmVmX2FycmF5KCAkY3Jvbl9ob29rLCAkY3Jvbl9hcnJheVsnYXJncyddICk7IC8vIFJ1biB0aGUgY3JvbiBqb2IhCgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdSYW4gQ1JPTiBldmVudCBgJyAuICRjcm9uX2hvb2sgLiAnIC8gJyAuICRjcm9uX2tleSAuICdgLiBJdHMgc2NoZWR1bGUgd2FzIG5vdCBtb2RpZmllZC4nICk7CgkJfSBlbHNlIHsgLy8gQ3JvbiBub3QgZm91bmQsIGVycm9yLgoJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdJbnZhbGlkIENST04gam9iLiBOb3QgZm91bmQuJywgdHJ1ZSApOwoJCX0KCX0KfQoKCgoKaW5jbHVkZSggJ19jcm9uLnBocCcgKTsKCgoKLy8gRGlzcGxheSBDUk9OIHRhYmxlLgpwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJJGNyb25zLCAvLyBBcnJheSBvZiBjcm9uIGl0ZW1zIHNldCBpbiBjb2RlIHNlY3Rpb24gYWJvdmUuCglhcnJheSgKCQknYWN0aW9uJwkJCQkJPT4JcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnI3BiX2JhY2t1cGJ1ZGR5X2dldHRpbmdfc3RhcnRlZF90YWJfdG9vbHMnLAoJCSdjb2x1bW5zJwkJCQkJPT4JYXJyYXkoCgkJCQkJCQkJCQkJX18oICdTY2hlZHVsZWQgRXZlbnRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkJX18oICdOZXh0IFJ1bicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCV9fKCAnUGVyaW9kJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkJX18oICdJbnRlcnZhbCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCV9fKCAnQXJndW1lbnRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkpLAoJCSdjc3MnCQkJCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJCSdob3Zlcl9hY3Rpb25zJwkJCQk9PglhcnJheSgKCQkJCQkJCQkJCQkncnVuX2Nyb24nCT0+CSdSdW4gY3JvbiBqb2Igbm93JywKCQkJCQkJCQkJCSksCgkJJ2J1bGtfYWN0aW9ucycJPT4JYXJyYXkoICdkZWxldGVfY3JvbicgPT4gJ0RlbGV0ZScgKSwKCQknaG92ZXJfYWN0aW9uX2NvbHVtbl9rZXknCT0+CScwJywKCSkKKTsKPz4KCjxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luLWJvdHRvbTogMXB4OyI+Cgk8YSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2ZmZWJjNjsgIWltcG9ydGFudDsiIGhyZWY9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCk7ID8+JmNsZWFyX2Nyb249eWVzJnRhYj0zIiBjbGFzcz0iYnV0dG9uIHNlY29uZGFyeS1idXR0b24iIG9uQ2xpY2s9ImlmICggZmFsc2UgPT09IGNvbmZpcm0oICc8P3BocCBfZSggJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbGVhciBhbGwgY3JvbiBlbnRyaWVzPyBXb3JkUHJlc3Mgd2lsbCBhdXRvbWF0aWNhbGx5IHJlZ2VuZXJhdGUgY3JvbnMgYnV0IHNvbWUgM3JkIHBhcnR5IHBsdWdpbnMgbWF5IG5vdC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz4nICkgKSB7IHJldHVybiBmYWxzZTsgfSI+PD9waHAgX2UoJ0RlbGV0ZSBBbGwgQ3JvbiBFbnRyaWVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Pz48L2E+CjwvZGl2PgoKPGJyPjxicj48YnI+PGJyPgo8P3BocAoKLy8gRGlzcGxheSB0aW1lIGludGVydmFscyB0YWJsZS4KJHByZXR0eV9pbnRlcnZhbHMgPSBhcnJheSgpOwokc2NoZWR1bGVfaW50ZXJ2YWxzID0gd3BfZ2V0X3NjaGVkdWxlcygpOwpmb3JlYWNoKCAkc2NoZWR1bGVfaW50ZXJ2YWxzIGFzICRpbnRlcnZhbF90YWcgPT4gJHNjaGVkdWxlX2ludGVydmFsICkgewoJJHByZXR0eV9pbnRlcnZhbHNbICRzY2hlZHVsZV9pbnRlcnZhbFsnaW50ZXJ2YWwnXSBdID0gYXJyYXkoCgkJJHNjaGVkdWxlX2ludGVydmFsWydkaXNwbGF5J10sCgkJJGludGVydmFsX3RhZywKCQkkc2NoZWR1bGVfaW50ZXJ2YWxbJ2ludGVydmFsJ10sCgkpOwp9Cmtzb3J0KCAkcHJldHR5X2ludGVydmFscyApOwpwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJJHByZXR0eV9pbnRlcnZhbHMsIC8vIEFycmF5IG9mIGNyb24gaXRlbXMgc2V0IGluIGNvZGUgc2VjdGlvbiBhYm92ZS4KCWFycmF5KAoJCSdjb2x1bW5zJwkJCQkJPT4JYXJyYXkoCgkJCQkJCQkJCQkJX18oICdTY2hlZHVsZSBQZXJpb2RzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkJX18oICdUYWcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkJCQkJCQlfXyggJ0ludGVydmFsJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkpLAoJCSdjc3MnCQkJCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJKQopOwplY2hvICc8YnI+PGJyPic7CgoKCgoKaWYgKCBlbXB0eSggJF9HRVRbJ3Nob3dfY3Jvbl9hcnJheSddICkgKSB7Cgk/PgoJPHA+Cgk8Y2VudGVyPgoJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCk7ID8+JnRhYj0zJnNob3dfY3Jvbl9hcnJheT10cnVlI3BiX2JhY2t1cGJ1ZGR5X2dldHRpbmdfc3RhcnRlZF90YWJfdG9vbHMiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij4KCQkJPD9waHAgX2UoJ0Rpc3BsYXkgQ1JPTiBEZWJ1Z2dpbmcgQXJyYXknLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsgPz4KCQk8L2E+Cgk8L2NlbnRlcj4KCTwvcD4KCTw/cGhwCn0gZWxzZSB7CgkKCWVjaG8gJzxicj48dGV4dGFyZWEgcmVhZG9ubHk9InJlYWRvbmx5IiBzdHlsZT0id2lkdGg6IDc5M3B4OyIgcm93cz0iMTMiIGNvbHM9Ijc1IiB3cmFwPSJvZmYiPic7CglwcmludF9yKCAkY3JvbiApOwoJZWNobyAnPC90ZXh0YXJlYT48YnI+PGJyPic7Cn0KdW5zZXQoICRjcm9uICk7Cj8+Cgo8YnI+CjxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIj4KCTxiPk5vdGU8L2I+OiBEdWUgdG8gdGhlIHdheSBzY2hlZHVsZXMgYXJlIHRyaWdnZXJlZCBpbiBXb3JkUHJlc3MgeW91ciBzaXRlIG11c3QgYmUgYWNjZXNzZWQgKGZyb250ZW5kIG9yIGFkbWluIGFyZWEpIGZvciBzY2hlZHVsZWQgYmFja3VwcyB0byBvY2N1ci4KCVdvcmRQcmVzcyBzY2hlZHVsZWQgZXZlbnRzICgiY3JvbnMiKSBtYXkgYmUgdmlld2VkIG9yIHJ1biBtYW51YWxseSBpbiB0aGUgdGFibGUgYWJvdmU8L2E+LiBBIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9ZnJlZSt3ZWJzaXRlK3VwdGltZSZvcT1mcmVlK3dlYnNpdGUrdXB0aW1lIiB0YXJnZXQ9Il9ibGFuayI+ZnJlZSB3ZWJzaXRlIHVwdGltZTwvYT4gc2VydmljZSBvciA8YSBocmVmPSJodHRwczovL2l0aGVtZXMuY29tL3N5bmMtcHJvL3VwdGltZS1tb25pdG9yaW5nLyIgdGFyZ2V0PSJfYmxhbmsiPmlUaGVtZXMgU3luYyBQcm8ncyBVcHRpbWUgTW9uaXRvcmluZzwvYT4gY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBhY2Nlc3MgeW91ciBzaXRlIHJlZ3VsYXJseSB0byBoZWxwIHRyaWdnZXIgc2NoZWR1bGVkIGFjdGlvbnMgKCJjcm9ucyIpIGluIGNhc2VzIG9mIGxvdyBzaXRlIGFjdGl2aXR5LCB3aXRoIHRoZSBhZGRlZCBwZXJrIG9mIGtlZXBpbmcgdHJhY2sgb2YgeW91ciBzaXRlIHVwdGltZS4KPC9kaXY+Cgo= ###PACKDATA,FILE_END,/controllers/pages/server_info/cron.php,importbuddy/controllers/pages/server_info/cron.php ###PACKDATA,FILE_START,/controllers/pages/server_info/database.php,importbuddy/controllers/pages/server_info/database.php PD9waHAKaWYgKCAhaXNzZXQoICRwYXJlbnRfY2xhc3MgKSApIHsKCSRwYXJlbnRfY2xhc3MgPSAkdGhpczsKfQppZiAoIGRlZmluZWQoICdwbHVnaW5idWRkeV9pbXBvcnRidWRkeScgKSApIHsKCS8vJHBhcmVudF9jbGFzcy0+YWRtaW5fc2NyaXB0cygpOwp9CgoKCgoKJHByb2ZpbGVfaWQgPSAwOwppZiAoIGlzX251bWVyaWMoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncHJvZmlsZScgKSApICkgewoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Byb2ZpbGUnICkgXSApICkgewoJCSRwcm9maWxlX2lkID0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwcm9maWxlJyApOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVsgcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwcm9maWxlJyApIF0gPSBhcnJheV9tZXJnZSggcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAncHJvZmlsZV9kZWZhdWx0cycgKSwgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Byb2ZpbGUnICkgXSApOyAvLyBTZXQgZGVmYXVsdHMgaWYgbm90IHNldC4KCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzQ1ODQ5NDU4OiBJbnZhbGlkIHByb2ZpbGUgSUQgbnVtYmVyIGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Byb2ZpbGUnICkgKSAuICdgLiBEaXNwbGF5aW5nIHdpdGggZGVmYXVsdCBwcm9maWxlLicsIHRydWUgKTsKCX0KfQoKCi8vIEdldCBwcm9maWxlIGFycmF5LgokcHJvZmlsZSA9IGFycmF5X21lcmdlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdwcm9maWxlX2RlZmF1bHRzJyApLCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ11bJHByb2ZpbGVfaWRdICk7CmZvcmVhY2goICRwcm9maWxlIGFzICRwcm9maWxlX2l0ZW1fbmFtZSA9PiAmJHByb2ZpbGVfaXRlbSApIHsgLy8gcmVwbGFjZSBub24tb3ZlcnJpZGRlbiBkZWZhdWx0cyB3aXRoIGFjdHVhbCBkZWZhdWx0IHZhbHVlLgoJaWYgKCAnLTEnID09ICRwcm9maWxlX2l0ZW0gKSB7IC8vIFNldCB0byB1c2UgZGVmYXVsdCBzbyBnbyBncmFiIGRlZmF1bHQuCgkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdWyAkcHJvZmlsZV9pdGVtX25hbWUgXSApICkgewoJCQkkcHJvZmlsZV9pdGVtID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdWyAkcHJvZmlsZV9pdGVtX25hbWUgXTsgLy8gR3JhYiB2YWx1ZSBmcm9tIGRlZmF1bHRzIHByb2ZpbGUgYW5kIHJlcGxhY2Ugd2l0aCBpdC4KCQl9Cgl9Cn0KCgoKCmVjaG8gJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDRweDsiPkJhY2t1cCBwcm9maWxlIGZvciBjYWxjdWxhdGluZyBleGNsdXNpb25zOiAnOwplY2hvICc8c2VsZWN0IGlkPSJwYl9iYWNrdXBidWRkeV9kYXRhYmFzZXByb2ZpbGUiIG9uQ2hhbmdlPSJ3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwnJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyZ0YWI9MSZwcm9maWxlPVwnICsgalF1ZXJ5KHRoaXMpLnZhbCgpOyI+JzsKZm9yZWFjaCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddIGFzICR0aGlzX3Byb2ZpbGVfaWQgPT4gJHRoaXNfcHJvZmlsZSApIHsKCT8+Cgk8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvICR0aGlzX3Byb2ZpbGVfaWQ7ID8+IiA8P3BocCBpZiAoICRwcm9maWxlX2lkID09ICR0aGlzX3Byb2ZpbGVfaWQgKSB7IGVjaG8gJ3NlbGVjdGVkJzsgfSA/Pj48P3BocCBlY2hvIGh0bWxlbnRpdGllcyggJHRoaXNfcHJvZmlsZVsndGl0bGUnXSApOyA/PiAgKDw/cGhwIGVjaG8gJHRoaXNfcHJvZmlsZVsndHlwZSddOyA/Pik8L2E+Cgk8P3BocAp9CmVjaG8gJzwvc2VsZWN0Pic7CmVjaG8gJzwvZGl2Pic7CgoKCgovLyR0YWJsZV9saXN0ID0gYXJyYXkoKTsKPz4KCgoKCjx0YWJsZSBjbGFzcz0id2lkZWZhdCBzdHJpcGVkIj4KCTx0aGVhZD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJPD9waHAKCQkJCWVjaG8gJzx0aD4nLCBfXygnRGF0YWJhc2UgVGFibGUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnU2V0dGluZ3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnVXBkYXRlZCAvIENoZWNrZWQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdSb3dzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1NpemUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnRXhjbHVkZWQgU2l6ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nOwoJCQk/PgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRmb290PgoJCTx0ciBjbGFzcz0idGhlYWQiPgoJCQk8P3BocAoJCQkJZWNobyAnPHRoPicsIF9fKCdEYXRhYmFzZSBUYWJsZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1N0YXR1cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdTZXR0aW5ncycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdVcGRhdGVkIC8gQ2hlY2tlZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1Jvd3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnU2l6ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdFeGNsdWRlZCBTaXplJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPic7CgkJCT8+CgkJPC90cj4KCTwvdGZvb3Q+Cgk8dGJvZHk+CgkJPD9waHAKCQlnbG9iYWwgJHdwZGI7CgkJJHByZWZpeCA9ICR3cGRiLT5wcmVmaXg7CgkJJHByZWZpeF9sZW5ndGggPSBzdHJsZW4oICR3cGRiLT5wcmVmaXggKTsKCQkKCQkkYWRkaXRpb25hbF9pbmNsdWRlcyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9teXNxbGR1bXBfYWRkaXRpb25hbCggJ2luY2x1ZGVzJywgJHByb2ZpbGUgKTsKCQkkYWRkaXRpb25hbF9leGNsdWRlcyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9teXNxbGR1bXBfYWRkaXRpb25hbCggJ2V4Y2x1ZGVzJywgJHByb2ZpbGUgKTsKCQkKCQkkdG90YWxfc2l6ZSA9IDA7CgkJJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zID0gMDsKCQkkdG90YWxfcm93cyA9IDA7CgkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFIFNUQVRVUyIsIEFSUkFZX0EgKTsKCQlmb3JlYWNoKCAkcm93cyBhcyAkcm93ICkgewoJCQkkZXhjbHVkZWQgPSB0cnVlOyAvLyBEZWZhdWx0LgoJCQkKCQkJLy8gVEFCTEUgU1RBVFVTLgoJCQkkcm93c2IgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJDSEVDSyBUQUJMRSBgeyRyb3dbJ05hbWUnXX1gIiwgQVJSQVlfQSApOwoJCQlmb3JlYWNoKCAkcm93c2IgYXMgJHJvd2IgKSB7CgkJCQlpZiAoICRyb3diWydNc2dfdHlwZSddID09ICdzdGF0dXMnICkgewoJCQkJCSRzdGF0dXMgPSAkcm93YlsnTXNnX3RleHQnXTsKCQkJCX0KCQkJfQoJCQl1bnNldCggJHJvd3NiICk7CgkJCQoJCQkvLyBGaXggdXAgcm93IGNvdW50IGFuZCBhdmVyYWdlIHJvdyBsZW5ndGggZm9yIElubm9EQiBlbmdpbmUgd2hpY2ggcmV0dXJucyBpbmFjY3VyYXRlCgkJCS8vIChhbmQgY2hhbmdpbmcpIHZhbHVlcyBmb3IgdGhlc2UKCQkJaWYgKCAnSW5ub0RCJyA9PT0gJHJvd1sgJ0VuZ2luZScgXSApIHsKCQkJCWlmICggZmFsc2UgIT09ICggJGNvdW50ID0gJHdwZGItPmdldF92YXIoICJTRUxFQ1QgQ09VTlQoMSkgRlJPTSBgeyRyb3dbICdOYW1lJyBdfWAiICkgKSApIHsKCQkJCQlpZiAoIDAgPCAoICRyb3dbICdSb3dzJyBdID0gJGNvdW50ICkgKSB7CgkJCQkJCSRyb3dbICdBdmdfcm93X2xlbmd0aCcgXSA9ICggJHJvd1sgJ0RhdGFfbGVuZ3RoJyBdIC8gJHJvd1sgJ1Jvd3MnIF0gKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFRBQkxFIFNJWkUuCgkJCSRzaXplID0gKCAkcm93WydEYXRhX2xlbmd0aCddICsgJHJvd1snSW5kZXhfbGVuZ3RoJ10gKTsKCQkJJHRvdGFsX3NpemUgKz0gJHNpemU7CgkJCQoJCQkvLyBIQU5ETEUgRVhDTFVTSU9OUy4KCQkJaWYgKCAkcHJvZmlsZVsnYmFja3VwX25vbndwX3RhYmxlcyddID09IDAgKSB7IC8vIE9ubHkgbWF0Y2hpbmcgcHJlZml4LgoJCQkJaWYgKCAoIHN1YnN0ciggJHJvd1snTmFtZSddLCAwLCAkcHJlZml4X2xlbmd0aCApID09ICRwcmVmaXggKSBPUiAoIGluX2FycmF5KCAkcm93WydOYW1lJ10sICRhZGRpdGlvbmFsX2luY2x1ZGVzICkgKSApIHsKCQkJCQlpZiAoICFpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9leGNsdWRlcyApICkgewoJCQkJCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKz0gJHNpemU7CgkJCQkJCSRleGNsdWRlZCA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsgLy8gQWxsIHRhYmxlcy4KCQkJCWlmICggIWluX2FycmF5KCAkcm93WydOYW1lJ10sICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICkgKSB7CgkJCQkJJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zICs9ICRzaXplOwoJCQkJCSRleGNsdWRlZCA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJLy8gT1VUUFVUIFRBQkxFIFJPVy4KCQkJZWNobyAnPHRyIGNsYXNzPSJlbnRyeS1yb3ciJzsKCQkJaWYgKCAkZXhjbHVkZWQgPT09IHRydWUgKSB7CgkJCQllY2hvICcgc3R5bGU9ImJhY2tncm91bmQ6ICNmY2M5Yzk7Iic7CgkJCX0KCQkJZWNobyAnPic7CgkJCWVjaG8gJwk8dGQ+JyAuICRyb3dbJ05hbWUnXTsKCQkJZWNobyAnCTxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIj4KCQkJCQkJPGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ2RiX2NoZWNrJyApIC4gJyZ0YWJsZT0nIC4gYmFzZTY0X2VuY29kZSggJHJvd1snTmFtZSddICkgLiAnJiMwMzg7VEJfaWZyYW1lPTEmIzAzODt3aWR0aD02NDAmIzAzODtoZWlnaHQ9NjAwIiBjbGFzcz0idGhpY2tib3giIHRpdGxlPSJDaGVjayBkYXRhYmFzZSB0YWJsZSBmb3IgYW55IGVycm9ycyBvciBjb3JydXB0aW9uLiI+Q2hlY2s8L2E+CgkJCQkJCXwKCQkJCQkJPGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ2RiX3JlcGFpcicgKSAuICcmdGFibGU9JyAuIGJhc2U2NF9lbmNvZGUoICRyb3dbJ05hbWUnXSApIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94IiB0aXRsZT0iUmVwYWlyIHRhYmxlIHRoYXQgaGFzIGJlZW4gY29ycnVwdGVkLiBPbmx5IG5lZWRlZCBpZiB0aGUgc3RhdHVzIG9yIGNoZWNrIHJlc3BvbnNlIGluZGljYXRlZCBkYW1hZ2UuIj5SZXBhaXI8L2E+CgkJCQkJPC9kaXY+CgkJCQknOwoJCQllY2hvICc8L3RkPic7CgkJCWVjaG8gJwk8dGQ+JyAuICRzdGF0dXMgLiAnPC90ZD4nOwoJCQllY2hvICcJPHRkPkVuZ2luZTogJyAuICRyb3dbJ0VuZ2luZSddIC4gJzxicj5Db2xsYXRpb246ICcgLiAkcm93WydDb2xsYXRpb24nXSAuICc8L3RkPic7CgkJCQoJCQllY2hvICcJPHRkPlVwZGF0ZWQ6ICc7CgkJCWlmICggJHJvd1snVXBkYXRlX3RpbWUnXSA9PSAnJyApIHsKCQkJCV9lKCAnVW5hdmFpbGFibGUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJfSBlbHNlIHsKCQkJCWVjaG8gJHJvd1snVXBkYXRlX3RpbWUnXTsKCQkJfQoJCQllY2hvICc8YnI+Q2hlY2tlZDogJzsKCQkJaWYgKCAkcm93WydDaGVja190aW1lJ10gPT0gJycgKSB7CgkJCQlfZSggJ1VuYXZhaWxhYmxlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCX0gZWxzZSB7CgkJCQllY2hvICRyb3dbJ0NoZWNrX3RpbWUnXTsKCQkJfQoJCQllY2hvICc8L3RkPic7CgkJCQoJCQllY2hvICcJPHRkPicgLiAkcm93WydSb3dzJ10gLiAnPC90ZD4nOwoJCQllY2hvICcJPHRkPicgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkc2l6ZSApIC4gJzwvdGQ+JzsKCQkJaWYgKCAkZXhjbHVkZWQgPT09IHRydWUgKSB7CgkJCQllY2hvICcJPHRkPjxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1pbXBvcnRhbnQiPkV4Y2x1ZGVkPC9zcGFuPjwvdGQ+JzsKCQkJfSBlbHNlIHsKCQkJCWVjaG8gJwk8dGQ+JyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRzaXplICkgLiAnPC90ZD4nOwoJCQl9CgkJCQoJCQkKCQkJCgkJCQkJCQoJCQkKCQkJCgkJCSR0b3RhbF9yb3dzICs9ICRyb3dbJ1Jvd3MnXTsKCQkJZWNobyAnPC90cj4nOwoJCX0KCQllY2hvICc8dHIgY2xhc3M9ImVudHJ5LXJvdyBhbHRlcm5hdGUiPic7CgkJZWNobyAnCTx0ZD4mbmJzcDs8L3RkPic7CgkJZWNobyAnCTx0ZD4mbmJzcDs8L3RkPic7CgkJZWNobyAnCTx0ZD4mbmJzcDs8L3RkPic7CgkJZWNobyAnPHRkPjxiPicsX18oJ1RPVEFMUycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksJzo8L2I+PC90ZD4nOwoJCWVjaG8gJzx0ZD48Yj4nIC4gJHRvdGFsX3Jvd3MgLiAnPC9iPjwvdGQ+JzsKCQllY2hvICc8dGQ+PGI+JyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICR0b3RhbF9zaXplICkgLiAnPC9iPjwvdGQ+JzsKCQllY2hvICc8dGQ+PGI+JyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICR0b3RhbF9zaXplX3dpdGhfZXhjbHVzaW9ucyApIC4gJzwvYj48L3RkPic7CgkJZWNobyAnPC90cj4nOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnZGJfc2l6ZSddID0gJHRvdGFsX3NpemU7CgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplX2V4Y2x1ZGVkJ10gPSAkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnM7CgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplX3VwZGF0ZWQnXSA9IHRpbWUoKTsKCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQoJCXVuc2V0KCAkdG90YWxfc2l6ZSApOwoJCXVuc2V0KCAkdG90YWxfcm93cyApOwoJCXVuc2V0KCAkcm93cyApOwoJCT8+Cgk8L3Rib2R5Pgo8L3RhYmxlPjxicj4= ###PACKDATA,FILE_END,/controllers/pages/server_info/database.php,importbuddy/controllers/pages/server_info/database.php ###PACKDATA,FILE_START,/controllers/pages/server_info/index.php,importbuddy/controllers/pages/server_info/index.php PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+ ###PACKDATA,FILE_END,/controllers/pages/server_info/index.php,importbuddy/controllers/pages/server_info/index.php ###PACKDATA,FILE_START,/controllers/pages/server_info/permissions.php,importbuddy/controllers/pages/server_info/permissions.php PGJyPjw/cGhwCiR0ZXN0cyA9IGFycmF5KCk7CgokdXBsb2Fkc19kaXJzID0gd3BfdXBsb2FkX2RpcigpOwokZGlyZWN0b3JpZXMgPSBhcnJheSgKCUFCU1BBVEggLiAnJywKCUFCU1BBVEggLiAnd3AtaW5jbHVkZXMvJywKCUFCU1BBVEggLiAnd3AtYWRtaW4vJywKCVdQX0NPTlRFTlRfRElSIC4gJy90aGVtZXMvJywKCVdQX1BMVUdJTl9ESVIgLiAnLycsCglXUF9DT05URU5UX0RJUiAuICcvJywKCS8vQUJTUEFUSCAuICd3cC1jb250ZW50LycsCglydHJpbSggJHVwbG9hZHNfZGlyc1snYmFzZWRpciddLCAnXFwvJyApIC4gJy8nLAoJQUJTUEFUSCAuICd3cC1pbmNsdWRlcy8nLAoJYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCksCgliYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSwKKTsKaWYgKCBAZmlsZV9leGlzdHMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSApICkgeyAvLyBUaGlzIGRpciBpcyB1c3VhbGx5IHRyYW5zaWVudCBzbyBtYXkgbm90IGV4aXN0LgoJJGRpcmVjdG9yaWVzW10gPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCk7Cn0KCgpmb3JlYWNoKCAkZGlyZWN0b3JpZXMgYXMgJGRpcmVjdG9yeSApIHsKCQoJJG1vZGVfb2N0YWxfZm91ciA9ICc8aT4nIC4gX18oICdVbmtub3duJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9pPic7Cgkkb3duZXIgPSAnPGk+JyAuIF9fKCAnVW5rbm93bicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvaT4nOwoJCglpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgKSApIHsKCQkkbW9kZV9vY3RhbF9mb3VyID0gJ0RpcmVjdG9yeSBkb2VzXCd0IGV4aXN0JzsKCQkkb3duZXIgPSAnbi9hJzsKCX0KCSRzdGF0cyA9IHBsdWdpbmJ1ZGR5X3N0YXQ6OnN0YXQoICRkaXJlY3RvcnkgKTsKCWlmICggZmFsc2UgIT09ICRzdGF0cyApIHsKCQkkbW9kZV9vY3RhbF9mb3VyID0gJHN0YXRzWydtb2RlX29jdGFsX2ZvdXInXTsKCQkkb3duZXIgPSAkc3RhdHNbJ3VpZCddIC4gJzonIC4gJHN0YXRzWydnaWQnXTsKCX0KCSR0aGlzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCScvJyAuIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJGRpcmVjdG9yeSApLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJzw9IDc1NScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQkkbW9kZV9vY3RhbF9mb3VyLAoJCQkJCSdvd25lcicJCQk9PgkJJG93bmVyLAoJCQkJKTsKCWlmICggZmFsc2UgPT09ICRzdGF0cyB8fCAkbW9kZV9vY3RhbF9mb3VyID4gNzU1ICkgewoJCSR0aGlzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHRoaXNfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHRoaXNfdGVzdCApOwoJCn0gLy8gZW5kIGZvcmVhY2guCgoKPz4KCjx0YWJsZSBjbGFzcz0id2lkZWZhdCI+Cgk8dGhlYWQ+CgkJPHRyIGNsYXNzPSJ0aGVhZCI+CgkJCTw/cGhwIAoJCQkJZWNobyAnPHRoPicsIF9fKCdSZWxhdGl2ZSBQYXRoJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwnPC90aD4nLAoJCQkJCSc8dGg+JywgX18oJ1N1Z2dlc3Rpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQknPHRoPicsIF9fKCdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSc8dGg+JywgX18oJ093bmVyIChVSUQ6R0lEKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCS8vICc8dGg+JywgX18oJ1Jlc3VsdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoIHN0eWxlPSJ3aWR0aDogNjBweDsiPicsIF9fKCdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JzsKCQkJPz4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Zm9vdD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJPD9waHAgCgkJCQllY2hvICc8dGg+JywgX18oJ1JlbGF0aXZlIFBhdGgnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCc8L3RoPicsCgkJCQkJJzx0aD4nLCBfXygnU3VnZ2VzdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSc8dGg+JywgX18oJ1ZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJJzx0aD4nLCBfXygnT3duZXIgKFVJRDpHSUQpJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJLy8gJzx0aD4nLCBfXygnUmVzdWx0JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJJzx0aCBzdHlsZT0id2lkdGg6IDYwcHg7Ij4nLCBfXygnU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPic7CgkJCT8+CgkJPC90cj4KCTwvdGZvb3Q+Cgk8dGJvZHk+CgkJPD9waHAKCQlmb3JlYWNoKCAkdGVzdHMgYXMgJHRoaXNfdGVzdCApIHsKCQkJZWNobyAnPHRyIGNsYXNzPSJlbnRyeS1yb3cgYWx0ZXJuYXRlIj4nOwoJCQllY2hvICcJPHRkPicgLiAkdGhpc190ZXN0Wyd0aXRsZSddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHRoaXNfdGVzdFsnc3VnZ2VzdGlvbiddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHRoaXNfdGVzdFsndmFsdWUnXSAuICc8L3RkPic7CgkJCWVjaG8gJwk8dGQ+JyAuICR0aGlzX3Rlc3RbJ293bmVyJ10gLiAnPC90ZD4nOwoJCQkvL2VjaG8gJwk8dGQ+JyAuICR0aGlzX3Rlc3RbJ3N0YXR1cyddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nOwoJCQlpZiAoICR0aGlzX3Rlc3RbJ3N0YXR1cyddID09IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICkgewoJCQkJLy9lY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMjJFRTVCOyBib3JkZXI6IDFweCBzb2xpZCAjRTJFMkUyOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9kaXY+JzsKCQkJCWVjaG8gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1zdWNjZXNzIj5QYXNzPC9zcGFuPic7CgkJCX0gZWxzZWlmICggJHRoaXNfdGVzdFsnc3RhdHVzJ10gPT0gX18oJ0ZBSUwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApIHsKCQkJCS8vZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0NGMzMzMzsgYm9yZGVyOiAxcHggc29saWQgI0UyRTJFMjsiPiZuYnNwOyZuYnNwOyZuYnNwOzwvZGl2Pic7CgkJCQllY2hvICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtaW1wb3J0YW50Ij5GYWlsPC9zcGFuPic7CgkJCX0gZWxzZWlmICggJHRoaXNfdGVzdFsnc3RhdHVzJ10gPT0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApIHsKCQkJCS8vZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZFRkY3RjsgYm9yZGVyOiAxcHggc29saWQgI0UyRTJFMjsiPiZuYnNwOyZuYnNwOyZuYnNwOzwvZGl2Pic7CgkJCQllY2hvICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyI+V2FybmluZzwvc3Bhbj4nOwoJCQl9IGVsc2UgewoJCQkJZWNobyAndW5rbm93bic7CgkJCX0KCQkJZWNobyAnCTwvdGQ+JzsKCQkJZWNobyAnPC90cj4nOwoJCX0KCQk/PgoJPC90Ym9keT4KPC90YWJsZT4KCjxicj48YnI+ ###PACKDATA,FILE_END,/controllers/pages/server_info/permissions.php,importbuddy/controllers/pages/server_info/permissions.php ###PACKDATA,FILE_START,/controllers/pages/server_info/remote_sends.php,importbuddy/controllers/pages/server_info/remote_sends.php PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkKCQlqUXVlcnkoICcucGJfYmFja3VwYnVkZHlfcmVtb3Rlc2VuZF9hYm9ydCcgKS5jbGljayggZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmFqYXgoewoJCQkJdHlwZTogJ1BPU1QnLAoJCQkJdXJsOiBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICksCgkJCQlzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKCQkJCQlkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKCQkJCQlpZiAoICcxJyA9PSBkYXRhICkgewoJCQkJCQlhbGVydCggJ1JlbW90ZSB0cmFuc2ZlciBhYm9ydGVkLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50IHRvIHRha2UgZWZmZWN0LicgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlhbGVydCggJ0Vycm9yICM4NTQ0ODk0OS4gVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UuIERldGFpbHM6IGAnICsgZGF0YSArICdgLicgKTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSk7Cgl9KTsKPC9zY3JpcHQ+Cjw/cGhwCgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2hvdXNla2VlcGluZy5waHAnICk7CmJhY2t1cGJ1ZGR5X2hvdXNla2VlcGluZzo6dHJpbV9yZW1vdGVfc2VuZF9zdGF0cygpOwoKCmluY2x1ZGUoICdfcmVtb3RlX3NlbmRzLnBocCcgKTsgLy8gU2V0cyAkc2VuZHMuCgoKaWYgKCBjb3VudCggJHNlbmRzICkgPT0gMCApIHsKCWVjaG8gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPicgLiBfXyggJ1RoZXJlIGhhdmUgYmVlbiBubyByZWNlbnQgZmlsZSB0cmFuc2ZlcnMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9zcGFuPjxicj4nOwp9IGVsc2UgewoJJHNlbmRzID0gYXJyYXlfc2xpY2UoICRzZW5kcywgMCwgYmFja3VwYnVkZHlfY29uc3RhbnRzOjpSRUNFTlRfU0VORFNfTUFYX0xJU1RJTkdfQ09VTlQgKTsgLy8gT25seSBkaXNwbGF5IG1vc3QgcmVjZW50IFggc2VuZHMgdG8ga2VlcCBwYWdlIGZyb20gYmVpbmcgYm9nZ2VkIGRvd24uCglwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJCSRzZW5kcywKCQlhcnJheSgKCQkJJ2FjdGlvbicJCT0+CXBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpLAoJCQknY29sdW1ucycJCT0+CWFycmF5KAoJCQkJX18oICdTZW50IEZpbGUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCV9fKCAnRGVzdGluYXRpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCV9fKCAnVHJpZ2dlcicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJX18oICdUcmFuc2ZlciBJbmZvcm1hdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyA8aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9zb3J0X2Rvd24ucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiIHRpdGxlPSJTb3J0ZWQgbW9zdCByZWNlbnQgc3RhcnRlZCBmaXJzdCI+JywKCQkJCV9fKCAnU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIDxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+KGhvdmVyIGZvciBvcHRpb25zKTwvc3Bhbj4nLAoJCQkJKSwKCQkJJ2NzcycJCQk9PgkJJ3dpZHRoOiAxMDAlOycsCgkJKQoJKTsKCWVjaG8gJzxkaXYgY2xhc3M9ImFsaWducmlnaHQgYWN0aW9ucyI+JzsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPm5vdGUoICdIb3ZlciBvdmVyIGl0ZW1zIGFib3ZlIGZvciBhZGRpdGlvbmFsIG9wdGlvbnMuJyApOwoJZWNobyAnPC9kaXY+JzsKfQoKPz48YnI+ ###PACKDATA,FILE_END,/controllers/pages/server_info/remote_sends.php,importbuddy/controllers/pages/server_info/remote_sends.php ###PACKDATA,FILE_START,/controllers/pages/server_info/server.php,importbuddy/controllers/pages/server_info/server.php PHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5wYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIHsKCQljdXJzb3I6IHBvaW50ZXI7Cgl9Cjwvc3R5bGU+CjxzY3JpcHQ+CmpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CglmdW5jdGlvbiBiYl9pc051bWJlciggbiApIHsKCQlyZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pOwoJfTsKCQoJalF1ZXJ5KCcucGJfYmFja3VwYnVkZHlfdGVzdEVycm9yTG9nJykuY2xpY2soZnVuY3Rpb24oZSkgewoJCWpRdWVyeSggJy5wYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApLnNob3coKTsKCQlqUXVlcnkucG9zdCggalF1ZXJ5KHRoaXMpLmF0dHIoICdyZWwnICksIHsgZnVuY3Rpb246ICd0ZXN0RXJyb3JMb2cnIH0sIAoJCQlmdW5jdGlvbihkYXRhKSB7CgkJCQlqUXVlcnkoICcucGJfYmFja3VwYnVkZHlfbG9hZGluZycgKS5oaWRlKCk7CgkJCQlhbGVydCggZGF0YSApOwoJCQl9CgkJKTsKCQlyZXR1cm4gZmFsc2U7Cgl9KTsKCQoJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X3Rlc3RQSFBSdW50aW1lJyApLmNsaWNrKCBmdW5jdGlvbihlKXsKCQlsb2FkaW5nID0galF1ZXJ5KHRoaXMpLmNoaWxkcmVuKCAnLnBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmcnICk7CgkJc2VyaWFsaXplZEZvcm0gPSBqUXVlcnkodGhpcykuY2xvc2VzdCggJ2Zvcm0nICkuc2VyaWFsaXplKCk7CgkJCgkJdGVzdFBIUFJ1bnRpbWVJbnRlcnZhbCA9IHNldEludGVydmFsKCBmdW5jdGlvbigpewoJCQlsb2FkaW5nLnNob3coKTsKCQkJalF1ZXJ5LnBvc3QoCgkJCQknPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdydW5fcGhwX3J1bnRpbWVfdGVzdF9yZXN1bHRzJyApOyA/PicsCgkJCQlzZXJpYWxpemVkRm9ybSwgCgkJCQlmdW5jdGlvbihkYXRhKSB7CgkJCQkJbG9hZGluZy5oaWRlKCk7CgkJCQkJaWYgKCBiYl9pc051bWJlciggZGF0YSApICkgeyAvLyBGaW5pc2hlZAoJCQkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKyAnIDw/cGhwIF9lKCAic2VjcyIsICJpdC1sMTBuLWJhY2t1cGJ1ZGR5IiApOyA/PicgKTsKCQkJCQkJY2xlYXJJbnRlcnZhbCggdGVzdFBIUFJ1bnRpbWVJbnRlcnZhbCApOwoJCQkJCX0gZWxzZSB7IC8vIEluIHByb2dyZXNzLgoJCQkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKTsKCQkJCQl9CgkJCQl9CgkJCSk7CgkJfSwgNTAwMCApOwoJfSk7CgkKCWpRdWVyeSggJy5wYl9iYWNrdXBidWRkeV90ZXN0UEhQTWVtb3J5JyApLmNsaWNrKCBmdW5jdGlvbihlKXsKCQlsb2FkaW5nID0galF1ZXJ5KHRoaXMpLmNoaWxkcmVuKCAnLnBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmcnICk7CgkJc2VyaWFsaXplZEZvcm0gPSBqUXVlcnkodGhpcykuY2xvc2VzdCggJ2Zvcm0nICkuc2VyaWFsaXplKCk7CgkJCgkJdGVzdFBIUE1lbW9yeUludGVydmFsID0gc2V0SW50ZXJ2YWwoIGZ1bmN0aW9uKCl7CgkJCWxvYWRpbmcuc2hvdygpOwoJCQlqUXVlcnkucG9zdCgKCQkJCSc8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3J1bl9waHBfbWVtb3J5X3Rlc3RfcmVzdWx0cycgKTsgPz4nLAoJCQkJc2VyaWFsaXplZEZvcm0sIAoJCQkJZnVuY3Rpb24oZGF0YSkgewoJCQkJCWxvYWRpbmcuaGlkZSgpOwoJCQkJCWlmICggYmJfaXNOdW1iZXIoIGRhdGEgKSApIHsgLy8gRmluaXNoZWQKCQkJCQkJcmVzdWx0X29iai5odG1sKCBkYXRhICsgJyA8P3BocCBfZSggIk1CIiwgIml0LWwxMG4tYmFja3VwYnVkZHkiICk7ID8+JyApOwoJCQkJCQljbGVhckludGVydmFsKCB0ZXN0UEhQTWVtb3J5SW50ZXJ2YWwgKTsKCQkJCQl9IGVsc2UgeyAvLyBJbiBwcm9ncmVzcy4KCQkJCQkJcmVzdWx0X29iai5odG1sKCBkYXRhICk7CgkJCQkJfQoJCQkJfQoJCQkpOwoJCX0sIDUwMDAgKTsKCX0pOwoJCglqUXVlcnkoJy5wYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzJykuY2xpY2soZnVuY3Rpb24oZSkgewoJCWxvYWRpbmcgPSBqUXVlcnkodGhpcykuY2hpbGRyZW4oICcucGJfYmFja3VwYnVkZHlfbG9hZGluZycgKTsKCQlsb2FkaW5nLnNob3coKTsKCQkKCQlyZXN1bHRfb2JqID0galF1ZXJ5KCAnI3BiX3N0YXRzXycgKyBqUXVlcnkodGhpcykuYXR0ciggJ3JlbCcgKSApOwoJCQoJCWpRdWVyeS5wb3N0KCBqUXVlcnkodGhpcykuYXR0ciggJ2FsdCcgKSwgalF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICdmb3JtJyApLnNlcmlhbGl6ZSgpLCAKCQkJZnVuY3Rpb24oZGF0YSkgewoJCQkJLy9hbGVydChkYXRhKTsKCQkJCWxvYWRpbmcuaGlkZSgpOwoJCQkJcmVzdWx0X29iai5odG1sKCBkYXRhICk7CgkJCX0KCQkpOyAvLywianNvbiIpOwoJCQoJCXJldHVybiBmYWxzZTsKCX0pOwp9KTsKPC9zY3JpcHQ+Cjw/cGhwCgoKaW5jbHVkZSggJ19zZXJ2ZXJfdGVzdHMucGhwJyApOwoJCgkKCQo/PgoKCgo8dGFibGUgY2xhc3M9IndpZGVmYXQgc3RyaXBlZCI+Cgk8dGhlYWQ+CgkJPHRyIGNsYXNzPSJ0aGVhZCI+CgkJCTx0aCBzdHlsZT0id2lkdGg6IDE1cHg7Ij4mbmJzcDs8L3RoPgoJCQk8P3BocAoJCQkJZWNobyAnPHRoPicsIF9fKCdTZXJ2ZXIgQ29uZmlndXJhdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdTdWdnZXN0aW9uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1ZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJIC8vJzx0aD4nLCBfXygnUmVzdWx0JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGggc3R5bGU9IndpZHRoOiA2MHB4OyI+JywgX18oJ1N0YXR1cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nOwoJCQk/PgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRmb290PgoJCTx0ciBjbGFzcz0idGhlYWQiPgoJCQk8dGggc3R5bGU9IndpZHRoOiAxNXB4OyI+Jm5ic3A7PC90aD4KCQkJPD9waHAKCQkJCWVjaG8gJzx0aD4nLCBfXygnU2VydmVyIENvbmZpZ3VyYXRpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnU3VnZ2VzdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAvLyc8dGg+JywgX18oJ1Jlc3VsdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoIHN0eWxlPSJ3aWR0aDogMTVweDsiPicsIF9fKCdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JzsKCQkJPz4KCQk8L3RyPgoJPC90Zm9vdD4KCTx0Ym9keT4KCQk8P3BocAoJCWZvcmVhY2goICR0ZXN0cyBhcyAkcGFyZW50X2NsYXNzX3Rlc3QgKSB7CgkJCWVjaG8gJzx0ciBjbGFzcz0iZW50cnktcm93Ij4nOwoJCQllY2hvICcJPHRkPicgLiBwYl9iYWNrdXBidWRkeTo6dGlwKCAkcGFyZW50X2NsYXNzX3Rlc3RbJ3RpcCddLCAnJywgZmFsc2UgKSAuICc8L3RkPic7CgkJCWVjaG8gJwk8dGQ+JyAuICRwYXJlbnRfY2xhc3NfdGVzdFsndGl0bGUnXSAuICc8L3RkPic7CgkJCWVjaG8gJwk8dGQ+JyAuICRwYXJlbnRfY2xhc3NfdGVzdFsnc3VnZ2VzdGlvbiddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHBhcmVudF9jbGFzc190ZXN0Wyd2YWx1ZSddIC4gJzwvdGQ+JzsKCQkJLy9lY2hvICcJPHRkPicgLiAkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nOwoJCQlpZiAoICRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPT0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKSB7CgkJCQllY2hvICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtc3VjY2VzcyI+UGFzczwvc3Bhbj4nOwoJCQkJLy9lY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMjJFRTVCOyBib3JkZXI6IDFweCBzb2xpZCAjRTJFMkUyOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9kaXY+JzsKCQkJfSBlbHNlaWYgKCAkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID09IF9fKCdGQUlMJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKSB7CgkJCQllY2hvICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtaW1wb3J0YW50Ij5GYWlsPC9zcGFuPic7CgkJCQkvL2VjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNDRjMzMzM7IGJvcmRlcjogMXB4IHNvbGlkICNFMkUyRTI7Ij4mbmJzcDsmbmJzcDsmbmJzcDs8L2Rpdj4nOwoJCQl9IGVsc2VpZiAoICRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPT0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApIHsKCQkJCWVjaG8gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIj5XYXJuaW5nPC9zcGFuPic7CgkJCQkvL2VjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRUZGN0Y7IGJvcmRlcjogMXB4IHNvbGlkICNFMkUyRTI7Ij4mbmJzcDsmbmJzcDsmbmJzcDs8L2Rpdj4nOwoJCQl9CgkJCWVjaG8gJwk8L3RkPic7CgkJCWVjaG8gJzwvdHI+JzsKCQl9CgkJPz4KCTwvdGJvZHk+CjwvdGFibGU+Cjw/cGhwCmVjaG8gJzxicj4nOwplY2hvICc8Y2VudGVyPic7CgppZiAoICFkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgllY2hvICc8YSBocmVmPSIjVEJfaW5saW5lP3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAmIzAzODtpbmxpbmVJZD1wYl9zZXJ2ZXJpbmZvdGV4dF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGJ1dHRvbi10ZXJ0aWFyeSB0aGlja2JveCIgdGl0bGU9IlNlcnZlciBJbmZvcm1hdGlvbiBSZXN1bHRzIj5EaXNwbGF5IFNlcnZlciBDb25maWd1cmF0aW9uIGluIFRleHQgRm9ybWF0PC9hPiAmbmJzcDsmbmJzcDsmbmJzcDsgJzsKCWVjaG8gJzxhIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdwaW5mbycgKSAuICcmIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCBidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiIgdGl0bGU9IicgLiBfXygnRGlzcGxheSBFeHRlbmRlZCBQSFAgU2V0dGluZ3MgdmlhIHBocGluZm8oKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+JyAuIF9fKCdEaXNwbGF5IEV4dGVuZGVkIFBIUCBTZXR0aW5ncyB2aWEgcGhwaW5mbygpJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPic7Cn0gZWxzZSB7CgllY2hvICc8YSBpZD0ic2VydmVyaW5mb3RleHQiIGNsYXNzPSJidXR0b24gYnV0dG9uLXNlY29uZGFyeSBidXR0b24tdGVydGlhcnkgYnV0dG9uLXByaW1hcnkgdGhpY2tib3ggdG9nZ2xlIiB0aXRsZT0iU2VydmVyIEluZm9ybWF0aW9uIFJlc3VsdHMiPkRpc3BsYXkgUmVzdWx0cyBpbiBUZXh0IEZvcm1hdDwvYT4gJm5ic3A7Jm5ic3A7Jm5ic3A7ICc7Cn0KZWNobyAnPC9jZW50ZXI+JzsKPz48YnI+CgoKCjxkaXYKPD9waHAKaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJZWNobyAnaWQ9InBiX3NlcnZlcmluZm90ZXh0X21vZGFsIic7Cn0gZWxzZSB7CgllY2hvICdpZD0idG9nZ2xlLXNlcnZlcmluZm90ZXh0Iic7Cn0KPz4gc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQk8P3BocAoJCWlmICggIWRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQkJZWNobyAnPGgzPicgLiBfXyggJ1NlcnZlciBJbmZvcm1hdGlvbiBSZXN1bHRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9oMz4nOwoJCQllY2hvICc8dGV4dGFyZWEgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDMwMHB4OyIgd3JhcD0ib2ZmIj4nOwoJCX0gZWxzZSB7CgkJCWVjaG8gJzx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6IDk1JTsgaGVpZ2h0OiAzMDBweDsiIHdyYXA9Im9mZiI+JzsKCQl9CgkJZm9yZWFjaCggJHRlc3RzIGFzICR0ZXN0ICkgewoJCQllY2hvICdbJyAuICR0ZXN0WydzdGF0dXMnXSAuICddICAgICAnIC4gJHRlc3RbJ3RpdGxlJ10gLiAnICAgPSAgICcgLiBzdHJpcF90YWdzKCAkdGVzdFsndmFsdWUnXSApIC4gIlxuIjsgCgkJfQoJCT8+PC90ZXh0YXJlYT4KPC9kaXY+Cg== ###PACKDATA,FILE_END,/controllers/pages/server_info/server.php,importbuddy/controllers/pages/server_info/server.php ###PACKDATA,FILE_START,/controllers/pages/server_info/site_size.php,importbuddy/controllers/pages/server_info/site_size.php PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnaWNpY2xlLmpzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdpY2ljbGVfc2V0dXAuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnaml0X2Jhc2UuY3NzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ2ppdF9pY2ljbGUuY3NzJyApOwo/Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCWpRdWVyeSgnI3BiX2ljaWNsZWxhdW5jaCcpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKCQkJalF1ZXJ5KCcjcGJfaW5mb3Zpc19jb250YWluZXInKS5zbGlkZVRvZ2dsZSgpOwoJCQlqUXVlcnkucG9zdCggJzw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnaWNpY2xlJyApOyA/PicsIAoJCQkJZnVuY3Rpb24oIGRhdGEgKSB7CgkJCQkJalF1ZXJ5KCcjaW5mb3ZpcycpLmh0bWwoJycpOwoJCQkJCWljaWNsZV9pbml0KCBkYXRhICk7CgkJCQl9CgkJCSk7CgkJfSk7CgkJCgkJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2J1dHRvbicgKS5jbGljayggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19pbnRybyA+IC5wYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApLnNob3coKTsKCQkJalF1ZXJ5LnBvc3QoICc8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3NpdGVfc2l6ZV9saXN0aW5nJyApOyA/PiZwcm9maWxlPScgKyBqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfZmlsZWxpc3Rpbmdwcm9maWxlJyApLnZhbCgpLCAKCQkJCWZ1bmN0aW9uKCBkYXRhICkgewoJCQkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19jb250ZW50JyApLmh0bWwoIGRhdGEgKTsKCQkJCQlqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2l0ZV9zaXplX2xpc3RpbmdfaW50cm8gPiAucGJfYmFja3VwYnVkZHlfbG9hZGluZycgKS5oaWRlKCk7CgkJCQkJLy9qUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2l0ZV9zaXplX2xpc3RpbmdfaW50cm8nICkuc2xpZGVVcCgpOwoJCQkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19jb250ZW50JyApLnNsaWRlRG93bigpOwoJCQkJfQoJCQkpOwoJCQlqUXVlcnkoICdwYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApLmhpZGUoKTsKCQl9ICk7CgkJCgl9KTsKPC9zY3JpcHQ+CgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCSNwYl9iYWNrdXBidWRkeV9zZXJ2ZXJpbmZvX2V4Y2x1c2lvbnM6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKCQktd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CgkJd2lkdGg6IDExcHg7CgkJaGVpZ2h0OiAxMXB4OwoJfQoJCgkKCSNwYl9iYWNrdXBidWRkeV9zZXJ2ZXJpbmZvX2V4Y2x1c2lvbnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKCQlib3JkZXItcmFkaXVzOiA4cHg7CgkJYm9yZGVyOiAycHggc29saWQgd2hpdGU7IC8qIHNob3VsZCBtYXRjaCBiYWNrZ3JvdW5kLCBjYW4ndCBiZSB0cmFuc3BhcmVudCAqLwoJCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjUpOwoJfeKAiwo8L3N0eWxlPgoKCgo8YnI+Cjw/cGhwCmVjaG8gJzxoMyBjbGFzcz0icGJfaHRpdGxlIj4nIC4gX18oJ0RpcmVjdG9yeSBTaXplIExpc3RpbmcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2gzPic7CmVjaG8gJzxhIG5hbWU9InBiX2JhY2t1cGJ1ZGR5X2Rpcl9zaXplX2xpc3RpbmciPiZuYnNwOzwvYT4nOwoKZWNobyAnPGRpdiBpZD0icGJfYmFja3VwYnVkZHlfc2l0ZV9zaXplX2xpc3RpbmdfaW50cm8iPic7CmVjaG8gX18oJ0Rpc3BsYXkgYSBjb21wcmVoZW5zaXZlIGxpc3Rpbmcgb2YgZGlyZWN0b3JpZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNpemUgb2YgYWxsIGNvbnRlbnRzIHdpdGhpbiwgaW5jbHVkaW5nIHN1YmRpcmVjdG9yaWVzLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGZpbmRpbmcgd2hlcmUgc3BhY2UgaXMgYmVpbmcgdXNlZC4gTm90ZSB0aGF0IHRoaXMgaXMgYSBDUFUgaW50ZW5zaXZlIHByb2Nlc3MgYW5kIG1heSB0YWtlIGEgd2hpbGUgdG8gbG9hZCBhbmQgZXZlbiB0aW1lIG91dCBvbiBzb21lIHNlcnZlcnMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CmVjaG8gJzxiciAvPjxiciAvPic7CgoKZWNobyAnPGI+QmFja3VwIHByb2ZpbGUgZm9yIGNhbGN1bGF0aW5nIGV4Y2x1c2lvbnM6PC9iPiAnOwplY2hvICc8c2VsZWN0IGlkPSJwYl9iYWNrdXBidWRkeV9maWxlbGlzdGluZ3Byb2ZpbGUiPic7CmZvcmVhY2goIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXSBhcyAkdGhpc19wcm9maWxlX2lkID0+ICRwcm9maWxlICkgewoJaWYgKCAnZGInID09ICRwcm9maWxlWyd0eXBlJ10gKSB7CgkJY29udGludWU7Cgl9Cgk/PgoJPG9wdGlvbiB2YWx1ZT0iPD9waHAgZWNobyAkdGhpc19wcm9maWxlX2lkOyA/PiIgPD9waHAgaWYgKCAkcHJvZmlsZV9pZCA9PSAkdGhpc19wcm9maWxlX2lkICkgeyBlY2hvICdzZWxlY3RlZCc7IH0gPz4+PD9waHAgZWNobyBodG1sZW50aXRpZXMoICRwcm9maWxlWyd0aXRsZSddICk7ID8+ICg8P3BocCBlY2hvICRwcm9maWxlWyd0eXBlJ107ID8+KTwvYT4KCTw/cGhwCn0KZWNobyAnPC9zZWxlY3Q+PGJyPic7CgoKZWNobyAnPGJyPjxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19idXR0b24gYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IiBzdHlsZT0ibWFyZ2luLXRvcDogM3B4OyI+JywgX18oJ0Rpc3BsYXkgRGlyZWN0b3J5IFNpemUgTGlzdGluZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCc8L2E+ICc7CmVjaG8gJzxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+JzsKZWNobyAnPC9kaXY+PGJyPic7CmVjaG8gJzxkaXYgaWQ9InBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2NvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+PC9kaXY+JzsKZWNobyAnPGJyPjxicj4nOwo/PgoKCgo8P3BocCBlY2hvICc8aDMgY2xhc3M9InBiX2h0aXRsZSI+JyAuIF9fKCAnSW50ZXJhY3RpdmUgR3JhcGhpY2FsIERpcmVjdG9yeSBTaXplIE1hcCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvaDM+Jzs/Pgo8YnI+Cjw/cGhwIF9lKCdEaXNwbGF5cyBhbiBpbnRlcmFjdGl2ZSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgZGlyZWN0b3JpZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNpemUgb2YgYWxsIGNvbnRlbnRzIHdpdGhpbiwgaW5jbHVkaW5nIHN1YmRpcmVjdG9yaWVzLgpUaGlzIGlzIHVzZWZ1bCBmb3IgZmluZGluZyB3aGVyZSBzcGFjZSBpcyBiZWluZyB1c2VkLiBEaXJlY3RvcnkgYm94ZXMgYXJlIHNjYWxlZCBiYXNlZCBvbiBzaXplLiBDbGljayBvbiBhIGRpcmVjdG9yeSBib3ggdG8gbW92ZSBhcm91bmQuIE5vdGUgdGhhdCB0aGlzCmlzIGEgQ1BVIGludGVuc2l2ZSBwcm9jZXNzIGFuZCBtYXkgdGFrZSBhIHdoaWxlIHRvIGxvYWQgYW5kIGV2ZW4gdGltZSBvdXQgb24gc29tZSBzZXJ2ZXJzLiBTbG93ZXIgY29tcHV0ZXJzIG1heSBoYXZlIHRyb3VibGUgbmF2aWdhdGluZyB0aGUgaW50ZXJhY3RpdmUgbWFwLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwo/Pgo8YnI+CjxwPjxhIGlkPSJwYl9pY2ljbGVsYXVuY2giIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkiIHN0eWxlPSJtYXJnaW4tdG9wOiAzcHg7Ij48P3BocCBfZSgnRGlzcGxheSBJbnRlcmFjdGl2ZSBHcmFwaGljYWwgRGlyZWN0b3J5IFNpemUgTWFwJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Pz48L2E+PC9wPgoKCjxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCk7ID8+L2Nzcy9qaXRfYmFzZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vY3NzL2ppdF9pY2ljbGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+CgoKPGRpdiBzdHlsZT0iZGlzcGxheTogbm9uZTsiIGlkPSJwYl9pbmZvdmlzX2NvbnRhaW5lciI+Cgk8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjMUExQTFBOyI+CgkJPGRpdiBpZD0iaW5mb3ZpcyI+CgkJCTxiciAvPjxiciAvPgoJCQk8ZGl2IHN0eWxlPSJtYXJnaW46IDMwcHg7Ij4KCQkJCTxoNCBzdHlsZT0iY29sb3I6ICNGRkZGRkY7Ij48aW1nIHNyYz0iPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpOyA/Pi9pbWFnZXMvbG9hZGluZ19sYXJnZV9kYXJrYmcuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC05cHg7IiAvPiA8P3BocCBfZSgnTG9hZGluZyAuLi4gUGxlYXNlIHdhaXQgLi4uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Pz48L2g0PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCTwvZGl2PgoJCgk8bGFiZWwgZm9yPSJzLW9yaWVudGF0aW9uIj48P3BocCBfZSgnT3JpZW50YXRpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTs/PjogPC9sYWJlbD4KCTxzZWxlY3QgbmFtZT0icy1vcmllbnRhdGlvbiIgaWQ9InMtb3JpZW50YXRpb24iPgoJCTxvcHRpb24gdmFsdWU9ImgiIHNlbGVjdGVkPjw/cGhwIF9lKCdob3Jpem9udGFsJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Pz48L29wdGlvbj4KCQk8b3B0aW9uIHZhbHVlPSJ2Ij48P3BocCBfZSgndmVydGljYWwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTs/Pjwvb3B0aW9uPgoJPC9zZWxlY3Q+CgkKCTxsYWJlbCBmb3I9ImktbGV2ZWxzLXRvLXNob3ciPjw/cGhwIF9lKCdNYXggbGV2ZWxzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Pz46IDwvbGFiZWw+Cgk8c2VsZWN0ICBpZD0iaS1sZXZlbHMtdG8tc2hvdyIgbmFtZT0iaS1sZXZlbHMtdG8tc2hvdyIgc3R5bGU9IndpZHRoOiA1MHB4Ij4KCQk8b3B0aW9uPmFsbDwvb3B0aW9uPgoJCTxvcHRpb24+MTwvb3B0aW9uPgoJCTxvcHRpb24+Mjwvb3B0aW9uPgoJCTxvcHRpb24gc2VsZWN0ZWQ9InNlbGVjdGVkIj4zPC9vcHRpb24+CgkJPG9wdGlvbj40PC9vcHRpb24+CgkJPG9wdGlvbj41PC9vcHRpb24+Cgk8L3NlbGVjdD4KCgk8YSBpZD0idXBkYXRlIiBjbGFzcz0idGhlbWUgYnV0dG9uIHdoaXRlIj48P3BocCBfZSgnR28gVXAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTs/PjwvYT4KPC9kaXY+Cjxicj48YnI+CgoKPD9waHAKJGRpcl9hcnJheSA9IGFycmF5KCk7CiRpY2ljbGVfYXJyYXkgPSBhcnJheSgpOwokdGltZV9zdGFydCA9IG1pY3JvdGltZSh0cnVlKTsKCi8vZWNobyAnPHByZT4nIC4gJHRoaXMtPmJ1aWxkX2ljaWNsZSggQUJTUEFUSCwgQUJTUEFUSCwgJycgKSAuICc8L3ByZT4nOwoKCgoKCgoKCgoKCgo/Pgo= ###PACKDATA,FILE_END,/controllers/pages/server_info/site_size.php,importbuddy/controllers/pages/server_info/site_size.php ###PACKDATA,FILE_START,/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php PD9waHAKaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgeyAvLyBOT1QgSU4gSU1QT1JUQlVERFk6CgoJd3BfZW5xdWV1ZV9zY3JpcHQoICd0aGlja2JveCcgKTsKCXdwX3ByaW50X3NjcmlwdHMoICd0aGlja2JveCcgKTsKCXdwX3ByaW50X3N0eWxlcyggJ3RoaWNrYm94JyApOwoJPz4KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYS5zaG93LXNldHRpbmdzIHsKCQlmbG9hdDogcmlnaHQ7CgkJbWFyZ2luOiAwIDAgMCA2cHg7Cgl9Cgkjc2NyZWVuLW1ldGEtbGlua3MgI2JhY2t1cGJ1ZGR5LW1ldGEtbGluay13cmFwIGEgewoJCWJhY2tncm91bmQ6IG5vbmU7Cgl9Cgkjc2NyZWVuLW1ldGEtbGlua3MgI2JhY2t1cGJ1ZGR5LW1ldGEtbGluay13cmFwIGE6YWZ0ZXIgewoJCWNvbnRlbnQ6ICcnOwoJCW1hcmdpbi1yaWdodDogNXB4OwoJfQoJPC9zdHlsZT4KCgk8P3BocAoKCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2FkbWluLmpzJyApOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+dGl0bGUoIF9fKCAnU2VydmVyIFRvb2xzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCWJhY2t1cGJ1ZGR5X2NvcmU6OnZlcnNpb25zX2NvbmZpcm0oKTsKCQoJJGRlZmF1bHRfdGFiID0gMDsKCWlmICggaXNfbnVtZXJpYyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd0YWInICkgKSApIHsKCQkkZGVmYXVsdF90YWIgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3RhYicgKTsKCX0KCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFicygKCQknZ2V0dGluZ19zdGFydGVkJywKCQlhcnJheSgKCQkJYXJyYXkoCgkJCQkndGl0bGUnCQk9PgkJX18oICdTZXJ2ZXInLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSdzbHVnJwkJPT4JCSdzZXJ2ZXInLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ0RhdGFiYXNlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZGF0YWJhc2UnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1NpdGUgU2l6ZSBNYXBzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZmlsZXMnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1dvcmRQcmVzcyBTY2hlZHVsZXMgKENyb24pJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknY3JvbicsCgkJCSksCgkJKSwKCQknd2lkdGg6IDEwMCU7JywKCQl0cnVlLAoJCSRkZWZhdWx0X3RhYgoJKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ3NlcnZlcicgKTsKCQkKCQlyZXF1aXJlX29uY2UoICdzZXJ2ZXJfaW5mby9zZXJ2ZXIucGhwJyApOwoJCQoJCQoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3Blcm1pc3Npb25zLnBocCcgKTsKCQkKCQkKCQkkd3BfdXBsb2FkX2RpciA9IHdwX3VwbG9hZF9kaXIoKTsKCQkkd3Bfc2V0dGluZ3MgPSBhcnJheSgpOwoJCQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydwYXRoJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBGaWxlIFBhdGgnLCAkd3BfdXBsb2FkX2RpclsncGF0aCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsndXJsJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBVUkwnLCAkd3BfdXBsb2FkX2RpclsndXJsJ10sICd3cF91cGxvYWRfZGlyKCknICk7CgkJfQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSApICkgewoJCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnVXBsb2FkIFN1YmRpcmVjdG9yeScsICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSwgJ3dwX3VwbG9hZF9kaXIoKScpOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBVUkwnLCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBEaXJlY3RvcnknLCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnU2l0ZSBVUkwnLCBzaXRlX3VybCgpLCAnc2l0ZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnSG9tZSBVUkwnLCBob21lX3VybCgpLCAnaG9tZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnV29yZFByZXNzIFJvb3QgUGF0aCcsIEFCU1BBVEgsICdBQlNQQVRIJyApOwoJCQoJCS8vIE11bHRpc2l0ZSBleHRyYXM6CgkJJHdwX3NldHRpbmdzX211bHRpc2l0ZSA9IGFycmF5KCk7CgkJaWYgKCBpc19tdWx0aXNpdGUoKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ05ldHdvcmsgU2l0ZSBVUkwnLCBuZXR3b3JrX3NpdGVfdXJsKCksICduZXR3b3JrX3NpdGVfdXJsKCknICk7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdOZXR3b3JrIEhvbWUgVVJMJywgbmV0d29ya19ob21lX3VybCgpLCAnbmV0d29ya19ob21lX3VybCgpJyApOwoJCX0KCQkKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnQmFja3VwQnVkZHkgbG9jYWwgc3RvcmFnZScsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpLCAnQmFja3VwQnVkZHkgU2V0dGluZ3MnICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IHRlbXBvcmFyeSBmaWxlcycsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSwgJ0FCU1BBVEggKyBIYXJkY29kZWQgbG9jYXRpb24nICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IGxvZ3MnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSwgJ1VwbG9hZCBCYXNlICsgQmFja3VwQnVkZHknICk7CgkJCgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1RoZW1lcyByb290JywgYmFja3VwYnVkZHlfY29yZTo6Z2V0X3RoZW1lc19yb290KCksICdiYWNrdXBidWRkeV9jb3JlOjpnZXRfdGhlbWVzX3Jvb3QoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnUGx1Z2lucyByb290JywgYmFja3VwYnVkZHlfY29yZTo6Z2V0X3BsdWdpbnNfcm9vdCgpLCAnYmFja3VwYnVkZHlfY29yZTo6Z2V0X3BsdWdpbnNfcm9vdCgpJyApOwoJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdNZWRpYSByb290JywgYmFja3VwYnVkZHlfY29yZTo6Z2V0X21lZGlhX3Jvb3QoKSwgJ2JhY2t1cGJ1ZGR5X2NvcmU6OmdldF9tZWRpYV9yb290KCknICk7CgkJCgkJLy8gRGlzcGxheSBXUCBzZXR0aW5ncy4uCgkJcGJfYmFja3VwYnVkZHk6OiR1aS0+bGlzdF90YWJsZSgKCQkJJHdwX3NldHRpbmdzLAoJCQlhcnJheSgKCQkJCSdhY3Rpb24nCQkJCQk9PglwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSwKCQkJCSdjb2x1bW5zJwkJCQkJPT4JYXJyYXkoCgkJCQkJCQkJCQkJCQlfXyggJ1VSTHMgJiBQYXRocycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdPYnRhaW5lZCB2aWEnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkJCQkJCQkJKSwKCQkJCSdjc3MnCQkJCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJCQkpCgkJKTsKCQkKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCS8vIFRoaXMgcGFnZSBjYW4gdGFrZSBhIGJpdCB0byBydW4uCgkvLyBSdW5zIEFGVEVSIHNlcnZlciBpbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgc28gd2UgY2FuIHZpZXcgdGhlIGRlZmF1bHQgbGltaXRzIGZvciB0aGUgc2VydmVyLgoJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZGF0YWJhc2UnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vZGF0YWJhc2UucGhwJyApOwoJCWVjaG8gJzxicj48YnI+PGEgbmFtZT0iZGF0YWJhc2VfcmVwbGFjZSI+PC9hPic7CgkJZWNobyAnPGRpdiBjbGFzcz0icGJfaHRpdGxlIj4nIC4gJ0FkdmFuY2VkOiAnIC4gX18oICdEYXRhYmFzZSBNYXNzIFRleHQgUmVwbGFjZW1lbnQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2Rpdj48YnI+JzsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnX3NlcnZlcl90b29scy1kYXRhYmFzZV9yZXBsYWNlJyApOwoJCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYigpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZmlsZXMnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vc2l0ZV9zaXplLnBocCcgKTsKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2Nyb24nICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vY3Jvbi5waHAnICk7CgkJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFiKCk7CgkKCQoJZWNobyAnPGJyIHN0eWxlPSJjbGVhcjogYm90aDsiPjxicj48YnI+JzsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWJzKCk7CgkKCQoJCgkvLyBIYW5kbGVzIHRoaWNrYm94IGF1dG8tcmVzaXppbmcuIEtlZXAgYXQgYm90dG9tIG9mIHBhZ2UgdG8gYXZvaWQgaXNzdWVzLgoJaWYgKCAhd3Bfc2NyaXB0X2lzKCAnbWVkaWEtdXBsb2FkJyApICkgewoJCXdwX2VucXVldWVfc2NyaXB0KCAnbWVkaWEtdXBsb2FkJyApOwoJCXdwX3ByaW50X3NjcmlwdHMoICdtZWRpYS11cGxvYWQnICk7Cgl9CgkKfSBlbHNlIHsgLy8gSU5TSURFIElNUE9SVEJVRERZOgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3NraXBfc2VydmVyaW5mbycgKSA9PSAnJyApIHsgLy8gR2l2ZSBhIHdvcmthcm91bmQgdG8gc2tpcCB0aGlzLgoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3NlcnZlci5waHAnICk7Cgl9IGVsc2UgewoJCWVjaG8gJ3tTa2lwcGluZyBTZXJ2ZXIgSW5mby4gc2VjdGlvbiBiYXNlZCBvbiBxdWVyeXN0cmluZy59JzsKCX0KfQo/Pg== ###PACKDATA,FILE_END,/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php ###PACKDATA,FILE_START,/destinations/stash2/class.itx_helper2.php,importbuddy/lib/stash2/class.itx_helper2.php PD9waHAKcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9jbGFzcy5pdGNyZWQucGhwJyApOwoKY2xhc3MgSVRYQVBJX0hlbHBlcjIgewoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcGhwYXNzX2hhc2hfcGFzc3dvcmQoICRwYXNzd29yZCApIHsKCQlpZiAoICEgY2xhc3NfZXhpc3RzKCAnUGFzc3dvcmRIYXNoJyApICkgewoJCQlyZXF1aXJlX29uY2UoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL2NsYXNzLXBocGFzcy5waHAnKTsKCQl9CgkJCgkJJGhhc2hlciA9IG5ldyBQYXNzd29yZEhhc2goOCwgdHJ1ZSk7CgkJJGhhc2ggPSAkaGFzaGVyLT5IYXNoUGFzc3dvcmQoJHBhc3N3b3JkKTsKCQkKCQlyZXR1cm4gJGhhc2g7CgkJCgl9CgkKCS8vIFdBUzogZ2V0X3dvcmRwcmVzc19waHBhc3MoKS4KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2FjY2Vzc190b2tlbigkdXNlciwgJHBhc3MsICRzaXRlLCAkd3ApIHsKCQlpZiAoICEgY2xhc3NfZXhpc3RzKCAnUGFzc3dvcmRIYXNoJyApICkgewoJCQlyZXF1aXJlX29uY2UoIGRpcm5hbWUoIF9fRklMRV9fICkgLiAnL2NsYXNzLXBocGFzcy5waHAnKTsKCQl9CgkJCgkJJHNvdXJjZV9zdHJpbmcgPSAkcGFzcyAuICR1c2VyIC4gc3RyX3JlcGxhY2UoICd3d3cuJywgJycsICRzaXRlICkgLiAkd3A7CgkJJHNhbHRlZF9zdHJpbmcyID0gc3Vic3RyKCAkc291cmNlX3N0cmluZywgMCwgbWF4KCBzdHJsZW4oICRwYXNzICksIDUxMiApICk7ICAgICAvLyAgbmV3IGF1dGggd2l0aCBoYXNoZWQgcGFzc3dvcmRzCgkJCgkJcmV0dXJuIHNlbGY6Ol9waHBhc3NfaGFzaF9wYXNzd29yZCggJHNhbHRlZF9zdHJpbmcyICk7Cgl9CgkKfSAvLyBFbmQgY2xhc3Mu ###PACKDATA,FILE_END,/destinations/stash2/class.itx_helper2.php,importbuddy/lib/stash2/class.itx_helper2.php ###PACKDATA,FILE_START,/destinations/stash2/class.itcred.php,importbuddy/lib/stash2/class.itcred.php PD9waHAKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIGNsYXNzIGlUaGVtZXNfQ3JlZGVudGlhbHMKICAgIHsKICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJGhhc2ggICAgICAgICAgICAgPSAnc2hhMjU2JzsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJHNhbHRfcGFkZGluZyAgICAgPSAnd2RIVndVJkhjWWNXbmxsbyVrVFVVbnhwU2N5NCVJQ00yOSc7CiAgICAgICAgCiAgICAgICAgcHJvdGVjdGVkICRpdGVyYXRpb25fY291bnQgID0gMTMxMDcyOwogICAgICAgIAogICAgICAgIHByb3RlY3RlZCAka2V5X2xlbmd0aCAgICAgICA9IDY0OwogICAgICAgICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJHBhc3N3b3JkOwogICAgICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAKICAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRvcHRpb25zID0gYXJyYXkoKSkKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+dXNlcm5hbWUgPSAkdXNlcm5hbWU7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+cGFzc3dvcmQgPSAkcGFzc3dvcmQ7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaWYoIWVtcHR5KCRvcHRpb25zWydoYXNoJ10pKQogICAgICAgICAgICAgICAgJHRoaXMtPmhhc2ggICAgICAgICAgICAgPSBzdHJ0b2xvd2VyKHRyaW0oJG9wdGlvbnNbJ2hhc2gnXSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoIWVtcHR5KCRvcHRpb25zWydpdGVyYXRpb25zJ10pKQogICAgICAgICAgICAgICAgJHRoaXMtPml0ZXJhdGlvbl9jb3VudCAgPSBpbnR2YWwoJG9wdGlvbnNbJ2l0ZXJhdGlvbnMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKCFlbXB0eSgkb3B0aW9uc1snc2FsdCddKSkKICAgICAgICAgICAgICAgICR0aGlzLT5zYWx0X3BhZGRpbmcgICAgID0gJG9wdGlvbnNbJ3NhbHQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKCFlbXB0eSgkb3B0aW9uc1sna2V5X2xlbmd0aCddKSkKICAgICAgICAgICAgICAgICR0aGlzLT5rZXlfbGVuZ3RoICAgICAgID0gaW50dmFsKCRvcHRpb25zWydrZXlfbGVuZ3RoJ10pOwogICAgICAgIAogICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCiAgICAgICAgCiAgICAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfcGFzc3dvcmRfaGFzaCgkdXNlcm5hbWUsICRwYXNzd29yZCwgJG9wdGlvbnMgPSBhcnJheSgpKQogICAgICAgIHsKICAgICAgICAgICAgJGhhc2hlciA9IG5ldyBpVGhlbWVzX0NyZWRlbnRpYWxzKCR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJGhhc2hlci0+Z2V0X3Bia2RmMigpOwogICAgICAgICAgICAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldF9zYWx0KCkKICAgICAgICB7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gc3RydG9sb3dlcih0cmltKCR0aGlzLT51c2VybmFtZSkpIC4gJHRoaXMtPnNhbHRfcGFkZGluZzsgICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgfSAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldF9wYmtkZjIoKQogICAgICAgIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cGJrZGYyKCR0aGlzLT5oYXNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBhc3N3b3JkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldF9zYWx0KCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aXRlcmF0aW9uX2NvdW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmtleV9sZW5ndGggLyAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCiAgICAgICAgCiAgICAgICAgLyoKICAgICAgICAgKiBQQktERjIga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gYXMgZGVmaW5lZCBieSBSU0EncyBQS0NTICM1OiBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjg5OC50eHQKICAgICAgICAgKiAkYWxnb3JpdGhtIC0gVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS4gUmVjb21tZW5kZWQ6IFNIQTI1NgogICAgICAgICAqICRwYXNzd29yZCAtIFRoZSBwYXNzd29yZC4KICAgICAgICAgKiAkc2FsdCAtIEEgc2FsdCB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgcGFzc3dvcmQuCiAgICAgICAgICogJGNvdW50IC0gSXRlcmF0aW9uIGNvdW50LiBIaWdoZXIgaXMgYmV0dGVyLCBidXQgc2xvd2VyLiBSZWNvbW1lbmRlZDogQXQgbGVhc3QgMTAwMC4KICAgICAgICAgKiAka2V5X2xlbmd0aCAtIFRoZSBsZW5ndGggb2YgdGhlIGRlcml2ZWQga2V5IGluIGJ5dGVzLgogICAgICAgICAqICRyYXdfb3V0cHV0IC0gSWYgdHJ1ZSwgdGhlIGtleSBpcyByZXR1cm5lZCBpbiByYXcgYmluYXJ5IGZvcm1hdC4gSGV4IGVuY29kZWQgb3RoZXJ3aXNlLgogICAgICAgICAqIFJldHVybnM6IEEgJGtleV9sZW5ndGgtYnl0ZSBrZXkgZGVyaXZlZCBmcm9tIHRoZSBwYXNzd29yZCBhbmQgc2FsdC4KICAgICAgICAgKgogICAgICAgICAqIFRlc3QgdmVjdG9ycyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzYwNzAudHh0CiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIFBCS0RGMiB3YXMgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IGh0dHBzOi8vZGVmdXNlLmNhCiAgICAgICAgICogV2l0aCBpbXByb3ZlbWVudHMgYnkgaHR0cDovL3d3dy52YXJpYXRpb25zLW9mLXNoYWRvdy5jb20KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgZnVuY3Rpb24gcGJrZGYyKCRhbGdvcml0aG0sICRwYXNzd29yZCwgJHNhbHQsICRjb3VudCwgJGtleV9sZW5ndGgsICRyYXdfb3V0cHV0ID0gZmFsc2UpCiAgICAgICAgewogICAgICAgICAgICAKICAgICAgICAgICAgJGFsZ29yaXRobSA9IHN0cnRvbG93ZXIoJGFsZ29yaXRobSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZighaW5fYXJyYXkoJGFsZ29yaXRobSwgaGFzaF9hbGdvcygpLCB0cnVlKSkKICAgICAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoJ1BCS0RGMiBFUlJPUjogSW52YWxpZCBoYXNoIGFsZ29yaXRobS4nLCBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoJGNvdW50IDw9IDAgfHwgJGtleV9sZW5ndGggPD0gMCkKICAgICAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoJ1BCS0RGMiBFUlJPUjogSW52YWxpZCBwYXJhbWV0ZXJzLicsIEVfVVNFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgICRoYXNoX2xlbmd0aCA9IHN0cmxlbihoYXNoKCRhbGdvcml0aG0sICcnLCB0cnVlKSk7CiAgICAgICAgICAgICRibG9ja19jb3VudCA9IGNlaWwoJGtleV9sZW5ndGggLyAkaGFzaF9sZW5ndGgpOwogICAgICAgIAogICAgICAgICAgICAkb3V0cHV0ID0gJyc7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IoJGkgPSAxOyAkaSA8PSAkYmxvY2tfY291bnQ7ICRpKyspIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vICRpIGVuY29kZWQgYXMgNCBieXRlcywgYmlnIGVuZGlhbi4KICAgICAgICAgICAgICAgICRsYXN0ID0gJHNhbHQgLiBwYWNrKCJOIiwgJGkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBmaXJzdCBpdGVyYXRpb24KICAgICAgICAgICAgICAgICRsYXN0ID0gJHhvcnN1bSA9IGhhc2hfaG1hYygkYWxnb3JpdGhtLCAkbGFzdCwgJHBhc3N3b3JkLCB0cnVlKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gcGVyZm9ybSB0aGUgb3RoZXIgJGNvdW50IC0gMSBpdGVyYXRpb25zCiAgICAgICAgICAgICAgICBmb3IgKCRqID0gMTsgJGogPCAkY291bnQ7ICRqKyspIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR4b3JzdW0gXj0gKCRsYXN0ID0gaGFzaF9obWFjKCRhbGdvcml0aG0sICRsYXN0LCAkcGFzc3dvcmQsIHRydWUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJG91dHB1dCAuPSAkeG9yc3VtOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgaWYoJHJhd19vdXRwdXQpCiAgICAgICAgICAgICAgICByZXR1cm4gc3Vic3RyKCRvdXRwdXQsIDAsICRrZXlfbGVuZ3RoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGJpbjJoZXgoc3Vic3RyKCRvdXRwdXQsIDAsICRrZXlfbGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICB9CgogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIH0KICAgIAogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCg== ###PACKDATA,FILE_END,/destinations/stash2/class.itcred.php,importbuddy/lib/stash2/class.itcred.php ###PACKDATA,FILE_START,/destinations/stash2/class-phpass.php,importbuddy/lib/stash2/class-phpass.php PD9waHAKLyoqCiAqIFBvcnRhYmxlIFBIUCBwYXNzd29yZCBoYXNoaW5nIGZyYW1ld29yay4KICogQHBhY2thZ2UgcGhwYXNzCiAqIEBzaW5jZSAyLjUuMAogKiBAdmVyc2lvbiAwLjMgLyBXb3JkUHJlc3MKICogQGxpbmsgaHR0cDovL3d3dy5vcGVud2FsbC5jb20vcGhwYXNzLwogKi8KCiMKIyBXcml0dGVuIGJ5IFNvbGFyIERlc2lnbmVyIDxzb2xhciBhdCBvcGVud2FsbC5jb20+IGluIDIwMDQtMjAwNiBhbmQgcGxhY2VkIGluCiMgdGhlIHB1YmxpYyBkb21haW4uICBSZXZpc2VkIGluIHN1YnNlcXVlbnQgeWVhcnMsIHN0aWxsIHB1YmxpYyBkb21haW4uCiMKIyBUaGVyZSdzIGFic29sdXRlbHkgbm8gd2FycmFudHkuCiMKIyBQbGVhc2UgYmUgc3VyZSB0byB1cGRhdGUgdGhlIFZlcnNpb24gbGluZSBpZiB5b3UgZWRpdCB0aGlzIGZpbGUgaW4gYW55IHdheS4KIyBJdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3UgbGVhdmUgdGhlIG1haW4gdmVyc2lvbiBudW1iZXIgaW50YWN0LCBidXQgaW5kaWNhdGUKIyB5b3VyIHByb2plY3QgbmFtZSAoYWZ0ZXIgdGhlIHNsYXNoKSBhbmQgYWRkIHlvdXIgb3duIHJldmlzaW9uIGluZm9ybWF0aW9uLgojCiMgUGxlYXNlIGRvIG5vdCBjaGFuZ2UgdGhlICJwcml2YXRlIiBwYXNzd29yZCBoYXNoaW5nIG1ldGhvZCBpbXBsZW1lbnRlZCBpbgojIGhlcmUsIHRoZXJlYnkgbWFraW5nIHlvdXIgaGFzaGVzIGluY29tcGF0aWJsZS4gIEhvd2V2ZXIsIGlmIHlvdSBtdXN0LCBwbGVhc2UKIyBjaGFuZ2UgdGhlIGhhc2ggdHlwZSBpZGVudGlmaWVyICh0aGUgIiRQJCIpIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQuCiMKIyBPYnZpb3VzbHksIHNpbmNlIHRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgdGhlIGFib3ZlIGFyZSBub3QKIyByZXF1aXJlbWVudHMgKHRoZXJlIGNhbiBiZSBub25lKSwgYnV0IG1lcmVseSBzdWdnZXN0aW9ucy4KIwoKLyoqCiAqIFBvcnRhYmxlIFBIUCBwYXNzd29yZCBoYXNoaW5nIGZyYW1ld29yay4KICoKICogQHBhY2thZ2UgcGhwYXNzCiAqIEB2ZXJzaW9uIDAuMyAvIFdvcmRQcmVzcwogKiBAbGluayBodHRwOi8vd3d3Lm9wZW53YWxsLmNvbS9waHBhc3MvCiAqIEBzaW5jZSAyLjUuMAogKi8KY2xhc3MgUGFzc3dvcmRIYXNoIHsKCXZhciAkaXRvYTY0OwoJdmFyICRpdGVyYXRpb25fY291bnRfbG9nMjsKCXZhciAkcG9ydGFibGVfaGFzaGVzOwoJdmFyICRyYW5kb21fc3RhdGU7CgoJLyoqCgkgKiBQSFA1IGNvbnN0cnVjdG9yLgoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGl0ZXJhdGlvbl9jb3VudF9sb2cyLCAkcG9ydGFibGVfaGFzaGVzICkKCXsKCQkkdGhpcy0+aXRvYTY0ID0gJy4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwoKCQlpZiAoJGl0ZXJhdGlvbl9jb3VudF9sb2cyIDwgNCB8fCAkaXRlcmF0aW9uX2NvdW50X2xvZzIgPiAzMSkKCQkJJGl0ZXJhdGlvbl9jb3VudF9sb2cyID0gODsKCQkkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgPSAkaXRlcmF0aW9uX2NvdW50X2xvZzI7CgoJCSR0aGlzLT5wb3J0YWJsZV9oYXNoZXMgPSAkcG9ydGFibGVfaGFzaGVzOwoKCQkkdGhpcy0+cmFuZG9tX3N0YXRlID0gbWljcm90aW1lKCkgLiB1bmlxaWQocmFuZCgpLCBUUlVFKTsgLy8gcmVtb3ZlZCBnZXRteXBpZCgpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMKCX0KCgkvKioKCSAqIFBIUDQgY29uc3RydWN0b3IuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBQYXNzd29yZEhhc2goICRpdGVyYXRpb25fY291bnRfbG9nMiwgJHBvcnRhYmxlX2hhc2hlcyApIHsKCQlzZWxmOjpfX2NvbnN0cnVjdCggJGl0ZXJhdGlvbl9jb3VudF9sb2cyLCAkcG9ydGFibGVfaGFzaGVzICk7Cgl9CgoJZnVuY3Rpb24gZ2V0X3JhbmRvbV9ieXRlcygkY291bnQpCgl7CgkJJG91dHB1dCA9ICcnOwoJCWlmICggQGlzX3JlYWRhYmxlKCcvZGV2L3VyYW5kb20nKSAmJgoJCSAgICAoJGZoID0gQGZvcGVuKCcvZGV2L3VyYW5kb20nLCAncmInKSkpIHsKCQkJJG91dHB1dCA9IGZyZWFkKCRmaCwgJGNvdW50KTsKCQkJZmNsb3NlKCRmaCk7CgkJfQoKCQlpZiAoc3RybGVuKCRvdXRwdXQpIDwgJGNvdW50KSB7CgkJCSRvdXRwdXQgPSAnJzsKCQkJZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50OyAkaSArPSAxNikgewoJCQkJJHRoaXMtPnJhbmRvbV9zdGF0ZSA9CgkJCQkgICAgbWQ1KG1pY3JvdGltZSgpIC4gJHRoaXMtPnJhbmRvbV9zdGF0ZSk7CgkJCQkkb3V0cHV0IC49CgkJCQkgICAgcGFjaygnSConLCBtZDUoJHRoaXMtPnJhbmRvbV9zdGF0ZSkpOwoJCQl9CgkJCSRvdXRwdXQgPSBzdWJzdHIoJG91dHB1dCwgMCwgJGNvdW50KTsKCQl9CgoJCXJldHVybiAkb3V0cHV0OwoJfQoKCWZ1bmN0aW9uIGVuY29kZTY0KCRpbnB1dCwgJGNvdW50KQoJewoJCSRvdXRwdXQgPSAnJzsKCQkkaSA9IDA7CgkJZG8gewoJCQkkdmFsdWUgPSBvcmQoJGlucHV0WyRpKytdKTsKCQkJJG91dHB1dCAuPSAkdGhpcy0+aXRvYTY0WyR2YWx1ZSAmIDB4M2ZdOwoJCQlpZiAoJGkgPCAkY291bnQpCgkJCQkkdmFsdWUgfD0gb3JkKCRpbnB1dFskaV0pIDw8IDg7CgkJCSRvdXRwdXQgLj0gJHRoaXMtPml0b2E2NFsoJHZhbHVlID4+IDYpICYgMHgzZl07CgkJCWlmICgkaSsrID49ICRjb3VudCkKCQkJCWJyZWFrOwoJCQlpZiAoJGkgPCAkY291bnQpCgkJCQkkdmFsdWUgfD0gb3JkKCRpbnB1dFskaV0pIDw8IDE2OwoJCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbKCR2YWx1ZSA+PiAxMikgJiAweDNmXTsKCQkJaWYgKCRpKysgPj0gJGNvdW50KQoJCQkJYnJlYWs7CgkJCSRvdXRwdXQgLj0gJHRoaXMtPml0b2E2NFsoJHZhbHVlID4+IDE4KSAmIDB4M2ZdOwoJCX0gd2hpbGUgKCRpIDwgJGNvdW50KTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJZnVuY3Rpb24gZ2Vuc2FsdF9wcml2YXRlKCRpbnB1dCkKCXsKCQkkb3V0cHV0ID0gJyRQJCc7CgkJJG91dHB1dCAuPSAkdGhpcy0+aXRvYTY0W21pbigkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgKwoJCQkoKFBIUF9WRVJTSU9OID49ICc1JykgPyA1IDogMyksIDMwKV07CgkJJG91dHB1dCAuPSAkdGhpcy0+ZW5jb2RlNjQoJGlucHV0LCA2KTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJZnVuY3Rpb24gY3J5cHRfcHJpdmF0ZSgkcGFzc3dvcmQsICRzZXR0aW5nKQoJewoJCSRvdXRwdXQgPSAnKjAnOwoJCWlmIChzdWJzdHIoJHNldHRpbmcsIDAsIDIpID09ICRvdXRwdXQpCgkJCSRvdXRwdXQgPSAnKjEnOwoKCQkkaWQgPSBzdWJzdHIoJHNldHRpbmcsIDAsIDMpOwoJCSMgV2UgdXNlICIkUCQiLCBwaHBCQjMgdXNlcyAiJEgkIiBmb3IgdGhlIHNhbWUgdGhpbmcKCQlpZiAoJGlkICE9ICckUCQnICYmICRpZCAhPSAnJEgkJykKCQkJcmV0dXJuICRvdXRwdXQ7CgoJCSRjb3VudF9sb2cyID0gc3RycG9zKCR0aGlzLT5pdG9hNjQsICRzZXR0aW5nWzNdKTsKCQlpZiAoJGNvdW50X2xvZzIgPCA3IHx8ICRjb3VudF9sb2cyID4gMzApCgkJCXJldHVybiAkb3V0cHV0OwoKCQkkY291bnQgPSAxIDw8ICRjb3VudF9sb2cyOwoKCQkkc2FsdCA9IHN1YnN0cigkc2V0dGluZywgNCwgOCk7CgkJaWYgKHN0cmxlbigkc2FsdCkgIT0gOCkKCQkJcmV0dXJuICRvdXRwdXQ7CgoJCSMgV2UncmUga2luZCBvZiBmb3JjZWQgdG8gdXNlIE1ENSBoZXJlIHNpbmNlIGl0J3MgdGhlIG9ubHkKCQkjIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlIGF2YWlsYWJsZSBpbiBhbGwgdmVyc2lvbnMgb2YgUEhQCgkJIyBjdXJyZW50bHkgaW4gdXNlLiAgVG8gaW1wbGVtZW50IG91ciBvd24gbG93LWxldmVsIGNyeXB0bwoJCSMgaW4gUEhQIHdvdWxkIHJlc3VsdCBpbiBtdWNoIHdvcnNlIHBlcmZvcm1hbmNlIGFuZAoJCSMgY29uc2VxdWVudGx5IGluIGxvd2VyIGl0ZXJhdGlvbiBjb3VudHMgYW5kIGhhc2hlcyB0aGF0IGFyZQoJCSMgcXVpY2tlciB0byBjcmFjayAoYnkgbm9uLVBIUCBjb2RlKS4KCQlpZiAoUEhQX1ZFUlNJT04gPj0gJzUnKSB7CgkJCSRoYXNoID0gbWQ1KCRzYWx0IC4gJHBhc3N3b3JkLCBUUlVFKTsKCQkJZG8gewoJCQkJJGhhc2ggPSBtZDUoJGhhc2ggLiAkcGFzc3dvcmQsIFRSVUUpOwoJCQl9IHdoaWxlICgtLSRjb3VudCk7CgkJfSBlbHNlIHsKCQkJJGhhc2ggPSBwYWNrKCdIKicsIG1kNSgkc2FsdCAuICRwYXNzd29yZCkpOwoJCQlkbyB7CgkJCQkkaGFzaCA9IHBhY2soJ0gqJywgbWQ1KCRoYXNoIC4gJHBhc3N3b3JkKSk7CgkJCX0gd2hpbGUgKC0tJGNvdW50KTsKCQl9CgoJCSRvdXRwdXQgPSBzdWJzdHIoJHNldHRpbmcsIDAsIDEyKTsKCQkkb3V0cHV0IC49ICR0aGlzLT5lbmNvZGU2NCgkaGFzaCwgMTYpOwoKCQlyZXR1cm4gJG91dHB1dDsKCX0KCglmdW5jdGlvbiBnZW5zYWx0X2V4dGVuZGVkKCRpbnB1dCkKCXsKCQkkY291bnRfbG9nMiA9IG1pbigkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgKyA4LCAyNCk7CgkJIyBUaGlzIHNob3VsZCBiZSBvZGQgdG8gbm90IHJldmVhbCB3ZWFrIERFUyBrZXlzLCBhbmQgdGhlCgkJIyBtYXhpbXVtIHZhbGlkIHZhbHVlIGlzICgyKioyNCAtIDEpIHdoaWNoIGlzIG9kZCBhbnl3YXkuCgkJJGNvdW50ID0gKDEgPDwgJGNvdW50X2xvZzIpIC0gMTsKCgkJJG91dHB1dCA9ICdfJzsKCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbJGNvdW50ICYgMHgzZl07CgkJJG91dHB1dCAuPSAkdGhpcy0+aXRvYTY0WygkY291bnQgPj4gNikgJiAweDNmXTsKCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbKCRjb3VudCA+PiAxMikgJiAweDNmXTsKCQkkb3V0cHV0IC49ICR0aGlzLT5pdG9hNjRbKCRjb3VudCA+PiAxOCkgJiAweDNmXTsKCgkJJG91dHB1dCAuPSAkdGhpcy0+ZW5jb2RlNjQoJGlucHV0LCAzKTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJZnVuY3Rpb24gZ2Vuc2FsdF9ibG93ZmlzaCgkaW5wdXQpCgl7CgkJIyBUaGlzIG9uZSBuZWVkcyB0byB1c2UgYSBkaWZmZXJlbnQgb3JkZXIgb2YgY2hhcmFjdGVycyBhbmQgYQoJCSMgZGlmZmVyZW50IGVuY29kaW5nIHNjaGVtZSBmcm9tIHRoZSBvbmUgaW4gZW5jb2RlNjQoKSBhYm92ZS4KCQkjIFdlIGNhcmUgYmVjYXVzZSB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gb3VyIGVuY29kZWQgc3RyaW5nIHdpbGwKCQkjIG9ubHkgcmVwcmVzZW50IDIgYml0cy4gIFdoaWxlIHR3byBrbm93biBpbXBsZW1lbnRhdGlvbnMgb2YKCQkjIGJjcnlwdCB3aWxsIGhhcHBpbHkgYWNjZXB0IGFuZCBjb3JyZWN0IGEgc2FsdCBzdHJpbmcgd2hpY2gKCQkjIGhhcyB0aGUgNCB1bnVzZWQgYml0cyBzZXQgdG8gbm9uLXplcm8sIHdlIGRvIG5vdCB3YW50IHRvIHRha2UKCQkjIGNoYW5jZXMgYW5kIHdlIGFsc28gZG8gbm90IHdhbnQgdG8gd2FzdGUgYW4gYWRkaXRpb25hbCBieXRlCgkJIyBvZiBlbnRyb3B5LgoJCSRpdG9hNjQgPSAnLi9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CgoJCSRvdXRwdXQgPSAnJDJhJCc7CgkJJG91dHB1dCAuPSBjaHIob3JkKCcwJykgKyAkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgLyAxMCk7CgkJJG91dHB1dCAuPSBjaHIob3JkKCcwJykgKyAkdGhpcy0+aXRlcmF0aW9uX2NvdW50X2xvZzIgJSAxMCk7CgkJJG91dHB1dCAuPSAnJCc7CgoJCSRpID0gMDsKCQlkbyB7CgkJCSRjMSA9IG9yZCgkaW5wdXRbJGkrK10pOwoJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxID4+IDJdOwoJCQkkYzEgPSAoJGMxICYgMHgwMykgPDwgNDsKCQkJaWYgKCRpID49IDE2KSB7CgkJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxXTsKCQkJCWJyZWFrOwoJCQl9CgoJCQkkYzIgPSBvcmQoJGlucHV0WyRpKytdKTsKCQkJJGMxIHw9ICRjMiA+PiA0OwoJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxXTsKCQkJJGMxID0gKCRjMiAmIDB4MGYpIDw8IDI7CgoJCQkkYzIgPSBvcmQoJGlucHV0WyRpKytdKTsKCQkJJGMxIHw9ICRjMiA+PiA2OwoJCQkkb3V0cHV0IC49ICRpdG9hNjRbJGMxXTsKCQkJJG91dHB1dCAuPSAkaXRvYTY0WyRjMiAmIDB4M2ZdOwoJCX0gd2hpbGUgKDEpOwoKCQlyZXR1cm4gJG91dHB1dDsKCX0KCglmdW5jdGlvbiBIYXNoUGFzc3dvcmQoJHBhc3N3b3JkKQoJewoJCWlmICggc3RybGVuKCAkcGFzc3dvcmQgKSA+IDQwOTYgKSB7CgkJCXJldHVybiAnKic7CgkJfQoKCQkkcmFuZG9tID0gJyc7CgoJCWlmIChDUllQVF9CTE9XRklTSCA9PSAxICYmICEkdGhpcy0+cG9ydGFibGVfaGFzaGVzKSB7CgkJCSRyYW5kb20gPSAkdGhpcy0+Z2V0X3JhbmRvbV9ieXRlcygxNik7CgkJCSRoYXNoID0KCQkJICAgIGNyeXB0KCRwYXNzd29yZCwgJHRoaXMtPmdlbnNhbHRfYmxvd2Zpc2goJHJhbmRvbSkpOwoJCQlpZiAoc3RybGVuKCRoYXNoKSA9PSA2MCkKCQkJCXJldHVybiAkaGFzaDsKCQl9CgoJCWlmIChDUllQVF9FWFRfREVTID09IDEgJiYgISR0aGlzLT5wb3J0YWJsZV9oYXNoZXMpIHsKCQkJaWYgKHN0cmxlbigkcmFuZG9tKSA8IDMpCgkJCQkkcmFuZG9tID0gJHRoaXMtPmdldF9yYW5kb21fYnl0ZXMoMyk7CgkJCSRoYXNoID0KCQkJICAgIGNyeXB0KCRwYXNzd29yZCwgJHRoaXMtPmdlbnNhbHRfZXh0ZW5kZWQoJHJhbmRvbSkpOwoJCQlpZiAoc3RybGVuKCRoYXNoKSA9PSAyMCkKCQkJCXJldHVybiAkaGFzaDsKCQl9CgoJCWlmIChzdHJsZW4oJHJhbmRvbSkgPCA2KQoJCQkkcmFuZG9tID0gJHRoaXMtPmdldF9yYW5kb21fYnl0ZXMoNik7CgkJJGhhc2ggPQoJCSAgICAkdGhpcy0+Y3J5cHRfcHJpdmF0ZSgkcGFzc3dvcmQsCgkJICAgICR0aGlzLT5nZW5zYWx0X3ByaXZhdGUoJHJhbmRvbSkpOwoJCWlmIChzdHJsZW4oJGhhc2gpID09IDM0KQoJCQlyZXR1cm4gJGhhc2g7CgoJCSMgUmV0dXJuaW5nICcqJyBvbiBlcnJvciBpcyBzYWZlIGhlcmUsIGJ1dCB3b3VsZCBfbm90XyBiZSBzYWZlCgkJIyBpbiBhIGNyeXB0KDMpLWxpa2UgZnVuY3Rpb24gdXNlZCBfYm90aF8gZm9yIGdlbmVyYXRpbmcgbmV3CgkJIyBoYXNoZXMgYW5kIGZvciB2YWxpZGF0aW5nIHBhc3N3b3JkcyBhZ2FpbnN0IGV4aXN0aW5nIGhhc2hlcy4KCQlyZXR1cm4gJyonOwoJfQoKCWZ1bmN0aW9uIENoZWNrUGFzc3dvcmQoJHBhc3N3b3JkLCAkc3RvcmVkX2hhc2gpCgl7CgkJaWYgKCBzdHJsZW4oICRwYXNzd29yZCApID4gNDA5NiApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGhhc2ggPSAkdGhpcy0+Y3J5cHRfcHJpdmF0ZSgkcGFzc3dvcmQsICRzdG9yZWRfaGFzaCk7CgkJaWYgKCRoYXNoWzBdID09ICcqJykKCQkJJGhhc2ggPSBjcnlwdCgkcGFzc3dvcmQsICRzdG9yZWRfaGFzaCk7CgoJCXJldHVybiAkaGFzaCA9PT0gJHN0b3JlZF9oYXNoOwoJfQp9 ###PACKDATA,FILE_END,/destinations/stash2/class-phpass.php,importbuddy/lib/stash2/class-phpass.php ###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/LICENSE,importbuddy/lib/requestcore/LICENSE Q29weXJpZ2h0IChjKSAyMDA2LTIwMTAgUnlhbiBQYXJtYW4sIEZvbGVlbyBJbmMuLCBhbmQgY29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCnBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKCSogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKCSAgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKCSAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKCSogTmVpdGhlciB0aGUgbmFtZSBvZiBSeWFuIFBhcm1hbiwgRm9sZWVvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCgkgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KCSAgcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MKT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMKQU5EIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K ###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/LICENSE,importbuddy/lib/requestcore/LICENSE ###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/README.md,importbuddy/lib/requestcore/README.md IyBSZXF1ZXN0Q29yZQoKUmVxdWVzdENvcmUgaXMgYSBsaWdodHdlaWdodCBjVVJMLWJhc2VkIEhUVFAgcmVxdWVzdC9yZXNwb25zZSBjbGFzcyB0aGF0IGxldmVyYWdlcyBNdWx0aUN1cmwgZm9yIHBhcmFsbGVsIHJlcXVlc3RzLgoKIyMjIFBFQVIgSFRUUF9SZXF1ZXN0PwoKUmVxdWVzdENvcmUgd2FzIHdyaXR0ZW4gYXMgYSByZXBsYWNlbWVudCBmb3IgW1BFQVIgSFRUUF9SZXF1ZXN0XShodHRwOi8vcGVhci5waHAubmV0L2h0dHBfcmVxdWVzdC8pLiBXaGlsZSBQRUFSIEhUVFBfUmVxdWVzdCBpcyBmdWxsLWZlYXR1cmVkIGFuZCBoZWF2eSwgUmVxdWVzdENvcmUgZmVhdHVyZXMgb25seSB0aGUgZXNzZW50aWFscyBhbmQgaXMgdmVyeSBsaWdodHdlaWdodC4gSXQgYWxzbyBsZXZlcmFnZXMgdGhlIGJhdGNoIHJlcXVlc3Qgc3VwcG9ydCBpbiBjVVJMJ3MgYGN1cmxfbXVsdGlfZXhlYygpYCB0byBlbmFibGUgbXVsdGktdGhyZWFkZWQgcmVxdWVzdHMgdGhhdCBmaXJlIGluIHBhcmFsbGVsLgoKIyMjIFJlZmVyZW5jZSBhbmQgRG93bmxvYWQKCllvdSBjYW4gZmluZCB0aGUgY2xhc3MgcmVmZXJlbmNlIGF0IDxodHRwOi8vc2t5enl4LmdpdGh1Yi5jb20vcmVxdWVzdGNvcmUvPi4gWW91IGNhbiBnZXQgdGhlIGNvZGUgZnJvbSA8aHR0cDovL2dpdGh1Yi5jb20vc2t5enl4L3JlcXVlc3Rjb3JlPi4KCiMjIyBMaWNlbnNlIGFuZCBDb3B5cmlnaHQKClRoaXMgY29kZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCwgUnlhbiBQYXJtYW4uIEhvd2V2ZXIsIEknbSBsaWNlbnNpbmcgdGhpcyBjb2RlIGZvciBvdGhlcnMgdG8gdXNlIHVuZGVyIHRoZSBbU2ltcGxpZmllZCBCU0QgbGljZW5zZV0oaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHApLgo= ###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/README.md,importbuddy/lib/requestcore/README.md ###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/cacert.pem,importbuddy/lib/requestcore/cacert.pem IyMKIyMgY2EtYnVuZGxlLmNydCAtLSBCdW5kbGUgb2YgQ0EgUm9vdCBDZXJ0aWZpY2F0ZXMKIyMKIyMgQ2VydGlmaWNhdGUgZGF0YSBmcm9tIE1vemlsbGEgYXMgb2Y6IFdlZCBKYW4gMTggMDA6MDQ6MTYgMjAxMgojIwojIyBUaGlzIGlzIGEgYnVuZGxlIG9mIFguNTA5IGNlcnRpZmljYXRlcyBvZiBwdWJsaWMgQ2VydGlmaWNhdGUgQXV0aG9yaXRpZXMKIyMgKENBKS4gVGhlc2Ugd2VyZSBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIE1vemlsbGEncyByb290IGNlcnRpZmljYXRlcwojIyBmaWxlIChjZXJ0ZGF0YS50eHQpLiAgVGhpcyBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUgbW96aWxsYSBzb3VyY2UgdHJlZToKIyMgaHR0cDovL214ci5tb3ppbGxhLm9yZy9tb3ppbGxhL3NvdXJjZS9zZWN1cml0eS9uc3MvbGliL2NrZncvYnVpbHRpbnMvY2VydGRhdGEudHh0P3Jhdz0xCiMjCiMjIEl0IGNvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZXMgaW4gUEVNIGZvcm1hdCBhbmQgdGhlcmVmb3JlCiMjIGNhbiBiZSBkaXJlY3RseSB1c2VkIHdpdGggY3VybCAvIGxpYmN1cmwgLyBwaHBfY3VybCwgb3Igd2l0aAojIyBhbiBBcGFjaGUrbW9kX3NzbCB3ZWJzZXJ2ZXIgZm9yIFNTTCBjbGllbnQgYXV0aGVudGljYXRpb24uCiMjIEp1c3QgY29uZmlndXJlIHRoaXMgZmlsZSBhcyB0aGUgU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUuCiMjCgojICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKIyBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKIwojIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgojIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAojIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIyBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KIwojIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiMgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiMgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKIyBMaWNlbnNlLgojCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5ldHNjYXBlIHNlY3VyaXR5IGxpYnJhcmllcy4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojCiMgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKIyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKIyB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKIyBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAojIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiMgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwojIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiMgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKIyBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQojIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKIyB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgojCiMgKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKioKIyBAKCMpICRSQ1NmaWxlOiBjZXJ0ZGF0YS50eHQsdiAkICRSZXZpc2lvbjogMS44MSAkICREYXRlOiAyMDEyLzAxLzE3IDIyOjAyOjM3ICQKCkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDV2pDQ0FjTUNBZ0dsTUEwR0NTcUdTSWIzRFFFQkJBVUFNSFV4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OUhWRVVnClEyOXljRzl5WVhScGIyNHhKekFsQmdOVkJBc1RIa2RVUlNCRGVXSmxjbFJ5ZFhOMElGTnZiSFYwYVc5dWN5d2dTVzVqTGpFak1DRUcKQTFVRUF4TWFSMVJGSUVONVltVnlWSEoxYzNRZ1IyeHZZbUZzSUZKdmIzUXdIaGNOT1Rnd09ERXpNREF5T1RBd1doY05NVGd3T0RFegpNak0xT1RBd1dqQjFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFIxUkZJRU52Y25CdmNtRjBhVzl1TVNjd0pRWURWUVFMCkV4NUhWRVVnUTNsaVpYSlVjblZ6ZENCVGIyeDFkR2x2Ym5Nc0lFbHVZeTR4SXpBaEJnTlZCQU1UR2tkVVJTQkRlV0psY2xSeWRYTjAKSUVkc2IySmhiQ0JTYjI5ME1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQ1ZENkMyOEZDYzZIckhpTTNkRnc0dQpzSlRRR3owTzlwVEFpcFRIQnNpUWw4aTRaQnA2Zm13OFUrRTNLSE5nZjdLWFV3ZWZVL2x0V0pUU3I0MXRpR2VBNXUyeWxjOXlNY3FsCkhISzZYQUxuWkVMbitha3Mxam9OckkxQ3FpUUJPZWFjUHdHRlZ3MVloMFg0MDRXcWsya21oWEJJZ0Q4U0ZjZDV0QjhGTHp0aW1RSUQKQVFBQk1BMEdDU3FHU0liM0RRRUJCQVVBQTRHQkFHM3JHd25wWHRsUjIyY2lZYVFxUEVoMzQ2QjhwdDV6b2hRRGhUMzdxdzR3eFlNVwpNNEVUQ0o1N05FN2ZRTWgwMTdsOTNQUjJWWDJiWTFRWTZmRHE4MXl4Mll0Q0hybkFsVTY2K3RYaWZQVm9ZYitPN0FXWFgxdXcxNk9GCk5NUWtwdzBQbFpQdnk1VFluaCtkWElWdHg2cXVUeDhpdGMyVnJicW56UG1yQzNwLwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUaGF3dGUgU2VydmVyIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQW55Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCeERFTE1Ba0dBMVVFQmhNQ1drRXhGVEFUQmdOVkJBZ1QKREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGM2RHVWdRMjl1YzNWcwpkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0dBMVVFCkF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWGMyVnlkbVZ5TFdObGNuUnpRSFJvWVhkMFpTNWoKYjIwd0hoY05PVFl3T0RBeE1EQXdNREF3V2hjTk1qQXhNak14TWpNMU9UVTVXakNCeERFTE1Ba0dBMVVFQmhNQ1drRXhGVEFUQmdOVgpCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGM2RHVWdRMjl1CmMzVnNkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0cKQTFVRUF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWGMyVnlkbVZ5TFdObGNuUnpRSFJvWVhkMApaUzVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFOT2tVRzdJLzFacjVzOWR0dW9NYUhWSG9xckMyb1FsCi9LajBSMUhhaGJVZ2RKU0dIZzkxeWVrSVlmVUdiVEJ1RlJrQzZWTEFZdHRObVo3aWFneEVPTTMrdnVOa0NYREYvckZyS2JZdlNjZzcKMUNjRUpSQ1hMK2VRYmNBb1FwblhURVBldy9VaGJWU2ZYY05ZNGNEazJWdXd1TnkwZTk4Mk9zSzFaaUlTMW9jTkFnTUJBQUdqRXpBUgpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFCL3BNYVZ6N2xjeEc3b1dEVFNFd2pzclpxRzlKCkd1YmFVZU5nY0d5RVlSR2hHc2hJUGxsRGZVK1ZQYUdMdHd0aW1IcDFpdDJJVGs2ZVFOdW96REowdVc4Tnh1T3pSQXZaaW0rYUtadVoKR0NnNzBlTkFLSnBhUE5XMTV5QWJpOHFrcTQzcFVkbmlUQ3hacWRxNXNuVWI5a0x5NzhmeUdQbUp2S1AvaWlNdWNFYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGhhd3RlIFByZW1pdW0gU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREp6Q0NBcENnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFRRkFEQ0J6akVMTUFrR0ExVUVCaE1DV2tFeEZUQVRCZ05WQkFnVApERmRsYzNSbGNtNGdRMkZ3WlRFU01CQUdBMVVFQnhNSlEyRndaU0JVYjNkdU1SMHdHd1lEVlFRS0V4UlVhR0YzZEdVZ1EyOXVjM1ZzCmRHbHVaeUJqWXpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakVoTUI4R0ExVUUKQXhNWVZHaGhkM1JsSUZCeVpXMXBkVzBnVTJWeWRtVnlJRU5CTVNnd0pnWUpLb1pJaHZjTkFRa0JGaGx3Y21WdGFYVnRMWE5sY25abApja0IwYUdGM2RHVXVZMjl0TUI0WERUazJNRGd3TVRBd01EQXdNRm9YRFRJd01USXpNVEl6TlRrMU9Wb3dnYzR4Q3pBSkJnTlZCQVlUCkFscEJNUlV3RXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHQTFVRUNoTVUKVkdoaGQzUmxJRU52Ym5OMWJIUnBibWNnWTJNeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeWRtbGpaWE1nUkdsMgphWE5wYjI0eElUQWZCZ05WQkFNVEdGUm9ZWGQwWlNCUWNtVnRhWFZ0SUZObGNuWmxjaUJEUVRFb01DWUdDU3FHU0liM0RRRUpBUllaCmNISmxiV2wxYlMxelpYSjJaWEpBZEdoaGQzUmxMbU52YlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTBqWTIKYW92WHdsdWUyb0ZCWW84NDdra0VWZGJRN3h3YmxSWkg3eGhJTlRwUzlDdHFCbzg3TCtwVzQ2K0dqWjRYOTU2MFpYVUNUZS9MQ2FJaApVZGliMEdmUXVnMlNCaFJ6MUpQTGx5b0FuRnhPREx6NkZWTDg4a1J1MmhGS2JnaWZMeTNqK2FvNmhuTzJSbE5ZeUlrRnZZTVJ1SE0vCnFnZU45RUpONTBDZEhEY0NBd0VBQWFNVE1CRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQW0KU0N3V3dsajY2QlowREtxcVgxUS84dGZKZUdCZVhtNDNZeUozTm42eUY4UTB1ZlVJaGZ6SkFUai9UYjd5RmtKRDU3dGFSdnZCeGhFZgo4VXF3S0ViSnc4UkNmYno2cTFsdTFiZFJpQkhqcElVWmE0Sk1wQXdTcmVta3JqL3h3MGxsbW96RnlENGx0NVNadTVJeWNRZndobDd0ClVDZW1EYVlqK2J2THBnY1VRZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVxdWlmYXggU2VjdXJlIENBCj09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FvbWdBd0lCQWdJRU5kNzB6ekFOQmdrcWhraUc5dzBCQVFVRkFEQk9NUXN3Q1FZRFZRUUdFd0pWVXpFUU1BNEdBMVVFCkNoTUhSWEYxYVdaaGVERXRNQ3NHQTFVRUN4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjUKTUI0WERUazRNRGd5TWpFMk5ERTFNVm9YRFRFNE1EZ3lNakUyTkRFMU1Wb3dUakVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFvVApCMFZ4ZFdsbVlYZ3hMVEFyQmdOVkJBc1RKRVZ4ZFdsbVlYZ2dVMlZqZFhKbElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVENCCm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXdWMnhXR2NJWXU2Z21pMGZDRzJSRkdpWUNoNysyZ1J2RTRSaUljUFIKZk02ZkJlQzRBZkJPTk96aWlwVUVaS3p4YTFOZkJiUExaNEMvUWdLTy90MEJDZXpoQUJSUC9QdndETjFEdWxzcjRSK0FjSmtWVjVNVwo4UStYYXJmQ2FDTWN6RTFaTUt4UkhqdXZLOWJ1WTBWN3hkbGZVTkxqVUE4NmlPZS9GUDNneDdrQ0F3RUFBYU9DQVFrd2dnRUZNSEFHCkExVWRId1JwTUdjd1phQmpvR0drWHpCZE1Rc3dDUVlEVlFRR0V3SlZVekVRTUE0R0ExVUVDaE1IUlhGMWFXWmhlREV0TUNzR0ExVUUKQ3hNa1JYRjFhV1poZUNCVFpXTjFjbVVnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUJvRwpBMVVkRUFRVE1CR0JEekl3TVRnd09ESXlNVFkwTVRVeFdqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVVNPWm8rU3ZTCnNwWFhSOWdqSUJCUE01aVFuOVF3SFFZRFZSME9CQllFRkVqbWFQa3IwcktWMTBmWUl5QVFUek9Za0ovVU1Bd0dBMVVkRXdRRk1BTUIKQWY4d0dnWUpLb1pJaHZaOUIwRUFCQTB3Q3hzRlZqTXVNR01EQWdiQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGak9LZXI4OTk2MQp6Z0s1RjdXRjBibmo0SlhNSlRFTkFLYVNibisya21PZVVKWFJtbS9rRWQ1amhXNlk3cWovV3NqVFZiSm1jVmZld0NIclBTcW5JMGtCCkJJWkNlL3p1ZjZJV1VyVm5aOU5BMnpzbVdMSW9kejJ1RkhkaDF2b3FaaWVnRGZxbmMxenFjUEdVSVdWRVgvcjg3eWxvcWFLSGVlOTUKNzArc0IzYzQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uIEdsb2JhbCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREtUQ0NBcEtnQXdJQkFnSUVObkFWbGpBTkJna3Foa2lHOXcwQkFRVUZBREJHTVFzd0NRWURWUVFHRXdKVlV6RWtNQ0lHQTFVRQpDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJFd0R3WURWUVFMRXdoRVUxUkRRU0JGTVRBZUZ3MDVPREV5Ck1UQXhPREV3TWpOYUZ3MHhPREV5TVRBeE9EUXdNak5hTUVZeEN6QUpCZ05WQkFZVEFsVlRNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnMKSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEVUQVBCZ05WQkFzVENFUlRWRU5CSUVVeE1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdMQURDQmh3S0JnUUNnYklHcHp6UWVKTjMraGlqTTNvTXYrVjdVUXRMb2RHQm1FNWdHSEtsUkVtbHZNVlc1U1hJQUNIN1RwV0pFCk55U1pqOW1EU0krWmJaVVR1ME03TGtsT2lEZkJ1MWgvL3VHOStMdGh6Zk5Id0ptbThmT1I2SGg4QU10aHlVUW5jV2xWU241SlRlMmkKbzc0Q1RBREtBcWp1QVFJeFpBOVNMUk4wZGphMWVyUXRjUUlCQTZPQ0FTUXdnZ0VnTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpCbwpCZ05WSFI4RVlUQmZNRjJnVzZCWnBGY3dWVEVMTUFrR0ExVUVCaE1DVlZNeEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwCmRYSmxJRlJ5ZFhOMElFTnZMakVSTUE4R0ExVUVDeE1JUkZOVVEwRWdSVEV4RFRBTEJnTlZCQU1UQkVOU1RERXdLd1lEVlIwUUJDUXcKSW9BUE1UazVPREV5TVRBeE9ERXdNak5hZ1E4eU1ERTRNVEl4TURFNE1UQXlNMW93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWQpNQmFBRkdwNWZwRnBSaGdUQ2dKM3BWbGJZSmdsRHFMNE1CMEdBMVVkRGdRV0JCUnFlWDZSYVVZWUV3b0NkNlZaVzJDWUpRNmkrREFNCkJnTlZIUk1FQlRBREFRSC9NQmtHQ1NxR1NJYjJmUWRCQUFRTU1Bb2JCRlkwTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0IKQUNJUzJIb2QzSUVHdGdsbHNvZklIMTYwTCtuRUh2STh3YnNFa0JGS2cwNStrN2xOUXNlU0pxQmNOSm80Y3ZqOWF4WStJTzZDaXpFcQpremFGSTRpS1BBTm8wOGtKRDAzOGJLVGFLSEtURG9tQXNIMytnRzlsYlJnemw0dkNhNG51WUQzSW0rOS9LekppYzVQTFBPTjc0blo0ClJieWhrd1M3aHA4NlcwTjZ3NHBsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiBHbG9iYWwgQ0EgMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQXBLZ0F3SUJBZ0lFTm03VHpqQU5CZ2txaGtpRzl3MEJBUVVGQURCR01Rc3dDUVlEVlFRR0V3SlZVekVrTUNJR0ExVUUKQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SRXdEd1lEVlFRTEV3aEVVMVJEUVNCRk1qQWVGdzA1T0RFeQpNRGt4T1RFM01qWmFGdzB4T0RFeU1Ea3hPVFEzTWpaYU1FWXhDekFKQmdOVkJBWVRBbFZUTVNRd0lnWURWUVFLRXh0RWFXZHBkR0ZzCklGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhFVEFQQmdOVkJBc1RDRVJUVkVOQklFVXlNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUEKQTRHTEFEQ0Jod0tCZ1FDL2s0OFhrdTh6RXhqckVIOU9Gci8vQm84cWhieGUrU1NtSklpMkE3ZkJ3MThEVzlGdnJuNUM2bVlqdUdPRApWdnNvTGVFNGk3VHVxQUhoemh5MmlDb2lSb1g3bjZkd3FVY1VQODdlWmZDb2NmZFBKbXlNdk1hMTc5NUpKLzlJS24zb1RRUE14N0pTCnhoY3hFenUxVGR2SXhQYkREeVFxMmd5ZDU1RmJnTTJVblFJQkE2T0NBU1F3Z2dFZ01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6Qm8KQmdOVkhSOEVZVEJmTUYyZ1c2QlpwRmN3VlRFTE1Ba0dBMVVFQmhNQ1ZWTXhKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMApkWEpsSUZSeWRYTjBJRU52TGpFUk1BOEdBMVVFQ3hNSVJGTlVRMEVnUlRJeERUQUxCZ05WQkFNVEJFTlNUREV3S3dZRFZSMFFCQ1F3CklvQVBNVGs1T0RFeU1Ea3hPVEUzTWpaYWdROHlNREU0TVRJd09URTVNVGN5Tmxvd0N3WURWUjBQQkFRREFnRUdNQjhHQTFVZEl3UVkKTUJhQUZCNkNUU2hsZ0R6SlFXNnNOUzVheTk3dStEbGJNQjBHQTFVZERnUVdCQlFlZ2swb1pZQTh5VUZ1ckRVdVdzdmU3dmc1V3pBTQpCZ05WSFJNRUJUQURBUUgvTUJrR0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCCkFFZU5nNjFpOHR1d25rVWlCYm1pMWdNT09ITG5udng3NXBPMm1xV2lsTWcwSFpIUnhkZjBDaVVQUFhpQm5nK3haOFNRVEdQZFhxZmkKdXAvMTkwMmxNWHVjS1MxTS9tUSs3TFpUL3VxYjdZTGJkSFZMQjNsdUh0Z1pnM1BlOVQ3UXRkN25TMmg5UXk0cUlPRitvSGhFbmdqMQptUG5IZnhzYjFnWWdBbGlodzZJRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQRENDQWFVQ0VIQzY1QjBRMlNrMHRqaktld1BNdXI4d0RRWUpLb1pJaHZjTkFRRUNCUUF3WHpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNQpJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGsyTURFeU9UQXdNREF3TUZvWERUSTRNRGd3TVRJek5UazFPVm93Clh6RUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXoKSUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdOQURDQmlRS0JnUURKWEZtZThodUtBUlMwRU44RVFOdmpWNjlxUlVDUGhBd0wwVFBaMlJIUDdnSllIeVgzS3FoRUJhcnNBeDk0CmY1NlR1Wm9BcWlOOTFxeUZvbU5GeDNJbnpQUk14blZ4MGpudlQwTHdkZDhLa01hT0lHK1lEL2lzSTE5d0tUYWt5WWJuc1pvZ3kxT2wKaGVjOXZuMmEvaVJGTTl4MkZlMFBvbkZrVEdVdWdXaEZwd0lEQVFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBQTRHQkFMdE1FaXZQTENZQQpUeFFUM2FiNy9Bb1JoSXp6S0J4bmtpOTh0c1g2My9Eb2xid2RqMndzcUZITWM5aWt3RlB3VHRZbXdIWUJWNEdTWGlIeDBiSC81OUFoCldNMXBGK05FSEp3WlJEbUpYTnljQUE5V2pRS1o3YUtRUlV6a3V4Q2tQZkF5QXc3eHp2am95VkdNNW1LZjVwL0FmYmR5bk1rMk9tdWYKVHFqL1pBMWsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREFqQ0NBbXNDRUgzWi9nZlBxQjYzRUhsbis2ZUpOTVl3RFFZSktvWklodmNOQVFFRkJRQXdnY0V4Q3pBSkJnTlZCQVlUQWxWVApNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRThNRG9HQTFVRUN4TXpRMnhoYzNNZ015QlFkV0pzYVdNZ1VISnBiV0Z5CmVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3lNVG93T0FZRFZRUUxFekVvWXlrZ01UazVPQ0JXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WegpkQ0JPWlhSM2IzSnJNQjRYRFRrNE1EVXhPREF3TURBd01Gb1hEVEk0TURnd01USXpOVGsxT1Zvd2djRXhDekFKQmdOVkJBWVRBbFZUCk1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGhjM01nTXlCUWRXSnNhV01nVUhKcGJXRnkKZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6CmRDQk9aWFIzYjNKck1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRE1YdEVSWFZ4cDBLdlR1V3BNbVI5Wm1EQ08KRm9VZ1JtMUhQOVNGSUlUaGJiUDRwTzBNOFJjUE8vbW4rU1hYd2MrRVkvSjhZOCtpUi9MR1d6T09aRUFFYU1HQXVXUWNSWGZIMkc3MQpsU2s4VU9nMDEzZ2ZxTHB0UTVHVmowVlhYbjdGKzhxa0JPdnFsemRVTUcrN0FVY3lNODNjVjV0a2FXSDRteDBjaVU5Y1p3SURBUUFCCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGRk56YjVjeTVnWm5CV3lBVGw0TGswUFozQndtY1lRV3BTa1UwMVViU3V2RFYxQWkyVFQKMSs3ZVZtR1NYNmJFSFJCaE50TXNKenpvS1FtNUVXUjB6TFZ6bnh4SXFieGhBZTdpRjZZTTQwQUlPdzduNjBSektwcnhhWkx2Y1JURApPYXh4cDVFSmIrUnhCck82V1ZjbWVRRDIrQTJpTXpBbzFLcFlvSjJkYVpIOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZFRDQ0FsMmdBd0lCQWdJTEJBQUFBQUFCRlV0YXc1UXdEUVlKS29aSWh2Y05BUUVGQlFBd1Z6RUxNQWtHQTFVRUJoTUNRa1V4CkdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHMKYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBd01EQmFGdzB5T0RBeE1qZ3hNakF3TURCYU1GY3hDekFKQmdOVgpCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEClZRUURFeEpIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGEKRHVhWmpjNmo0MCtLZnZ2eGk0TWxhK3BJSC9FcXNMbVZFUVM5OEdQUjRtZG16eHpkenh0SUsrNk5pWTZhcnltQVphdnB4eTBTeTZzYwpUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcDFXcmpzb2s2VmprNGJ3WThpR2xiCktrM0ZwMVM0YkluTW0vazh5dVg5aWZVU1BKSjRsdGJjZEc2VFJHSFJqY2RHc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlAKYzFTVEU0VTZHN3dlTkxXTEJZeTVkNHV4Mng4Z2thc0pVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWApnelQvTENyQmJCbERTZ2VGNTlOODlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cnZRbWVVNzlyWHFvUlNMYmxDS096eWoxaFRkTkdDYk0rdzZEagpZMVViOHJydnJUbmhRN2s0bytZdmlpWTc3NkJRVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UzOE5mbE5VVnlSUkJuTVJkZFdRVkRmOVZNT3lHCmovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUEFiRVZ0UXdkcGY1cExHa2tlQjZ6cHh4eFl1N0t5SmVzRjEyS3d2aEgKaG00cXhGWXhsZEJuaVlVcitXeW1YVWFkREtxQzVKbFIzWEMzMjFZOVllUnE0VnpXOXY0OTNrSE1CNjVqVXI5VFUvUXI2Y2Y5dHZlQwpYNFhTUVJqYmdiTUVITVVmcElCdkZTREozZ3lJQ2gzV1psWGkvRWpKS1NacDRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjIKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1akNDQXFLZ0F3SUJBZ0lMQkFBQUFBQUJENFltNWcwd0RRWUpLb1pJaHZjTkFRRUZCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpJeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRFl4TWpFMU1EZ3dNREF3V2hjTk1qRXhNakUxTURnd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTWpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2JQSkE2K0xtOG9tVVZDeEtzK0lWU2JDOU4vaEhENgpFclBMdjRkZnhuK0cwN0l3WE5iOXJmRjczT1g0WUpZSmtoRDEwRlBlKzN0K2M0aXNVb2g3U3FiS1NhWmVxS2VNV2hHOGVvTHJ2b3pwCnM2eVdKUWVYU3BrcUJ5KzBIbmUvaWcrMUFud2JscmpGdVRvc3ZOWVN1ZXRaZmVMUUJvWmZYa2xxdFRsZWlEVHN2SGdNQ0ppRWJLak4KUzdTZ2ZReDVUZkM0TGNzaHl0VnNXMzNob0NtRW9mblRsRW5MSkdLUklMemRDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTApUZnV3Tmh2MkdYcUY0RzN5WVJPSVhKL2drd3BSbDRwYXpxK3IxZmVxQ2FwZ3ZkelpYOTl5cVdBVFhnQUJ5VXI2UDZUcUJ3TWhBbzZDCnlnUENtNDhDQXdFQUFhT0JuRENCbVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEUKRmdRVW0rSUhWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuYkc5aQpZV3h6YVdkdUxtNWxkQzl5YjI5MExYSXlMbU55YkRBZkJnTlZIU01FR0RBV2dCU2I0Z2RYWnh3ZXdHb0czbG0wbWkzZjNCbUdMakFOCkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW1ZRlRoeHhvbDRhUjdPQkt1RVFMcTRHc0owL1d3YmdjUTNpekRKcjg2aXc4Ym1FYlRVc3AKOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPMjkxeE5CckJWTnBHUCtEVEtxdHRWQ0wxT21MTklHKzZLWW5YM1pIdQowMXlpUHFGYlFmWGY1V1JETGVuVk9hdlNvdCszaTlEQWdCa2NSY0F0ak9qNExhUjBWa25GQmJWUEZkNXVSSGc1aDZoK3UvTjVHSkc3CjlHK2R3ZkNNTll4ZEFmdkRiYm52UkcxNVJqRitDdjZwZ3NILzc2dHVJTVJReVYrZFRac1hqQXpsQWNtZ1FXcHpVL3FsVUxSdUpRLzcKVEJqMC9WTFpqbW14NkJFUDNvalkreDFKOTZyZWxjOGdlTUpnRXRzbFFJeHEvSDVDT0VCa0V2ZWVnZUdUTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWYWxpQ2VydCBDbGFzcyAxIFZBCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWxBQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnAKYjI0Z1RtVjBkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOcwpZWE56SURFZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoCmJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1CNFhEVGs1TURZeU5USXkKTWpNME9Gb1hEVEU1TURZeU5USXlNak0wT0Zvd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnBiMjRnVG1WMApkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOc1lYTnpJREVnClVHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoYkdsalpYSjAKTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdOQURDQmlRS0JnUURZV1lKNmliaVd1cVl2YUc5WUxxZFVIQVp1OU9xTlNMd3hsQmZ3ODA2OHNyZzFrbmF3MEtXbEFkY0FBeElpCkdRajQveEVqbTg0SDliOXBHaWIrVHVuUmY1MHNRQjFaYUc2bStGaXduUnFQMHoveDNCa0dnYWdPNERyZHlGTkZDUWJtRDNERCtrQ20KRHVKV0JROFlUZndnZ3RGelZYU05kbktnSFowZHdOMC9jUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGQm9QVW4wTEJ3RwpsTitWWUgrV2V4ZitUM0d0Wk1qZGQ5THZXVlhvUCtpT0JTb2g4Z2ZTdGFkUy9weXh0dUpiZHhkQTZuTFdJOHNvZ1RMREFIa1k3RmtYCmljbkdhaDV4eWYyM2RLVWxSV25GU0tzWjRVV0tKV3NaN3VXN0V2Vi85NmFOVWNQd25YUzNxVDZncGYrMlNRTVQyaUxNN1hHQ0s1blAKT3JmMUxYTEkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmFsaUNlcnQgQ2xhc3MgMiBWQQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDNXpDQ0FsQUNBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwCmIyNGdUbVYwZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnMKWVhOeklESWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaApiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNQjRYRFRrNU1EWXlOakF3Ck1UazFORm9YRFRFNU1EWXlOakF3TVRrMU5Gb3dnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwYjI0Z1RtVjAKZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnNZWE56SURJZwpVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaGJHbGpaWEowCkxtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUEKQTRHTkFEQ0JpUUtCZ1FET09uSEs1YXZJV1pKVjE2dllkQTc1N3RuMlZVZFpaVWNPQlZYYzY1ZzJQRnhUWGRNd3p6anN2VUdKN1NWQwpDU1JyQ2w2emZOMVNMVXptMU5aOVdsbXBaZFJKRXkwa1RSeFFiN1hCaFZRNy9uSGswMXhDK1lEZ2tSb0tXemsyWi9NL1ZYd2JQN1JmClpITTA0N1FTdjRkaytOb1MvemNud2JORHUrOTdiaTVwOXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRHQvVUc5dlVKU1oKU1dJNE9COUwrS1hJUHFlQ2dmWXJ4K2pGenVnNkVJTExHQUNPVGIyb1dIK2hlUUMxdSttTnIwSFpEelR1SVlFWm9ESkpLUFRFamxiVgpValA5VU5WK21Xd0Q1TWxNL010c3EyYXpTaUdNNWJVTU1qNFFzc3hzb2R5YW1Fd0NXL1BPdVo2bGNnNUt0ejg4NWhabytMN3RkRXk4Clc5VmlIMFBkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClJTQSBSb290IENlcnRpZmljYXRlIDEKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzV6Q0NBbEFDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScApiMjRnVG1WMGQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zCllYTnpJRE1nVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmgKYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUI0WERUazVNRFl5TmpBdwpNakl6TTFvWERURTVNRFl5TmpBd01qSXpNMW93Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScGIyNGdUbVYwCmQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zWVhOeklETWcKVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmhiR2xqWlhKMApMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBCkE0R05BRENCaVFLQmdRRGptRkdXSE9qVnNRYUJhbGZEY25XVHE4K2Vwdnp6RmxMV0xVMmZOVVNvTGdSTkIwbUtPQ24xZHpmbnQ2dGQKM3paeEZKbVAzTUtTOGVkZ2twZnMyRWpjdjhFQ0lNWWtwQ2hNTUZwMmJiRmM4OTNlbmhCeG9ZakhXNXRCYmNxd3VJNFY3cTB6Szg5SApCRngxY1FxWUpKZ3BwMGxacGQzNHQwTmlZZlBUNHRCVlB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUZhN0FsaUVad2dzCjN4L2JlMGt6OWRObm5mUzBDaEN6eWNVczRwSnFjWGduOG5DRFF0TSt6NmxVOVBIWWtoYU0wUVRMUzZ2Sm4wV3VQSXFwc0hFelhjakYKVjkrdnFEV3pmNG1INmVnbGtyaC9oWHF1MXJ3ZU4xZ3FaOG1SenlxQlB1M0dPZC9BUGhtY0djd1RUWUpCdFl6ZTREMWdDQ0FQUlg1cgpvbitqakJYdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3Q1FZRFZRUUdFd0pWClV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHYKY21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObApJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3cKQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeQpkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2CmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2cKUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQU11Nm5GTDhlQjhhSG04Yk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxCkVVR08raTJ0S21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdWt4VWMKY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtQ0MrVms3K3FSeStvUnBmdwpFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkpYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqCjA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdWltaTVWNWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlMnlGUGhwazBkalpYM2RBVkw4V3RmeFVmTjJKelB0VG5YODRYQTlzMStpdmJybUFKWHg1ZgpqMjY3Q3ozcVdoTWVER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCi9ZNHdqeWxHc0I0OU5kbzRZaFlZU3EzbXRsRnMzcTlpNndIUUhpVCtlbzhTR2hKb3VQdG1tUlFVUlZ5dTU2NXBGNEVyV2pmSlhpcjAKeHVLaFhGU2JwbFFBei9EeHdjZVlNQm83TmhiYm8yN3EvYTJ5d3RydkFrY1Rpc0R4c3pHdFR4emhUNXl2RHd5ZDkzZ04yUFExVm9EYQp0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlzaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHakNDQXdJQ0VRRHNvS2VMYm5WcUFjL0VmTXd2bEY3WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdgpjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRFFnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzdwpDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5CmRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHYKY21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHVJRU5zWVhOeklEUWdVSFZpYkdsaklGQnlhVzFoY25rZwpRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBSzNMcFJGcHhsbXI4WSsxR1E5V3pzeTFIeURrbmlZbFMrQnpaWWxaM3RDRDVQVVB0YnV0OFh6b0lmems2QXp1ZkVVaUdYYVMKdEJPM0lGc0orbUd1cVBLbGpZWENLdGJlWmpiU213TDBxSkpnZkp4cHRJOGtIdENHVXZZeW5FRllIaUs5elVWaWxRaHUwR2JkVTZMTQo4QkRjVkhPTEJLRkdNek5jRjBDNW5rM1Q4NzVWZytpeGlZNWFmSnFXSXBBN2lDWHkwbE9JQWd3TGVQTG1OeGRMTUVZSDVJQnRwdGlXCkx1Z3MrQkd6T0ExbXBwdnF5U05iMjQ3aTh4T09HbGt0cWdMdzdLU0hadHpCUC9YWXVmVHNnc2JTUFpVZDVjQlBoTW5abzBRb0JtclgKUmF6d2EycnZUbC80RVlJZU9HTTBabERVUHBOeitqRERacTMva3kyWDd3TUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQQpqL29sYTA5YjVLUk9KMVdySWhWWlBNcTFDdFJLMjZ2ZG9WOVR4YUJYT2NMT1J5dStPc2hXdjhMWkp4QTZzUVU4d0hjeHV6clRCWHR0Cm1od3dqSURMazVNcWc2c0ZVWUlDQUJGbmEvT0lZVWRmQTVQVld3M2c4ZFNoTWpXRnNqcmJzSUtyMGNzS3ZFK01XOFZMQURzZktvS20KZmphRjNINDhad0MxNUR0UzRLanJYUlg1eG0zd3JSME9oYmVwbW5NVVdsdVBRU2pBMWVndFRhUmV6YXJaN2M3YzJOVThRaDBYd1JKZApSVGpET1BQOGhTNkRSa2l5MXlCZmtqYVA1M2tQbUY2WjZQRFFwTHYxVTcwcXpsbXdyMjUvYkx2U0hnQ3dJZTM0UVdLQ3VkaXl4THRHClVQTXh4WThCcUhUcjlYZ24ydWYzWmtQem5vTStJS3JETldDUnpnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFMkRDQ0JFR2dBd0lCQWdJRU4wclNRekFOQmdrcWhraUc5dzBCQVFVRkFEQ0J3ekVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WCkJBb1RDMFZ1ZEhKMWMzUXVibVYwTVRzd09RWURWUVFMRXpKM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHVZMjl5Y0M0Z1lua2cKY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbE1DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbApaREU2TURnR0ExVUVBeE14Ulc1MGNuVnpkQzV1WlhRZ1UyVmpkWEpsSUZObGNuWmxjaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlVEFlRncwNU9UQTFNalV4TmpBNU5EQmFGdzB4T1RBMU1qVXhOak01TkRCYU1JSERNUXN3Q1FZRFZRUUdFd0pWVXpFVU1CSUcKQTFVRUNoTUxSVzUwY25WemRDNXVaWFF4T3pBNUJnTlZCQXNUTW5kM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FXNWpiM0p3TGlCaQplU0J5WldZdUlDaHNhVzFwZEhNZ2JHbGhZaTRwTVNVd0l3WURWUVFMRXh3b1l5a2dNVGs1T1NCRmJuUnlkWE4wTG01bGRDQk1hVzFwCmRHVmtNVG93T0FZRFZRUURFekZGYm5SeWRYTjBMbTVsZENCVFpXTjFjbVVnVTJWeWRtVnlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdMQURDQmh3S0JnUUROS0lNMFZCdUo4dyt2TjVFeC82OHhZTW1vNkxJUQphTzJmNTVNMjhRcGt1MGYxQkJjL0kwZE54U2NaZ1NZTVZISU5pQzNaSDVvU243eXpjZE9BR1Q5SFpudU1OU2pTdVFyZkpOcWMxbEI1CmdYcGEwemYzd2tyWUtaSW1aTkhrbUd3NkFJcjFOSnRsK08zakVQLzl1RWxZM0tEZWdqbHJnYkVXR1dHNVZMYm1Rd0lCQTZPQ0FkY3cKZ2dIVE1CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6Q0NBUmtHQTFVZEh3U0NBUkF3Z2dFTU1JSGVvSUhib0lIWXBJSFZNSUhTTVFzdwpDUVlEVlFRR0V3SlZVekVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1WlhReE96QTVCZ05WQkFzVE1uZDNkeTVsYm5SeWRYTjBMbTVsCmRDOURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJQ2hzYVcxcGRITWdiR2xoWWk0cE1TVXdJd1lEVlFRTEV4d29ZeWtnTVRrNU9TQkYKYm5SeWRYTjBMbTVsZENCTWFXMXBkR1ZrTVRvd09BWURWUVFERXpGRmJuUnlkWE4wTG01bGRDQlRaV04xY21VZ1UyVnlkbVZ5SUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVEwd0N3WURWUVFERXdSRFVrd3hNQ21nSjZBbGhpTm9kSFJ3T2k4dmQzZDNMbVZ1CmRISjFjM1F1Ym1WMEwwTlNUQzl1WlhReExtTnliREFyQmdOVkhSQUVKREFpZ0E4eE9UazVNRFV5TlRFMk1EazBNRnFCRHpJd01Ua3cKTlRJMU1UWXdPVFF3V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVOEJkaUUxVTlzLzhLQUd2N1VJU1g4KzFpMEJvdwpIUVlEVlIwT0JCWUVGUEFYWWhOVlBiUC9DZ0JyKzFDRWwvUHRZdEFhTUF3R0ExVWRFd1FGTUFNQkFmOHdHUVlKS29aSWh2WjlCMEVBCkJBd3dDaHNFVmpRdU1BTUNCSkF3RFFZSktvWklodmNOQVFFRkJRQURnWUVBa053d0F2cGtkTUtuQ3FWOElZMDBGNmo3Unc3L0pYeU4KRXdyNzVKaTE3NHo0eFJBTjk1Sys4Y1BWMVpWcUJMc3N6aVkyWmNneHh1ZnVQK05YZFlSNkVlOUdUeGowMDVpN3FJY3l1bkwyUE9JOQpuOWNkMmNOZ1E0eFlEaUtXTDJLakxCKzZyUVh2cXpKNGg2QlVjeG0xWEFYNVVqNXRMVVVMOXdxVDZ1MEcrYkk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWERDQ0EwU2dBd0lCQWdJRU9HTzVaakFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1ClpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnBibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHAKYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNUlFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVgpCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4Ck56VXdOVEZhRncweE9URXlNalF4T0RJd05URmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTMKZDNkM0xtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbApNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQzV1ClpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXFLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTApHcDE4RXpvT0gxdTNIcy9sSkJRZXNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyCmhSU0dsVnVYTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVFhUelcKbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvSG9aZGVub1Z2ZThBamhVaQpWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUg0UUlEQVFBQm8zUXdjakFSQmdsZ2hrZ0JodmhDCkFRRUVCQU1DQUFjd0h3WURWUjBqQkJnd0ZvQVVWZVNCMFJHQXZ0aUp1UWlqTWZtaEpBa1d1WEF3SFFZRFZSME9CQllFRkZYa2dkRVIKZ0w3WWlia0lvekg1b1NRSkZybHdNQjBHQ1NxR1NJYjJmUWRCQUFRUU1BNGJDRlkxTGpBNk5DNHdBd0lFa0RBTkJna3Foa2lHOXcwQgpBUVVGQUFPQ0FRRUFXVWVzSVlTS0Y4bWNpVk1ldW9DRkdzWThUajZ4bkxaOHhwSmRHR1FDNDlNR0NCRmhmR1BqSzUweEEzQjIwcU1vCm9QUzdtbU56N1czbEt0dnRGS2tyeGpZUjBDdnJCNHVsMnA1Y0daMVdFdlZVS2NnRjdiSVNLbzMwQXh2LzU1SVFoN0E2dGNPZEJUY1MKbzhmMEZiblZwRGtXbTFNNkk1SHhxSUtpYW9ob3dYa0NJcnlxcHRhdTM3QVVYN2lIME4xOGYzdi9yeHpQNXRzSHJWN2JoWjNRS3cwegoyd1RSNWtsQUV5dDIrejdwbklrUEZjNFlzSVY0SVU5clR3NzZObWZOQi9ML0NORGkzdG0vS3ErNGg0WWhQQVRLdDVSb2Y4ODg2WmpYCk9QL3N3TmxROEM1TFdLNUdiOUF1dzJEYWNsVnl2VXhGbm1HNnY0U0JrZ1BSMG1sOHhRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKUlRFU01CQUdBMVVFCkNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWURWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGkKWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWERUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQwpTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5WlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzCmRHbHRiM0psSUVONVltVnlWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUUKdXlLcm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anJJWjNBUVNzQgpVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllS21wWWNxV2U0UHd6VjkvbFNFeS9DCkc5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1WG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDkKWGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnlkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcgpsM1JqTTcxb0dESHdlSTEydi95ZWpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JClZEYUdlenExQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUIKQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyOWhrVEk3Z1FDdmxZcE5SaApjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3hqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1CmhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMEVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2EKWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6a3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SApSQ3dCWGJzZHRUTFNSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDa0RDQ0FmbWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURCYU1Rc3dDUVlEVlFRR0V3SlZVekVjTUJvR0ExVUVDaE1UClJYRjFhV1poZUNCVFpXTjFjbVVnU1c1akxqRXRNQ3NHQTFVRUF4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1IyeHZZbUZzSUdWQ2RYTnAKYm1WemN5QkRRUzB4TUI0WERUazVNRFl5TVRBME1EQXdNRm9YRFRJd01EWXlNVEEwTURBd01Gb3dXakVMTUFrR0ExVUVCaE1DVlZNeApIREFhQmdOVkJBb1RFMFZ4ZFdsbVlYZ2dVMlZqZFhKbElFbHVZeTR4TFRBckJnTlZCQU1USkVWeGRXbG1ZWGdnVTJWamRYSmxJRWRzCmIySmhiQ0JsUW5WemFXNWxjM01nUTBFdE1UQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF1dWNYa0FKbHNUUlYKUEVuQ1VkWGZwOUUzajlIbmdYTkJVbUNibmFFWEpuaXR4N0hvSnBReXRkNHpqVG92Mi9LYWVscHptS05jNmZ1S2N4dGM1OE8vZ0d6TgpxZlRXSzhEMytabXFZNkt4UndJUDFPUlJPaEk4YklwYVZJUncyOEhGa005eVJjdW9XY0ROTTUwL281YnJoVE1oSEQ0ZVBtQnVkcHhuCmhjWEl3MkVDQXdFQUFhTm1NR1F3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGoKQkJnd0ZvQVV2cWlnZEhKUWEwUzN5U1BZKzZqL3MxZHJhR3d3SFFZRFZSME9CQllFRkw2b29IUnlVR3RFdDhrajJQdW8vN05YYTJocwpNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBRERpQVZHcXgrcGYycm5RWlE4dzFqN2FEUlJKYnBHVEp4UXg3OFQzTFVYNDdNZS9va0VOCkk3U1MrUmtBWjcwQnI4M2djZnhhejJURTRKYVkwS05BNGdHSzd5Y0g4V1VCaWtRdEJtVjFVc0NHRUNBaFgyeHJEMnl1Q1J5djhxSVkKTk1SMXBITWM4WTNjNzYzNXMzYTBrci9jbFJBZXZzdklPMXFFWUJsV2xLbFYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNnakNDQWV1Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRUUZBREJUTVFzd0NRWURWUVFHRXdKVlV6RWNNQm9HQTFVRUNoTVQKUlhGMWFXWmhlQ0JUWldOMWNtVWdTVzVqTGpFbU1DUUdBMVVFQXhNZFJYRjFhV1poZUNCVFpXTjFjbVVnWlVKMWMybHVaWE56SUVOQgpMVEV3SGhjTk9Ua3dOakl4TURRd01EQXdXaGNOTWpBd05qSXhNRFF3TURBd1dqQlRNUXN3Q1FZRFZRUUdFd0pWVXpFY01Cb0dBMVVFCkNoTVRSWEYxYVdaaGVDQlRaV04xY21VZ1NXNWpMakVtTUNRR0ExVUVBeE1kUlhGMWFXWmhlQ0JUWldOMWNtVWdaVUoxYzJsdVpYTnoKSUVOQkxURXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTTR2R2J3WHQzZmVrNmxmV2cwWFR6UWFESmowSXRsWgoxTVJvUnZDME5jV0ZBeURHcjBXbElWRkZRZXNXV0RZeWIrSlFZbVQ1L1ZHY3FpVFo5SjJES29jS0lkTVNPRFJzalFCdVdxRFpRdTRhCklaWDVVa3hWV3NVUE9FOUcrbTM0TGpYV0hYenI0dkN3ZFlESXFST3N2b2p2T202clh5bzRZZ0t3RW52K2o2WURBZ01CQUFHalpqQmsKTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZFcDRNbElSMjFrVwpObDdmd1JRMlFHcEhmRXloTUIwR0ExVWREZ1FXQkJSS2VESlNFZHRaRmpaZTM4RVVOa0JxUjN4TW9UQU5CZ2txaGtpRzl3MEJBUVFGCkFBT0JnUUIxVzZpYkF4SG02VlpNemZtcFRNQU5tdlBNWldubUpYYk1XYmZXVk1NZHpabXNHZDIwaGRYZ1BmeGlJS2VFUzFobDhlTDUKbFNFLzlkUitXQjVIaDFRK1dLRzF0ZmdxNzNIbnZNUDJzVWxHNHRlZ2ErVldlcG9ubUh4R1loVG55Znh1QXhKNWdEZ2RTSUtOL0JmKwpLcFlydFdLbXBqMjlmNUpaelZvcWdySTNlUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FvbWdBd0lCQWdJRU4zRFB0VEFOQmdrcWhraUc5dzBCQVFVRkFEQk9NUXN3Q1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFCkNoTU9SWEYxYVdaaGVDQlRaV04xY21VeEpqQWtCZ05WQkFzVEhVVnhkV2xtWVhnZ1UyVmpkWEpsSUdWQ2RYTnBibVZ6Y3lCRFFTMHkKTUI0WERUazVNRFl5TXpFeU1UUTBOVm9YRFRFNU1EWXlNekV5TVRRME5Wb3dUakVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVApEa1Z4ZFdsbVlYZ2dVMlZqZFhKbE1TWXdKQVlEVlFRTEV4MUZjWFZwWm1GNElGTmxZM1Z5WlNCbFFuVnphVzVsYzNNZ1EwRXRNakNCCm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTVEazVreDVTQmhzb052aXlveW5GN1k2eUViMys2K2UwZE1LUC93WG4KMlowR3Z4TElQdzd5MXRFa3NoSGUwWE1KaXRTeExKZ0pEUjVRUnJLRHBrV05ZbWk3aFJzZ2NES3FRTTJtbGwvRWNUYy9CUE8zUVNRNQpCeG9lTG1GWW9CSUw1YVhmeGF2cU4zSE1ITWczT3JtWFVxZXN4V29rbEU2Y2U4L0FhdGJmSWIwQ0F3RUFBYU9DQVFrd2dnRUZNSEFHCkExVWRId1JwTUdjd1phQmpvR0drWHpCZE1Rc3dDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PUlhGMWFXWmhlQ0JUWldOMWNtVXgKSmpBa0JnTlZCQXNUSFVWeGRXbG1ZWGdnVTJWamRYSmxJR1ZDZFhOcGJtVnpjeUJEUVMweU1RMHdDd1lEVlFRREV3UkRVa3d4TUJvRwpBMVVkRUFRVE1CR0JEekl3TVRrd05qSXpNVEl4TkRRMVdqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVVVKNEw2cTllCnVTQklwbEJxeS8zWUlIcW5nbll3SFFZRFZSME9CQllFRkZDZUMrcXZYcmtnU0taUWFzdjkyQ0I2cDRKMk1Bd0dBMVVkRXdRRk1BTUIKQWY4d0dnWUpLb1pJaHZaOUIwRUFCQTB3Q3hzRlZqTXVNR01EQWdiQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFBeUdncTNvVGhyMQpqb2tuNGpWWVBTbTBCNDgyVUpXL2JzR2U2OFNRc29Xb3U3ZEM0QThIT2QvN25wQ3kwY0UrVTU4RFJMQitTL1J2NUh3ZjUrS3g1TGlhCjc4Tzl6dDRMTWpUWjNpanRNMnZFMU5jOUVsaXJmUWt0eTNEMUU0cVVvU2VrMW5ERmJaUzF5WDJkb05MR0NFblpacHVtMC9RTDNNVW0KVitHUk1Pck4KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWRkVHJ1c3QgTG93LVZhbHVlIFNlcnZpY2VzIFJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHRENDQXdDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJsTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVQpjblZ6ZENCRGJHRnpjeUF4SUVOQklGSnZiM1F3SGhjTk1EQXdOVE13TVRBek9ETXhXaGNOTWpBd05UTXdNVEF6T0RNeFdqQmxNUXN3CkNRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SFRBYkJnTlZCQXNURkVGa1pGUnlkWE4wSUZSVVVDQk8KWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1dsdFFoU1dEaWEraEJCd3pleE9EY0V5UE53VFhIKzlaT0VRcG5YdlVHVzJ1bENEdGJLUlk2CjU0ZXlOQWJGdkFXbEEzeUN5eWtRcnVHSWdiM1dudFArTFZiQkZjN2pKcDBWTGhEN0JvOHdCTjZudEdPMC83R2Nyanl2ZDdaV3hiV3IKb3VscE9qME9NM2t5UDNDQ2twbGhiWTB3Q0k5eFA2WklWeG40SmR4TFpseWxkSStZcnNqNXdBWWk1Nnh6MzZVdSsxTGNzUlZsSVBvMQpabW5lM3l6eGJyd3cyeXdrRXR2ck5UVm9rTXNBc0pjaFBYUWhJMlUwSzd0NFdhUFc0WFk1bXFSSmpveDByMjZrbXFQWm05STRYSnVpCkdNeDFJNFMrNitKTk0zR09HdkRDK01jZG9xMERseXo0enlYRzlyZ2tNYkZqWFpKL1kvQWx5Vk11SDc5TkFnTUJBQUdqZ2RJd2djOHcKSFFZRFZSME9CQllFRkpXeHRQQ1V0cjNIMnRFUkNTRyt3YTlKL1JCN01Bc0dBMVVkRHdRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUlHUEJnTlZIU01FZ1ljd2dZU0FGSld4dFBDVXRyM0gydEVSQ1NHK3dhOUovUkI3b1dta1p6QmxNUXN3Q1FZRFZRUUdFd0pUClJURVVNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SFRBYkJnTlZCQXNURkVGa1pGUnlkWE4wSUZSVVVDQk9aWFIzYjNKck1TRXcKSHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUN4dApaQnNmelEzZHVRSDZsbU0wTWtoSG1hNlg3ZjF5RnFaelIxcjA2OTNwOWRiN1Jjd3BpVVJkdjBZNVBlanV2RTFVaGg0ZGJPTVhKMFBoCmlWWXJxVzl5VGtrejQzSjhLaU9hdkQ3L0tDcnRvLzhjSTdwRFZ3bG5UVXRpQmkzNC8yeWRZQjdZSEV0OXRURXYyZEI4WGZqZWE0TVkKZURkWEwrZ3pCMmZmSHNkcktwVjJybzlYby9EMFVyU3BVd2pQNEUvVGVsT0wvYnNjVmpieS9ySzI1WGE3MVNKbHB6LyswV2F0Qzd4cgptWWJ2UDMzekdETEtlOGJqcTJSR2xmZ21hZGxWZzNzc2xnZi9XU3hFbzhibDZhbmNvV09BV2lGZUljOVRWUEM2YjRuYnFLcVZ6NHZqCmNjd2VHeUJFQ01CNnRrRDl4T1ExNFIwV0hOQzhLNDdXY2RrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZGRUcnVzdCBFeHRlcm5hbCBSb290Cj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVOakNDQXg2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJ2TVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRApWUVFERXhsQlpHUlVjblZ6ZENCRmVIUmxjbTVoYkNCRFFTQlNiMjkwTUI0WERUQXdNRFV6TURFd05EZ3pPRm9YRFRJd01EVXpNREV3Ck5EZ3pPRm93YnpFTE1Ba0dBMVVFQmhNQ1UwVXhGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVNZd0pBWURWUVFMRXgxQlpHUlUKY25WemRDQkZlSFJsY201aGJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZwpVbTl2ZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGYzR2pQbThnQUVMVG5nVGx2dEg3eHNEODIxCitpTzJ6dDZiRVRPWHBDbE1mWk9mdlVxOGsrMERHdU9QeitWdFVGcldseW1VV29Dd1NYcmJMcFg5dU1xL056Z3RIajZSUWExd1ZzZncKVHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelhtazZ2QmJPbWNaU2NjYk5RWUFySEU1MDRCNFlDcU9tbwphU1lZa0t0TXNFOGpxenBQaE5qZnpwL2hhVys3MTBMWGEwVGt4NjN1YlVGZmNscHhDRGV6ZVdXa1dhQ1VOL2NBTHczQ2tuTGEwRGh5CjJ4U29SY1JkS24yM3ROYkU3cXpORTBTM3lTdmRRd0FsK21HNWFXcFlJeEczcHpPUFZuVlo5YzBwMTBhM0NpdGx0dE5DYnhXeXVIdjcKNytsZFU5VTBXaWNDQXdFQUFhT0IzRENCMlRBZEJnTlZIUTRFRmdRVXJiMlllalMwSnZmNnhDWlU3d085NENUTFZCb3dDd1lEVlIwUApCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2daa0dBMVVkSXdTQmtUQ0Jqb0FVcmIyWWVqUzBKdmY2eENaVTd3Tzk0Q1RMClZCcWhjNlJ4TUc4eEN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVWNuVnpkQ0JCUWpFbU1DUUdBMVVFQ3hNZFFXUmsKVkhKMWMzUWdSWGgwWlhKdVlXd2dWRlJRSUU1bGRIZHZjbXN4SWpBZ0JnTlZCQU1UR1VGa1pGUnlkWE4wSUVWNGRHVnlibUZzSUVOQgpJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTENiNElVbHd0WWo0ZytXQnBLZFFaaWMyWVI1Z2RrZVd4UUhJelpsCmo3RFlkN3VzUVd4SFlJTlJzUGt5UGVmODlpWVR4NEFXcGI5YS9JZlBlSG1KSVpyaVRBY0toalc4OHQ1UnhOS1d0OXgrVHU1dy9SdzUKNnd3Q1VSUXRqcjBXNE1IZlJuWG5KSzNzOUVLMGhaTndFR2U2blFZMVNoalRLM3JNVVVLaGVtUFI1cnVoeFN2Q05yNFREZWE5WTM1NQplNmNKRFVDcmF0MlBpc1AyOW93YVFnVlIxRVgxbjZkaUlXZ1ZJRU04bWVkOHZTVFlxWkVYYzRnL1Zoc3hPQmkwY1ErYXpjZ09ubzR1CkcrR01tSVBMSHpIeFJFekdCSE5KZG1BUHgvaTlGNEJyTHVuTVRBNWFtbmtQSUFvdTFaNWpKaDVWa3BUWWdoZGFlOUM4eDQ5T2hnUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWRkVHJ1c3QgUHVibGljIFNlcnZpY2VzIFJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJrTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0F3SGdZRFZRUURFeGRCWkdSVQpjblZ6ZENCUWRXSnNhV01nUTBFZ1VtOXZkREFlRncwd01EQTFNekF4TURReE5UQmFGdzB5TURBMU16QXhNRFF4TlRCYU1HUXhDekFKCkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVY25WemRDQkJRakVkTUJzR0ExVUVDeE1VUVdSa1ZISjFjM1FnVkZSUUlFNWwKZEhkdmNtc3hJREFlQmdOVkJBTVRGMEZrWkZSeWRYTjBJRkIxWW14cFl5QkRRU0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTZSb3dqNE9JRk1FZzJEeWJqeHQrQTNTNzJtblRScVg0anNJTUVaQlJwUzltVkVCVjZ0c2ZTbGJ1Cm55TnU5RG5Mb2JsdjhuNzVYWWNtWVo0YytPTHNwb0g0SWNVa3pCRU1QOXNtY25ySEFaY0hGL25YR0N3d2ZRNTZIbUlleGt2QS9YMWkKZDlORUhpZjJQMHRFczdjNDJUa2ZZTlZSa25NRHRBQnA0L01VVHU3UjNBblBkelJHVUxENEVmTCtPSG4zQnpuK1VaS1hDMXNJWHpTRwpBYTJJbCt0bXpWN1IvOXg5OG9UYXVuZXQzSUFJeDZlSDFsV2ZsMnJveUJGa3V1Y1pLVDhSczNpUWhDQlNXeEh2ZU5DRDl0VklrTkF3CkhNK0ErV0QrZWVTSTh0MEE2NVJGNjJXVWFVQzZ3TlcwdUxwOUJCR282ekVGbHBST1dDR09uOUJnL1FJREFRQUJvNEhSTUlIT01CMEcKQTFVZERnUVdCQlNCUGpmWWtyQWZkNTljdEt0enF1ZjJOR0F2K2pBTEJnTlZIUThFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekNCamdZRFZSMGpCSUdHTUlHRGdCU0JQamZZa3JBZmQ1OWN0S3R6cXVmMk5HQXYrcUZvcEdZd1pERUxNQWtHQTFVRUJoTUNVMFV4CkZEQVNCZ05WQkFvVEMwRmtaRlJ5ZFhOMElFRkNNUjB3R3dZRFZRUUxFeFJCWkdSVWNuVnpkQ0JVVkZBZ1RtVjBkMjl5YXpFZ01CNEcKQTFVRUF4TVhRV1JrVkhKMWMzUWdVSFZpYkdsaklFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVAzRlVyNApKTm9qVmhhVGR0MDJLTG11RzdqRDhXUzZJQmg0bFNrblZ3VzhmQ3IwdVZGVjJvY0MzZzhXRnpINHFua3VDUk83cjdJZ0dSTGxrL2xMCitZUG9STld5UVNXL2lIVnYveEQ4U2xUUVgvRDY3elp6ZlJzMlJjWWhiYlFWdUU3UG5GeWxQVm9BamdialBHc3llL0tmOExiOTMvQW8KR0Vqd3hyelF2elNBbHNKS3NXMk94NUJGM2k5bnJFVUVvM3JjVlpMSlIyYllHb3pIN1p4T211QVN1N1ZxVElUaDRTSU5od0JrL294OQpZamxscHU5Q3RvQWxFbUVCcUNRVGNBQVJKbC82TlZERlNNd0dSK2duMkhDTlgyVG1vVVFtWGlMc2tzMy9RcHBFSVcxY3hlTWlIVjlICkV1Zk9YMTM2MktxeE15M1pkdkpPT2pNTUs3TXRrQVk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFkZFRydXN0IFF1YWxpZmllZCBDZXJ0aWZpY2F0ZXMgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIakNDQXdhZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJuTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU013SVFZRFZRUURFeHBCWkdSVQpjblZ6ZENCUmRXRnNhV1pwWldRZ1EwRWdVbTl2ZERBZUZ3MHdNREExTXpBeE1EUTBOVEJhRncweU1EQTFNekF4TURRME5UQmFNR2N4CkN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVWNuVnpkQ0JCUWpFZE1Cc0dBMVVFQ3hNVVFXUmtWSEoxYzNRZ1ZGUlEKSUU1bGRIZHZjbXN4SXpBaEJnTlZCQU1UR2tGa1pGUnlkWE4wSUZGMVlXeHBabWxsWkNCRFFTQlNiMjkwTUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNUI2YS90d0pXb2VrbjBlK0VWK3ZoRFRiWWp4NWVMZnBNTFhzREJ3cXhCYi80T3h4CjY0cjFFVzd0VHcyUjBoSVlMVWtWQWNLa0loUEhFV1QvSWhLYXVZNWNMd2pQY1dxelp3Rlo4VjFHODdCNHBmWU9RbnJqZnh2TTBQQzMKS1AwcTZwNnpzTGtFcXYzMng3U3h1Q3FnKzFqeEdhQnZjQ1YrUG1sS2Z3OGkyTyt0Q0JHYUtabmhxa1JGbWhKZVBwMXRVdnpub0QxbwpML0JMY0h3VE9LMjhGU1h4MXM2cm9zQXgxaStmNFA4VVdmeUVrOW1IZkV4VUUrdWYwUzBSK0JnNk90NGwyZmZUUU8ya0JoTEVPK0dSCndWWTE4QlRjWlRZSmJxdWtCOGMxMGNJRE16WmJkU1p0UXZFU2EwTnZTM0dVK2pRZDdSTnV5b0IvbUM5c3VXWFk2UUlEQVFBQm80SFUKTUlIUk1CMEdBMVVkRGdRV0JCUTVsWXRpaTF6SjFJQzZXQStYUHhVSVE4eVlwekFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96Q0JrUVlEVlIwakJJR0pNSUdHZ0JRNWxZdGlpMXpKMUlDNldBK1hQeFVJUTh5WXA2RnJwR2t3WnpFTE1Ba0dBMVVFCkJoTUNVMFV4RkRBU0JnTlZCQW9UQzBGa1pGUnlkWE4wSUVGQ01SMHdHd1lEVlFRTEV4UkJaR1JVY25WemRDQlVWRkFnVG1WMGQyOXkKYXpFak1DRUdBMVVFQXhNYVFXUmtWSEoxYzNRZ1VYVmhiR2xtYVdWa0lFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUJtcmRlcjRpMlZobFJPNmFRVHZoc29Ub01lcVQyUWJQeGoycUMwc1ZZOEZ0ekRxUW1vZHdDVlJMYWUvRExQdDd3aC9iRHhHCkd1b1lROTkyelBsbWhwd3NhUFhwRi9neHN4akUxa2g5STB4b3dYNjdBUlJ2eGRsdTNyc0VRbXI0OWx4OTVkcjZoK3NOTlZKbjBKNlgKZGdXVFA1WEhBZVpwVlRoL0VHR1p5ZU5mcHNvK2dtTklxdUlJU0Q2cThyS0ZZcWEwcDltOU41eG90UzFXZmJDM1A2Q3hCOWJwVDl6ZQpSWEV3TW44YkxnbjV2MUtoN3NLQVBnWmNMbFZBd1J2MWNFV3czRjM2OW5KYWQ5Smp6YzlZaVFCQ1l6OTVPZEJFc0lKdVFSbm8zZURCCmlGclJIbkdUSHlRd2RPVWVxTjQ4SnpkL2c2NmVkOC93TUxIL1M1bm94cUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVrVENDQTNtZ0F3SUJBZ0lFUld0UVZEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnNERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlYKQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKdwpiM0poZEdWa0lHSjVJSEpsWm1WeVpXNWpaVEVmTUIwR0ExVUVDeE1XS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHCkExVUVBeE1rUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTAKTWxvWERUSTJNVEV5TnpJd05UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdQpNVGt3TndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeVpXWmxjbVZ1ClkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WQkFNVEpFVnVkSEoxYzNRZ1VtOXYKZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGb051M3MvcG9CajZFNEtQejNFRVptTGswZUdyRWFUc2JSd0pXSXNNbi9NWXN6CkE5dTNnM3MrSUlSZTdiSldLS2Y0NExsQWNUZkZ5MGNPbHlwb3dDS1ZZaFhiUjluMTBDdi9na3ZKclQ3ZVROdVFnRkEvQ1lxRUFPd3cKQ2owWXpmdjlLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJcmI2OApqNnhTbGt1cVVZM2tFekVaNkU1Tm45dXNzMnJWdkRsVWNjcDZlbitRM1gwZGdObUJ1MWttd2hIKzVwUGk5NERrWmZzME53NHBnSEJOCnJ6aUdMcDUvVjYrZUY2N3JITXNvSVYrMkhOam5vZ1FpK2RQYTJNc0NBd0VBQWFPQnNEQ0JyVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMQpNelF5V2pBZkJnTlZIU01FR0RBV2dCUm9rT1JucEtaVGdNZUdacVR4OTB0RCs0UzliVEFkQmdOVkhRNEVGZ1FVYUpEa1o2U21VNERICmhtYWs4ZmRMUS91RXZXMHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWamN1TVRvMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dE8xS3pLdHZuMUlTTQpZL1lQeXlZQmtWQnM5RjhVNHBOMHdCT2VNRHBRNDdSZ3hSendJa1NOY1Vlc3lCcko2WnVhQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhCnY1MlZyMnVhMko3cDhlUkRqZUlSUkRxL3I3MkRRbk5TaTZxN3B5blA5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFMKVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2L2V1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMAp0SHV1Mmd1UU9IWHZnUjFtMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpSU0EgU2VjdXJpdHkgMjA0OCB2Mwo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFlUQ0NBa21nQXdJQkFnSVFDZ0VCQVFBQUFud0FBQUFLQUFBQUFqQU5CZ2txaGtpRzl3MEJBUVVGQURBNk1Sa3dGd1lEVlFRSwpFeEJTVTBFZ1UyVmpkWEpwZEhrZ1NXNWpNUjB3R3dZRFZRUUxFeFJTVTBFZ1UyVmpkWEpwZEhrZ01qQTBPQ0JXTXpBZUZ3MHdNVEF5Ck1qSXlNRE01TWpOYUZ3MHlOakF5TWpJeU1ETTVNak5hTURveEdUQVhCZ05WQkFvVEVGSlRRU0JUWldOMWNtbDBlU0JKYm1NeEhUQWIKQmdOVkJBc1RGRkpUUVNCVFpXTjFjbWwwZVNBeU1EUTRJRll6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdDQ5VmNkS0EzWHRwZWFmd0dGQXlQR0puOWdxVkI5M21HL09lMmRKQlZHdXRuM3krR2MzN1JxdEJhQjRZNmxYSUw1RjRpU2o3Ckp5bGcvOStQakR2SlNadTFwSlRPQWVvK3RXTjdmeWI5R2QzQUliMkUwUzFQUnNOTzNOZzNPVHNvcjh1ZEd1b3JyeUdsd1NNaXVMZ2IKV2hPSFY0UFI4Q0RuNkU4alFyQUFwWDJKNmVsaGM1U1ljU2E4TFdyZzkwM3c4YllxT0RHQkRTbmhBTUZSRDB4UytBUmFxbjF5MDdpSApLcnRqRUFNcXM2RlBEVnBlUnJjOUR2VjA3Sm1mK1Qwa2dZaW0zV0JVNkpVMlBjWUprNXFqRW9BQVZaa1pSNzNRcFh6RHV2c2Y5L1VQCitLeTV0ZlEzbUJNWTNvVmJ0d3lDTzRkdmxUbFlNTnB1QVdnWElzekFDd0lEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JRSHcxRXdwS3JwUmE0MUpQci9KQ3d6MExHZGpEQWRCZ05WSFE0RQpGZ1FVQjhOUk1LU3E2VVd1TlNUNi95UXNNOUN4bll3d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGOCtoblp1dURVOFRqWWNIbm1ZCnYvM1ZFaEY1VWc3dU1ZbTgzWC81MGNZVkllaUtBVlFOT3Z0VXVkWmoxTEdxbGsyaVFrM1VVeCtMRU41L1piNWdFeWR4aUtSejQ0UmoKMGFSVjRWQ1Q1aHNPZWRCbnZFYkl2ejhYRFpYbXhwQnAzdWUwTDk2VmZkQVNQejArZjAwL0ZHajFFVkRWd2ZTUXBRZ2RNV0QvWUl3agpWQXF2L3FGdXhkRjZLbWg0eng2Q0NpQzBINjNsaGJKcWFIVk9yU1UzbElXK3ZhSFU2cmNNU3p5ZDZCSUE4RitzRGVHc2NHTno5Mzk1Cm56SWxRblFGZ0NpL3ZjRWtsbGdWc1JjaDZZbEwyd2VJWi9RVnJYQStMMDJGTzhLMzIvNllhQ09KNFhRUDN2VEZoR01wRzh6TEI4a0EKcEtuWHdpSlBaOWQzN0NBRllkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2VvVHJ1c3QgR2xvYmFsIENBCj09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZEQ0NBanlnQXdJQkFnSURBalJXTUEwR0NTcUdTSWIzRFFFQkJRVUFNRUl4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRSwpFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Sc3dHUVlEVlFRREV4SkhaVzlVY25WemRDQkhiRzlpWVd3Z1EwRXdIaGNOTURJd05USXhNRFF3Ck1EQXdXaGNOTWpJd05USXhNRFF3TURBd1dqQkNNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKTGpFYk1Ca0dBMVVFQXhNU1IyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQTJzd1lZekQ5OUJjakdsWitXOTg4YkRqa2NiZDRrZFM4b2RoTStLaER0Z1BwVFNFSENJamFXQzltT1NtOUJYaUxuVGpvCkJiZHFmbkdrNXNSZ3ByRHZnT1NKS0ErZUpkYnRnL090cHBISG1NbENHRFVVbmEyWVJwSXVUOHJ4aDBQQkZwVlhMVkR2aVMyQWVsZXQKOHU1ZmE5SUFqYmtVK0JRVk5kbkFScU43Y3NpUnY4bFZLODNRbHo2Y0ptVE0zODZER1hIS1R1YlUxWHVwR2MxVjNzanMwbDQ0VStWYwpUNHd0L2xBak52eG01c3VPcERrWkFMZVZBam1SQ3c3K09DN1JIUVdhOWswK2J3OEhIYThzSG85Z09lTDZObE1UT2RSZUppdmJQYWdVCnZUTHJHQU1vVWdSeDVhc3pQZUU0dXdjMmhHS2NlZW9XTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCVEFlcGhvalluN3F3VmtEQkY5cW4xbHVNck1UakFmQmdOVkhTTUVHREFXZ0JUQWVwaG9qWW43cXdWawpEQkY5cW4xbHVNck1UakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBTmVNcGF1VXZYVlNPS1ZDVW41a2FGT1NQZUNwaWxLSW5aNTdRCnp4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmU3RRV1ZZcm1tM29rOU5uczQKZDBpWHJLWWdqeTZteVF6Q3NwbEZBTWZPRVZFaUl1Q2w2cllWU0FsazZsNVBkUGNGUHNlS1VnemJGYlM5Ylp2bHhyRlVhS25qYVpDMgptcVVQdUxrL0lIMnVTclc0bk9RZHRxdm1sS1hCeDRPdDIvVW5odzRFYk5YLzNhQmQ3WWRTdHlzVkFxNDVwbXAwNmRyRTU3eE5OQjZwClhFMHpYNUlKTDRobVhYZVh4eDEyRTZuVjVmRVdDUkUxMWF6YkpIRndMSmhXQzlrWHROSGpVU3RlZGVqVjBOeFBOTzNDQldhQW9jdm0KTXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHZW9UcnVzdCBHbG9iYWwgQ0EgMgo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFpqQ0NBazZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkVNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTgpSMlZ2VkhKMWMzUWdTVzVqTGpFZE1Cc0dBMVVFQXhNVVIyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQklESXdIaGNOTURRd016QTBNRFV3Ck1EQXdXaGNOTVRrd016QTBNRFV3TURBd1dqQkVNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKTGpFZE1Cc0dBMVVFQXhNVVIyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQklESXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRHZQRTFBUFJEZk8xTUE0V2YrbEdBVlBvV0k4WWtOa01nb0k1a0Y2Q3NnbmNiellFYll3YkxWakRIWjNDQjVKSUcvCk5UTDhZMm5ic1NwcjdpRlk4Z2pwZU10dnkvd1dVc2lSeFA4OWM5NnhQcWZDZldiQjlYNVNKQnJpMVdlUjBJSVExM2hMVHl0Q09iMWsKTFVDZ3NCRFRPRWhHaUtFTXV6b3pLbUtZK3dDZEUxbC9ienR5cXU2bUQ0YjVCV0hxWjM4TU41YUw1bWtXUnhIQ0oxa0RzNlpnd2lGQQpWdnFneDMwNkUrUHNWOGV6MXE2ZGlZRDNBZWNzOXBZckV3MTVMTm5BNUlaN1M0d01jb0tLK3hmTkFHdzZFenl3aElkTEZub3Bzay9iCkhkUUw4MlkzdmRqMlY3dGVKSHE0UEl1NStwSWFHb1NlMkhTUHFodC9YdlQrUlNJaEFnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGSEU0TnZJQ01WTkhLMjY2WlVhcEVCVllJQVVKTUI4R0ExVWRJd1FZTUJhQUZIRTROdklDTVZOSApLMjY2WlVhcEVCVllJQVVKTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBQS9lMUs2dGRFUHg3CnNySmVySnNPZmxONFdUNUNCUDUxbzYyc2dVN1hBb3RleEMzSVVuYkhMQi84Z1RLWTBVdkdrcE16TlRFdi9OZ2RSTjNnZ1grZDZZdmgKWkpGaUN6a0lqS3gwblZuWmVsbFNseEc1Rm50dlJkT1cyVEY5QWpZUG5EdHV6eXdOQTBaRjY2RDBmMGhFeGdoQXpONGJjTFVwcmJxTApPelJsZFJ0eElSMHNGQXF3bHBXNDF1cnlaZnNwdWsvcWtaTjBhYmJ5LytFYTBBelJkb1hMaWlXOWwxNHNieFdaSnVlMktmOGk3TWtDCngxWUF6VW01czJ4N1V3UWE0cWpKcWhJRkk4TE81N3NFQXN6QVI2TGt4Q2t2VzBWWGlWSHVQT3RTQ1A4SE5SNmZOV3BIU2xhWTBWcUYKSDR6MUlyK3J6b1B6NGlJcHJuMkRRS2k2YkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHZW9UcnVzdCBVbml2ZXJzYWwgQ0EKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYURDQ0ExQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OClIyVnZWSEoxYzNRZ1NXNWpMakVlTUJ3R0ExVUVBeE1WUjJWdlZISjFjM1FnVlc1cGRtVnljMkZzSUVOQk1CNFhEVEEwTURNd05EQTEKTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdQpZeTR4SGpBY0JnTlZCQU1URlVkbGIxUnlkWE4wSUZWdWFYWmxjbk5oYkNCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQCkFEQ0NBZ29DZ2dJQkFLWVZWYUNqeHVBZmpKMGhVTmZCdml0YnRhU2VvZGx5V0wwQUcweS9ZY2tVSFVXQ3E4WWRnTlk5NnhDY09xOXQKSlBpOGNRR2VCdlY4WHg3QkRsWEtnNXBaTUs0Wnl6QklsZTBpTjQzMFNwcHlaajZ0bGNEZ0ZnRGdFQjhyTVE3WGxGVFRRak9nTkIwZQpSWGJkVDhvWU4reUZGWG9aQ1B6Vng1enc4cWt1RUttUzVqMVlQYWtXYUR3dmRTRVlmeWgzcGVGaEY3ZW02ZmdlbWR0emJ2UUtvaUZzCjd0cXFoWkptci9aNmE0TGF1aUlJTlEvUFF2RTErbXJ1ZmlzbHpEb1I1RzJ2YzdKMkhhM1FzbmhuR3FRNUhGRUxaMWFEL1RoZERjN2QKOExzcmxoL2VlekpTL1IyN3RRYWhzaUZlcGRhVmFIL3dtWjdjUlFnKzU5SUpEVFdVM1lCT1U1Zlh0UWxFSUdRV0Z3TUNURk1OYU43VgpxbkpOazIyQ0R0dWN2YyswODF4ZFZIcHBDWmJXMnhIQmpYV290TTg1eU00OHZDUjg1bUxLNGIxOXA3MVhaUXZrL2lYdHRta1EzQ2dhClJyMEJIZENYdGVHWU84QTNaTlk5bE80TDRmVW9yZ3RXdjNHTEl5bEJqb2JGUzFKNzJIR3JING9WcGp1RFd0ZFlBVkhHVEVIWmY5aEIKWjNLaUtOOWdnNm1leUh2OFUzTnlXZldUZWhkMkRzNzM1VnpaQzFVMG9xcGJ0V3BVNXhQS1YreVhiZlJlQmk5RmkxalVJeGFTNUJadQpLR05aTU45UUFaeGppUnFmMnhlVWduQTN3eVNlbWtmV1dzcE9xR21KY2grUmJOdCtuaHV0eHg5ejNTeFBHV1g5ZjVOQUVDN1M4TzA4Cm5pNG9QbWttTThWN0FnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcTdMcXF3RExpSUpsRjAKWEcwRDA4RFlqM3JXTUI4R0ExVWRJd1FZTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQgpoakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBTVhqbXg3WGZ1SlJBeVhIRXFEWHNSaDNDaGZNb1dJYXdDL3lPc2ptUFJGV3JaSVJjCmFhblFtamc4K3VVZk5lVkU0NEI1bEdpa3U4U2ZQZUUwelRCR2kxUXJsYVh2OXorWmhQMDE1czh4eHR4cXY2ZlhJd2pobUY3RFdnaDIKcWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bkFOWEgvS3R0Z0NKd3BRemdYUVFwQXZ2TApvSkhSZk5iRGZsRFZuVmkrUVRqcnVYVThGZG1ieVVxRFdjRGFVLzB6dXpZWW00VVBGZDN1TGF4Mms3blpBWTFJRUtqNzlUaUc4ZHNLCnhyMkVveU5CM3RaM2I0WFVoUnhRNEs1UmlycU5QbmJpdWNvbjhsK2Y3MjVaRFFiWUt4ZWswbnhydTE4VUdraVBHa3puczBjY2preEYKS3lEdVNOL24zUW1PR0tqYVFJMlNKaEZUWVhOZDY3M254RTBwTjJIcnJEa3RaeTRXMXZVQWc0V2h6SDkyeEgza3QwdG03d05GWUdtMgpERktXa29SZXBxTzFwRDRyMmN6WUcwZXE4a1RhVC9rRDZQQVV5ei96Zzk3UXdWVGp0K2dLTjAyTElGa0RNQm1oTE1pOUVSL2Zyc2xLCnhmTW5abWFHckdpUi85bm1VeHdQaTF4cFpRb215QjQwdzExUmU5ZXBuQWFoTnQzVmlaUzgyZVF0REY0SmJBaVhmS005ZkpQL1A2RVUKcDgrMVhldmIyeHpFZHQrSXViMUZCWlVicnZ4R2FreXZTT1BPcmcvU2Z1dm1iSnhQZ1dwNlpLeTdQdFhueTNZdXhhZEl3VnlRRDh2SQpQL3JtTXVHTkcyK2s1bzdZK1NsSWlzNXovaXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFVuaXZlcnNhbCBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCSE1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OClIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjFjM1FnVlc1cGRtVnljMkZzSUVOQklESXdIaGNOTURRd016QTAKTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZwpTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxYzNRZ1ZXNXBkbVZ5YzJGc0lFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBCkE0SUNEd0F3Z2dJS0FvSUNBUUN6VkZMQnlUN3kyZHl4VXhwWktlZXh3MFVvNWRmUjdjWEZTNkdxZEh0WHIwb20vTmoxWHFkdUdkdDAKREU4MVd6SUxBZVBiNjNwM05lcXFXdURXNktGWGxQQ1FvM1JXbEVRd0F4NWNUaXVGSm5TQ2VneDJvRzlOemtFdG9CVUdGRiszUXMxNwpqMWhoTk53cUNQa3V3d0dtSWtRY1RBZUM1bHZPMEVwOEJOTVpjeWZ3cXBoL0xxOU82NGNlSkhkcVhiYm9XMFc2M01PaEJXOVdqbzhRCkpxVkp3eTdYUVljaTRFK0d5bUMxNnFGandBR1hFSG05QUR3U2JTc1ZzYXhMc2U0WXVVNlczTngyL3p1K3oxOER3UHc3Nkw1R0cvL2EKUU1KUzkvN2pPdmRxZHpYUTJvM3JYaGhxTWNjZXVqd2JLTlpyVk1hcVc5ZWlMQnNaektJQzlwdFp2VGRyaHJWdGdyclk2c2xXdktrMgpXUDArR2ZQdERDYXBremo0VDhGZElnYlFsK3JocmNaVjRJRXJLSU02K3ZSN0lWRUF2bEk0enMxbWVhajBnVmJpMElNSlIxRmJVR3JQCjIwZ2FYVDczeS9abDkyenhsZmdDT3pKV2dqbDZXNzB2aVJ1L29iVG8vMytOak44RDhXQk9XQkZNNjZNL0VDdURtZ0Z6MlpSdGhBQW4KWnF6d2NFQUpRcEt0VDVNTllRbFJKTmlTMVF1VVliS0hzdTMvbWpYL2hWVEs3VVJEckJzOEZtdElTZ29jUUlnZmtzSUxBQVgvOHNnQwpTcVNxcWN5Wmxwd3ZXT0I5NGI2N0I5eGZCSEpjTVRURDdGOHQ0RDFra0NMbTBleTRMdDFacnRtaE43OVVOZHh6TWsrTUJCNHpzc2xHCjhkaGN5RlZReVdpOXFMbzJDUUlEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyODFYaCtxUTIKKy9DZlhHSng3VHowUnpnUUt6QWZCZ05WSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RQpCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFHYkJ4aVB6MmVBdWJsL296NjZ3c0NWTksvZzdXSnRBSkRkYXk2c1dTZit6CmRYa3pvUzl0Y0JjMGtmNW5mby9zbStWZWdxbFZIeS9jMUZFSEV2NnNGajRzTmNaai9Od1E2dzJqcXRCOHpOSFFMMUV1eEJSYTN1Z1oKNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJnckZnNWZOdUg4S3JVd0pNL2dZd3g3V0JyKwptYnBDRXJHUjlIeG80c2pvcnl6cXlYNnV1eW85RFJYY05KVzJHSFNvYWcvSHRQUVR4T1JiN1FyU3BKZE1LdTB2YkJLSlBmRW5jS3BxCkExSWhuMENvWjFEeTgxb2YzOThqOXR4NFR1YVlUMVU2VStQdjh2U2Z4M3pZV0s4cElwZTQ0TDJSTHJCMjdGY1J6KzhwUlBQcGhYcGcKWStSZE00a1gyVEdxMnRiekdEVnl6NGNyTDJNamhGMkVqRDlYb0lqOG1aRW9KbW1aMUkrWFJMNk8xVWl4cENncDhSVzA0ZVdlM2ZpUApwbThtMXdrOE9od1JEcVpzTi9ldFJJY3NLTWZZZElLejBHOUtWN3MxS1NlZ2krZ2hwNGRrTmwzTTJCYXN4N0luUUpKVk9DaU5VVzdkCkZHZFRiSEZjSm9STmRWcTJmbUJXcVUydCs1c2VsL01OMmRLWFZIZmFQUkszNEI3dkNBYXMrWVdINmFMY3IzNFlFb1A5VmhkQkx0VXAKZ24yWjlESDJjYW5QTEFFbnBRVzVxckpJVGlydm41TlNVWlU4VW5PT1Zrd1hRTUFKS09TTGFraFQyK3pOVlZYeHh2anBvaXhNcHRFbQpYMzZ2V2t6YUg2YnlIQ3grcmdJVzBsYlFMMWRUUitpUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWVyaWNhIE9ubGluZSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcERDQ0FveWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SlZVekVjTUJvR0ExVUVDaE1UClFXMWxjbWxqWVNCUGJteHBibVVnU1c1akxqRTJNRFFHQTFVRUF4TXRRVzFsY21sallTQlBibXhwYm1VZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F4TUI0WERUQXlNRFV5T0RBMk1EQXdNRm9YRFRNM01URXhPVEl3TkRNd01Gb3dZekVMTUFrRwpBMVVFQmhNQ1ZWTXhIREFhQmdOVkJBb1RFMEZ0WlhKcFkyRWdUMjVzYVc1bElFbHVZeTR4TmpBMEJnTlZCQU1UTFVGdFpYSnBZMkVnClQyNXNhVzVsSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dFUEFEQ0NBUW9DZ2dFQkFLZ3Y2S1JwQmdOSHcra3FtUDhab25DYXhsQ3lmcVhmYUUwYmZBKzJsMmg5TGFhTGwrbGtoc21qNzZDRwp2MkJsbkV0VWlNSkl4VW81dnhUaldWWGxHYlIweUxRRk9Wd1dwZUtWQmVBU3JsbUxvak5vV0J5bTFCVzMySi9YM0hHcmZwcS9tNDR6CkR5TDlIeTduQnpidllqbkYzY3U2SlJRajNnekdQVHpPZ2dqbVpqN2FVVHNXT3FNRmY2RGNoOVdjL0hLcG9IMTQ1TGN4VlI1bHU5UmgKc0NGZzdSQXljc1dTSlI3NGtFb1llRWZmZmpBM1BsQWIyeHpUYTVxR1V3ZXc3NndHZVBpRW1mNGhqVXlBdGd5QzltWndlUnJUVDZQUAo4YzlHc0VzUFB0MklZcmlNcVFrb08zckhsK0VlNWZTZndNQ3VKS0RJb2RrUDFuc21nbWt5UGFjQ0F3RUFBYU5qTUdFd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBSzNaby9aNTltNTBxWDh6UFlFWDEwelBNOTR3SHdZRFZSMGpCQmd3Rm9BVUFLM1oKby9aNTltNTBxWDh6UFlFWDEwelBNOTR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUI4aXRFZgpHRGVDNExpd28rMVdsY2hpWVp3Rm9zM0NZaVpoelJBVzE4eTBaVFRRRVlxdHFLa0ZadTkwODIxZm5abXY5b3Y3NjFLeUJaaWlieXJGClZMMGx2Vit1eUlicVJpekJzNzNCNlVsd0dCYVhDQk9NSU9BYkxqcEh5eDdrQURDVlcvUkZvOEFhc0FGT3E3M0FJMjVqUDRCS3hRZnQKM09Kdng4Rmk4ZU55MWdUSWRHY0wrb2lyb1FISWIvQVVyOUtaelZHVGZ1MHVPTWU5emtaUVBYTGplU1dkbTRnckVDRGRwYmd5bjQzZwpLZDhoZElhQzJ5K0NNTWJITllheitaWmZSdHNNUmYzelVNTnZ4c05JclVhbTRTZEhDaDBPbTdiQ2QzOWo4dUI5R3I3ODROL1h4NmRzCnNQbXV1ano5ZExRUjZGZ05nTHpUcUlBNm1lMTF6RVo3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtZXJpY2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwRENDQTR5Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKVlV6RWNNQm9HQTFVRUNoTVQKUVcxbGNtbGpZU0JQYm14cGJtVWdTVzVqTGpFMk1EUUdBMVVFQXhNdFFXMWxjbWxqWVNCUGJteHBibVVnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXlNQjRYRFRBeU1EVXlPREEyTURBd01Gb1hEVE0zTURreU9URTBNRGd3TUZvd1l6RUxNQWtHCkExVUVCaE1DVlZNeEhEQWFCZ05WQkFvVEUwRnRaWEpwWTJFZ1QyNXNhVzVsSUVsdVl5NHhOakEwQmdOVkJBTVRMVUZ0WlhKcFkyRWcKVDI1c2FXNWxJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQU14QlJSM3BQVTBROW95eFFjbmdYc3NOdDc5SGM5UHdWVTNkeGd6NnNXWUZhczE0dE53QzIwNkI4OWVuCmZIRzhkV09nWGVNSERFanNKY1FESVBUL0Rqc1MvNXVONGNiVkc3UnRJdU94MjM4aFpLK0d2RmNpS3RaSGdWZEVnbFpUdllZVUFRdjgKZjNTa1dxN3h1aEcxbTFoYWdMUTNlQWt6ZkRKSEExekVwWU5JOUZkV2JvRTJKeGhQN0pzb3d0UzAxM3dNUGd3cjM4b0UxOGFPNmxoTwpxS1NsR0J4c1JaaWpRZEV0MHNkdGpSbnhyWG0zZ1QrOUJvSW5MUkJZQmJWNEJia3Yyd3hya0pCK0ZGazR1NVFrRStYUm5SVGYwNEpOClJ2Q0FPVkl5RCtPRXNucEQ4bDdlWHo4ZDNlT3lHNkNoS2lNRGJpNEJGWWRjcG5WMXg1ZGh2dDZHM05SSTI3MHF2MHBWMnVoOVVQdTAKZ0JlNGxMOEJQZXJhdW56Z1dHY1h1VmpnaUlaR1oyeWRFRWRZTXRBMWZIa3FrS0phRUJFak5hMHZ6T1JLVzZmSUovS0QzbDY3WG5mbgo2S1Z1WThJTlhXSFFqTkpzV2lFT3lpaWp6aXJwbGNkSXo1WnZIWklseU1iR3djRU1CYXdteE5KMTB1RXFaOEE5VzZXYTY4OTdHcWlkCkZFWGxENkNhWmQ0dktMM09iNVJtZzBncDJPcGxqSytUMldTZlZWY212Mi9MTnpHWm8yQzdISzJKTkRKaXVFTWhCbklNb1Z4dFJzWDYKS2M4dzNvbmNjVnZkdGpjKzMxRDF1QWNsSnVXOHRmNDhBck8zK0w1RHdZY1JsSjRqYkJlS3VJb25ERlJIOEttendJQ01vQ2ZySFJuagpCNDUzY01vcjlIMTI0SGhuQWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkUxRndXZzR1M09wCmFhRWc1KzMxSXFFakZOZWVNQjhHQTFVZEl3UVlNQmFBRkUxRndXZzR1M09wYWFFZzUrMzFJcUVqRk5lZU1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFaMnNHdVY5Rk95cExNN1BtRzJ0WlRpTE11YmVrSmNtbnhQQlVsZ3RrODdGWQpUMTVSL0xLWGV5ZGx3dVhLNXcwTUpYdGk0L3FmdEllM1JVYXZnNldYU0l5bHZmRVdLNXQyTEhvMVlHd1JnSmZNcVpKUzVpdm1hZTJwCitEWXRMSGUvWVVqUll3dTVXMUx0R0xCRFFpS21zWGV1M21uRnpjY2NvYkdsSEJEN0dMNGFjTjNCa2t1K0tWcWRQelcrNVgxUitGWGcKSlhVamh4NWMzTHFkc0t5emFkc1hnOG4zM2d5OENOeVJucWpRMXhVM2M2VTF1UHgreFVSQUJzUHIrQ0tBWEVmT0F1TVJuMFQvL1pveQp6SDFrVVE3clZ5WjJPdU1lSWp6Q3BqYmRHZStuL0JMekpzQlpNWVZNbk5qUDM2VE16Q21ULzVSdGRsd1RDSmZ5N2FVTFRkM295V2dPClp0TUFEak1TVzd5VjVUS1FxTFBHYklPdGQrNkxmbjZ4cWF2VDRmRzJ3TEhxaU1EbjA1RHBLSktVZTJoN2x5b0taeTJGQWpnUTVBTmgKMU5vbE5zY0lXQzJocDFHdk1BcEo5YVpwaHdjdFJFWjJqaXJsbWp2WEdLTDhuRGdRek1ZNzByVVhPbS85cmlXOTlYSlpaTEYwS2poZgpHRXpmejNFRVdqYlV2eStabk9qWnVyR1Y1Z0pMSWFGYjFjRlBqNjVwYlZQYkFaTzFYQjRZM1dSYXloZ29QbU1FRWYwY2pRQVB1RGZmClo0cWRacWtDYXBIL0U4b3ZYWU84aDVOczNDUlJGZ1FsWnZxejJjSzZLYjZhU0RpQ21mUy9PMG94R2ZtL2ppRXpGTXBQVkYvN3p2dVAKY1gvOVhobWdEMHVSdU1SVXZBYXdSWThta2FLTy9xaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmlzYSBlQ29tbWVyY2UgUm9vdAo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb2pDQ0FvcWdBd0lCQWdJUUU0WTFUUjAvQnZMQitXVUYxWkFjWWpBTkJna3Foa2lHOXcwQkFRVUZBREJyTVFzd0NRWURWUVFHCkV3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmxjbTVoZEdsdmJtRnNJRk5sY25acFkyVWcKUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdmJXMWxjbU5sSUZKdmIzUXdIaGNOTURJd05qSTJNREl4T0RNMgpXaGNOTWpJd05qSTBNREF4TmpFeVdqQnJNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tClZtbHpZU0JKYm5SbGNtNWhkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnYKYlcxbGNtTmxJRkp2YjNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2Vjk1V0htNmgybUN4bENmTApGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RWxwRjdzRFB3c1JST0VXKzFRSzhiClJhVks3MzYyclBLZ0gxZy9Fa1pnUEkyaDRIM1BWejR6SHZ0SDhhb1Zsd2RWWnFXMUxTN1lnRm15cHcyM1J1d2hZLzgxcTZVQ3p5cjAKVFA1NzlaUmRoRTJvOG1DUDJ3NGxQSjl6Y2MrVTMwcnEyOTl5T0l6emxyM3hGN3pTdWp0RldzYW45c1lYaXdHZC9CbW9Lb01XdURwSQovazQrb0tzR0dlbFQ4NEFUQiswdHZ6OEtQRlVnT1N3c0FHbDBsVXE4SUxLcGVlVVlpWkdvM0J4Tjc3dCtOd3RkL2ptbGlGS01BR3pzCkdIeEJ2ZmFMZFhlNllKMkU1LzR0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUcKTUIwR0ExVWREZ1FXQkJRVk9JTVBQeXcvY0RNZXpVYitCNHdnNE5mRHR6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFYL0ZCZlh4YwpDTGtyNE5XU1IvcG5YS1VUd3dNaG15dE1pVWJQV1UzSi9xVkF0bVBOM1hFb2xXY1J6Q1NzMDBSc2NhNEJJR3NEb284WXR5azZmZVVXCllGTjRQTUN2RllQM2oxSXpKTDFrazVmdWkvZmJHS2h0Y2JQM0xCZlFkQ1ZwOS81clBKUytUVXRCakU3aWM5RGprQ0p6UTgzejcrcHoKemtXS3NLWkovMHg5blhHSXhIWWRrRnNkN3YzTTkrNzlZS1d4ZWhaeDBSYlFmQkk4YkdtWDI2NWZPWnB3THdVOEdVWUVtU0EyMEdCdQpZUWE3RmtLTWNQY3crK0RiWnFNQUFiM21MTnFSWDZCR2kwMXFuRDA5M1FWRy9uYS9vQW84NUFEbUo3Zi9oQzNldWlJbmxoQng2eUx0CjM5OHpuTS9qcmE2TzFJN21UMUd2RnBMZ1hQWUhEdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNlcnR1bSBSb290IENBCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlERERDQ0FmU2dBd0lCQWdJREFRQWdNQTBHQ1NxR1NJYjNEUUVCQlFVQU1ENHhDekFKQmdOVkJBWVRBbEJNTVJzd0dRWURWUVFLCkV4SlZibWw2WlhSdklGTndMaUI2SUc4dWJ5NHhFakFRQmdOVkJBTVRDVU5sY25SMWJTQkRRVEFlRncwd01qQTJNVEV4TURRMk16bGEKRncweU56QTJNVEV4TURRMk16bGFNRDR4Q3pBSkJnTlZCQVlUQWxCTU1Sc3dHUVlEVlFRS0V4SlZibWw2WlhSdklGTndMaUI2SUc4dQpieTR4RWpBUUJnTlZCQU1UQ1VObGNuUjFiU0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTZ4CndTN1RUM3pOSmM0WVBrL0VqRytBYW5QSVcxSDRtOUxjdXdCY3NhRDhkUVB1Z2ZDSTdpTlM2ZVlWTTQyc0xRbkZkdmtyT1lDSjVKZEwKa0tXb2VQaHpRM3VrWWJEWVdNemhiR1orblBNSlhsVmpoTldvNy9PeExqQm9zOFE4Mkt4dWpabGFrRTQwM0RhYWo0R0lVTGR0bGtJSgo4OWVWZ3cxQlM3QnFhL2o4RDM1aW4yZkU3U1pmRUNZUENFL3dwRmNvem8rNDdVWDJidTRsWGFwdU9iN2treS9aUjZCeTYvcW1XNi9LClV6L2lEc2FXVmhGdTkrbG1xU2JZZjVWVDdRcUZpTHBQS2FWQ2pGNjIvSVVnQUtwb0M2RWFoUUdjeEVaamdvaTJJckh1L3FwR1dYN1AKTlN6VnR0cGQ5MGd6RkZTMjY5bHZ6czJJMXFzYjJwWTdIVmtDQXdFQUFhTVRNQkV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcQpoa2lHOXcwQkFRVUZBQU9DQVFFQXVJM083K2NVdXMvdXNFU1NiTFE1UHFLRWJxMjRJWGZTMUhlQ2grWWdRWUh1NHZnUnQyUFJGemUrCkdYWWtIQVFhVE9zOXFtZHZMZFROL21VeGNNVWJwZ0lLdW1CN2JWakNta24rWXpJTGErTTZ3S3lyTzdEbzB3bFJqQkNEeGpUZ3hTdmcKR3JaZ0ZDZHNNbmVNdkxKeW1NL056RCs1eUNSQ0ZOWlgvT1ltUTZrZDVZQ1F6Z05VS0Q3M1A5UDRUZTFxQ2pxVEU1czdGQ01UWTV3LwowWWNuZWVWTVVlTUJyWVZkR2p1eDFYTVFwTlB5dkc1azlWcFdrS2pIRGt4MER5NXhPL2ZJUi9ScGJ4WHlFVjZESHB4OFVxNzlBdG9TCnFGbG5HTnU4Y04yYnNXbnRnTTZKUUVocURqWEtLV1lWSVpRczZHQXFtNFZLUVBOcmlpVHNCaFlzY3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDb21vZG8gQUFBIFNlcnZpY2VzIHJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTWpDQ0F4cWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCN01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTClIzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3dHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWcKVEdsdGFYUmxaREVoTUI4R0ExVUVBd3dZUVVGQklFTmxjblJwWm1sallYUmxJRk5sY25acFkyVnpNQjRYRFRBME1ERXdNVEF3TURBdwpNRm9YRFRJNE1USXpNVEl6TlRrMU9Wb3dlekVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnTUVrZHlaV0YwWlhJZ1RXRnVZMmhsCmMzUmxjakVRTUE0R0ExVUVCd3dIVTJGc1ptOXlaREVhTUJnR0ExVUVDZ3dSUTI5dGIyUnZJRU5CSUV4cGJXbDBaV1F4SVRBZkJnTlYKQkFNTUdFRkJRU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUw1QW5mUnU0ZXAyaHh4TlJVU092a2JJZ3dhZHdTcitHQitPNUFMNjg2dGRVSW9XTVF1YUJ0REZjQ0xOU1MxVVk4eTJibWhHCkMxUHF5MHdrd0x4eVR1cnhGYTcwVkpvU0NzTjZzak5nNHRxSlZmTWlXUFBlM00vdmc0YWlqSlJQbjJqeW1KQkdoQ2ZIZHIvanpEVXMKaTE0SFpHV0N3RWl3cUpINVlaOTJJRkNva2NkbXRldDRZZ05XOElvYUUrb3hveDZnbWYwNDl2WW5NbGh2Qi9WcnVQc1VLNiszcXN6VwpZMTl6ak5vRm1hZzRxTXNYZURaUnJPbWU5SGc2amM4UDJVTGltQXlyTDU4T0FkN3ZuNWxKOFMzZnJIUk5HNWkxUjhYbEtkSDVrQmpICllweStnOGNtZXo2S0pjZkEzWjNtTldnUUlKMlAyTjdTdzRTY0RWN29MOGtDQXdFQUFhT0J3RENCdlRBZEJnTlZIUTRFRmdRVW9CRUsKSXo2VzhRZnM0cThwNzRLbGY5QXdwTFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdld1lEVlIwZgpCSFF3Y2pBNG9EYWdOSVl5YUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHZRVUZCUTJWeWRHbG1hV05oZEdWVFpYSjJhV05sCmN5NWpjbXd3TnFBMG9ES0dNR2gwZEhBNkx5OWpjbXd1WTI5dGIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnoKTG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFDRmI4QXZDYjZQK2srdFo3eGtTQXprL0V4ZllBV015bXRyd1VTV2dFZHVqbQo3bDNzQWc5ZzFvMVFHRThtVGdIajVyQ2w3cis4ZEZSQnYvMzhFcmpIVDFyMGlXQUZmMkMzQlVyejl2SEN2OFM1ZElhMkxYMXJ6Tkx6ClJ0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDJHOXc4NEZvVnhwN1oKOFZsSU1DRmxBMnpzNlNGejdKc0RvZUEzcmFBVkdJLzZ1Z0xPcHl5cEVCTXMxT1VJSnFzaWwyRDRrRjUwMUtLYVU3M3lxV2pnb203QwoxMnl4b3crZXYrdG81MWJ5cnZMakt6ZzZDWUcxYTRYWHZpM3RQeHEzc21QaTlXSXNndFJxQUVGUThUbURuNVhwTnBhWWJnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ29tb2RvIFNlY3VyZSBTZXJ2aWNlcyByb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVB6Q0NBeWVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQitNUXN3Q1FZRFZRUUdFd0pIUWpFYk1Ca0dBMVVFQ0F3UwpSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93R0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnClRHbHRhWFJsWkRFa01DSUdBMVVFQXd3YlUyVmpkWEpsSUVObGNuUnBabWxqWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXcKTURBd01Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2ZqRUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdQpZMmhsYzNSbGNqRVFNQTRHQTFVRUJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhKREFpCkJnTlZCQU1NRzFObFkzVnlaU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVAKQURDQ0FRb0NnZ0VCQU1CeE00S0swSERyYzRlQ1FOVWQ1TXZKRGtLUStkNDB1YUc2RWZRbGhmUE1jbTN5ZTVkcnN3ZnhkeVNSWHlXUAo5blE5NUlEQytEd044NzlBNnZmSVV0RnliKy9JcTBHNGJpNFhLcFZwRE0zU0hwUjdMWlFkcW5YWHM1akxyTHhrVTBDOGo2eXNOc3RjCnJidmQ0SlFYN05GYzBML3ZwWlhKa01Xd3JQc2JROTk2Q0YyM3VQSkFHeXNubmxET1htV0NpSXhlMDA0TWV1b0lrYlkycWl0QysrckMKb3pubDJ5WTRyWXNLN2hsanh4d2szd040MnVicXdVY2FDd3RHQ2QwQy9ON0xoMS9YTUdOb29hN2NNcUc2dnY1RXEyaTJwUmNWL2IzVgpwNmVhNUVRejZZaU8vTzFSNjVOeFRxMEI1MFNPcXkzTHFQNEJTVWp3d04zSGFOaVMvajBDQXdFQUFhT0J4ekNCeERBZEJnTlZIUTRFCkZnUVVQTmlUaU1MQWdnbk1BWmtHa3lEcG5uQUpZMDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcKZ1lFR0ExVWRId1I2TUhnd082QTVvRGVHTldoMGRIQTZMeTlqY213dVkyOXRiMlJ2WTJFdVkyOXRMMU5sWTNWeVpVTmxjblJwWm1sagpZWFJsVTJWeWRtbGpaWE11WTNKc01EbWdONkExaGpOb2RIUndPaTh2WTNKc0xtTnZiVzlrYnk1dVpYUXZVMlZqZFhKbFEyVnlkR2xtCmFXTmhkR1ZUWlhKMmFXTmxjeTVqY213d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJY0JiU01kZmxzWGZjRmhNcytQNS9PS2xGbG0KNEo0b3FGN1R0L1EwNXFvNXNwY1d4WUp2TXFUcGpPZXYvZS9DNkxsTHFxUDA1dHFOWlNIN3VvRHJKaWlGR3Y0NWpONWJCQVMwVlBtagpaNTVCK2dsU3pBVklxTWsvSVFRZXpraHIvSVhvd251dmY3Zk0rRjg2L1RYR0RlK1gzRXlyRWVGcnl6SFJiUHRJZ0t2Y25EZTRJUlJMCkRYRTk3SU16YnRGdU1oYnNtTWNXaTFtbU5Lc0ZWeTJUOTZvVHk5SVQ0cmN1TzgxclVCY0phRDYxSmxmdXR1QzIzYmtwZ0hsOWo2UHcKcENpa0ZjU0Y5Q2ZVYTcvbFhPUmxBblpVdE9NM1ppVFRHV0hJVWhEbGl6ZWF1YW41SGIvcW1aSmhsdjhCemFGZkRieHh2QTZzQ3gxSApSUjNCN0h6cy9Taz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ29tb2RvIFRydXN0ZWQgU2VydmljZXMgcm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTClIzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3dHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWcKVEdsdGFYUmxaREVsTUNNR0ExVUVBd3djVkhKMWMzUmxaQ0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pBZUZ3MHdOREF4TURFdwpNREF3TURCYUZ3MHlPREV5TXpFeU16VTVOVGxhTUg4eEN6QUpCZ05WQkFZVEFrZENNUnN3R1FZRFZRUUlEQkpIY21WaGRHVnlJRTFoCmJtTm9aWE4wWlhJeEVEQU9CZ05WQkFjTUIxTmhiR1p2Y21ReEdqQVlCZ05WQkFvTUVVTnZiVzlrYnlCRFFTQk1hVzFwZEdWa01TVXcKSXdZRFZRUUREQnhVY25WemRHVmtJRU5sY25ScFptbGpZWFJsSUZObGNuWnBZMlZ6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBMzNGdk5saFRXdkkyVkZlQXhIUUlJTzBZZnlvZDVqV2FIaVdzbk9XV2ZuSlNvQlZDMjFuZFpIb2EwTGg3CjNUa1Z2RlZJeE8wNkFPb3hFYnJ5Y1hRYVo3alBNOHlvTWErajQ5ZC92ek10VEdvODdJdkRrdEpUZHlSMG5BZHVjUHk5QzF0MnVsL3kKLzljM1MwcGdlUGZ3K3Nwd3RPcFpxcVBPU0MrcHc3SUxmaGR5Rmd5bUJ3d2JPTS9KWXJjL29KT2xoMEh5dDNCQWQ5aStGSHpqcU1CNgpqdWxqYXRFUG1zYlM5SXM2RkFSVzFPMjR6RzcxKytJc1dMMS9UMnNyOTJBa1dDVE9KdTgwa1RyVjQ0SFFzdkFFQXRkYnR6NlNyR3NTCml2bmtCYkE3a1VsY3N1dFQ2dmlmUjRidXY1WEF3QWFmMGx0ZUVSdjB4d1ExS2RKVlhPVHQ2d0lEQVFBQm80SEpNSUhHTUIwR0ExVWQKRGdRV0JCVEZlMWk5N2RvbGFkTDNXUmFvc3pMQWV5ZGI5REFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekNCZ3dZRFZSMGZCSHd3ZWpBOG9EcWdPSVkyYUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHZWSEoxYzNSbFpFTmxjblJwClptbGpZWFJsVTJWeWRtbGpaWE11WTNKc01EcWdPS0EyaGpSb2RIUndPaTh2WTNKc0xtTnZiVzlrYnk1dVpYUXZWSEoxYzNSbFpFTmwKY25ScFptbGpZWFJsVTJWeWRtbGpaWE11WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRRElrNEU3aWJTdnVJUVNUSTNTOE50dwp1bGVHRlRRUXVTOS9IckNvaVdDaGlzSjNERkJLbXdDTDJJdjBRZUxRZzRwS0hCUUdzS05vQlhBeE1LZFRtdzdwU3FCWWFXY09ycDMyCnBTeEJ2endHYStSWnpHMFE4Wlp2SDkvMEJBS2tuMFUreU5qNk5rWkVVRCtDbDVFZktOc1lFWXdxNUdXRFZ4SVNqQmMvbERiK1hiREEKQkhjVHVQUVYxVDg0ekpRNlZkQ3NtUFc2QUYvZ2hobUJlQzhvd0g3VHpFSUs5YTVRb05FK3hxRng3RCtnSUl4bU9vbTBqdFRZc1UwbApSKzR2aU1pMTRRVkZ3TDRVY2Q1Ni9ZNTdmVTBJbHFVU2MvQXR5amNuZEJJblRNdTJsK25acmdodFdqbEEzUVZIZFdwYUliT2pHTTlPCjl5NVh0NWh3WHNqRWVMQmkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMERDQ0JMaWdBd0lCQWdJRU9yWlFpekFOQmdrcWhraUc5dzBCQVFVRkFEQi9NUXN3Q1FZRFZRUUdFd0pDVFRFWk1CY0dBMVVFCkNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWxNQ01HQTFVRUN4TWNVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDAKZVRFdU1Dd0dBMVVFQXhNbFVYVnZWbUZrYVhNZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBegpNVGt4T0RNek16TmFGdzB5TVRBek1UY3hPRE16TXpOYU1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwCmN5Qk1hVzFwZEdWa01TVXdJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRFZRUUQKRXlWUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXYyRzFsVk82Vi96NjhtY0xPaHJmRVlCa2xiVFJ2TTE2ei9ZcGxpNGtWRUFrT1BjYWhkeFlUTXVrCkowS1gwSitEaXNQa0JnTmJBS1ZSSG5BRWRPTEIxRHFyMTYwN0J4Z0ZqdjJEck9wbTJSZ2JhSXIxVnhxWXV2WHRkajE4MmQ2VWFqdEwKRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkpXQ0NZZnF0ZmZwL3AxazNzZzNTcHgyelk3aWxLaFNvR0ZQbFU1dFBhWlFlTApZemNTMTlEc3czc2dRVVNqN2N1Z0YrRnhaYzRkWmpIM2RnRVp5SDBEV0xhVlNSMm1FaWJveGd4MjRPTm15K3BkcGlidTVjeGZ2V2VuCkFTY09vc3BVeGJGNmxSMXhIa29waWdQY2FrWEJwQmxlYnpiTnc2S3d0LzVjT09KU3ZQaEVRK2FRdXdJREFRQUJvNElDVWpDQ0FrNHcKUFFZSUt3WUJCUVVIQVFFRU1UQXZNQzBHQ0NzR0FRVUZCekFCaGlGb2RIUndjem92TDI5amMzQXVjWFZ2ZG1Ga2FYTnZabVp6YUc5eQpaUzVqYjIwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pDQ0FSb0dBMVVkSUFTQ0FSRXdnZ0VOTUlJQkNRWUpLd1lCQkFHK1dBQUJNSUg3Ck1JSFVCZ2dyQmdFRkJRY0NBakNCeHhxQnhGSmxiR2xoYm1ObElHOXVJSFJvWlNCUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGoKWVhSbElHSjVJR0Z1ZVNCd1lYSjBlU0JoYzNOMWJXVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJSFJvWlc0Z1lYQndiR2xqWVdKcwpaU0J6ZEdGdVpHRnlaQ0IwWlhKdGN5QmhibVFnWTI5dVpHbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhScGIyNGdjSEpoClkzUnBZMlZ6TENCaGJtUWdkR2hsSUZGMWIxWmhaR2x6SUVObGNuUnBabWxqWVhSbElGQnZiR2xqZVM0d0lnWUlLd1lCQlFVSEFnRVcKRm1oMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhNdVltMHdIUVlEVlIwT0JCWUVGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdQpCZ05WSFNNRWdhWXdnYU9BRkl0TGJlM1RLYmtHR2V3NU9hbndsNFJxeSsvZm9ZR0VwSUdCTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3CkZ3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNgp0bENMTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBaXRRVXRmNzBtcEtuR2RTa2ZuSVlqOWxvCmZGSWszV2R2T1hyRXFsNDk0bGl3VFhDWWhHSG9HK05wR0E3TyswZFFvRTcvOENRZnZiTE85U2Y4N0M5VHFuTjdBejEwYnVZV251dWwKTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVJjSGhYSFRNZS9RS1puQXpOQ2dWUHg3dU9wSFg2U20yeApnSTRKVnJtY0dtRCtYY0hYZXR3UmVORFdYY0czMWEweW1RTTZpc3hVSlRreGdYc1RJbEc2Um15aHU1NzZCR3hKSm5TUDBuUHJ6RENpCjV1cFpJb2Y0bC9VTy9lck1rcVFXeEZJWTZpSE9zZkhtaElIbHVxbUdLUEpEV2wwU25hd2UyYWpsQ21xbmY2Q0hLYy95aVUzVTdNWGkKNW5yUU5pT0tTblEyK1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCkVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXgKT0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRQ2FHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzYKWEp4Z0Z5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUpXcHptTStZawpsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQnJyY0Nhb0Y2cVVXRDRnWG11VmJCCmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3kKbFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDFrc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dAo2Ni8zRnN2YnpTVXI1Ui83bXAvaVVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhuCndRNWhZSWl6UHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZy96T2gKRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVIb3ljUjdoWVFlN3hGU2t5eQpCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUl5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllCkowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWQKRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVQphNkZKcEVjd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmZCbHVvcm5GZEx3VXYKWitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4MwpVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtClZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUtXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0sKK0pEU1Y2SVpVYVV0bDBIYUIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyVwpJb3pjaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUlRVSVozUGgxCldWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdEbWJBNENEL3BYdmsxQitUSlltNVgKZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSQo0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eTRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04ClZDTEFBVkJwUTU3MHN1OXQrT3phOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1QKRUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReApPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFETVYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZwpEaG9CNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVckg1NTZWT2lqCktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkOGx5eUJUTnZpamJPMEJOTy83OUsKRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3Z2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didgpCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVG1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwCnA1aWpKVU12Ny9GZkp1R0lUZmhlYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjgKblQ4S0tkamNUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0V0FFWApNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFpjNnRzZ0xqb0MyU1RvSnlNCkdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QTRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHoKdUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVApCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUdDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqCllYUmxJR052Ym5OMGFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdWRDNHdMUVlJS3dZQgpCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53Y3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEClZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEdBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTQKeXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQ1RURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRQpBeE1TVVhWdlZtRmthWE1nVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWCnF5TTA3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtZDFvNDE3K3MKaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQrTEoydy93NEU2b00za0pwSzI3egpQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3QjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyClBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXAKOGtva1V2ZDAvYnBPNXFnZEFtNnhEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQwpialBzTVo1N2s4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnN6SFh1CmcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwald5MTBRSkxaWXhrTmM5MXAKdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicgpxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEs0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUApVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3CkhoY05NRE13T1RNd01EUXlNRFE1V2hjTk1qTXdPVE13TURReU1EUTVXakJRTVFzd0NRWURWUVFHRXdKS1VERVlNQllHQTFVRUNoTVAKVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDenMvNS8wMjJ4N3haOFY2VU1iWGFLTDB1L1pQdE03b3J3Cjh5bDg5Zi91S3VEcDZicGJaQ0thbW04c09pWnBVUVdaSnR6VkhHcHh4cHA5SHAzZGZHekdqR2RuU2o3NGNiQVpKNmtKREthVnYwdU0KRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjlNcytrMlk3Q0k5ZU5xUFBZSmF5WAo1SEE0OUxZNnRKMDdseVpEbzZHOFNWbHlUQ013aHdGWTlrNitIR2hXWnEvTlFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkCkRKWmtuZHdpOTJTTDMySGVGWlJTRmFCOVVzbExxQ0hKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjIKSkNoekFnTUJBQUdqUHpBOU1CMEdBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkdrbDNnCjBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmclVqOTRuSzlOcnZqVlQ4K2EKbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241QncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSgpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlVKUkRMOFRyeTJmcmJTVmE3cHY2blFUWEQ0SWhoeVlqSDN6WVFJcGhaCjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdFJTZmxNTUZlOHRvVHl5VkNVWlZIQTR4c0ljeDBRdTFUL3pPTGp3OVhBUll2ejZidXlYQWkKRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNvbmVyYSBDbGFzcyAyIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUE1BMEdBMVVFQ2hNRwpVMjl1WlhKaE1Sa3dGd1lEVlFRREV4QlRiMjVsY21FZ1EyeGhjM015SUVOQk1CNFhEVEF4TURRd05qQTNNamswTUZvWERUSXhNRFF3Ck5qQTNNamswTUZvd09URUxNQWtHQTFVRUJoTUNSa2t4RHpBTkJnTlZCQW9UQmxOdmJtVnlZVEVaTUJjR0ExVUVBeE1RVTI5dVpYSmgKSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSkFYU2pXZHl2QU5sc2RFK2hZMwovRWk5dlgrQUxUVTc0VytvWjZtL0F4eE5qRzh5UjlWQmFLUVRCTUUxREpxRVEveGNIZitKcytnWEdNMlJYL3VKNCtxL1RsMThHeWJUCmRYbnQ1b1RqVitXdEtjVDBPaWpucFh1RU5tbXovVjUydmFNdG1kT1FUaU1vZlJoajhWUTdKcDEyVzVkQ3N2K3U4RTdzM1RtVlRvTUcKZitkSlFNakZBYkpVV21ZZFBmejU2VHdLbm9HNGNQQUJpK1FqVkh6SXJ2aVFIZ0NXY3RSVXoyRWp2T3I3blFLVjBiYTVjVHBwQ0Q4UAp0T0ZDeDRqMVA1aW9wN29jNEhGeDcxaFhnVkI2WEd0MFJnNkRBNWpEanFodThuWXliaWVEd25QejNCam90SlBxZFVSckJHQWdjVmVICm5mTytvSkFqUFlvazRkb2gyOE1DQXdFQUFhTXpNREV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFSQmdOVkhRNEVDZ1FJU3FDcVdJVFQKWGp3d0N3WURWUjBQQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhem9mNUZuSVZWMHNkMlp2bm9pWXc3Sk5uMzlZdAowalN2OXppbHpxc1d1YXN2ZkRYTHJOQVB0RXdyL0lEdmE0eVJYeloyOTl1ekd4bnE5TElSL1dGeFJMOG9zem9kdjdORDZKKy8zREVJCmNiQ2RqZFkwUnpLUXhtVWs5NkJLZkFSemp6bHZGNHh5dGIxTHlIcjRlNFBES0U2Y0NlcG5QN0puQkJ2REZOcjQ1MGtra2RBZGF2cGgKT2U5cjV5RjFCZ2ZZRXJRaElIQkNjWUhhUEpvMnZxWmJEV3BzbWgrUmUvbjU3MEs2VGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeApFdHpLTzZndW5SUmFCWFczN05kajRybzF0Z1FJa2VqYW5aejJaclVZckFxbVZDWTBNOUlid2RSL0dqcU9DNm95YnR2OFR5V2YyVExICmxscHdyTjlNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdWpDQ0FxS2dBd0lCQWdJRUFKaVdpakFOQmdrcWhraUc5dzBCQVFVRkFEQlZNUXN3Q1FZRFZRUUdFd0pPVERFZU1Cd0dBMVVFCkNoTVZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNZd0pBWURWUVFERXgxVGRHRmhkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGcKVW05dmRDQkRRVEFlRncwd01qRXlNVGN3T1RJek5EbGFGdzB4TlRFeU1UWXdPVEUxTXpoYU1GVXhDekFKQmdOVkJBWVRBazVNTVI0dwpIQVlEVlFRS0V4VlRkR0ZoZENCa1pYSWdUbVZrWlhKc1lXNWtaVzR4SmpBa0JnTlZCQU1USFZOMFlXRjBJR1JsY2lCT1pXUmxjbXhoCmJtUmxiaUJTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW1OSzFVUkY2Z2FZVW1IRnQKdnN6bkV4dldKdzU2czJvWUhMWmhXdFZoQ2IvZWtCUEhaKzdkODlyRkRCS2VOVlUrTENlSVFHdjMzTjBpWWZYQ3h3NzE5dFYyVTAyUApqTHdZZGplRm5laktTY2ZTVDVnVENhSStJb2ljZjlieUVHVzA3bDhZMVJmaitNWDk0cDJpNzFNT2hYZWlEK0V3Uis0QTV6TjlSR2NhCkMxSG9pNkNlVUpob05GSWZMbTBCOG1CRjhqSHJxVEZvS2J0NlFaN0dHWCtVdEZFNUEzK3kzcWN5bTdSSGptKzBTcTdscjdIY3NCdGgKdkpseTN1U0p0M29tWGRvelNWdFNuQTcxaXEzRHVEM29CbXJDMVNvTGJIdUV2VllGeTRabGt1eEVLN0NPdWR4d0MwYmFyYnhqaURuNgoyMnIrSS9xODVFajBaeXRxRVJBaFNRSURBUUFCbzRHUk1JR09NQXdHQTFVZEV3UUZNQU1CQWY4d1R3WURWUjBnQkVnd1JqQkVCZ1JWCkhTQUFNRHd3T2dZSUt3WUJCUVVIQWdFV0xtaDBkSEE2THk5M2QzY3VjR3RwYjNabGNtaGxhV1F1Ym13dmNHOXNhV05wWlhNdmNtOXYKZEMxd2IyeHBZM2t3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlNvZmV1OFk2UjBFM1FBN0piZzB6VEJMTDlzK0RBTgpCZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFCWVNIVlhRMlljRzcwZFRHRmFnVHRKK2svcnZ1RmJRdkJnd3A4cWlTcEdFTi9LdGNDRnRSCkV5dE53aXBoeVBnSldQd3RBckk1ZlpsbWdiOXVYSlZGSUd6bWVhZlIyQndwL01JZ0oxSEk4WHhkTkdkcGhSRXd4Z0RTMS9QVGZMYncKTVZjb0VvSno2VE12cGxXMEM1R1VSNXo2dTNwQ011aXVmaTNJdkt3VXY5a1AyVnY4d2ZsNmxlRjlmcGI4Y2JEQ1RNamZSVFRKemczeQpuR1FJMER2REtjV3k3WkFFd2JFcGtjVXdiOEdwY2pQTS9sMFdGeXdSYWVkKy9zV0RDTis4M0NJNkxpQnBJemxXWUdlUWl5NTJPZnNSCmlKZjJmTDFMdUNBV1p3V040anZCY2orVWxUZkhYYm1lMkpPaEY0Ly9ER1lWd1NSOE1ud0RIVHVoV0VVeWt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVERDIEludGVybmV0IFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLekNDQXhPZ0F3SUJBZ0lFT3N5bFREQU5CZ2txaGtpRzl3MEJBUVVGQURCRE1Rc3dDUVlEVlFRR0V3SkVTekVWTUJNR0ExVUUKQ2hNTVZFUkRJRWx1ZEdWeWJtVjBNUjB3R3dZRFZRUUxFeFJVUkVNZ1NXNTBaWEp1WlhRZ1VtOXZkQ0JEUVRBZUZ3MHdNVEEwTURVeApOak16TVRkYUZ3MHlNVEEwTURVeE56QXpNVGRhTUVNeEN6QUpCZ05WQkFZVEFrUkxNUlV3RXdZRFZRUUtFd3hVUkVNZ1NXNTBaWEp1ClpYUXhIVEFiQmdOVkJBc1RGRlJFUXlCSmJuUmxjbTVsZENCU2IyOTBJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeExoQXZKSFZZeC9YbWFDTERFQWVkTGRJblVhTUFyTGdKRi93R1JPbk40TnJYY2VPK1lRd3pobzcrdnZPaTIwagp4c051WnArSnBkL2dRbEJuK2g5c0h2VFFCZGEveXRaTzVHaGdiRWFxSEYxajRRZUdEbVVBcHk2bWNjYTh1WUdvT24wYTB2blJyRXZMCnpuV3YzSHY2Z1hQVS9McTlRWWpVZExQNVhqZzZQRU9vMHBWT2QyMFRESjJQZUFHM1dpQWZBemMxNGl6YlN5c3NlTGxKMjhUUXg1eWMKNUlvZ0NTRVdWbWIvQmV4YjQvRFBxeVFrWHNOL2NIb1N4TksxRUtDMkllR05lR2xWUkduMXlwWWNOSVVYSlhmaTlpOG5tSGo5ZVFZNgpvdFphUThILzdBUTc3aFB2MDFoYS81THI3SzdhOGpjRFIwRzJsOGt0Q2tFaXU3dm1wd0lEQVFBQm80SUJKVENDQVNFd0VRWUpZSVpJCkFZYjRRZ0VCQkFRREFnQUhNR1VHQTFVZEh3UmVNRnd3V3FCWW9GYWtWREJTTVFzd0NRWURWUVFHRXdKRVN6RVZNQk1HQTFVRUNoTU0KVkVSRElFbHVkR1Z5Ym1WME1SMHdHd1lEVlFRTEV4UlVSRU1nU1c1MFpYSnVaWFFnVW05dmRDQkRRVEVOTUFzR0ExVUVBeE1FUTFKTQpNVEFyQmdOVkhSQUVKREFpZ0E4eU1EQXhNRFF3TlRFMk16TXhOMXFCRHpJd01qRXdOREExTVRjd016RTNXakFMQmdOVkhROEVCQU1DCkFRWXdId1lEVlIwakJCZ3dGb0FVYkdRQngvMkZiYXpJMnA1UUNJVUl0VHhXcUZBd0hRWURWUjBPQkJZRUZHeGtBY2Y5aFcyc3lOcWUKVUFpRkNMVThWcWhRTUF3R0ExVWRFd1FGTUFNQkFmOHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWalV1TURvMExqQURBZ1NRTUEwRwpDU3FHU0liM0RRRUJCUVVBQTRJQkFRQk9ROHpSM1IwUUd3Wi90NlQ2MDlsTit5T2ZJMVJiNW9zdkJDaUx0U2R0aWFIc21HbmM1NDBtCmd3VjVkT3kwdWFPWHdUVUEvUlhhT1lFNmxUR1EzcGZwaHFpWmR3emxXcUNFL3hJV3JHNjRqY043a3NLc0x0QjlLT3kyODJBNGFXOCsKMkFSVlBwN01WZEs2L3J0SEJOY0syUllLTkNuMVdCUFZUOCtQVmt1ekh1N1RtSG5hQ0I0TWI3ajRGaWZ2d204OTlxTkxQZzdrYld6YgpPMEVTbTcwTlJ5Ti9QRXJRcjhDdjl1OGJ0UlhFNjRQRUNWOTBpOWtSKzhKV3NUejRjTW8walVOQUU0ejltUU5VZWNZdTZvYWg5anJVCkNiejB2R2JNUFZqUVYwa0s3aVhpUWU0VCtaczROTkVBOVg3bmxCMzhhUU5pdUprRkJUMXJlQks5c0c5bAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUREMgT0NFUyBSb290IENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZHVENDQkFHZ0F3SUJBZ0lFUGtpOXhEQU5CZ2txaGtpRzl3MEJBUVVGQURBeE1Rc3dDUVlEVlFRR0V3SkVTekVNTUFvR0ExVUUKQ2hNRFZFUkRNUlF3RWdZRFZRUURFd3RVUkVNZ1QwTkZVeUJEUVRBZUZ3MHdNekF5TVRFd09ETTVNekJhRncwek56QXlNVEV3T1RBNQpNekJhTURFeEN6QUpCZ05WQkFZVEFrUkxNUXd3Q2dZRFZRUUtFd05VUkVNeEZEQVNCZ05WQkFNVEMxUkVReUJQUTBWVElFTkJNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyR0wyWVNDeXo4REdoZGZqZWViTTdmSTVrcVNYTG1TamhGdUgKbkV6OXBQUEVYeUc5VmhEcjJ5NWg3Sk5wNDZQTXZabkRCZndHdU1vMkhQNlFqa2xNeEZhYUwxYTh6M3NNOFc5SHBnMURUZUxwSFRrMAp6WTBzMlJLWStlUGh3VXA4aGpqRXFjUmhpTkplcnhvbVRkWGtvQ0pIaE5sa3R4bVcvT3daNUxLWEprNUtUTXVQSkl0VUdCeElZWHZWCmlHamFYYlhxelJvd3dZQ0RkbENxVDlIVTNUanc3eGIwNFF4UUJyL3ErM3BKb1NnckhQYjhGVEtqZEdxUHFjTmlLWEV4NVR1a1lCZGUKZE9iYUUrM3BIeDhiMGJKb2M4WVFOSFZHRUJEamtBQjJRTXVMdDBNSklmK3JUcFBHV09tbGd0dDN4RHFac1hLVlNRVHd0eXY2ZTFtTwozUUlEQVFBQm80SUNOekNDQWpNd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3Z2V3R0ExVWRJQVNCCjVEQ0I0VENCM2dZSUtvRlFnU2tCQVFFd2dkRXdMd1lJS3dZQkJRVUhBZ0VXSTJoMGRIQTZMeTkzZDNjdVkyVnlkR2xtYVd0aGRDNWsKYXk5eVpYQnZjMmwwYjNKNU1JR2RCZ2dyQmdFRkJRY0NBakNCa0RBS0ZnTlVSRU13QXdJQkFScUJnVU5sY25ScFptbHJZWFJsY2lCbQpjbUVnWkdWdWJtVWdRMEVnZFdSemRHVmtaWE1nZFc1a1pYSWdUMGxFSURFdU1pNHlNRGd1TVRZNUxqRXVNUzR4TGlCRFpYSjBhV1pwClkyRjBaWE1nWm5KdmJTQjBhR2x6SUVOQklHRnlaU0JwYzNOMVpXUWdkVzVrWlhJZ1QwbEVJREV1TWk0eU1EZ3VNVFk1TGpFdU1TNHgKTGpBUkJnbGdoa2dCaHZoQ0FRRUVCQU1DQUFjd2dZRUdBMVVkSHdSNk1IZ3dTS0JHb0VTa1FqQkFNUXN3Q1FZRFZRUUdFd0pFU3pFTQpNQW9HQTFVRUNoTURWRVJETVJRd0VnWURWUVFERXd0VVJFTWdUME5GVXlCRFFURU5NQXNHQTFVRUF4TUVRMUpNTVRBc29DcWdLSVltCmFIUjBjRG92TDJOeWJDNXZZMlZ6TG1ObGNuUnBabWxyWVhRdVpHc3ZiMk5sY3k1amNtd3dLd1lEVlIwUUJDUXdJb0FQTWpBd016QXkKTVRFd09ETTVNekJhZ1E4eU1ETTNNREl4TVRBNU1Ea3pNRm93SHdZRFZSMGpCQmd3Rm9BVVlMV0Y3RlprZmhJWkoyY2RVQlZMYzY0NworUkl3SFFZRFZSME9CQllFRkdDMWhleFdaSDRTR1NkbkhWQVZTM091Ty9rU01CMEdDU3FHU0liMmZRZEJBQVFRTUE0YkNGWTJMakE2Ck5DNHdBd0lFa0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUNyb21Ka2JUYzZnSjgyc0xNSm45aXVGWGVoSFR1SlRYQ1JCdW83RTQKQTlHMjhrTkJLV0tuY3RqN2ZBWG1NWEFuVkJoT2lueE81ZEhLakhpSXp4dlRrSXZtSS9nTERqTkRmWnppQ2htUHlRRStkRjEweVlzYwpBK1VZeUFGTVA4dVhCVjJZY2FhWWI3Wjh2VGQvdnVHVEpXMXY4QXF0RnhqaEE3d0hLY2l0SnVqNFlmRDlJUWwrbW82cGFIMUlZbks5CkFPb0JtYmdHZ2xHQlR2SDF0SkZVdVNONkFKcWZYWTNnUEdTNUdoS1NLc2VDUkhJNTNPSTh4dGhWOVJWT3lBVU8yOGJRWXFic0ZiUzEKQW9MYnJJeWlnZkNibVRIMUlDQ29pR0VLQjUrVS9ORFhHOHd1Ri9NRUozWm42MVNEL2FTUWZnWTlCS05ETGRyOEMyTHFMMTlpVXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpVVE4gREFUQUNvcnAgU0dDIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWGpDQ0EwYWdBd0lCQWdJUVJMNE1pMUFBSWJRUjB5cG9CcW10YVRBTkJna3Foa2lHOXcwQkFRVUZBRENCa3pFTE1Ba0dBMVVFCkJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwZVRFZU1Cd0dBMVVFQ2hNVlZHaGwKSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhob2RIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4R3pBWgpCZ05WQkFNVEVsVlVUaUF0SUVSQlZFRkRiM0p3SUZOSFF6QWVGdzA1T1RBMk1qUXhPRFUzTWpGYUZ3MHhPVEEyTWpReE9UQTJNekJhCk1JR1RNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1ZWUXhGekFWQmdOVkJBY1REbE5oYkhRZ1RHRnJaU0JEYVhSNU1SNHcKSEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeElUQWZCZ05WQkFzVEdHaDBkSEE2THk5M2QzY3VkWE5sY25SeQpkWE4wTG1OdmJURWJNQmtHQTFVRUF4TVNWVlJPSUMwZ1JFRlVRVU52Y25BZ1UwZERNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUEzKzVZRUtJcmJsWEVqcjh1UmdubjRBZ1BMaXQ2RTVRYnZmYTJnSTVsQlpNQUhyeXY0ZytPR1EwU1IreXMKcmFQNkxuRDQzbTc3VmtJVm5pNWM3eVBlSWJrRmRpY1pEMC9XdzV5MHZwUVpZL0ttRVFyclUwaWN2dklwT3hib0dxQk1wc24wR0Zsbwp3SER5VXdEQVhsQ0NwVlp2TnZsSzRFU0dvRTFPMWtkdVNVckxaOWVteEFXNWpoNzAvUC9ONXpiZ25BVnNzak1pRmRDMDRNd1h3TExBCjlQNHlQeWtxbFh2WThxZE9EMVI4b1EyQXN3a0R3ZjljM1Y2YVByeXV2RWVLYXE1eHloK3hLcmhmUWdVTDdFWXcwWElMeXVsV2JmWHYKMzNpK1licXlwYTRFVEx5b3JHa1ZsNzN2NjdTTXZ6WDQxTVBSS0E1Y09wOXdHRE1nZDhTaXJ3SURBUUFCbzRHck1JR29NQXNHQTFVZApEd1FFQXdJQnhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUlRNdEd6ejMvNjRQR2dYWVZPa3RLZVJSMjBUekE5CkJnTlZIUjhFTmpBME1ES2dNS0F1aGl4b2RIUndPaTh2WTNKc0xuVnpaWEowY25WemRDNWpiMjB2VlZST0xVUkJWRUZEYjNKd1UwZEQKTG1OeWJEQXFCZ05WSFNVRUl6QWhCZ2dyQmdFRkJRY0RBUVlLS3dZQkJBR0NOd29EQXdZSllJWklBWWI0UWdRQk1BMEdDU3FHU0liMwpEUUVCQlFVQUE0SUJBUUFuTlpjQWlvc292Y1l6TUI0cC9PTDMxWmpVUUx0Z3lyK3JGeXdKTm45UStrSGNycFk2Q2lNK2lWbkpvd2Z0Ckd6ZXQvSHkrVVVsYTNqb0tWQWdXUmNLWnNZZk5qR2pnYVFQcHhFNllzanVNRnJNT29BeVlVSnVUcVhBSnlDeWpqOThDNU9CeE92RzAKSTNLZ3FnSGYzNWcrRkZDZ01TYTlLT2xhTUNaMStYdGdISTN6elZBbWJRUW5tdC9WRFVWSEtXc3M1bmJacVNsOU10M0pOank5cmpYeApFWjRkdTVBL0VrZE9qdGQrRDJKekhWSW1PQndZU2Ywd2RKckU1U0l2Mk1DTjdaRjZUQUNQY245ZDJ0MGJpMFZyNTkxcGw2akZWa3dQCkRQYWZlcEUzOXBlQzROMXhhZjkyUDJCTlBNLzNtZm5HVi9USlZUbDR1aXg1eWFhSUsvUUkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVVROIFVTRVJGaXJzdCBIYXJkd2FyZSBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWREQ0NBMXlnQXdJQkFnSVFSTDRNaTFBQUpMUVIwellxL21VSy9UQU5CZ2txaGtpRzl3MEJBUVVGQURDQmx6RUxNQWtHQTFVRQpCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnUTJsMGVURWVNQndHQTFVRUNoTVZWR2hsCklGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG9kSFJ3T2k4dmQzZDNMblZ6WlhKMGNuVnpkQzVqYjIweEh6QWQKQmdOVkJBTVRGbFZVVGkxVlUwVlNSbWx5YzNRdFNHRnlaSGRoY21Vd0hoY05PVGt3TnpBNU1UZ3hNRFF5V2hjTk1Ua3dOekE1TVRneApPVEl5V2pDQmx6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwCmVURWVNQndHQTFVRUNoTVZWR2hsSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhob2RIUndPaTh2ZDNkM0xuVnoKWlhKMGNuVnpkQzVqYjIweEh6QWRCZ05WQkFNVEZsVlVUaTFWVTBWU1JtbHljM1F0U0dGeVpIZGhjbVV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN4OThNNFA3U29mODg1Z2xGbjBHMmYwdjlZOCtlZksrd05pVlNadVRpWkZ2ZmdJWGxJCndydGhkQktXSFR4cWN0VThFR2M2T2UwckU4MW02NVVKTTZSc2w3SG94dXpCZFhtY1JsNk5xOUJxL2JrcVZSY1FWTE1aOEpyMjhiRmQKdHFkdCsrQnhGMnVpaVBzQTMvNGFNWGNNbWdGNnNUTGpLd0VIT0c3RHBWNGp2RVdiZTFEQnlUQ1AyK1VyZXROYit6TkFIcURWbUJlOAppNGZEaWROZG9JNnlxcXIyam1tSUJzWDZpU0h6Q0oxcExna3pteWtOUmcrTXpFazBzR2xSdmZrR3pXaXRaa3k4UHF4aHZRcUlEc2pmClBlNThCRXlkQ2w1cmtkYnV4KzBvamF0Tmg0bHowRzZrMEI0V2l4VGhka1FEZjJPczVNMUpuTVdTOUtzeW9VaGJBZ01CQUFHamdia3cKZ2JZd0N3WURWUjBQQkFRREFnSEdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGS0Z5WHlZYktKaERsVjBITjlXRgpscDFMMHNORk1FUUdBMVVkSHdROU1Ec3dPYUEzb0RXR00yaDBkSEE2THk5amNtd3VkWE5sY25SeWRYTjBMbU52YlM5VlZFNHRWVk5GClVrWnBjbk4wTFVoaGNtUjNZWEpsTG1OeWJEQXhCZ05WSFNVRUtqQW9CZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd1VHQ0NzR0FRVUYKQndNR0JnZ3JCZ0VGQlFjREJ6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFSeGtQM25UR21aZXYvSzBvWG5XTzZ5MW43azU3SzljTQovL2JleTFXaUN1Rk1WR1dUWUd1ZkVweXRYb01zNjFxdXdPUXQ5QUJqSGJqQWJQTFBTYnROazI4R3Bnb2lza2xpQ0U3L3lNZ1Vzb2dXClhlY0I1QktWNVVVMHM0dHB2YyswaFk5MVVaNTlPamc2RkVnU3h2dW5PeHFORFlKQUIrZ0VDSkNoaWNzWlVOL0tIQUc4SFFRWmV4QjIKbHp2dWtKREt4QTRmRm01MTd6UDQwMjliSHBiajRIUjNkSHVLb200dDNYYldPVENDOEt1Y1V2SXF4NjlKWG43SGFPV0NnY2hxSi9rbgppQ3JWV0ZDVkgvQTdIRmU3ZlJRNVlpdWF5WlNTS3FNaURQK0pKbjFmSXl0SDF4VWRxV3FlVVEwcVVaNkIrZFE3WG5BU2Z4QXluQjY3Cm5maG1xQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNhbWVyZmlybWEgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2VENDQTZXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWUKUVVNZ1EyRnRaWEptYVhKdFlTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaQpaWEp6YVdkdUxtOXlaekVpTUNBR0ExVUVBeE1aUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkREFlRncwd016QTVNekF4Ck5qRXpORE5hRncwek56QTVNekF4TmpFek5EUmFNSDh4Q3pBSkJnTlZCQVlUQWtWVk1TY3dKUVlEVlFRS0V4NUJReUJEWVcxbGNtWnAKY20xaElGTkJJRU5KUmlCQk9ESTNORE15T0RjeEl6QWhCZ05WQkFzVEdtaDBkSEE2THk5M2QzY3VZMmhoYldKbGNuTnBaMjR1YjNKbgpNU0l3SUFZRFZRUURFeGxEYUdGdFltVnljeUJ2WmlCRGIyMXRaWEpqWlNCU2IyOTBNSUlCSURBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFRMEFNSUlCQ0FLQ0FRRUF0elpWNWFWZEdERGcyb2xVa2Z6SXgxTDRMMURaNzdGMWMyVkhmUnRidW5YRi9LR0lKUG92N2NvSVNqbFUKeEZGNnRkcGc2amc4Z2JMTDhidlprU00vU0FGd2Rha0ZLcTBmY2ZQSlZEMGRCbXBBUHJNTWhlNWNHM25DWXNTNE5vNDFYUUVNSXdSSApOYXFiWUU2Z1pqM0xKZ3FjUUtIMFhaaS9jYXVsQUdncTdZTjZENklVdGRRaXM0Q3dQQXhhVVdrdFdCaVA3Wm1lOGE3aWxlYjJSNmpXCkRBK3dXRmpidzJZM25wdVJWRE0zMHBRY2Frakp5ZktsMnFVTUkvY2pEcHd5VlY1eG5JUUZVWm90L2VaT0tqUmEzc3BBTjJjTVZDRlYKZDlvS0RNeVhyb0RjbERaSzlEN09OaE1lVStTc1Rqb0Y3TnV1Y3B3NGk5QTVPNGtLUG5mK2RRSUJBNk9DQVVRd2dnRkFNQklHQTFVZApFd0VCL3dRSU1BWUJBZjhDQVF3d1BBWURWUjBmQkRVd016QXhvQytnTFlZcmFIUjBjRG92TDJOeWJDNWphR0Z0WW1WeWMybG5iaTV2CmNtY3ZZMmhoYldKbGNuTnliMjkwTG1OeWJEQWRCZ05WSFE0RUZnUVU0NVQxc1UzcDI2RXBXMWVMVFhZR2R1SFJvb293RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBbkJnTlZIUkVFSURBZWdSeGphR0Z0WW1WeWMzSnZiM1JBWTJoaApiV0psY25OcFoyNHViM0puTUNjR0ExVWRFZ1FnTUI2QkhHTm9ZVzFpWlhKemNtOXZkRUJqYUdGdFltVnljMmxuYmk1dmNtY3dXQVlEClZSMGdCRkV3VHpCTkJnc3JCZ0VFQVlHSExnb0RBVEErTUR3R0NDc0dBUVVGQndJQkZqQm9kSFJ3T2k4dlkzQnpMbU5vWVcxaVpYSnoKYVdkdUxtOXlaeTlqY0hNdlkyaGhiV0psY25OeWIyOTBMbWgwYld3d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFBeEJsOElhaHNBaQpmSi83a1BNYTBRT3g3eFA1SVY4RW5OckpwWTBuYkphSGtiNUJrQUZ5aytjZWZWLzJpY1pkcDBBSlBheEpSVVhjTG8wd2FMSUp1dnZECkw4eTZDOTgvZDN0R2ZUb1NKSTZXanp3RkNtL1NsQ2dkYlF6QUxvZ2kxZGpQSFJQSDhFalgxd1duejhkSG5qczhOTWlBVDlRVXUvd04KVVBmNnMreENYNm5kYmNqMGRjOTd3WEltc1FFY1hDejllazYwQWNVRlY3bm5QS29GMllqcEIwWkJ6dTlCZ2E1WTM0T2lyc3JYZHgvbgpBRHlkYjQ3a01na2RUWGcwZURROGxKc203VTl4eGhsNnZTQWlTRnIrUzMwRHQrZFl2c1l5VG5RZWFOMm9hRnV6UHU1aWZkbUE2QXAxCmVyZnV0R1dhSVpEZ3F0Q1l2RGkxY3p5TCtOdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2FtZXJmaXJtYSBHbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFeFRDQ0E2MmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCOU1Rc3dDUVlEVlFRR0V3SkZWVEVuTUNVR0ExVUVDaE1lClFVTWdRMkZ0WlhKbWFYSnRZU0JUUVNCRFNVWWdRVGd5TnpRek1qZzNNU013SVFZRFZRUUxFeHBvZEhSd09pOHZkM2QzTG1Ob1lXMWkKWlhKemFXZHVMbTl5WnpFZ01CNEdBMVVFQXhNWFIyeHZZbUZzSUVOb1lXMWlaWEp6YVdkdUlGSnZiM1F3SGhjTk1ETXdPVE13TVRZeApOREU0V2hjTk16Y3dPVE13TVRZeE5ERTRXakI5TVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWVRVU1nUTJGdFpYSm1hWEp0CllTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaVpYSnphV2R1TG05eVp6RWcKTUI0R0ExVUVBeE1YUjJ4dlltRnNJRU5vWVcxaVpYSnphV2R1SUZKdmIzUXdnZ0VnTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRFFBdwpnZ0VJQW9JQkFRQ2ljS0xRbjBLdVd4ZkgySDNQRklQOFQ4bWh0eE92aXRlZVBnUUtrb3RnVnZxME1pK0lUYUZnQ1BTM0NVNmdTUzlKCjF0UGZuWmRhbjVRRWNPdy9XZG0zekdhTG1GSW9DUUxmeFMrRWpYcVhkNy9zUUowbGNxdTFQektZKzdlMy9IS0U1VFdIK1ZYNm94OE8KYnk0bzNXbWcyVUlReHZpMVJNTFFRMy9idk9TaVBHcFZlQXAzcWRqcUdUSzNMLzVjUHh2dXNaanN5cTE2YVVYamxnOVY5dWJ0ZGVwbAo2REpXazBhSnFDV0taUWJ1YTc5NUI5RHh0Ni90TEUyU3U4Q29YNmRuZlFUeUZRaHdySkxXZlFUU00vdE10Z3NMK3hySnhJMERxWDVjCjhsQ3JFcVdoejBoUXBlL1N5Qm9UK3JCL3NZSWNkMm9QWDl3TGxZL3ZRMzdtUlFrbEFnRURvNElCVURDQ0FVd3dFZ1lEVlIwVEFRSC8KQkFnd0JnRUIvd0lCRERBL0JnTlZIUjhFT0RBMk1EU2dNcUF3aGk1b2RIUndPaTh2WTNKc0xtTm9ZVzFpWlhKemFXZHVMbTl5Wnk5agphR0Z0WW1WeWMybG5ibkp2YjNRdVkzSnNNQjBHQTFVZERnUVdCQlJEbkRhZnNKNHdUY2JPWDYwUXErVURwZnFwRkRBT0JnTlZIUThCCkFmOEVCQU1DQVFZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1Db0dBMVVkRVFRak1DR0JIMk5vWVcxaVpYSnphV2R1Y205dmRFQmoKYUdGdFltVnljMmxuYmk1dmNtY3dLZ1lEVlIwU0JDTXdJWUVmWTJoaGJXSmxjbk5wWjI1eWIyOTBRR05vWVcxaVpYSnphV2R1TG05eQpaekJiQmdOVkhTQUVWREJTTUZBR0N5c0dBUVFCZ1ljdUNnRUJNRUV3UHdZSUt3WUJCUVVIQWdFV00yaDBkSEE2THk5amNITXVZMmhoCmJXSmxjbk5wWjI0dWIzSm5MMk53Y3k5amFHRnRZbVZ5YzJsbmJuSnZiM1F1YUhSdGJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKUER0d2tma0VWQ2VSNGUzdC9taC9ZVjNsUVdWUE12RVlCWlJxSE40ZmNOcytleklDTkxVTWJLR0tmS1gwai8vVTJLMFgxUzBFMFQ5WQpnT0tCV1lpK3dPTkdreVQra0wwbW9qQXQ2SmNtVnpXSmRKWVk5aFhpcnlRWlZnSUNzcm9QRk9yR2ltYkJoa1ZWaTc2U3ZweWtCTWRKClBKN29LWHFKMS82di8yajFwUmVRdmF5WnpLV0dWd2xuUnR2V0ZzSkc4ZVNwVVBXUDBaSVYwMTgreGdCSk9tNVlzdEhSSncwbHlETDQKSUJITmZUSXpTSlJVVE4zY2VjUXduK3VPdUZXMTE0aGN4V29rUGJMVEJRTlJ4Z2Z2ekJSeWREMXVjczRZS0l4S29IZmxDU3RGUkVlcwp0MmQvQVlvRldwTytvY0gvK09jT1o2UkhTWFpkZFpBYTlTYVA4QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgTm90YXJ5IChDbGFzcyBBKSBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHZlRDQ0JXV2dBd0lCQWdJQ0FRTXdEUVlKS29aSWh2Y05BUUVFQlFBd2dhOHhDekFKQmdOVkJBWVRBa2hWTVJBd0RnWURWUVFJCkV3ZElkVzVuWVhKNU1SRXdEd1lEVlFRSEV3aENkV1JoY0dWemRERW5NQ1VHQTFVRUNoTWVUbVYwVEc5amF5QklZV3h2ZW1GMFltbDYKZEc5dWMyRm5hU0JMWm5RdU1Sb3dHQVlEVlFRTEV4RlVZVzUxYzJsMGRtRnVlV3RwWVdSdmF6RTJNRFFHQTFVRUF4TXRUbVYwVEc5agpheUJMYjNwcVpXZDVlbTlwSUNoRGJHRnpjeUJCS1NCVVlXNTFjMmwwZG1GdWVXdHBZV1J2TUI0WERUazVNREl5TkRJek1UUTBOMW9YCkRURTVNREl4T1RJek1UUTBOMW93Z2E4eEN6QUpCZ05WQkFZVEFraFZNUkF3RGdZRFZRUUlFd2RJZFc1bllYSjVNUkV3RHdZRFZRUUgKRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNmRHOXVjMkZuYVNCTFpuUXVNUm93R0FZRApWUVFMRXhGVVlXNTFjMmwwZG1GdWVXdHBZV1J2YXpFMk1EUUdBMVVFQXhNdFRtVjBURzlqYXlCTGIzcHFaV2Q1ZW05cElDaERiR0Z6CmN5QkJLU0JVWVc1MWMybDBkbUZ1ZVd0cFlXUnZNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZIU00KRDd0TTlEY2VxUVdDMk9iaGJIRHFlTFZ1MFRoRURhaUR6bDNTMXRXQnhkUkw1MXVVY0NiYk81MXFUR0wzY2ZOazFtRTdQZXR6b3pmWgp6K3FNa2p2Tjl3ZmNablNYOUVVaTNmUmM0TDl0ODc1bE0rUVZPci9ibUpCVk9NVHRwbFZqQzdCNEJQVGpic0UvanZ4UmVCK1Nub1BDCi90bXdxY204V2dEL3FhaVlkUHYyTEQ0Vk9RMjJCRldvRHBnZ1FyT3hKYTErbW05ZFU3R3JEUHpyNFBONnM2aXovMGIyWTZMWU9waDcKdHF5Ri83QWxUM1JqNXhNSHBRcVBCZmZBWkc5K3B5ZUFsdDdVTG9aZ3gyc3JYbk43RitlUlAyUU0yRXNpTkN1Yk12SklINStoQ29SNgo0c0t0bHoyTzFjSDVWcU5RNmNhMCtwaWk3cFhtS2dPTTN3SURBUUFCbzRJQ256Q0NBcHN3RGdZRFZSMFBBUUgvQkFRREFnQUdNQklHCkExVWRFd0VCL3dRSU1BWUJBZjhDQVFRd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1JSUNZQVlKWUlaSUFZYjRRZ0VOQklJQ1VSYUMKQWsxR1NVZFpSVXhGVFNFZ1JYcGxiaUIwWVc1MWMybDBkbUZ1ZVNCaElFNWxkRXh2WTJzZ1MyWjBMaUJCYkhSaGJHRnViM01nVTNwdgpiR2RoYkhSaGRHRnphU0JHWld4MFpYUmxiR1ZwWW1WdUlHeGxhWEowSUdWc2FtRnlZWE52YXlCaGJHRndhbUZ1SUd0bGMzcDFiSFF1CklFRWdhR2wwWld4bGMybDBaWE1nWm05c2VXRnRZWFJoZENCaElFNWxkRXh2WTJzZ1MyWjBMaUIwWlhKdFpXdG1aV3hsYkc5emMyVm4KTFdKcGVuUnZjMmwwWVhOaElIWmxaR2t1SUVFZ1pHbG5hWFJoYkdseklHRnNZV2x5WVhNZ1pXeG1iMmRoWkdGellXNWhheUJtWld4MApaWFJsYkdVZ1lYb2daV3h2YVhKMElHVnNiR1Z1YjNKNlpYTnBJR1ZzYW1GeVlYTWdiV1ZuZEdWMFpXeGxMaUJCZWlCbGJHcGhjbUZ6CklHeGxhWEpoYzJFZ2JXVm5kR0ZzWVd4b1lYUnZJR0VnVG1WMFRHOWpheUJMWm5RdUlFbHVkR1Z5Ym1WMElHaHZibXhoY0dwaGJpQmgKSUdoMGRIQnpPaTh2ZDNkM0xtNWxkR3h2WTJzdWJtVjBMMlJ2WTNNZ1kybHRaVzRnZG1GbmVTQnJaWEpvWlhSdklHRjZJR1ZzYkdWdQpiM0o2WlhOQWJtVjBiRzlqYXk1dVpYUWdaUzF0WVdsc0lHTnBiV1Z1TGlCSlRWQlBVbFJCVGxRaElGUm9aU0JwYzNOMVlXNWpaU0JoCmJtUWdkR2hsSUhWelpTQnZaaUIwYUdseklHTmxjblJwWm1sallYUmxJR2x6SUhOMVltcGxZM1FnZEc4Z2RHaGxJRTVsZEV4dlkyc2cKUTFCVElHRjJZV2xzWVdKc1pTQmhkQ0JvZEhSd2N6b3ZMM2QzZHk1dVpYUnNiMk5yTG01bGRDOWtiMk56SUc5eUlHSjVJR1V0YldGcApiQ0JoZENCamNITkFibVYwYkc5amF5NXVaWFF1TUEwR0NTcUdTSWIzRFFFQkJBVUFBNElCQVFCSUpFYjN1bFp2K3Nnb0EwQk81VEU1CmF5WnJVMy9iMzkvemNUMG13QlFPeG1kN0k2Z01jOTBCdThiS2JqYzVWZFhIakZZZ0RpZ0tEdElxcExCSlVzWTRCLzYrQ2dtTTBaalAKeXRvVU1hRlAwam44RHhFc1E4UGRxNVBIVlQ1SGZCZ2FBTnp6ZTlqeWYxSnNJUFFMWDJsUzlPNzRzaWxnNitOSk1TRU4xclVRUWVKQgpDV3ppR3BwV1MzY0M5cUNibWllSDZGVXBjY0tRbjBWNEd1RVZaRDNRRHRpZ2RwK3V4ZEF1NnRZUFZ1eGtmMXFiRkZnQkozNFRVTWRyCkt1Wm9QTDljb0FvYjRRNTY2ZUtBdytucDl2MXNFWjdRNVNnbksxUXlRaFNDZGVaSzhDdG1kV09Nb3ZzRVBvTU9temJ3R09RbUlNT00KOENnSHJUd1hab2kxL2JhSQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpOZXRMb2NrIEJ1c2luZXNzIChDbGFzcyBCKSBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZTekNDQkxTZ0F3SUJBZ0lCYVRBTkJna3Foa2lHOXcwQkFRUUZBRENCbVRFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY1QKQ0VKMVpHRndaWE4wTVNjd0pRWURWUVFLRXg1T1pYUk1iMk5ySUVoaGJHOTZZWFJpYVhwMGIyNXpZV2RwSUV0bWRDNHhHakFZQmdOVgpCQXNURVZSaGJuVnphWFIyWVc1NWEybGhaRzlyTVRJd01BWURWUVFERXlsT1pYUk1iMk5ySUZWNmJHVjBhU0FvUTJ4aGMzTWdRaWtnClZHRnVkWE5wZEhaaGJubHJhV0ZrYnpBZUZ3MDVPVEF5TWpVeE5ERXdNakphRncweE9UQXlNakF4TkRFd01qSmFNSUdaTVFzd0NRWUQKVlFRR0V3SklWVEVSTUE4R0ExVUVCeE1JUW5Wa1lYQmxjM1F4SnpBbEJnTlZCQW9USGs1bGRFeHZZMnNnU0dGc2IzcGhkR0pwZW5Sdgpibk5oWjJrZ1MyWjBMakVhTUJnR0ExVUVDeE1SVkdGdWRYTnBkSFpoYm5scmFXRmtiMnN4TWpBd0JnTlZCQU1US1U1bGRFeHZZMnNnClZYcHNaWFJwSUNoRGJHRnpjeUJDS1NCVVlXNTFjMmwwZG1GdWVXdHBZV1J2TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0IKaVFLQmdRQ3g2Z1RzSUtBandvODRZTS9IUnJQVkcvNzd1Wm1lQk53Y2Y0eEtnWmp1cE5US2loZTVJbitEQ25WTW04QnAyR1E1bysyUwpvLzFiWEhRYXdFZktPbWwybXJyaVJCZjhUS1BWL3JpWGlLK0lBNGtmcFBJRVBzZ0hDK2I1c3k5NlloUUpSaFRLWlBXTGdMVmlxTmhyCjFuR1RMYk8vQ1ZSWTdRYnJxSHZjUTdHaGFRSURBUUFCbzRJQ256Q0NBcHN3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQkRBT0JnTlYKSFE4QkFmOEVCQU1DQUFZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1JSUNZQVlKWUlaSUFZYjRRZ0VOQklJQ1VSYUNBazFHU1VkWgpSVXhGVFNFZ1JYcGxiaUIwWVc1MWMybDBkbUZ1ZVNCaElFNWxkRXh2WTJzZ1MyWjBMaUJCYkhSaGJHRnViM01nVTNwdmJHZGhiSFJoCmRHRnphU0JHWld4MFpYUmxiR1ZwWW1WdUlHeGxhWEowSUdWc2FtRnlZWE52YXlCaGJHRndhbUZ1SUd0bGMzcDFiSFF1SUVFZ2FHbDAKWld4bGMybDBaWE1nWm05c2VXRnRZWFJoZENCaElFNWxkRXh2WTJzZ1MyWjBMaUIwWlhKdFpXdG1aV3hsYkc5emMyVm5MV0pwZW5SdgpjMmwwWVhOaElIWmxaR2t1SUVFZ1pHbG5hWFJoYkdseklHRnNZV2x5WVhNZ1pXeG1iMmRoWkdGellXNWhheUJtWld4MFpYUmxiR1VnCllYb2daV3h2YVhKMElHVnNiR1Z1YjNKNlpYTnBJR1ZzYW1GeVlYTWdiV1ZuZEdWMFpXeGxMaUJCZWlCbGJHcGhjbUZ6SUd4bGFYSmgKYzJFZ2JXVm5kR0ZzWVd4b1lYUnZJR0VnVG1WMFRHOWpheUJMWm5RdUlFbHVkR1Z5Ym1WMElHaHZibXhoY0dwaGJpQmhJR2gwZEhCegpPaTh2ZDNkM0xtNWxkR3h2WTJzdWJtVjBMMlJ2WTNNZ1kybHRaVzRnZG1GbmVTQnJaWEpvWlhSdklHRjZJR1ZzYkdWdWIzSjZaWE5BCmJtVjBiRzlqYXk1dVpYUWdaUzF0WVdsc0lHTnBiV1Z1TGlCSlRWQlBVbFJCVGxRaElGUm9aU0JwYzNOMVlXNWpaU0JoYm1RZ2RHaGwKSUhWelpTQnZaaUIwYUdseklHTmxjblJwWm1sallYUmxJR2x6SUhOMVltcGxZM1FnZEc4Z2RHaGxJRTVsZEV4dlkyc2dRMUJUSUdGMgpZV2xzWVdKc1pTQmhkQ0JvZEhSd2N6b3ZMM2QzZHk1dVpYUnNiMk5yTG01bGRDOWtiMk56SUc5eUlHSjVJR1V0YldGcGJDQmhkQ0JqCmNITkFibVYwYkc5amF5NXVaWFF1TUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUFUYnJvd1hyL2dPa0RGT3pUNEp3RzA2c1BnelRFZE0KNDNXSUVKZXNzRGdWa2NZcGxzd2h3RzA4cFhUUDJJS2xPY05sNDBKd3V5S1E0MzNiTlhiaG9MWGFuM0J1a3hvd09SMHcyeTdqZkxLUgpzdEUzS2ZxNTFoZGNSMC9qSFRqcm45VjdsYWdvbmhWSzBkSFFLd0NYb09LU05pdGpyRmdCYXpNcFVJYUQ4UUZJCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgRXhwcmVzcyAoQ2xhc3MgQykgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZUekNDQkxpZ0F3SUJBZ0lCYURBTkJna3Foa2lHOXcwQkFRUUZBRENCbXpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY1QKQ0VKMVpHRndaWE4wTVNjd0pRWURWUVFLRXg1T1pYUk1iMk5ySUVoaGJHOTZZWFJpYVhwMGIyNXpZV2RwSUV0bWRDNHhHakFZQmdOVgpCQXNURVZSaGJuVnphWFIyWVc1NWEybGhaRzlyTVRRd01nWURWUVFERXl0T1pYUk1iMk5ySUVWNGNISmxjM042SUNoRGJHRnpjeUJECktTQlVZVzUxYzJsMGRtRnVlV3RwWVdSdk1CNFhEVGs1TURJeU5URTBNRGd4TVZvWERURTVNREl5TURFME1EZ3hNVm93Z1pzeEN6QUoKQmdOVkJBWVRBa2hWTVJFd0R3WURWUVFIRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNgpkRzl1YzJGbmFTQkxablF1TVJvd0dBWURWUVFMRXhGVVlXNTFjMmwwZG1GdWVXdHBZV1J2YXpFME1ESUdBMVVFQXhNclRtVjBURzlqCmF5QkZlSEJ5WlhOemVpQW9RMnhoYzNNZ1F5a2dWR0Z1ZFhOcGRIWmhibmxyYVdGa2J6Q0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0IKalFBd2dZa0NnWUVBNit5d2JHR0tJeVd2WUNEajJaLzhrd3ZiWFkyd29iTkFPb0xPL1hYZ2VESURobHFHbFpIdFUvcWRRUHptNk4zWgpXM29EdlYzek93ekRVWG1iclZXZzZkQURFSzhLdWhSQzJWSW1FU0xIMGlETWdxU2FxZjY0Z1hhZGFyZlNOblUrc1lZSjltNXRmazYzCmV1eXVjWVQyQkRNSUpUTHJkS3dXUk1ia1FKTWRmNjBDQXdFQUFhT0NBcDh3Z2dLYk1CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRUXcKRGdZRFZSMFBBUUgvQkFRREFnQUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekNDQW1BR0NXQ0dTQUdHK0VJQkRRU0NBbEVXZ2dKTgpSa2xIV1VWTVJVMGhJRVY2Wlc0Z2RHRnVkWE5wZEhaaGJua2dZU0JPWlhSTWIyTnJJRXRtZEM0Z1FXeDBZV3hoYm05eklGTjZiMnhuCllXeDBZWFJoYzJrZ1JtVnNkR1YwWld4bGFXSmxiaUJzWldseWRDQmxiR3BoY21GemIyc2dZV3hoY0dwaGJpQnJaWE42ZFd4MExpQkIKSUdocGRHVnNaWE5wZEdWeklHWnZiSGxoYldGMFlYUWdZU0JPWlhSTWIyTnJJRXRtZEM0Z2RHVnliV1ZyWm1Wc1pXeHZjM05sWnkxaQphWHAwYjNOcGRHRnpZU0IyWldScExpQkJJR1JwWjJsMFlXeHBjeUJoYkdGcGNtRnpJR1ZzWm05bllXUmhjMkZ1WVdzZ1ptVnNkR1YwClpXeGxJR0Y2SUdWc2IybHlkQ0JsYkd4bGJtOXllbVZ6YVNCbGJHcGhjbUZ6SUcxbFozUmxkR1ZzWlM0Z1FYb2daV3hxWVhKaGN5QnMKWldseVlYTmhJRzFsWjNSaGJHRnNhR0YwYnlCaElFNWxkRXh2WTJzZ1MyWjBMaUJKYm5SbGNtNWxkQ0JvYjI1c1lYQnFZVzRnWVNCbwpkSFJ3Y3pvdkwzZDNkeTV1WlhSc2IyTnJMbTVsZEM5a2IyTnpJR05wYldWdUlIWmhaM2tnYTJWeWFHVjBieUJoZWlCbGJHeGxibTl5CmVtVnpRRzVsZEd4dlkyc3VibVYwSUdVdGJXRnBiQ0JqYVcxbGJpNGdTVTFRVDFKVVFVNVVJU0JVYUdVZ2FYTnpkV0Z1WTJVZ1lXNWsKSUhSb1pTQjFjMlVnYjJZZ2RHaHBjeUJqWlhKMGFXWnBZMkYwWlNCcGN5QnpkV0pxWldOMElIUnZJSFJvWlNCT1pYUk1iMk5ySUVOUQpVeUJoZG1GcGJHRmliR1VnWVhRZ2FIUjBjSE02THk5M2QzY3VibVYwYkc5amF5NXVaWFF2Wkc5amN5QnZjaUJpZVNCbExXMWhhV3dnCllYUWdZM0J6UUc1bGRHeHZZMnN1Ym1WMExqQU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQVFyWC9YRERLQUN0aUc4WG1ZdGEzVXpiTTIKeEpaSXdWek5tdGtGTHArK1VPdjBKaFFRTGRSbUYvaWV3U2Y5OGUza2UwdWdiTFdybWxkd3B1MmdwTzB1OWYzOHZmNU5Od2dNdk9PVwpneUwxU1J0L1N5dTBWTUdBZkpsT0hkQ003dENzNVpMNmRWYitaS0FUajdpNEZwMWhCV2VBeU5EWXBRY0NOSmdFalRNRTFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKWFJhbXAgR2xvYmFsIENBIFJvb3QKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnakVMTUFrR0ExVUUKQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWagpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3hOREEwV2hjTk16VXdNVEF4TURVek56RTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXgKSGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZwpVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDWUpCNjlGYlM2MzhlTXBTZTJPQXRwODdaT3FDd3UKSVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1BLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeApmb0FydFl6QVFEc1JodERMb29ZMllLVFZNSUp0Mlc3UUR4SUVNNWRmVDJGYThPVDVrYXZuSFR1ODZNLzBheTAwZk9KSVlSeU84MkZFCnpHK2dTcW1Vc0UzYTU2azBlbkk0cUVITVBKUVJmZXZJcG95M2hzdktNenZaUFRlTCszbytoaXpuYzljS1Y2eGtteG5yOUE4RUNJcXMKQXhjWlpQUmFKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpUHZyeQp4UzNUL2RSbEFnTUJBQUdqZ1o4d2dad3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFBCQVFEQWdHR01BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTVpQb2owR1k0UUpuTTVpNUFTc2pWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXAKb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQwpBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjCi9LaDRaelh4SGZBUnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYUlSOU5tWG1kNGM4bgpueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5aTZteDVPK2FHdEE5YVpudXFDaWo0VHl6CjhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVFPKzdFVFBUc0ozeEN3blI4Z29vSnliUURKYnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdvIERhZGR5IENsYXNzIDIgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWQpWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTNNRFl5TUZvWERUTTBNRFl5T1RFM01EWXlNRm93WXpFTE1Ba0cKQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSb1pTQkhieUJFWVdSa2VTQkhjbTkxY0N3Z1NXNWpMakV4TUM4R0ExVUVDeE1vUjI4ZwpSR0ZrWkhrZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRU5BRENDQVFnQ2dnRUJBTjZkMStwWEdFbWhXK3ZYWDBpRzZyN2QvK1R2Wnh6MFpXaXpWM0dnWG5lNzdadEo2WENBUFZZWVl3aHYKMnZMTTBEOS9BbFFpVkJEWXNvSFV3SFU5UzMvSGQ4TStlS3NhQTdVZ2F5OXFLN0hGaUg3RXV4Nnd3ZGhGSjIrcU4xajNoeWJYMkMzMgpxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaUVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqCllHQjB4VUdsY21JYllzVWZiMThhUXI0Q1VXV29yaU1ZYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVkKdkxFSFo2SVZEZDJnV01aRWV3bytZaWhmdWtFSFUxalBFWDQ0ZE1YNC83VnBrSStFZE9xWEc2OENBUU9qZ2NBd2diMHdIUVlEVlIwTwpCQllFRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvCmF0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXUKTVRFd0x3WURWUVFMRXloSGJ5QkVZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3RwpBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltClBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeU9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3QKSTNscGpiaTJUYzdQVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSZEVyL1Z4cUhEM1ZJCkxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWZSZVlObnlpY3Nia3FXbGV0TncrdkhYL2IKdlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgQ2xhc3MgMiBDQQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUR6Q0NBdmVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFQ2hNYwpVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnClEyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXdOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm8KTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRUNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBRwpBMVVFQ3hNcFUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmOE1PaDJ0VFkKYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4rbHEyY3dRbFp1dDNmK2RaeGtxWgpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMFg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtCmVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhSzRVbWtoeW5BclBrUHcydkNIbUN1RFk5NnB6VE5iTzhhY3Ixekozby9XU04KRjRBemJsNUtYWm5KSG9lMG5SckExVzRUTlNOZTM1dGZQZS9XOTNiQzZqNjdlQTBjUW1kckJOajQxdHB2aS9KRW9BR3JBZ0VEbzRIRgpNSUhDTUIwR0ExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlJ6dDBmCmh2UmJWYXpjMXhEQ0RxbUk1NkZzcEdvd2FERUxNQWtHQTFVRUJoTUNWVk14SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm8KYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBc1RLVk4wWVhKbWFXVnNaQ0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0ZwpRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzCmFmUHpXZHFiQVljYVQxZXBvWGtKS3R2M0w3SWV6TWRlYXRpRGg2R1g3MGsxUG5jR1FWaGl2NDVZdUFwblAreXozU0ZtSDhsVStuTE0KUFV4QTJJR3ZkNTZEZXJ1aXgvVTBGNDdaRVVEMC9Dd3FUUlYvcDJKZExpWFRBQXNnR2gxbytSZTQ5TDJMN1NoWjNVMFdpeGVEeUxKbAp4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wVlNKWUFDUHE0eEpECktWdEhDTjJNUVdwbEJxamxJYXBCdEpVaGxibDkwVFNyRTlhdHZOemlQVG5OdlQ1MWNLRVlXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTMKUUJGR21oOTVEbUsvRDVmczRDOGZGNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIeVRDQ0JiR2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCOU1Rc3dDUVlEVlFRR0V3SkpUREVXTUJRR0ExVUVDaE1OClUzUmhjblJEYjIwZ1RIUmtMakVyTUNrR0ExVUVDeE1pVTJWamRYSmxJRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJsbmJtbHUKWnpFcE1DY0dBMVVFQXhNZ1UzUmhjblJEYjIwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EWXdPVEUzTVRrMApOak0yV2hjTk16WXdPVEUzTVRrME5qTTJXakI5TVFzd0NRWURWUVFHRXdKSlRERVdNQlFHQTFVRUNoTU5VM1JoY25SRGIyMGdUSFJrCkxqRXJNQ2tHQTFVRUN4TWlVMlZqZFhKbElFUnBaMmwwWVd3Z1EyVnlkR2xtYVdOaGRHVWdVMmxuYm1sdVp6RXBNQ2NHQTFVRUF4TWcKVTNSaGNuUkRiMjBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBdwpnZ0lLQW9JQ0FRREJpTnNKdkd4R2ZIaWZsWHUxTTVEeWNtTFd3VFlnSWlSZXp1bDM4a01Lb2daa3BNeU9Odmc0NWlQd2JtMnhQTjF5Cm80VWNvZE05dERNcjB5K3YvdXF3UVZsbnRzUUdmUXFlZElYV2VVeUFOM3JmT1FWU1dmZjBHMFpEcE5LRmhkTERjZk4xWWpTNkxJcC8KSG8vdTdUVFFFY2VXelZJOXVqUFczVTNlQ3p0S1M1L0NKaS82dFJZY2NqVjN5anhkNXNyaEpvc2FOblpjQWR0MEZDWCs3YldnaUEvZAplTW90SHdlWE1BRXRjbm42UnRZVEtxaTVwcXVEU1IzbDh1L2Q1QUdPR0FxUFkxTVdoV0twRGhrNnpMVm1wc0pyZEFma0srRjJQclJ0CjJQWkU0WE5pSHp2RXZxQlRWaVZzVVFuM3Fxdkt2M2I5Ylp2em5kdS9QV2E4REZhcXI1aElsVHBMMzZkWVVOazRkYWxiNmtNTUF2K1oKNitoc1RYQmJLV1djM2FwZHpLOEJNZXdNNjlLTjZPcWNlK1p1OXlkbURCcEkxMjVDNHovZUlUNTc0UTF3KzJPcXFHd2FWTFJjSlhySgpvc21MRnFhN0xINFhYZ1ZOV0c0U0hRSHVFaEFOeGpKL0dQLzg5UHJOYnBIb05rbStHa2hwaThLV1RSb1NzbWtYd1FxUTF2cDVJa2kvCnVudHArSERIK25vMzJOZ04wblpQVi8rUXQrT1IwdDN2d21DM1p6cmQvcXFjOE5TTGYzSWl6c2FmbDdiNHI0cWdFS2paK3hqR3RyVmMKVWp5SnRoa3Fjd0VLRHdPekVtRHllaStCMjZOdS95WXdsL1dMM1lsWHRxMDlzNjhyeGJkMkF2Q2wxaXVhaGhRcWN2YmpNNHhkQ1VzVAozN3VNZEJOU1N3SURBUUFCbzRJQ1VqQ0NBazR3REFZRFZSMFRCQVV3QXdFQi96QUxCZ05WSFE4RUJBTUNBYTR3SFFZRFZSME9CQllFCkZFNEw3eHFrUUZ1bEYybUhNTW8wYUVQUVFhN3lNR1FHQTFVZEh3UmRNRnN3TEtBcW9DaUdKbWgwZEhBNkx5OWpaWEowTG5OMFlYSjAKWTI5dExtOXlaeTl6Wm5OallTMWpjbXd1WTNKc01DdWdLYUFuaGlWb2RIUndPaTh2WTNKc0xuTjBZWEowWTI5dExtOXlaeTl6Wm5OagpZUzFqY213dVkzSnNNSUlCWFFZRFZSMGdCSUlCVkRDQ0FWQXdnZ0ZNQmdzckJnRUVBWUcxTndFQkFUQ0NBVHN3THdZSUt3WUJCUVVICkFnRVdJMmgwZEhBNkx5OWpaWEowTG5OMFlYSjBZMjl0TG05eVp5OXdiMnhwWTNrdWNHUm1NRFVHQ0NzR0FRVUZCd0lCRmlsb2RIUncKT2k4dlkyVnlkQzV6ZEdGeWRHTnZiUzV2Y21jdmFXNTBaWEp0WldScFlYUmxMbkJrWmpDQjBBWUlLd1lCQlFVSEFnSXdnY013SnhZZwpVM1JoY25RZ1EyOXRiV1Z5WTJsaGJDQW9VM1JoY25SRGIyMHBJRXgwWkM0d0F3SUJBUnFCbDB4cGJXbDBaV1FnVEdsaFltbHNhWFI1CkxDQnlaV0ZrSUhSb1pTQnpaV04wYVc5dUlDcE1aV2RoYkNCTWFXMXBkR0YwYVc5dWN5b2diMllnZEdobElGTjBZWEowUTI5dElFTmwKY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlGQnZiR2xqZVNCaGRtRnBiR0ZpYkdVZ1lYUWdhSFIwY0RvdkwyTmxjblF1YzNSaApjblJqYjIwdWIzSm5MM0J2YkdsamVTNXdaR1l3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITURnR0NXQ0dTQUdHK0VJQkRRUXJGaWxUCmRHRnlkRU52YlNCR2NtVmxJRk5UVENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQWdFQUZteVo5R1lNTlBYUWhWNTlDdXphRUU0NEhGN2ZwaVVGUzVFeXdlZzc4VDNkUkFsYkIwbUtLY3RtQXJleG12Y2xtQWs4amh2aAozVGFISzB1N2FOTTVaajJnSnNmeU9aRWRVYXVDZTM3Vnpscms0Z05YY0dtWENQbGVXS1lLMzR3R21rVVdGamdLWGxmMllzZDZBZ1htCnZCNjE4cDcwcVNtRCtMSVU0MjRvaDBURGtCcmVPS2s4ckVOTlpFWE8zU2lwWFBKemV3VDRGK2lyc2ZNdVhHUnVjekU2RXJpOHN4SGsKZlkrQlVabzdqWW4wVFpObWV6d0Q3ZE9hSFpyelpWRDFvTkIxbnkrdjhPcUNRNWo0YVp5SmVjUkRqa1p5NDJRMkVxLzNKUjQ0aVpCMwpmc05yYXJuRHkwUkxySGlRaStmSExCNUxFVVRJTkZJbnpRcGRuNFhCaWRVYWVQS1ZFRk15M1lDRVpuWFp0V2dvKzJFdXZvU29PTUNaCkVvYWxIbWRrclFZdUw2bHdoY2VXRDN5SlpmV09RMVFPcTkybGdEbVVZTUEweVpad0xLTVM5UjlJZTcwY2ZtdTNuWkQwSWp1dStQd3EKeXZxQ1VxRHZyMHRWayt2QnRmQWlpNncwVGlZaUJLR0hMSFZLdCtWOUU5ZTRER1RBTnRMSkw0WVNqQ01Kd1J1Q08zTkpvMnBYaDVUbAoxbmpGbVVOajQwM2dkeTNoWlpseWFRUWFSd25tRHdGV0pQc2Z2dzU1cVZndXVjUUpBWDZWdW0wQUJqNnk2a29RT2RqUUsvVy83SFcvCmx3TEZDUnNJM0ZVMzRvSDdONFJEWWlESzUxWkxaZXIrYk1Fa2t5U2hOT3NGLzVvaXJwdDlQL0ZsVVFxbU1HcXo5SWdjZ0EzOGNvcm8KZzE0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUYWl3YW4gR1JDQQo9PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNqQ0NBMXFnQXdJQkFnSVFINTFaV3RjdndnWkVwWUFJYWVOZTlqQU5CZ2txaGtpRzl3MEJBUVVGQURBL01Rc3dDUVlEVlFRRwpFd0pVVnpFd01DNEdBMVVFQ2d3blIyOTJaWEp1YldWdWRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYCkRUQXlNVEl3TlRFek1qTXpNMW9YRFRNeU1USXdOVEV6TWpNek0xb3dQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHYKZG1WeWJtMWxiblFnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQUpvbHVPek1vbldvZS9mT1cxbUt5ZEdHRWdoVTdKenk1MGIyaVBOODZhWGZURWMycEJzQkhIOGVWNHFOCnc4WFJJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxZ1FkVzhvcjUKQnREM2NDSk50TGRCdVRLNHNmQ3h3NXcvY1AxVDNZR3EyR040OXRoVGJxR3Nhb1FrY2xTR3h0S3l5aHdPZVlIV3RYQmlDQUV1VGs4TwoxUkd2cWEvbG1yL2N6SWR0SnVUSlY2TDdsdm5NNFQ5VGpHeE1mcHRUQ0F0c0YvdG55TUt0c2MyQXRKZmNkZ0VXRmVscTE2VGhlRWZPCmh0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyaldSK3RTQnFuVHVCdG85QUFHZExpWWE0ekdYK0ZWUHBCTUhXWHgxRTF3b3YKSjVwR2ZhRU5kYTFVaGhYY1NUdnhsczRQbTZEc28zcGR2dFVxZFVMbGU5Nmx0cXF2S0t5c2tLdzR0OVZvTlNaNjNQYzc4LzFGbTlHNwpRM2h1Yi9GQ1ZHcVk4QTJ0bCtsU1h1blZhbkxlYXZjYllCVDBwZVMyY1dlcUgrcmlUY0ZDUVA1blJoYzRMMGMvY1p5dTVTSEtZUzF0CkI2aUVmQzN1VVNYeFk1Q2UvZUZYaUd2dmlpTnRzZWE5UDYzUlBaWUxoWTNOYXllN3R3V2I3THVScVFvSEVnS1hUaUNROFA4Tkh1SkIKTzlOQU91ZU5YZHBtNUFLd0IxS1lYQTZPTTV6Q3BwWDdWUmx1VEk2dVN3Kzl3VGhOWG8rRUhXYk54V0NXdEZKYUJZbU9sWHFZd1pFOApsU095RHZSNXRNbDh3VW9oQWdNQkFBR2phakJvTUIwR0ExVWREZ1FXQkJUTXpPL01LV0NrTzdHU3RqejZNbUtQckNVVk96QU1CZ05WCkhSTUVCVEFEQVFIL01Ea0dCR2NxQndBRU1UQXZNQzBDQVFBd0NRWUZLdzREQWhvRkFEQUhCZ1ZuS2dNQUFBUVVBNXZ3SWhQL2xTZzIKMDl5ZXdETDdNVHFLVVdVd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFFQ0FTdm9teWM1ZU1OMVBoblIyV1BXdXM0TXplS1I2ZEJjWgpUdWxTdGJuZ0NuUmlxbWpLZUtCTW1vNHNJeTdWYWhJa3Y5Um8wNHJRMkp5ZnRCOE0zamgrVnpqOGplSlBYZ3lmcXp2Uy8zV1h5NlRqClp3ai81Y0FXdFVnQmZlbjVDdjhiNVdwcHYzZ2hxTUtuSTZtR3EzWlc2QTRNOWhQZEttYUtaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjIKTmUvL0FIWTJSVEtieGthRlhlSWtzQjdqU0phWVYwZVVWWG9QUWJGRUpQUEIvaHBydjRqOXdhYmFrMkJlZ1VxWklKeElaaG0xQUhsVQpEN2dzTDB1OHFWMWJZSCtNaDZYZ1VtTXF2dGc3aFVBVi9oNjJaVC9GUzlwK3RYbzFLYU11ZXBoZ0lxUDBmU2RPTGVxMGREenBENlF6CkR4QVJ2Qk1CMXVVTzA3KzFFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmsKWjZNbW5EK2lNc0pLeFlFWU1SQldxb1R2TFFyL3VCOTMwcitsV0tCaTVOZExrWFdOaVlDWWZtM0xVMDVlci9heWw0V1h1ZHBWQnJrawo3dGZHT0I1akd4STdsZUZZclBMZmhOVmZtUzhOVlZ2bU9Oc3VQM0xwU0lYTHV5a1RqeDQ0VmJuenNzUXdtU05PWGZKSW9SSU0zQktRCkNaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlTE1ERGF2N3YzQXVuK2tiZllOdWNwbGxRZFNOcGM1T3kKK2Z3QzAwZm1jYzRRQXU0bmpJVC9yRVVORTF5RE11QWxwWVlzZlBRUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpGaXJtYXByb2Zlc2lvbmFsIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFVnpDQ0F6K2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQm5URUxNQWtHQTFVRUJoTUNSVk14SWpBZ0JnTlZCQWNUCkdVTXZJRTExYm5SaGJtVnlJREkwTkNCQ1lYSmpaV3h2Ym1FeFFqQkFCZ05WQkFNVE9VRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnAKWTJGamFXOXVJRVpwY20xaGNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMk1qWXpOREEyT0RFbU1DUUdDU3FHU0liM0RRRUpBUllYWTJGQQpabWx5YldGd2NtOW1aWE5wYjI1aGJDNWpiMjB3SGhjTk1ERXhNREkwTWpJd01EQXdXaGNOTVRNeE1ESTBNakl3TURBd1dqQ0JuVEVMCk1Ba0dBMVVFQmhNQ1JWTXhJakFnQmdOVkJBY1RHVU12SUUxMWJuUmhibVZ5SURJME5DQkNZWEpqWld4dmJtRXhRakJBQmdOVkJBTVQKT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWhjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTJNall6TkRBMgpPREVtTUNRR0NTcUdTSWIzRFFFSkFSWVhZMkZBWm1seWJXRndjbTltWlhOcGIyNWhiQzVqYjIwd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEbkl3TnZieU9sWG5qT2xTenRsQjV1Q3A0Qngrb3cwU3lkM1Rmb201aDVWdFA4YzkvUWl0NVYKajFINVd1cmV0WERFN2FUdC82TU5iZzlrVURHdkFTZFlydjVzcDBvdkZ5M1RjOVVUSEk5WnBUUXNIVlFFUmMxb3VLREFBNlhQaFVKSApsU2hieisrQWJPQ1FsNG9CUEIzemh4QXdKa2g5MS96cG5aRngvMEdhcVVDMU41d3BJRThmVXVPZ2ZSTnRWTGNLM3VscVRnZXNyQmxmCjNINWlkUGF5QlFDNmhhRDlIVGh1eTFxN2hyeVVaek0xZ3l3Zkk4MzR5SkZ4ekplTDc2NFAzQ2tERzhBNTYzRHR3VzRPMkdjTGlhbTgKTmVUdnRqUzBwYmJFTGFXKzBNT1VKRWpiMzViVEFMVm1Hb3RtQlEvZFB6L0xQNnBlbWtyNHRFcnZsVGNiQWdNQkFBR2pnWjh3Z1p3dwpLZ1lEVlIwUkJDTXdJWVlmYUhSMGNEb3ZMM2QzZHk1bWFYSnRZWEJ5YjJabGMybHZibUZzTG1OdmJUQVNCZ05WSFJNQkFmOEVDREFHCkFRSC9BZ0VCTUNzR0ExVWRFQVFrTUNLQUR6SXdNREV4TURJME1qSXdNREF3V29FUE1qQXhNekV3TWpReU1qQXdNREJhTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVU13dWdadEhxMnM3ZVlwTUVLRksxRkg4NGFMY3dEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUVkei9vMG5WUEQxMUhlY0ozbFhWN2NWVnV6SDJGaTNBUUwwTSsyVFVJaWVmRWF4dlQ4VWIvR3pSMGlMakpjRzErcCtvMXdxCnUwMHZSK0w0T1FiSm5DNHhHZ040OUx3NHhpS0xNekh3RmdRRWZmbDI1RXZYd09hRDdGbk1QOTcvVDJ1M1ozNm1ob0V5SXdPZHlQZGYKd1VwZ3BaS3BzYVNnWU1ONGg3TWk4eXJyVzZudEJhczNEN0hpMDVWMlkxWjBqRmh5R3pmbFpLRytUUXlUbUF5WDlvZHRzei9ueTRDbQo3WWpIWDFCaUF1aVpkQmJRNXJRNThTZkx5RURXNDRZUXFTTVNrdUJwUVdPbnJ5VUx3TVdTeXg2WW8xcTZ4VE1Qb0pjQjNYL2dlOVlHClZNK2g0azA0NjB0UXRjc205TXJhY0VwcW9lSjVxdUduTS9iOVNoLzIyV0E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCldlbGxzIEZhcmdvIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDVUQ0NBczJnQXdJQkFnSUVPZVNYbmpBTkJna3Foa2lHOXcwQkFRVUZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgpCQW9UQzFkbGJHeHpJRVpoY21kdk1Td3dLZ1lEVlFRTEV5TlhaV3hzY3lCR1lYSm5ieUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlVEV2TUMwR0ExVUVBeE1tVjJWc2JITWdSbUZ5WjI4Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY04KTURBeE1ERXhNVFkwTVRJNFdoY05NakV3TVRFME1UWTBNVEk0V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9UQzFkbApiR3h6SUVaaGNtZHZNU3d3S2dZRFZRUUxFeU5YWld4c2N5QkdZWEpuYnlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV2Ck1DMEdBMVVFQXhNbVYyVnNiSE1nUm1GeVoyOGdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFZxRE03SnZrMC84MmJmdVVFUjg0QTRuMTM1ekhDTGllbFRXaTVNYnFOUTFtWAp4M09xZnoxY1FKNEY1YUhpaWRsTXVEK2IrUXkweUdJWkxFV3VrUjV6Y1VIRVN4UDljTUlsckNMMWRRdTNVK1NsSzkzT3ZSdzZlc1AzCkU0OG1WSndXYTJ1dis5aVdzV0NhU09BbElpUjVOTTRPSmdBTFRxdjlpODZDMXk4SWNHakJxQXI1ZEU4SHE2VDU0b04rSjNOMFByajUKT0VMOHBhaGJTQ096NitNbHNvQ3VsdFFLbk1KNG1zWm9HSzQzWWpkZVVYV29XR1BBVWU1QWVINm9yeHFnNGJCNG5WQ01lK2V6L0k0agpzTnRsQUhDRUFRZ0FGRzVVaHBxNnpQazNFUGJnM29RdG5hU0ZOOU9INHhYUXdSZVFmaGtoYWhLcGR2MFNBdWxQSVY0WEFnTUJBQUdqCllUQmZNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdUQVlEVlIwZ0JFVXdRekJCQmd0Z2hrZ0JodnQ3aHdjQkN6QXlNREFHQ0NzR0FRVUYKQndJQkZpUm9kSFJ3T2k4dmQzZDNMbmRsYkd4elptRnlaMjh1WTI5dEwyTmxjblJ3YjJ4cFkza3dEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQU5JbjNad0tkeXU3SXZJQ3RVcEtrZm5STGI3a3V4cG83dzZrQU9udTUrL3U5dm5sZEtUQzJGSll4SFQ3em11MU95bDVHRnJ2Cm0rMGZhemJ1U0NVbEZMWldvaERvN3FkLzBEK2owTU5kSnU0SHpNUEJKQ0dISHQ4cUVsTnZRUmJuN2E2VStveHkraE5IOER4K3JuMFIKT2hQczdmcHZjbVI3blgxL0p2MTYreVd0Nmo0cGYwempBRmN5c0xQcDdWTVgyWXV5RkE0dzZPWFZFOFprcjhRQTFkaFlKUHoxait6eAp4MzJsMnc4bjBjYnlRSWptSC9aaHFQUkN5TGszMDZtK0xGWjR3bktiV1YwMVFJcm9UbU1hdHVrZ2FsSGl6cVNRMzNad21WeHdRMDIzCnRxY1paRTZTdDhXUlBIOUlGbVY3RnYzTC9QdloxZFpQSVdVN1NuOUhvL3M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzY29tIFJvb3QgQ0EgMQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyVENDQThHZ0F3SUJBZ0lRWEF1RlhBdm5XVUhmVjh3L2Y1Mm9OakFOQmdrcWhraUc5dzBCQVFVRkFEQmtNUXN3Q1FZRFZRUUcKRXdKamFERVJNQThHQTFVRUNoTUlVM2RwYzNOamIyMHhKVEFqQmdOVkJBc1RIRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJWeQpkbWxqWlhNeEd6QVpCZ05WQkFNVEVsTjNhWE56WTI5dElGSnZiM1FnUTBFZ01UQWVGdzB3TlRBNE1UZ3hNakEyTWpCYUZ3MHlOVEE0Ck1UZ3lNakEyTWpCYU1HUXhDekFKQmdOVkJBWVRBbU5vTVJFd0R3WURWUVFLRXdoVGQybHpjMk52YlRFbE1DTUdBMVVFQ3hNY1JHbG4KYVhSaGJDQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekViTUJrR0ExVUVBeE1TVTNkcGMzTmpiMjBnVW05dmRDQkRRU0F4TUlJQwpJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMExtd3FBelp1ejhoK0J2Vk01T0FGbVVnZGJJOW0yQnRSc2lNCk1XOFh3L3FhYkZidFBNV1JWOFBOcTVaSmtDb1pTeDZqYlZmZDhTdGlLSFZGWHFyV1cvb0xKZGloRnZrY3hDN21sU3Buek5BcGJqeUYKTkRoaFNiRUFuOVk2Y1Y5TmJjNWZ1YW5raVg5cVV2ckttL0xjcWZtZG1VYy9UaWxmdEthTlhYc0xtUkVEQS83bjI5dWoveDJselpBZQpBUjgxc0g4QTI1QnZ4bjU3MGU1NmVxZXFERmR2cEczRkV6dXdwZG50TWh5MFhtZUxWTnh6aCtYVEYzeG1VSEpkMUJwWXdkblAySWtDCmI2ZEp0RFpkMEtUZUJ5eTJkYmNva2RhWHZpajFtQjdxV3liSnZiQ1hjOXF1a1NicmFNSDVPUlhXWjBzS2JVL0x6N0RrUW5HTVUzbm4KN3VIYkhhQnVIWXdhZHpWY0ZoNHJVeDgwaTlGcy9QSm5CM3IxcmUzV21xdWhzVXZoekRkZi9YL05UYTY0SDV4RCtTcFlWVU5GdkpiTgpjQTc4eWVObXVrNk5PNEhMRldSN3VaVG9YVE5TaFhFdVQ0NmlCaEZSeWVQTG9XNHhDR1FNd3RJODlUYm8xOUFPZUNNZ2tja2tLbVVwCld5TDNJYzZEWHFUejNrdlRhSTlHZFZ5RENXNHBhOFJ3alBXZDF5QXYvMGJTS3pqQ0wzVWNQWDdhcGU4ZVlJVnBRdFBNK0dQK0hrTTUKaGFhMlkwRVFzM01ldk5QNnluMFdSK0tuMWRDamlnb0lsbUpXYmpUYjJRSzVNSFhqQk5Mbmo4S3dFVUFLck5WeEFtS0xNYjdkeGlOWQpNVUpETFhUNXhwNm1pZy9wL3IrRDVrTlhKTHJ2UmpTcTF4SUJPTzBDQXdFQUFhT0JoakNCZ3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkhRWURWUjBoQkJZd0ZEQVNCZ2RnaFhRQlV3QUJCZ2RnaFhRQlV3QUJNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUWN3SHdZRFZSMGoKQkJnd0ZvQVVBeVV2M20rQ0FUcGNMTndyb1dtMVo5U00wLzB3SFFZRFZSME9CQllFRkFNbEw5NXZnZ0U2WEN6Y0s2RnB0V2ZVak5QOQpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUUExRU12c3BnUU5EUS9Od051cnFQS0lsd3pma3k5TmZFQldNWHJycEE5Z3pYcnp2c01uCmpnTStwTjBTNzM0ZWRBWThQekh5SEh1Uk1TRzA4TkJzbDlUcGw3SWtWaDVXd3pXOWlBVVBXeEFhWk9ISGdqRDVNcTJlVUN6bmVBWFEKTWJGYW1JcDFUcEJjYWhRcTRGSkhnbURtSHRxQnNmc1VDMXJ4bjlLVnVqN1FHOVlWSGFPK2h0WGJEOEJKWkxzdVVCbEwwaVQ0M1I0SApWdEE0b0pWd0lIYU0xOTBlM3A5eHhDUHZneE5jb3lRVlRTbEFQR3JFcWRpM3BrU2xEZlRnblhjZVFIQW0vTnJaTnVSNTVMVS92SnRsCnZyc1Jscy9ieGlnNU9nak9SMXRUV3NXWi9sMnAzZTlNMU1hbHJRTG1qQWNTSG04RDBXK2dvL01wdlJMSFVLS3dmNGlwbVhlYXNjQ2wKT1M1Y2ZHbmlMTERxTjJxazRWcmg5VkRsZysrbHV5cUk1NHpiL1cxZWx4bW9mbVoxYTNIcXY3SEhiNkQwanFUc05GRmJqQ1lEY0tGMwoxUUVTVndBMTJ5UGVEb29vbWYyeEVHOUwvemd0WUU0c25PdG50YTFKN2tzZnJLLzdEWkJhWm1Cd1hhck5lTlFrN3NoQm9KTUJrcHhxCm52eTVKTVd6RllKK3ZxNlZLK3V4d05yakFXQUxYbW1zaEZaaHZuRVgvaDBURC83R2gwWHAvaktnR2cwVHBKUlZjYVVXaTdyS2liQ3kKeC95UDJGUzFrMktkenM5Wit6MFl6aXJMTlJXQ1hmOVVJbHR4VXZ1M3lmNWdtd0JCWlBDcUt1eTJRa1BPaVdhQnlJdWZPVlFESmRNVwpOWTZFMEYvNk1CcjFtbXowRGxQNU9sdlJIQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRdwpJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4Ck1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUwKRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3Y0pwU0lxdlRPCjlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQbURJMmRzemUzVHlvb3U5cSt5SHkKVW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZyt3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVwovbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNFZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5Cm9lYjZwTm5WRnpGMXJvVjlJcTQvQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGYKR0hkUEFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSRgo2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQ2RXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmMKRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGbgpTYk5kNjdJSkt1c203WGkrZlQ4cjg3Y21OVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpCjhiNVFaN2RzdmZQeEgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKSGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBdwpNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCmR5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3EKaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0JDU0RNQVpPbgpUakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85N25oNlZmZTYzU0tNSTJ0YXZlZ3c1CkJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0NDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUgKNGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1BUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveQo3dnJUQzBMVXE3ZEJNdG9NMU8vNGdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCCm8yTXdZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUlRMdG0KOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3JoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yCkViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZzA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXQKdGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NgpVQWIzTHVqRVYwbHNZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnNNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNzdwpLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3Ck1Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVoKTUJjR0ExVUVDeE1RZDNkM0xtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdQpZMlVnUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbSs5Uzc1UzB0Ck1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXUE50ME9LUkt6RTBsZ3ZkS3BWTVMKT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU14Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0MwpNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRCk5BUVRYS0Z4MDFwOFZkdGVaT0UzaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWUKaDEwYVVBc2dFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUFGTEUrdzJrRCtMOUhBZFNZCkpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lY256eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVEKVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6ZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcApteVBJbm5naUszQkQ0MVZITVdFWjcxakZoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLCm1ORVZYNThTdm53Mll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcCtPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0cGx1cyBDbGFzcyAyIFByaW1hcnkgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEa2pDQ0FucWdBd0lCQWdJUkFJVzlTL1BZMnVOcDlwVFhYOE9sUkNNd0RRWUpLb1pJaHZjTkFRRUZCUUF3UFRFTE1Ba0dBMVVFCkJoTUNSbEl4RVRBUEJnTlZCQW9UQ0VObGNuUndiSFZ6TVJzd0dRWURWUVFERXhKRGJHRnpjeUF5SUZCeWFXMWhjbmtnUTBFd0hoY04KT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOU1Rc3dDUVlEVlFRR0V3SkdVakVSTUE4R0ExVUVDaE1JUTJWeQpkSEJzZFhNeEd6QVpCZ05WQkFNVEVrTnNZWE56SURJZ1VISnBiV0Z5ZVNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFOeFFsdEFTK0RYU0NIaDZ0bEp3L1cvdXo3a1J5MTEzNGV6cGZnU04xc3h2YzBOWFlLd3pDa1RzQTE4Y2dDU1IKNWFpUlZoS0M5K0FyOU51dVlTNkpFSTFyYkxxekFyM1ZOc1ZJTnlQaThGbzNVak1YRXVMUllFMitMMEVSNC9ZWEpReUxrY0FibVh1WgpWZzJ2N3RLOFIxZmplVWw3TklrbkpJVGVzZXpwV0U3K1R0OWF2a0d0ckFqRkdBN3YwbFB1Yk5DZEVnRVRqZHlBWXZlVnFVU0lTbkZPCllGV2UyeU1aZVZZSEREOWpDMXl3NHI1K0ZmeVVNMWhCT0hURTRZK0wzeWFzSDdXTE83ZERXV3V3SktadGtJdkVjdXBkTTVpM3k5NWUKZSsrVThScyt5c2tod2NXWUFxcWk5bHQzbS9WK2xsVTBIR2Rwd1BGQzQwZXMvQ2djWmxVQ0F3RUFBYU9CakRDQmlUQVBCZ05WSFJNRQpDREFHQVFIL0FnRUtNQXNHQTFVZER3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQzTXQzOHNPS0F6ZTNiT2t5bm00anJ2b01Ja3dFUVlKCllJWklBWWI0UWdFQkJBUURBZ0VHTURjR0ExVWRId1F3TUM0d0xLQXFvQ2lHSm1oMGRIQTZMeTkzZDNjdVkyVnlkSEJzZFhNdVkyOXQKTDBOU1RDOWpiR0Z6Y3pJdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNuVk0rSVJCbkwzOVIvQU45V00ySzE5MUVCa092RApQOUdJUk9ra1hlL25GTDBndDVvOEFQNXRuOXVRM05mMFl0YUxjRjNuNVFSSXFXaDh5ZkZDODJ4L3hYcDhIVkdJdXRJS1BpZGQzaTFSClR0TVRaR25rTHVQVDU1c0ptYWJnbFp2T0d0ZC92anpPVXJNUkZjRVBGODBEdTV3bEZicWlkb244QnZFWTBKTkxEbnlDdDZYMDlsLysKN1VDbW5ZUjBPYm5jSG9VVzJpa2JoaU1BeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVwovLzFJTXdyaDNLV0JrSnROM1gzbjU3TE5YTWhxbGZpbDlvM0VYWGdJdm5zRzFrblBHVFpRSXk0STVwNEZUVWNZMVJicHNkYTJFTlc3Cmw3K2lqclJVCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRTVCBSb290IENBIFgzCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEU2pDQ0FqS2dBd0lCQWdJUVJLK3dnTmFqSjdxSk1EbUdMdmhBYXpBTkJna3Foa2lHOXcwQkFRVUZBREEvTVNRd0lnWURWUVFLCkV4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVREa1JUVkNCU2IyOTBJRU5CSUZnek1CNFgKRFRBd01Ea3pNREl4TVRJeE9Wb1hEVEl4TURrek1ERTBNREV4TlZvd1B6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMQpjbVVnVkhKMWMzUWdRMjh1TVJjd0ZRWURWUVFERXc1RVUxUWdVbTl2ZENCRFFTQllNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTit2NlpkUUNJTlh0TXhpWmZhUWd1ekgweXhyTU1wYjdObkRmY2RBd1JnVWkrRG9NM1pKS3VNL0lVbVQKckU0T3J6NUl5Mlh1L05NaEQyWFNLdGt5ajR6bDkzZXdFbnUxbGNDSm82bTY3WE11ZWd3R01vT2lmb29VTU0wUm9PRXFPTGw1Q2pIOQpVTDJBWmQrM1VXT0R5T0tJWWVwTFlZSHNVbXU1b3VKTEdpaWZTS09lRE5vSmpqNFhMaDdkSU45YnhpcUtxeTY5Y0szRkN4b2xrSFJ5CnhYdHFxelRXTUluLzVXZ1RlMVFMeU5hdTdGcWNraDQ5WkxPTXh0Ky95VUZ3N0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGQKdXRvbHVjYlkzOEVWQWpxcjJtN3hQaTcxWEFpY1BOYURhZVFRbXhrcXRpbFg0K1U5bTUvd0FsMENBd0VBQWFOQ01FQXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTVNuc2FSN0xISDYyK0ZMa0hYL3hCVmdoWWtRCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OWlrdWcKZEIvT0VJS2NkQm9kZnBnYTNjc1RTN01nUk9TUjZjejhmYVhiYXVYKzV2M2dUdDIzQURxMWNFbXY4dVhyQXZIUkFvc1p5NVE2WGtqRQpHQjVZR1Y4ZUFscndEUEd4cmFuY1dZYUxidW1SOVliSytybG1NNnBaVzg3aXB4WnpSOHNyekptd04walA0MVpMOWM4UERISXloOGJ3ClJMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNUpER0ZvcWdDV2pCSDRkMVFCN3dDQ1pBQTYyUmpZSnNXdklqSkV1YlMKZlpHTCtUMHlqV1cwNlh5eFYzYnF4YllvT2I4VlpSekk5bmVXYWdxTmR3dllrUXNFamdmYktiWUs3cDJDTlRVUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEU1QgQUNFUyBDQSBYNgo9PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNUQ0NBdkdnQXdJQkFnSVFEVjZaQ3RhZHQzanMyQWRXTzRZVjJUQU5CZ2txaGtpRzl3MEJBUVVGQURCYk1Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1F4RVRBUEJnTlZCQXNUQ0VSVFZDQkJRMFZUCk1SY3dGUVlEVlFRREV3NUVVMVFnUVVORlV5QkRRU0JZTmpBZUZ3MHdNekV4TWpBeU1URTVOVGhhRncweE56RXhNakF5TVRFNU5UaGEKTUZzeEN6QUpCZ05WQkFZVEFsVlRNU0F3SGdZRFZRUUtFeGRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRERVJNQThHQTFVRQpDeE1JUkZOVUlFRkRSVk14RnpBVkJnTlZCQU1URGtSVFZDQkJRMFZUSUVOQklGZzJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUF1VDMxTE1tVTNIV0tsVjFqNklSM2RtYTVXWkZjUnQyU1BwLzVEZ08wUFdHU3ZTTW10V1B1a3RLZTFqekkKRFpCZlpJR3hxQWdOVE5qNTB3VW9VclFCSmNXVkhBeCtQaENFZGMvQkdaRmp6K2lva1lpNVExSzdnTEZWaVlzeCt0QzNkcjVCUFRDYQpwQ0lsRjNQb0h1TFRyQ3E5V3pnaDFTcEwxMVY5NHpwVnZkZHRhd0pYYStaSGZBaklncnJlcDRjOW9XMjRNRmJDc3dLQlh5MzE0cG93CkdDaTRadFBMQVpadjZvcEZWZGJnbmY5bkt4Y0NwazRhYWhFTGZyZDc1NWpXakhadndUdmJVSk4rNWRDT0h6ZTR2YnJHbjJ6cGZEUHkKTWp3bVIvb25KQUxKZmgxYmlFSVRhalY4ZlRYcExtYVJjcFBWTWliRWRQVlRvN05kbXZZSnl3SURBUUFCbzRISU1JSEZNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnSEdNQjhHQTFVZEVRUVlNQmFCRkhCcmFTMXZjSE5BZEhKMWMzUmtjM1F1ClkyOXRNR0lHQTFVZElBUmJNRmt3VndZS1lJWklBV1VEQWdFQkFUQkpNRWNHQ0NzR0FRVUZCd0lCRmp0b2RIUndPaTh2ZDNkM0xuUnkKZFhOMFpITjBMbU52YlM5alpYSjBhV1pwWTJGMFpYTXZjRzlzYVdONUwwRkRSVk10YVc1a1pYZ3VhSFJ0YkRBZEJnTlZIUTRFRmdRVQpDWElHVGhoREQrWFd6TU5xaXpGN2VJK29nN2d3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUtQWWp0YXkyODRGNXpMTkFkTUVBK1YyCjVGWXJuSm1RNkFnd2JOOTlQZTdsdjdVa1FJUko0ZEVvcnNUQ09sTXdpUEgxZDI1Unl2ci9tYThrWHh1Zy9mS3NoTXJmcWZCZkJDNnQKRnI4aGx4Q0JQZVAvaDQweTNKVGxSNHBlYWhQSmxKVTkwdTdJTkpYUWdOU3RNZ2lBVkR6Z3ZWSlQxMUo4c21rL2YzclBhblRLK2dRcQpuRXhhQnFYcElLMUZaZzlwOGQyLzZlTXlpL3Jnd1laTmNqd3UySk40Q2lyNDJOSW5QUm1KWDFwN2lqdk1ETnBScnNjTDl5dXdOd1hzCnZGY2o0ampTbTJqelZoS0lUMEo4dURIRXRkdmt5Q0UwNlVnUk5lNzZ4NUpYeFo4MDVNZjI5dzRMVEp4b2VIdHhNY2ZySHVCblFmTzMKb0tmTjVYb3pObXI2bWlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUVVJLVFJVU1QgQ2VydGlmaWNhdGUgU2VydmljZXMgUHJvdmlkZXIgUm9vdCAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQrekNDQXVPZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBRENCdHpFL01EMEdBMVVFQXd3MlZNT2NVa3RVVWxWVFZDQkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hNUXN3Q1FZRFZRUUdEQUpVVWpFUApNQTBHQTFVRUJ3d0dRVTVMUVZKQk1WWXdWQVlEVlFRS0RFMG9ZeWtnTWpBd05TQlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwCmFjV2ZhVzBnZG1VZ1FtbHNhY1dmYVcwZ1I4TzhkbVZ1YkduRW4ya2dTR2w2YldWMGJHVnlhU0JCTHNXZUxqQWVGdzB3TlRBMU1UTXgKTURJM01UZGFGdzB4TlRBek1qSXhNREkzTVRkYU1JRzNNVDh3UFFZRFZRUURERFpVdzV4U1MxUlNWVk5VSUVWc1pXdDBjbTl1YVdzZwpVMlZ5ZEdsbWFXdGhJRWhwZW0xbGRDQlRZY1NmYkdGNXhMRmp4TEZ6eExFeEN6QUpCZ05WQkFZTUFsUlNNUTh3RFFZRFZRUUhEQVpCClRrdEJVa0V4VmpCVUJnTlZCQW9NVFNoaktTQXlNREExSUZURG5GSkxWRkpWVTFRZ1FtbHNaMmtneExCc1pYUnB4WjlwYlNCMlpTQkMKYVd4cHhaOXBiU0JIdzd4MlpXNXNhY1NmYVNCSWFYcHRaWFJzWlhKcElFRXV4WjR1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBeWxJRjFtTUQyQnhmM2RKN1hmSU1ZR0ZiYXp0MEszZ05mVVc5SW5Ub2pBUEJ4aEVxUFpXOHFaU3d1NUdYCnlHbDhoTVcwa1d4c0UycWtWYTJraGVpVmZyTUFyd0RDQlJqMWNKMDJpNjdMNUJ1QmY1T0krMnBWdTMyRmtzNjZXSi9iTXNXOVhlOGkKU2k5QkIzNUpZYk9HN0U2bVFXNkV2QVBzOVRzY3lCL0M3cWp1NmhKS2pSVFA4d3JnVURuNUNEWDRFVm10NXlMcVM4b1VCdDVDdXJLWgo4eTFVaUJBRzZ1RWFQajFuSC92TyszeUM2QkZkU3NHNUZPcFUyV2FiZklsOUJKcGl5ZWxTUEo2Yzc5TDFKdVRtNVJoOGkyN2ZiTXg0ClcwOXlzc3RjUDR3RmpkRk1qSzJTeCtGNGYyVnNTUVpRTEo0eXd0ZEt4bldLV1U1MWIwZGV3UUlEQVFBQm94QXdEakFNQmdOVkhSTUUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFWOVZYL041YUFXU0drL0tFVlRDRDIxRi9hQXlUOHo1QWE5Q0VLbXU0NgpzV3J2Ny9oZzBVdzJaa1VkODJZQ2RBUjdrakNvM2dwMkQrK1ZicjNKTitZYURheUpTRnZNZ3piQzlVWmNXWUpXdE5YK0k3VFlWQnhFCnE4U241UlRPUEVGaGZFUG16Y1NCQ1lzaysxUWwxaGFvbGd4bkIyK3pVRWZqSENRbzNTcVlwR0grMitvU043d0JHalNGdlc1UDU1RnkKQjBTRkhsaktWRVRkOTZ5NXk0a2hjdHVQd0drcGx5cWpyaGdqbHh4QktvdDhLc0Y4a09pcEtNRFRrY2F0S0lkQWFMWC83S2ZTMHpnWQpuTk45YVYzd3hxVWVKQnVqUi94cEIyam41SnEwN1EraGg0Y0N6b2ZTU0U3aHZQL0w4WEtTUkdRREplcmVXMjZmeWZKT3JOM0gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFVSS1RSVVNUIENlcnRpZmljYXRlIFNlcnZpY2VzIFByb3ZpZGVyIFJvb3QgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUERDQ0F5U2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQnZqRS9NRDBHQTFVRUF3dzJWTU9jVWt0VVVsVlRWQ0JGCmJHVnJkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4TVFzd0NRWURWUVFHRXdKVVVqRVAKTUEwR0ExVUVCd3dHUVc1cllYSmhNVjB3V3dZRFZRUUtERlJVdzV4U1MxUlNWVk5VSUVKcGJHZHBJTVN3YkdWMGFjV2ZhVzBnZG1VZwpRbWxzYWNXZmFXMGdSOE84ZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMaUFvWXlrZ1MyRnp4TEZ0SURJd01EVXdIaGNOCk1EVXhNVEEzTVRBd056VTNXaGNOTVRVd09URTJNVEF3TnpVM1dqQ0J2akUvTUQwR0ExVUVBd3cyVk1PY1VrdFVVbFZUVkNCRmJHVnIKZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeE1Rc3dDUVlEVlFRR0V3SlVVakVQTUEwRwpBMVVFQnd3R1FXNXJZWEpoTVYwd1d3WURWUVFLREZSVXc1eFNTMVJTVlZOVUlFSnBiR2RwSU1Td2JHVjBhY1dmYVcwZ2RtVWdRbWxzCmFjV2ZhVzBnUjhPOGRtVnViR25FbjJrZ1NHbDZiV1YwYkdWeWFTQkJMc1dlTGlBb1l5a2dTMkZ6eExGdElESXdNRFV3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNwTm43RGtVTk13eG1ZQ01qSFdIdFBGb3lsemtrQkgzTU9ySFVUcHZxZQpMQ0RlMkpBT0N0RnAwaWY3cW5lZkoxSWw0c3RkMk5pRFVCZDlpcldDUHdTT3ROWHdTYWRrdHg0dVh5Q2NVSFZQcitHMVFSVDBtSktJCngrWGxaRWRoUjNuOXdGSHh3Wm5uM001cSs2KzFBVERjUmh6dml1eVY3OXovcnhBYzY1M1lzS3BxaFJnTkY4ayt2L0diMEFtSlF2MmcKUXJTZGlWRlZLYzhiY0x5RVZLM0JFeCtZOUM1MllJdGRQNXF0eWd5L3AxWmJqM2U0MVo1NVNaSS80UEdYSkhwc214Y1BiZTlUbUpFcgo1QSsrV1hrSGVMdVhsZlNmYWRSWWh3cXA0OHkyV0JtZkppR3h4Rm1Oc2tGMXdLMXB6cHdBQ1BJMi96N3dvUThhckJUOXBtQVBBZ01CCkFBR2pRekJCTUIwR0ExVWREZ1FXQkJUWk43Tk9CZjNaejU4U0ZxNjJpUy9ySlRxSUhEQVBCZ05WSFE4QkFmOEVCUU1EQndZQU1BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSEpnbHJmSjNOZ3BYaU9GWDdLekxYYjdpTmNYL250dApSYmoyaFd5Zkl2d3FFQ0xzcXJrdzlxdFkxamtRTVprcEFMMkpaa0g3ZE42UndSZ0xuN1ZoeTUwNnZ2V29sS01pVlc0WFNmL1NLZkU0CkpsM3ZwYW82K1hGNzV0cFlIZE4wd2dINlBtbFlYNjNMYUw0VUxwdHN3TGJjb0NiNmR4cmlKTm9hTitCbnJkRnpndzJsR2gxdUVwSisKaEdJQUY3MjhKUmhYOHRlcGIxbUl2RFMzTG9WNG5aYmNGTU1zaWxLYmxveFNaajJHRm90SHVGRUpqT3A5elloeXMyQXpzZkFLUk84UAo5UWszaUNRT0xHc2dPcUw2RWZKQU5aeEVhR003ckROdlk3d3N1L0xTeTNaOWZZallIY2dGSFc2OGxLbG1qSGR4eC9xUitpOVJudWs1ClVyYm5CRUk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzU2lnbiBHb2xkIENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnVqQ0NBNktnQXdJQkFnSUpBTHRBSEVQMVhrK3dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVkJBWVRBa05JTVJVdwpFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SHpBZEJnTlZCQU1URmxOM2FYTnpVMmxuYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOCk1EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkZNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHAKYzNOVGFXZHVJRUZITVI4d0hRWURWUVFERXhaVGQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxCnQyLzg3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrYmJxQkhINUMKakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2M2Yk04Szh2ekFSTy9Xcy9CdFFwZwp2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRWVtQThhdHVmSyt6ZTNnRS9iazNsVUliTHRLL3RSRURGCnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlIKQWlUeXN5YlVhOW9FVmVYQkNzZHRNRGVRS3VTZUZETmVGaGRWeFZ1MXl6U0prdkdkSm8raEI5VEdzbmhRMnd3TUMzd0xqRUhYdWVuZApqSWozbzAyeU1zellGOXJOdDg1bW5kVDlYdis5bHo0cGRlZCtwMkpZcnlVMHBVSEhQYndOVU1vREF3OElXaCtWYzNoaXY2OXlGR2tPCnBlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaWFHNTlqZTg4M1dYMFhheFIKN3lTQXJxcFdsMi81clgzYVlUK1lkenlsa2JZY2pDYmFaYUlKYmNIaVZPTzV5a3hNZ0k5M2UyQ2FIdCsyOGtnZURycE9WRzJZNE9HaQpHcUozVU0vRVk1THNSeG1kNitacnpzRUNBd0VBQWFPQnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjQKT2ZQQWVHWmU2RHJuOE80d1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRUNBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwY0RvdgpMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQ2U2NDVSODhhN0EzaGZtCjVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek9VWXJIVURGdTRVcCtHQzlwV2JZOVpJRXIKNDRPRTVpS0hqbjNnN2dLWlliZ2U5TGdyaUJJV2hNSXhremlXTWFhNU8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZgpNa2U2VWlJMEhUSjZDVmFuZkNVMnFUMUwyc0NDYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtCkd1NnVMZnRJZHhmK3UreXZHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHAKbW8vYTc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0NoZGlEeXlKawp2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMzkycWdRbXdMT003WGRWQXlrc0xmCkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnIKTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3daTUVCbnVuS29HcVlEcy9ZWVBJdlNiamtRdUU0TlJiMHlHNVA5NEZXNkxxagp2aU92cnYxdkErQUNPekIyK2h0dFFjOEJzZW00eVdiMDJ5YnpPcVIwOGtra1c4bXcwRmZCK2o1NjRaZkoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnZUQ0NBNldnQXdJQkFnSUlUeHZVTDFTN0wwc3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNRMGd4RlRBVApCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYCkRUQTJNVEF5TlRBNE16STBObG9YRFRNMk1UQXlOVEE0TXpJME5sb3dSekVMTUFrR0ExVUVCaE1DUTBneEZUQVRCZ05WQkFvVERGTjMKYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWVUzZHBjM05UYVdkdUlGTnBiSFpsY2lCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0Ck4wTXZGejBmeU01b0VNRjRyaGtES3hENkxIbUQ5dWk1YUxsVjhnUkVwem41L0FTTEh2R2lUU2Y1WVh1NnQrV2lFN2JyWVQ3UWJOSG0KKy9wZTdSMjBucUExVzZHU3kvQkprdjZGQ2dVKzV0a0w0ays3M0pVMy9KSHBNalVpMFI4NlRpZUZuYkFWbERMYVlRMUhUV0JDcnBKSAo2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSDZBVEs3Mm94aDlUQXR2bVVjWHRuWkxpMmtVcENlMlV1Ck1Hb005WkR1bGVieXpZTHMyYUZLN1BheVMrVkZoZVp0ZUpNRUxweUNiVGFweERGa0g0YURDeXIwTlFwNHlWWFBRYkJINlRDZm1iNWgKcUFhRXVTaDZYempaRzZrNHNJTi9jOEhETzBncWdnOGhtN2pNcURYRGhCdURzejYrcEpWcEFUcUpBSGdFMmNuMG1SbXJWbjViaTRZNQpGWkdrRUN3Sk1vQmdzNVBBS3JZWUM1MStqVW55RUVwLytkVkdMeG1TbzVtbkpxeTdqRHptRHJ4SEI5eHpVZkZ3WkM4SStiUkhIVEJzClJPb3BONFdTYUdhOGd6aitlemt1MDFEd0gvdGVZTGFwcHZvblFmR2JHSEx5OVlSMFNzbG54RlN1U0dUZmpORnVzQjNoQjQ4SUhwbWMKY2VsTTJLWDNSeElmZE5GUm5vYnp3cUlqUUF0ejIwdW01M01Hak1HZzZjRlpyRWI2NWkvNHozR2NSbTI1eEJXTk9Ia0RSVWp2eEYzWApDTzZIT1NLR3NnMFBXRVAzY2FsSUx2M3ExaDhDQXdFQUFhT0JyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUY2RE53ZVJCdGpwYk84dEZuYjBjd3BqNmhsZ3dId1lEVlIwakJCZ3dGb0FVRjZETndlUkIKdGpwYk84dEZuYjBjd3BqNmhsZ3dSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVEQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMApjRG92TDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUhQR2dlQW4waTBQCjRKVXc0cHBCZjFBc1gxOWlZYW1HYW1rWURIUkoxbDJFNmtGU0dHOVlyVkJXSUdyR3ZTaHBXSkhja1JFMXFUb2R2QnFsWUo3WUgzOUYKa1duWmZydDRjc0VHRHlyT2o0VndZYXlnelF1NE9TbFdoREpPaHJzOXhDcloxeDl5N3Y1Um9TSkJzWEVDWXhxQ3NHS3JYbGNTSDkvTAozWFdnd0YxNWtJd2I0RkRtM2pIK21IdHdYNldRMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4Ci91Tm5jcUN4djF5TDVQcVpJc2VFdVJ1Tkk1Yy83U1hnejJXNzlXRUU3OTBlc2xwQklscWhuMTBzNkZ2SmJha01ESGlxWU1aV2p3RmEKREdpOGFSbDV4QjkrbHdXL3hla2tVVjdVMVV0VDdka2pXallEWmFQQkE2MUJNUE5HRzRXUXIyVzExYkhrRmx0NGRSMlhlbTFacVNxUAplOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUmRBdHEvZ3NEL0tOVlY0bitTc3V1Cld4Y0Z5UEtOSXpGVE9OSXRhaitDdVkwSWF2ZGVRWFJ1d3hGK0I2d3BZSkUvT01wWEVBMjlNQy9IcGVaQm9OcXVCWWVhb0tSbGJFd0oKREltNnVOTzV3Sk9LTVBxTjVacHJGUUZPWjZyYVlsWStoQWhtMHNRMmZhYytFUHlJNE5TQTVRQzlxdk5PQnFONmF2bGljdU1KVCt1YgpEZ0VqOForN2ZOemNiQkdYSmJMeXRHTVUwZ1lxWjR5RDljN3FCOWlhYWg3czVBcTdLa3pyQ1dBNXpzcGkyQzV1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRRwpFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakV4TUM4R0ExVUVBeE1vUjJWdlZISjFjM1FnVUhKcGJXRnllU0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXhNamN3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1GZ3gKQ3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRFd0x3WURWUVFERXloSFpXOVVjblZ6ZENCUQpjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCkNnS0NBUUVBdnJnVmUvL1VmSDFucllOa2U4aENVeTNmOW9RSUlHSFdBVmxxbkVRUnIrOTIvWlYrem1Fd3UzcURYd0s5QVdiSzdoV04KYjZFd25MMmhoWjZVT3ZOV2lBQXh6OWp1YXBZQzJlMERqUHQxYmVmcXVGVVdCUmFhOU9CZXNZakFaSVZjRlUySXg3ZTY0SFhwclFVOQpuY2VKU09DN0tNZ0Q0VENUWkY1U3dGbHdJalZYaUlyeGxRcUQxN3d4Y3dFMDdlOUdjZUJyQXFnMWNtdVhtMmJneXh4NVg5Z2FCR2dlClJ3TG1uV0RpTnBjQjM4NDFrdCsrWjhkdGQxazdqNTNXa0JXVXZFSTBFTUU1K2JFblBuN1dpblhGc3ErVzA2TGVtK1NZdm4zaDZZR3QKdG0vODF3N2E0RFN3RFJwMzUrTUltTzlZK3B5RXR6YXZ3dCtzMHZRUUJuQnhOUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVTE5WUVFaY1ZpL0NQTm1GYlN2dHIyWm5KTTVJd0RRWUpLb1pJCmh2Y05BUUVGQlFBRGdnRUJBRnB3Znl6ZHR6UlA5WVpScVNhK1M3aXE4WEVOM0dISG9PbzBIbnAzRHdRMTZDZVBiSkMva1JZa1JqNUsKVHM0ckZ0VUxVaDM4SDJlaUFrVXhUODd6K2dPbmVaMVRhdG5hWXpyNGdOZlRtZUdsNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTgpOV016aVVuV20wN0t4K2RPQ1FEMzJzZnZtV0taZDdhVklsNktvS3YwdUhpWXlqZ1ptY2x5bm5qTlM2eXZHYUJ6RWkzOHdrRzZnWkhhCkZsb3h0L20wY1lBU1NKbHljMXBaVThGalVqUHRwOG5TT1FKdyt1Q3hRbVlwcXB0UjdUQlVJaFJmMmFzZHdlU1U4UGoxSy9mcXluaEcKMXJpUi9hWU5LeG9VQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdGhhd3RlIFByaW1hcnkgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJUU5FN1ZWeURWN2V4SjlDL09OOXNyYlRBTkJna3Foa2lHOXcwQkFRVUZBRENCcVRFTE1Ba0dBMVVFCkJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjIKYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodgpjbWw2WldRZ2RYTmxJRzl1YkhreEh6QWRCZ05WQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3SGhjTk1EWXhNVEUzCk1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2cKU1c1akxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdgpLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SHpBZEJnTlZCQU1UCkZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3MKb1BEN2dGblVuTWVrejUyaFdYTUpFRVVNRFN4dWFQRnNXMGhvU1ZrMy9Bc3pHY0ozZjh3UUxaVTBIT2JyVFFtbkhOSzR5WmMyQXJlSgoxQ1JmQnNETVJKU1VqUUppYit0YTNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjCnEvZ2Nmb21rNktIWWNXVU5vMUY3N3J6U0ltQU51VnVkMzdyOFVWc0xyNWl5NlM3cEJPaGloOTRyeU5kT3dVeGtIdDNQaDFpNlNrL0sKYUFjZEhKMUt4dFV2a2N4OGNYSWN4Y0JuNnpMOXlaSmNsTnFGd0p1L1UzMHJDZlNNblpFZmwycFN5OTRKTnFSMzJIdUhVRVRWUG00cAphZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlI3VzBYUHI4N0xldjB4a2hwcXR2Tkc2MWRJVURBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFlUkhBUzdPUnR2enc2V2ZVRFc1RnZsWG9rOUxPQXovdDJpV3dIVmZMSGpwMm9FenNVSGJvWkhJTXBLbnh1SXZXMW9lRQp1ekxsUVJIQWQ5bXpZSjNyRzlYUmJrUkVxYVlCN0ZWaUhYZTRYSTVJU1h5Y08xY1JySzF6TjQ0dmVGeVFhRWZaWUdEbS9BYzlJaUFYCnhQY1c2Y1RZY3ZuSWMzemZGaThWcVQ3OWFpZTJvZXRhdXBnZjFlTk5aQXFkRThoaHV2VTVISWU2dUwxN0luLzIvcXhBZWVXc0VHODkKanh0NWRvdkVON01oR0lUbE5nRHJZeUNadWVuK013UzdRY2pCQXZsRVl5Q2VnYzVDMDlZL0xIYlRZNXhaM1krbTRRNmdMa0gzTHBWSAp6N3o5TS9QMkMyRitmcEVyZ1VmQ0p6RHVweEJkTjQ5Y09TdmtCUEI3alZhTWFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTB6Q0NBN3VnQXdJQkFnSVFHTnJSbmlaOTZMdEtJVmpOekdzN1NqQU5CZ2txaGtpRzl3MEJBUVVGQURDQnlqRUxNQWtHQTFVRQpCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPClpYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmsKSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpVd0hoY05NRFl4TVRBNE1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCCnlqRUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG4KYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaApkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0CllYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXcKZ2dFS0FvSUJBUUN2SkFnSUtYbzFubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLegpqL2k1VmJleHQwdXovbzkrQjFmczcwUGJabUlWWWM5Z0RhVFkzdmpndzJJSVBWUVQ2MG5LV1ZTRkp1VXJqeHVmNi9XaGtjSXpTZGhEClkycFNTOUtQNkhCUlRkR0phWHZIY1BhejNCSjAyM3RkUzFiVGxyOFZkNkd3OUtJbDhxOGNrbWNZNWZRR0JPK1F1ZVFBNU4wNnRSbi8KQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrckNwU3g0L1ZCRW5raldOSGlEeHBnOHYrUjcwcgpmay9GbGE0T25kVFJROEJuYytNVUNIN2xQNTl6dURNS3oxMC9OSWVXaXU1VDZDVVZBZ01CQUFHamdiSXdnYTh3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKYVcxaFoyVXYKWjJsbU1DRXdIekFIQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWphSFIwY0RvdkwyeHZaMjh1ZG1WeQphWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkgvVFphZkMzZXk3OERBSjgwTTUrZ0t2TXpFek1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNUSkVvd1gyTFAyQnFZTHozcTNKa3R2WGYycFhraU9PekVwNkI0RXExaURrVndaTVhubDJZdG1BbCsKWDYvV3pDaGw4Z0dxQ0JwSDN2bjVmSkphQ0drZ0RkaytiVzQ4RFc3WTVnYVJRQmk1K01IdDM5dEJxdUNXSU1uTlpCVTRnY21VN3FLRQpLUXNUYjQ3YkROMGxBdHVraXhsRTBrRjZCV2xLV0U5Z3luNkNhZ3NDcWlVWE9iWGJmK2VFWlNxVmlyMkczbDZCRm9NdEVNemUvYWlDCkttMG9IdzBMeE9YbkdpWVo0ZlFSYnhDMWxmem5RZ1V5Mjg2ZFVWNG90cDZGMDF2dnBYMUZRSEtPdHc1ckRnYjdNelZJY2JpZEo0dkUKWlY4TmhuYWNSSHIybFZ6MlhUSUlNNlJVdGhnL2FGenlRa3FGT0ZTRFg5SG9MUEtzRWRhbzdXTnEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlVHJ1c3QgQ0EKPT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQklNUXN3Q1FZRFZRUUcKRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eEZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeQpkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6TVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlCkJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnZjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWApPWkV6WnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTzBnTWRBKzl0CkRXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvd1c4eFFteFNQbWpMOHhrMDM3dUgKR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2o3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYgowMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUzhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1ICnVyc0NBd0VBQWFPQm5UQ0JtakFUQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnSllZagphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0MzZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3UKU2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZgptYng4SVZRcjVGaWl1MWNwcnA2cG94a21ENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2ZaCm5NVUZkQXZuWnlQU0NQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZSBHbG9iYWwgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JICmJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3hNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWcKTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3ZwpRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4CllEaUppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhL0ZIdGFNYlEKYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0pqbklGSG92ZFJJV0NRdEJKd0IxZwo4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSUhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWCkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3c0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkKMFhQbmozcERBZ01CQUFHamdaMHdnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3dLYUFuCm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzR0FRUUJnamNWQVFRREFnRUEKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2KwpPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE9IMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuCkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbUk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUKM0NZTnY2WkhkQWJZaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnVEVMTUFrR0ExVUUKQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRwpBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxCmRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXdNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQk1TUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRApUMDFQUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzVWNFYlZBU1kwNm0vd2VhS1hUdUgKKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3dwp4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOFE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWCjRFYWpjTnhvMmY4RVNJbDMzclhwKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0EKMUtHenFTWCtEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPbktWSQpyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWsKYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1UVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVlTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQCk9HRUlxQjZCQ3NBdklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNHpKVlNrL0J3SlZtYwpJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOCis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUJaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQXM2Z0F3SUJBZ0lRVjhzemI4SmNGdVpIRmhmamtERm80REFOQmdrcWhraUc5dzBCQVFVRkFEQmlNUXN3Q1FZRFZRUUcKRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdU1UQXdMZ1lEVlFRREV5ZE9aWFIzYjNKcgpJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY05NRFl4TWpBeE1EQXdNREF3V2hjTk1qa3hNak14Ck1qTTFPVFU1V2pCaU1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXUKTVRBd0xnWURWUVFERXlkT1pYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGt2SDZTTUczRzJJNHJDN3hHenVBbmx0N2UrZm9TMHp3emM3TUVMN3h4CmpPV2Z0aUpnUGw5ZHpnbi9nZ3dibWxGUUdpYUozZFZoWFJuY0VnOHRDcUpEWFJmUU5KSWc2blBQT0N3R0pnbDZjdmY2VURMNHdwUFQKYWFJanprR3h6T1RWSHpiUmlqcjRqR1BpRkZscDdRM1RmMnZvdUFQbFQycmxtR05wU0FXK0x2OHp0dW1YV1duNFp4bXVrMkdXUkJYVApjckEvdkdwOTdFaC9qY09ycW5FclUybEJVelMxc0xuRkJnckVzRVgxUVYxdWlVVjdQVHNtakhUQzVkTFJmYklSMVB0WU1pS2FnTW5jCi9RenBmMTREbDg0N0FCU0hKM0E0cVk1dXN5ZDJtRkhnQmVNaHF4clZoU0k4S2JXYUZzV0FxUFM3YXpDUEwwWUNvckVNSXVEVEFnTUIKQUFHamdaY3dnWlF3SFFZRFZSME9CQllFRkNFd3lmc0ExMDZZMm9lcUt0Q25MckZBTWFkTU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01GSUdBMVVkSHdSTE1Fa3dSNkJGb0VPR1FXaDBkSEE2THk5amNtd3VibVYwYzI5c2MzTnNMbU52CmJTOU9aWFIzYjNKclUyOXNkWFJwYjI1elEyVnlkR2xtYVdOaGRHVkJkWFJvYjNKcGRIa3VZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQzdya3ZudDFmcmY2b3R0M05IaFdyQjVLVWQ1T2M4NmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UQo0THFJTFB4RnpCaXdtWlZSRHV3ZHVJai9oMUFjZ3NMajRES0F2NkFMUjhqRE1lK1paektBVHhjaGVReHBYTjVlTks0Q3RTYnFVTjkvCkdHVXN5ZkpqNGFrSC9ueHhIMnN6SkdvZUJmY0ZhTUJxRXNzdVhtSExyaWpUZnNLMFpwRW1Yend1SkYvTFdBL3JLT3l2RVpiejNIdHYKd0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITnBHeGxhS0ZKZGx4RAp5ZGk4Tm1kc3BaUzExTXk1dldvMVZpSGUyTVByKzh1a1lFeXdWYUNnZTFleQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpXZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdlRDQ0E2V2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhURUxNQWtHQTFVRUJoTUNWVk14SURBZUJnTlZCQW9NCkYxZGxiR3h6SUVaaGNtZHZJRmRsYkd4elUyVmpkWEpsTVJ3d0dnWURWUVFMREJOWFpXeHNjeUJHWVhKbmJ5QkNZVzVySUU1Qk1UWXcKTkFZRFZRUUREQzFYWld4c2MxTmxZM1Z5WlNCUWRXSnNhV01nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3SGhjTgpNRGN4TWpFek1UY3dOelUwV2hjTk1qSXhNakUwTURBd056VTBXakNCaFRFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb01GMWRsCmJHeHpJRVpoY21kdklGZGxiR3h6VTJWamRYSmxNUnd3R2dZRFZRUUxEQk5YWld4c2N5QkdZWEpuYnlCQ1lXNXJJRTVCTVRZd05BWUQKVlFRRERDMVhaV3hzYzFObFkzVnlaU0JRZFdKc2FXTWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRHViN1M5ZWVLUENDR2VPQVJCSmUrcld4eFRrcXh0bnQzQ3hDNUZsQU0xCmlHZDBWK1BmakxpbmRvODc5NmpFMnlsakRwRm9Ob3FYam9weGFBa0g1T2pVRGsvNDFpdE1wQmI1NzBPWWo3T2VVdDl0a1RtUE9MMTMKaTBOajY3ZVQvREJNSEFHVHRoUDc5NkVmdnlYaGREY3NIcVJlUEdqNFM3OE51UjR1TnVpcDVLZjREOHVDZFh3MUxTTFd3cjhMODdUOApiSlZoSGxmWEJJRXlnMUo1NW9Oano3ZkxZNHNSNHIxZTYvYU43WlZ5S0xTc0VtTHBTalBtZ3pLdUJYV1Z2WVNWMnlwY200NHVETGlCCkswSG1PRmFmU1p0c2R2cUtYZmNCZVlGOHdZTkFCZjV4L1F3L3pFNWdDUTVsUnhBdkFjQUZQNC80czBIdldrSitXZS9TbHd4bEFnTUIKQUFHamdnRTBNSUlCTURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTURrR0ExVWRId1F5TURBd0xxQXNvQ3FHS0doMGRIQTZMeTlqY213dQpjR3RwTG5kbGJHeHpabUZ5WjI4dVkyOXRMM2R6Y0hKallTNWpjbXd3RGdZRFZSMFBBUUgvQkFRREFnSEdNQjBHQTFVZERnUVdCQlFtCmxSa1EyZWlobDVILzNCblp0UVErMG5NS2FqQ0JzZ1lEVlIwakJJR3FNSUduZ0JRbWxSa1EyZWlobDVILzNCblp0UVErMG5NS2FxR0IKaTZTQmlEQ0JoVEVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvTUYxZGxiR3h6SUVaaGNtZHZJRmRsYkd4elUyVmpkWEpsTVJ3dwpHZ1lEVlFRTERCTlhaV3hzY3lCR1lYSm5ieUJDWVc1cklFNUJNVFl3TkFZRFZRUUREQzFYWld4c2MxTmxZM1Z5WlNCUWRXSnNhV01nClVtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhtQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTGtWc1VTUnpDUEkKSzAxMzQvaWFleWNOelhLN21RREtmR1laVU1iVm1PMnJ2d05hNVUzbEhzaFBjWmVHMWVNZC9aREpQSFYzVjNwOStONzAxTlgzbGVaMApiaDA4cm55ZDJ3SURCU3h4U3lVK0IrTmVtdlZtRnltSUdqaWZ6NnBCQTRTWGE1TTRlc293UkJza1JEUFE1TkhjS0RqMEUwTTFOU2xqCnFIeWl0YTA0cE8ydC9jYWFILytYYy83N3N6V25rNGJHZHBFQTVxeFJGc1FuTWx6YmM5cWxrMWVPUG0wMUpnaFoxZWRFMTNZZ1krZXMKRTJmRGJiRndSbnpWbGhFOWlXOWRxS0hyalFyYXd4MHpiS1BxWnhtYW1YOUxQWU5SS2gzS0w0WU1vbjRRTFN2VUZwVUxCNm91RkpKSgp0eWx2MkcweGZmWDhvUkFIaDg0dldkdytXTnM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTE1Ba0dBMVVFQmhNQwpSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFCkNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeApHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm8KYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1JGdFNyWXBuMVBsSUxCczVCQUgrWAo0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pCnd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWRwpGQWtLK3FEbWZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHZHRGVBClUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJR0MvQQo9PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFqQ0NBdXFnQXdJQkFnSUZPUkZGRUpRd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z1lVeEN6QUpCZ05WQkFZVEFrWlNNUTh3RFFZRApWUVFJRXdaR2NtRnVZMlV4RGpBTUJnTlZCQWNUQlZCaGNtbHpNUkF3RGdZRFZRUUtFd2RRVFM5VFIwUk9NUTR3REFZRFZRUUxFd1ZFClExTlRTVEVPTUF3R0ExVUVBeE1GU1VkREwwRXhJekFoQmdrcWhraUc5dzBCQ1FFV0ZHbG5ZMkZBYzJka2JpNXdiUzVuYjNWMkxtWnkKTUI0WERUQXlNVEl4TXpFME1qa3lNMW9YRFRJd01UQXhOekUwTWpreU1sb3dnWVV4Q3pBSkJnTlZCQVlUQWtaU01ROHdEUVlEVlFRSQpFd1pHY21GdVkyVXhEakFNQmdOVkJBY1RCVkJoY21sek1SQXdEZ1lEVlFRS0V3ZFFUUzlUUjBST01RNHdEQVlEVlFRTEV3VkVRMU5UClNURU9NQXdHQTFVRUF4TUZTVWRETDBFeEl6QWhCZ2txaGtpRzl3MEJDUUVXRkdsblkyRkFjMmRrYmk1d2JTNW5iM1YyTG1aeU1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNoL1IwR0xGTXp2QUJJYUlzOXo0aVBmOTMwUGZlbzJhU1Z6MgpUcXJNSExtaDZ5ZUo4a2JwTzBweDFSMk9MYy9tcmF0alVNZFVDMjRTeVpBMnh0Z3YycEdxYU1WeS9oY0tzaGQrZWJVeWlIREtjTUNXClNvN2tWYzBkSjVTL3puSXE3Rno1Y3lEK3ZmY3VpV2U0dTBkekV2ZlJOV2s2OGdxNXJ2OUdRa2FpdjZHRkd2bS81UDlKaGZlamNJWXkKSEYyZllQZXByYVgvejlFMCtYMWJGOGJjMWc0b2E4TGQ4ZlV6YUoxTy9JZDhOaExXbzREb1F3MVZZWlRxWkRkSDZuZkswTEpZQmNOZApmckdvUnBBeFZzNXdLcGF5TUxoMzVubkF2U2s3L1pSM1RMMGd6VUVsNEM3SEc3dnVwQVJCMGwydEVtcUttMGY3eWQxR1FPR2RQRFBRCnRRSURBUUFCbzNjd2RUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUJSakFWQmdOVkhTQUVEakFNTUFvR0NDcUIKZWdGNUFRRUJNQjBHQTFVZERnUVdCQlNqQlM4WVlGRENpUXJkS3lGUC80NU9xREF4TmpBZkJnTlZIU01FR0RBV2dCU2pCUzhZWUZEQwppUXJkS3lGUC80NU9xREF4TmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUJkd20yUHAzRlVSby9DOW1PblRnWGVRcC93WUhFNFJLCnE4OXRvQjlSbFBoSnkzUTJGTHdWM2R1Skw5MlBvRjE4OVJMcm41NDRwRWZNczViWnZwd2xxd04rTXcrVmdRMzlGdUNJdmpmd2JGM1EKTVpzeUsxMFhaWk9ZWUx4dWo3R29QQjdaSFBPcEprTDVaQjNDNTVMMjlCNWFxaGxTWGEvb292ZGdvUGFOOEluMWJ1QUtCUUdWeVlzZwpDcnBhL0pvc1BMM0R0OGxkZUNVRlAxWVVtd3phK3pwSS9wZHBYc29RaHZkT2xnUUlUZXl3dmwzY080NVB3ZjJhTmpTYVRGUitGd05JCmxRZ1JIQWR2aFFoK1hVM0VuZHY3cnM2eTBiTzRnMndkc3JONThkaHdtWDd3RXdMT1h0MVIwOTgyZ2FFYmVDOXhzL0ZaVEVZWUtLdUYKMG1CV1dnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZUQ0NBbVdnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmdNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYwpVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVxTUNnR0ExVUVDeE1oVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oCmRHbHZiaUJGVmlCU2IyOTBRMEV4TUI0WERUQTNNRFl3TmpBeU1USXpNbG9YRFRNM01EWXdOakF5TVRJek1sb3dZREVMTUFrR0ExVUUKQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4S2pBb0JnTlZCQXNUSVZObApZM1Z5YVhSNUlFTnZiVzExYm1sallYUnBiMjRnUlZZZ1VtOXZkRU5CTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUx4LzdGZWJKT0QrbkxwQ2VhbUlpdnFBNFBVSEtVUHFqZ28wTm8wYytxZTFPWGovbDNYM0wrU3Fhd1NFUk1xbTRtaU8KL1ZWUVlnK2tjUTdPQnpndFFvVlFyVHlXYjR2Vm9nN1Aza21KUGRaa0xqamxIbXkxVjRxZTcwZ096WHBwRm9kRXRaRGtCcDJ1b1FTWApXSG52SUVxQ2E0d2l2K3dmRCttRWNlM3hEdVM0R0JQTVZqWmQwWm9lVVdzNWJtQjJpRFFMODdQUnNKM0tZZUprSGNGR0I3aGozUjR6ClpiT09DVlZTUGJXOS93ZnJyV0ZWR0N5cGFaaEtxa0RGTXhSbGRBRDVrZDZ2QTBqRlFGVGNENFNRYUNERmtwYmNMdVVDUmFyQVgxVDQKYmVwSnoxMXNTNi92bXNKV1hNWTFWa0pxTUYvQ3EvYmlQVCt6eVJHUE1VelhuMGtDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkRWSwo5VTJ2UDllQ09LeXJjV1VYZFl5ZFZaUG1NQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNvaCtucytFQm5YY1BCWnNkQVM1ZjhoeE9RV3NUdm9NcGZpN2VudC9IV3RXUzNpck80Rzh6YSs2eG0KaUVITzZQemsyeDZJcHUwblVCc0NNQ1JHZWY0RWgzQ1hRSFBSd01GWEdacHBwU2VacTUxaWhQWlJ3U3pKSXhYWUtMZXJKUk8xUnVHRwpBdjhtak1TSWtoMVcvaGxuOGxYa2dLTnJuS3QzNFZGeERTRGJFSnJidlhaNUIzZVpLSzJhWHRxeFQwUXNOWTZsbHNmOWcvQll4bm5XCm1IeW9qZjZHUGdjV2t1Rjc1eDNzTTNaK1FpNUtoZm1SaVdpRUE0R2xtNXErNHpmRlZLdFdPeGd0UWFRTStFTGJtYURnY20rN1hlRVcKVDFNS1pQbE85TDlPVkwxNGJJanF2NXdUSk1Kd2FhSi9EOGc4clFqSnNKaEFveXJuaUlQdGQ0OTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEOFRDQ0F0bWdBd0lCQWdJUVFUMXl4L1JySDRGRGZmSFNLRlRmbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCaWpFTE1Ba0dBMVVFCkJoTUNRMGd4RURBT0JnTlZCQW9UQjFkSlUyVkxaWGt4R3pBWkJnTlZCQXNURWtOdmNIbHlhV2RvZENBb1l5a2dNakF3TlRFaU1DQUcKQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSApiRzlpWVd3Z1VtOXZkQ0JIUVNCRFFUQWVGdzB3TlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlEClZRUUdFd0pEU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFYk1Ca0dBMVVFQ3hNU1EyOXdlWEpwWjJoMElDaGpLU0F5TURBMU1TSXcKSUFZRFZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNQpJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXkwK3pBSnM5Ck50MzUwVWxxYXhCSkgrellLN0xHK0RLQktVT1ZUSm9aSXlFVlJkN2p5QnhSVlZ1dWsrZzMveXRyNmRUcXZpcmRxRkVyMTJiRFlWeGcKQXNqMXpuSjdPN2p5VG1VSW1zMmthaG5CQWJ0enB0ZjJ3OTNOdktTTHRabGh1QUdpbzlSTjFBVTlrYTM0dEFoeFpLOXc4UnhyZnZiRApkNTBrYzN2a0RJemgyVGJobVlzRm1RdnRSVEVKeXNJQTIvZHlvSmFxbFlmUWpzZTJZWE1OZG1hTTNCdTBZNktmZjVNVE1QR2hKOXZaCi95eFZpSkdnNEU4SHNDaFdqQmdibDBTT2lkM2dGMjduS3UrUE9Rb3hoSUxZUUJSSkxucEI1S2YrNDJUTXdWbHhTeXdocDF0OTRCM1IKTG9HYnc5aG85NzJXRzZ4d3NSWVVDOXRndVNZQkJRSURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVXN3TityamE4c0huUjNKUW10aEcrSWJKcGhwUXdFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUV1aC93dUhiclA1d1VPeFNQTW93QjB1eVFsQitwUUFIS1NrcTBsUGp6MGU3MDF2dmJ5azl2SW0KTU1rUXloMkkrM1FaSDRWRnZiQnNVZmsyZnR2MVRESTZRVTliUjgvb0N5MjJ4Qm1kZE1WSHhqdHFENndVMnp6MGM1eXBCZDhBM0hSNAordmcxWUZrQ0V4aDh2UHROc0NCdFE3dGdNSHBuTTF6Rm1kSDRMVGxTYy91TXFwY2xYSExaQ0I2clRqempnVEdmQTZiN3dQNHBpRlhhCmhOVlFBN2JpaEtPbU5xb1JPZ0hoR0V2V1JHaXpQZmxUZElTelJwRkdsZ0MzZ0N5MjRlTVE0dHVpNXlpUEFaWmlGajRBNHh5bE5vRVkKb2t4U2RzQVJvMjdtSGJyaldyNDJVOFUrZFkrR2FTbFlVN1djdTIrZlhNVVk3TjB2NFpqSi9MN2ZDZzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSHFEQ0NCcENnQXdJQkFnSVJBTXk0NTc5T0tScjlvdHhtcFJ3c0R4RXdEUVlKS29aSWh2Y05BUUVGQlFBd2NqRUxNQWtHQTFVRQpCaE1DU0ZVeEVUQVBCZ05WQkFjVENFSjFaR0Z3WlhOME1SWXdGQVlEVlFRS0V3MU5hV055YjNObFl5Qk1kR1F1TVJRd0VnWURWUVFMCkV3dGxMVk42YVdkdWJ5QkRRVEVpTUNBR0ExVUVBeE1aVFdsamNtOXpaV01nWlMxVGVtbG5ibThnVW05dmRDQkRRVEFlRncwd05UQTAKTURZeE1qSTRORFJhRncweE56QTBNRFl4TWpJNE5EUmFNSEl4Q3pBSkJnTlZCQVlUQWtoVk1SRXdEd1lEVlFRSEV3aENkV1JoY0dWegpkREVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nVEhSa0xqRVVNQklHQTFVRUN4TUxaUzFUZW1sbmJtOGdRMEV4SWpBZ0JnTlZCQU1UCkdVMXBZM0p2YzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFEdHlBRFZnWHZOT0FCSHpOdUV3U0ZwTEhTUURDSFpVNGZ0UGtORVU2K3IrSUNiUEhpTjFJMnV1Ty9URWR5QjVzODdsb3pXYnhYRwpkMzZoTCtCZmtyWW4xM2FhSFVNODZ0bnNMKzQ1ODJwblM0dUN6eUw0WlZYK0xNc3ZmVWg2UFhYNXFxQW51M2pDQnNwUnduNW1TNi9OCm9xZE5Bb0kvZ3F5Rnh1RVBrRWVabEFweGNwTXF5YWJBdmp4V1RIT1NKL0ZydGZYOS9EQUZZSkxHNjVaK0FaSENhYkVlSFh0VFJiamMKUVIvSmkzSFdWQlRqaTFSNFA3NzBZanRiOWFQczFaSjA0blF3N3dIYjRkU3JtWnNxYS9pOXBoeUdJMEpmN0VuZW1vdGI5SEk2UU1WSgpQcVcranFweDYyejY5UnJrYXYxN2ZWVkE3MWh1NXRuVnZDU3J3ZSszQWdNQkFBR2pnZ1EzTUlJRU16Qm5CZ2dyQmdFRkJRY0JBUVJiCk1Ga3dLQVlJS3dZQkJRVUhNQUdHSEdoMGRIQnpPaTh2Y21OaExtVXRjM3BwWjI1dkxtaDFMMjlqYzNBd0xRWUlLd1lCQlFVSE1BS0cKSVdoMGRIQTZMeTkzZDNjdVpTMXplbWxuYm04dWFIVXZVbTl2ZEVOQkxtTnlkREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NSUlCY3dZRApWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnd3JCZ0VFQVlHb0dBSUJBUUV3Z2dGUU1DZ0dDQ3NHQVFVRkJ3SUJGaHhvZEhSd09pOHZkM2QzCkxtVXRjM3BwWjI1dkxtaDFMMU5hVTFvdk1JSUJJZ1lJS3dZQkJRVUhBZ0l3Z2dFVUhvSUJFQUJCQUNBQWRBQmhBRzRBK2dCekFPMEEKZEFCMkFPRUFiZ0I1QUNBQTZRQnlBSFFBWlFCc0FHMEFaUUI2QU9rQWN3RHBBR2dBWlFCNkFDQUE2UUJ6QUNBQVpRQnNBR1lBYndCbgpBR0VBWkFEaEFITUE0UUJvQUc4QWVnQWdBR0VBSUFCVEFIb0Fid0JzQUdjQTRRQnNBSFFBWVFCMEFQTUFJQUJUQUhvQWJ3QnNBR2NBCjRRQnNBSFFBWVFCMEFPRUFjd0JwQUNBQVV3QjZBR0VBWWdEaEFHd0FlUUI2QUdFQWRBQmhBQ0FBY3dCNkFHVUFjZ0JwQUc0QWRBQWcKQUdzQVpRQnNBR3dBSUFCbEFHd0FhZ0RoQUhJQWJnQnBBRG9BSUFCb0FIUUFkQUJ3QURvQUx3QXZBSGNBZHdCM0FDNEFaUUF0QUhNQQplZ0JwQUdjQWJnQnZBQzRBYUFCMUFDOEFVd0JhQUZNQVdnQXZNSUhJQmdOVkhSOEVnY0F3Z2Iwd2dicWdnYmVnZ2JTR0lXaDBkSEE2Ckx5OTNkM2N1WlMxemVtbG5ibTh1YUhVdlVtOXZkRU5CTG1OeWJJYUJqbXhrWVhBNkx5OXNaR0Z3TG1VdGMzcHBaMjV2TG1oMUwwTk8KUFUxcFkzSnZjMlZqSlRJd1pTMVRlbWxuYm04bE1qQlNiMjkwSlRJd1EwRXNUMVU5WlMxVGVtbG5ibThsTWpCRFFTeFBQVTFwWTNKdgpjMlZqSlRJd1RIUmtMaXhNUFVKMVpHRndaWE4wTEVNOVNGVS9ZMlZ5ZEdsbWFXTmhkR1ZTWlhadlkyRjBhVzl1VEdsemREdGlhVzVoCmNua3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01JR1dCZ05WSFJFRWdZNHdnWXVCRUdsdVptOUFaUzF6ZW1sbmJtOHVhSFdrZHpCMU1TTXcKSVFZRFZRUUREQnBOYVdOeWIzTmxZeUJsTFZONmFXZHV3N01nVW05dmRDQkRRVEVXTUJRR0ExVUVDd3dOWlMxVGVtbG5ic096SUVoVApXakVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nUzJaMExqRVJNQThHQTFVRUJ4TUlRblZrWVhCbGMzUXhDekFKQmdOVkJBWVRBa2hWCk1JR3NCZ05WSFNNRWdhUXdnYUdBRk1lZ1NYVVdZWVRiTVV1RTB2RTNRSkR2VHR6M29YYWtkREJ5TVFzd0NRWURWUVFHRXdKSVZURVIKTUE4R0ExVUVCeE1JUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9URFUxcFkzSnZjMlZqSUV4MFpDNHhGREFTQmdOVkJBc1RDMlV0VTNwcApaMjV2SUVOQk1TSXdJQVlEVlFRREV4bE5hV055YjNObFl5QmxMVk42YVdkdWJ5QlNiMjkwSUVOQmdoRUF6TGpudjA0cEd2MmkzR2FsCkhDd1BFVEFkQmdOVkhRNEVGZ1FVeDZCSmRSWmhoTnN4UzRUUzhUZEFrTzlPM1Bjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFOTVQKbkdaaldTN0tYSEFNL0lPOFZiSDBqZ2RzWmlmT3dUc2dxUnk3UmxSdzdsck1vSGZxYUVRbjYvSXAzWGVwMWZ2ajFLY0V4Slc0QytGRQphR0FIUXpBeFFtSGw3dG5sSk5VYjMrRktHNnFmeDEvNGVoSHFFNU1BeW9wWXNlN3REazIwMTZnMkpuemdPc0hWVjRMeGRiYjlpVi9hCjg2ZzRuelVHQ000aWxiN04xZnkrVzk1NWE5eDZxV1ZtdnJFbFdsL3RmdE9zUm0xTTlES0h0Q0FFNEd4NHNIZlJoVVpMcGhLM2RlaEsKeVZaczE1S3JuZlZKT05KUFUrTlZrQkhibUpiR1NmSSs5SjhiNFBlSTNDVmltVVRZYzc4L01QTU1OejdVd2lpQWM3RUJ0NTFhbGhRQgpTNmtSblNscUx0QmRnY0RQc2lCRHh3UGdOMDVkQ3R4WklDVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGlnbmEKPT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlZCQVlUQWtaU01SSXcKRUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WERUQTNNRFl5T1RFMU1UTXdOVm9YRFRJMwpNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJClEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3EKWE9FbTdSRkhZZUdpZkJaNFFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SApHeG55Z1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhid3pCZnNWMS9wCm9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRMTMweUdMTUxMR3Evamo4VUVZa2cKRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjJKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZgpJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2Jrd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RCnRDUlp2Z0h5VXRWRjlsbzUzQkV3WkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUoKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqQVEvSgpTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aGJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cysKSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdQpQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXVIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZCjFna0lsMlBsd1M2d3QwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQyBSYVx4QzNceEFEeiBDZXJ0aWNceEMzXHhBMW1hcmEgUy5BLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1pqQ0NCRTZnQXdJQkFnSVBCMzVTazN2Z0ZlTlg4R21NeSt3TU1BMEdDU3FHU0liM0RRRUJCUVVBTUhzeEN6QUpCZ05WQkFZVApBa05QTVVjd1JRWURWUVFLREQ1VGIyTnBaV1JoWkNCRFlXMWxjbUZzSUdSbElFTmxjblJwWm1sallXTnB3N051SUVScFoybDBZV3dnCkxTQkRaWEowYVdQRG9XMWhjbUVnVXk1QkxqRWpNQ0VHQTFVRUF3d2FRVU1nVW1IRHJYb2dRMlZ5ZEdsanc2RnRZWEpoSUZNdVFTNHcKSGhjTk1EWXhNVEkzTWpBME5qSTVXaGNOTXpBd05EQXlNakUwTWpBeVdqQjdNUXN3Q1FZRFZRUUdFd0pEVHpGSE1FVUdBMVVFQ2d3KwpVMjlqYVdWa1lXUWdRMkZ0WlhKaGJDQmtaU0JEWlhKMGFXWnBZMkZqYWNPemJpQkVhV2RwZEdGc0lDMGdRMlZ5ZEdsanc2RnRZWEpoCklGTXVRUzR4SXpBaEJnTlZCQU1NR2tGRElGSmh3NjE2SUVObGNuUnBZOE9oYldGeVlTQlRMa0V1TUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcTJ1Sm8xUE1TQ01JKzhQUFVaWUlMcmdJZW0wOGtCZUdxZW50TGhNMFI3TFFjTnpKUE5DTgp5dTVMRjZ2UWhiQ25Jd1RMcUtMODVYWGJRTXBpaVk5UW5nRTlKbHNZaEJ6TGZEZTNmZXpUZjNNWnNHcXkySWlLTFVWMHFQZXp1TURVCjJzMGlpWFJOV2hVNWN4aDBUN1hybWFmQkhvaTB3cE9RWTVmenA2Y1NzZ2tpQnpQWmtjME9uQjhPSU1mdXV6T05qOExTV0tkZi9XVTMKNG9qQzJJK0dkVjc1TGFlSE0vSjROeStMdkIyR056bXhsUExZdkVxY2d4aGFCdnp6MU5TNmpCVUpKZkQ1dG8wRWZoY1NNMnRYU0V4UAoyeVllNjh5UTU0djVhSHh3RDZNcTBEbzQzemVYNGx2ZWdHSFRnTmlSZzBKYVRBU0phQkU4ckY5b2dFSE1ZRUxPRFZvcURBK2JNTUNtCjhJYmJxMG5YbDIxSWkva0R3RkpubXhMM3d2SXVtR1ZDMmRhYTQ5QVpNUXl0aDlWWEFub3c2SVltKzQ4amlsU0g1TDg4N3V2RGRVaGYKSGpsdmdXSnN4UzNFRjFRWnR6ZU5uRGVSeVBZTDFlcGpiNE9zT01MelA5NmErK0VqWWZESUpzczJ5S0h6TUkra282S2gzVk96M3ZDYQpNaCtEa1hrd3dha2ZVNXRUb2hWVFA5MmRzeEE3U0gySkQvenRBL1g3SldSMURoY1pEWThBRm1kNWVrRDhMVmtIMlpENm1xMDkzSUNLCjVsdzFvbWRNRVd1eCtJQmtBQzF2SW1IRnJFc201Vm9RZ3B1a2czczA5NTZKa1NDWGpyZEN4MmJEME9tazF2VWdqY1REbGF4RUNwMWIKY3p3bVBTOUt2cWZKcHhBZSs1OVFhZk1DQXdFQUFhT0I1akNCNHpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRQpBd0lCQmpBZEJnTlZIUTRFRmdRVTBRblE2ZGZPZVhSVStUb3dzL1J0TEFNREcyZ3dnYUFHQTFVZElBU0JtRENCbFRDQmtnWUVWUjBnCkFEQ0JpVEFyQmdnckJnRUZCUWNDQVJZZmFIUjBjRG92TDNkM2R5NWpaWEowYVdOaGJXRnlZUzVqYjIwdlpIQmpMekJhQmdnckJnRUYKQlFjQ0FqQk9Ha3hNYVcxcGRHRmphVzl1WlhNZ1pHVWdaMkZ5WVc1MDdXRnpJR1JsSUdWemRHVWdZMlZ5ZEdsbWFXTmhaRzhnYzJVZwpjSFZsWkdWdUlHVnVZMjl1ZEhKaGNpQmxiaUJzWVNCRVVFTXVNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUUJjbExXNFJaRk5qbUVmCkF5Z1BVM3ptcEZtcHM0cDZ4YkQvQ0h3c28zRWNJUk5ub1pVU1FEV0RnNDkwMnpOYzhFbDJDb0ZTM1VuVW1qSXo3NXVueTNYbGVzdVgKRXBCY3VudkZtOSs3T1NQSS81ak9DazBpQVVnSGZvckExU0JDbEVUdnYzZWlpV2RJRzBBREJhR0o3TTlpNHowbGRtYS9KcmU3SXI1dgovemxYZExwNnlRR1Z3WlZSNktzcytMR0dJT2sveXpWYjBoZnBLdjZERXhkQTdvaGlaVnZWTzJEcGV6eTR5ZFYvTmdJbHFtakNNUlczCk1HWHJmeDFJZWJIUE9lSkNnQmJUOVpNai9FeVh5Vm8zYkh3aTJFck4wbzQyZ3ptUmtCREk4Y2sxZmorNDA0SEdJR1FhdGxEQ0lhUjQKM05Bdk8yU1RkUENXa1BIdit3bGFORUNXOERZU3dhTjBqSk4rUWQ1M2kreUcyZElQUHkzUnpFQ2lpV1pJSGlDem5DTlpjNmxFYzd3awplWkJXTjdQR0tYNmpEL0VwT2U5K1hDZ3ljRFdzMnJqSWRXYjhtMHc1UjQ0YmI1dE5BbFFpTSs5aHVwNHBoTzlPU3pOSGRwZHF5MzVmCi9SV21ua0pEVzJaYWlvZ045eGE1UDFGbEsyWnFpOUU0VXFMV1JoSDYvSm9jZEo2UGx3c0NUMlRHOVdqVFN5My9wRGNlaXorL1JMNWgKUnFHRVBRZ25USUVnZDRrSTZtZEFYbXdJVVY4MFdveVdhTTNYOTRuQ0hOTXlBSzlTeTlOZ1d5bzZSMzVyTURPaFlpbC9Tcm5oTGVjVQpJdzRPR0VmaGVmd1ZWZEN4L0NWeFkzVXpIQ01ycjF6WjdVZDNZQTQ3RHg3U3dOeGtCWW44ZU5aY0xDWkRxUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXFqQ0NBNUtnQXdJQkFnSU9MbW9BQVFBQ0g5ZFNJU3dSWERzd0RRWUpLb1pJaHZjTkFRRUZCUUF3ZGpFTE1Ba0dBMVVFQmhNQwpSRVV4SERBYUJnTlZCQW9URTFSRElGUnlkWE4wUTJWdWRHVnlJRWR0WWtneElqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5CklFTnNZWE56SURJZ1EwRXhKVEFqQmdOVkJBTVRIRlJESUZSeWRYTjBRMlZ1ZEdWeUlFTnNZWE56SURJZ1EwRWdTVWt3SGhjTk1EWXcKTVRFeU1UUXpPRFF6V2hjTk1qVXhNak14TWpJMU9UVTVXakIyTVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRWRU1nVkhKMQpjM1JEWlc1MFpYSWdSMjFpU0RFaU1DQUdBMVVFQ3hNWlZFTWdWSEoxYzNSRFpXNTBaWElnUTJ4aGMzTWdNaUJEUVRFbE1DTUdBMVVFCkF4TWNWRU1nVkhKMWMzUkRaVzUwWlhJZ1EyeGhjM01nTWlCRFFTQkpTVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0MKQVFvQ2dnRUJBS3VBaDV1TzhNTjhoOWZvSklJUnN6emRRMkx1K01ORjJ1amhvRi9SS3JMcWsyamZ0TWpXUStuRWRWbC8vT0VkK0RGdwpJeHVJbmllNWUvMDYwc21wNlJRdmtMNERVc0ZKemZiOTVBaG1DMWVLb2tLZ3VOVi9hVnlRTXJLWERjcEszRVkrQWxXSlUrTWFXc3MyCnhnZFc5NHpQRWZSTXV6QndCSldsOWptTS9YT0JDSDJKWGpJZUlxa2lSVXV3Wmk0d3pKOWwvZnpMZ2FueDREdXZvNGJSaWVyRVJYbFEKWGE3cElYU1NUWXRaZ28rVTQrbEs4ZWRKc0JUajlXTEwxWEs5SDduU242RE5xUG9CeU5rTjM5cjhSNTJ6eUZUZlNVcnhJYW4rR0U3dQpTTlFadSs5OTVPS2R5MXUyYnYvanpWcm5kSUlGdW9BbE9NdmthWjZ2UWFvYWhQVUNBd0VBQWFPQ0FUUXdnZ0V3TUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJUanExUk1nS0hiVmtPM2tVckw4NEo2RTF3SXF6Q0IKN1FZRFZSMGZCSUhsTUlIaU1JSGZvSUhjb0lIWmhqVm9kSFJ3T2k4dmQzZDNMblJ5ZFhOMFkyVnVkR1Z5TG1SbEwyTnliQzkyTWk5MApZMTlqYkdGemMxOHlYMk5oWDBsSkxtTnliSWFCbjJ4a1lYQTZMeTkzZDNjdWRISjFjM1JqWlc1MFpYSXVaR1V2UTA0OVZFTWxNakJVCmNuVnpkRU5sYm5SbGNpVXlNRU5zWVhOekpUSXdNaVV5TUVOQkpUSXdTVWtzVHoxVVF5VXlNRlJ5ZFhOMFEyVnVkR1Z5SlRJd1IyMWkKU0N4UFZUMXliMjkwWTJWeWRITXNSRU05ZEhKMWMzUmpaVzUwWlhJc1JFTTlaR1UvWTJWeWRHbG1hV05oZEdWU1pYWnZZMkYwYVc5dQpUR2x6ZEQ5aVlYTmxQekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBak5mZmZ1NGJnQkN6Zy9YYkVlcHJTNmlTR05uM0J6bjFMTDRHCmRYcG9VeFVjNmtydFh2d2pzaE9nMHduLzl2WXVhMEZ4ZWMzaWJmMnVXV3VGSGJoT0lwcnRaamx1UzVUbVZmd0xHNHQzd1ZNVFpvbloKS05hTDgwVktZN2Y5ZXd0aFhiaHR2c1BjVzNuUzdZYmxvazIrWG5SOGF1MFdPQjkvV0lGYUd1c3lpQzJ5OHpsM2dLOWV0bUYxS2RzagpUWWpLVUNqTGhkTFRFS0paYnRPVFZBQjZva2FWaGdXY3FSbVk1VEZ5REFEaVo5bEE0Q1F6ZTI4c3VWeXJaWjBzckhicU5abjFsN2tQCkpPekhkaUVvWmE1WDZBZUlkVXBXb05JRk9xVG1qWktJTFBQeTRjSEdZZHRCeGNlYjl3NGFVVVhDWVd2Y1pDY1hqRnEzMm5Rb3paZmsKdlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBIElJCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVxakNDQTVLZ0F3SUJBZ0lPU2tjQUFRQUM1YUJkMWo4QVViOHdEUVlKS29aSWh2Y05BUUVGQlFBd2RqRUxNQWtHQTFVRUJoTUMKUkVVeEhEQWFCZ05WQkFvVEUxUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVkdFlrZ3hJakFnQmdOVkJBc1RHVlJESUZSeWRYTjBRMlZ1ZEdWeQpJRU5zWVhOeklETWdRMEV4SlRBakJnTlZCQU1USEZSRElGUnlkWE4wUTJWdWRHVnlJRU5zWVhOeklETWdRMEVnU1Vrd0hoY05NRFl3Ck1URXlNVFEwTVRVM1doY05NalV4TWpNeE1qSTFPVFU1V2pCMk1Rc3dDUVlEVlFRR0V3SkVSVEVjTUJvR0ExVUVDaE1UVkVNZ1ZISjEKYzNSRFpXNTBaWElnUjIxaVNERWlNQ0FHQTFVRUN4TVpWRU1nVkhKMWMzUkRaVzUwWlhJZ1EyeGhjM01nTXlCRFFURWxNQ01HQTFVRQpBeE1jVkVNZ1ZISjFjM1JEWlc1MFpYSWdRMnhoYzNNZ015QkRRU0JKU1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUxUZ3UxRzdPVnlMQk1WTWVSd2poakVRWTBOVkp6L0dSY2VrUGV3SkRSb2VJTUpXSHQ0Yk53Y3dJaTl2OFFieHE2M1cKeUt0aG95OUR4TEN5TGZ6RGxtbDdmb3Jrek1BNUVwQkNZTW5NTldqdTJsK1FWbC9OSEUxYldFbnJEZ0ZQWlBvc1BJbFkyQzh1NHJCbwo2U0k3ZFluV1JCcGw4aHVYSmgwb2Jhem92VmtkS3lUMjFvUURab2drQUhoZzhmaXIvZ0t5YS9zaSt6WG1GdEd0OWk0UzVQbzFhdVVaCnVWM2JPeDRhKzlQL0ZSUUkyQWxxdWtXZEZIbGdmYTlBaWdkenM1T1cwM1EwalRvM0tkNWM3UFh1TGpIQ0lOeSs4VTkvSTFMWlcrSmsKMlp5cUJ3aTFSYjNSMERIQnExU2ZxZExEWW1BRDhiczVTcEpLUFFxNW5jV2cvamNDQXdFQUFhT0NBVFF3Z2dFd01BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCVFVvdnlmczhQWUE5TlhYQWVrMENTbndQSUExRENCCjdRWURWUjBmQklIbE1JSGlNSUhmb0lIY29JSFpoalZvZEhSd09pOHZkM2QzTG5SeWRYTjBZMlZ1ZEdWeUxtUmxMMk55YkM5Mk1pOTAKWTE5amJHRnpjMTh6WDJOaFgwbEpMbU55YklhQm4yeGtZWEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlEwNDlWRU1sTWpCVQpjblZ6ZEVObGJuUmxjaVV5TUVOc1lYTnpKVEl3TXlVeU1FTkJKVEl3U1Vrc1R6MVVReVV5TUZSeWRYTjBRMlZ1ZEdWeUpUSXdSMjFpClNDeFBWVDF5YjI5MFkyVnlkSE1zUkVNOWRISjFjM1JqWlc1MFpYSXNSRU05WkdVL1kyVnlkR2xtYVdOaGRHVlNaWFp2WTJGMGFXOXUKVEdsemREOWlZWE5sUHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQU5tRGtjUGNHSUVQWkl4cEM4dmlqc3JsTmlyVHp3cHBWTVh6RQpPMmVhdE45TkRvcVRTaGVMRzQzS2llSFBPaDZzSGZHY01yU09XWGFpUVlVbE42QVQwUFY4VHRYcWx1SnVjc0c3S3Y1c2J2aVJtRWI4CnlSdFhXK3JJR2pzL3NGR1lQQWZhTEZrQjJvdEU2T0YwL2FkbzNWUzZnMGJzeUVhMStLK1h3RHNKSEkvT2NwWTlNMVp3dkpiTDJOVjkKSUpxRG54cmNPZkhGY3FNUkEvMDdRbElwMitnQjk1dGVqTmFOaGs0Wityd2N2c1VocFllZWVDNDIyd2x4bzNJMCtHempCZ255WGxhbAowOTJZK3RUbUJ2VHd0aUJqUytvcHZhcUNaaDc3Z2Fxbk42MFRHT2FTdzRIQk03dUlIcUhuNHJTOU1Xd09VVDF2KzVaV2dPSTJGOUhjCjVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lPSGFJQUFRQUM3TGRnZ0hpTnRnWXdEUVlKS29aSWh2Y05BUUVGQlFBd2VURUxNQWtHQTFVRUJoTUMKUkVVeEhEQWFCZ05WQkFvVEUxUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVkdFlrZ3hKREFpQmdOVkJBc1RHMVJESUZSeWRYTjBRMlZ1ZEdWeQpJRlZ1YVhabGNuTmhiQ0JEUVRFbU1DUUdBMVVFQXhNZFZFTWdWSEoxYzNSRFpXNTBaWElnVlc1cGRtVnljMkZzSUVOQklFa3dIaGNOCk1EWXdNekl5TVRVMU5ESTRXaGNOTWpVeE1qTXhNakkxT1RVNVdqQjVNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVFZFTWcKVkhKMWMzUkRaVzUwWlhJZ1IyMWlTREVrTUNJR0ExVUVDeE1iVkVNZ1ZISjFjM1JEWlc1MFpYSWdWVzVwZG1WeWMyRnNJRU5CTVNZdwpKQVlEVlFRREV4MVVReUJVY25WemRFTmxiblJsY2lCVmJtbDJaWEp6WVd3Z1EwRWdTVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBS1IzSTVaRXI1RDBNYWNROUNhSG5QTTQyUTllM3M5QjZER3R4blNSSkpaNEhnbWdtNXFWU2tyMVlud0MKcU1xcysxb0Vkam5lWC9INXM3L3pBMWhWMHFxMzR3UWkwZmlVMmlJSUFJM1RmQ1pkekhkNTV5eDRPYWdtY3c2aVhTVnBoVTlWRHBydgp4cmxFNFZjOTN4OVVJdVZ2WmFvemhEcnp6bnErVlpldWpSSVBGRFBpVUhERFNZY1R2RkhlMTVnU1d1ODZnek9TQm5XTGtud1NhSHR3CmFnKzFtN1ozVzBoWm5lVHZXcTN6d1o3VTEwVk95bFkwSWJ3K0YxdHZkd3hJQVVNcHNOMC9sbTdtbGFvTXdDQzIvVDQySjV6alhNOU8KZ2R3WnU1R1FmZXptbHdRZWs4d2lTZGVYaHJZVENqeERJM2QrOE56bXpTUWZPNE9iTkRxRE5PTUNBd0VBQWFOak1HRXdId1lEVlIwagpCQmd3Rm9BVWtxUjFMS1Nldm9GRTYzbjhpc1dWcGVzUWRYTXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFZWXdIUVlEVlIwT0JCWUVGSktrZFN5a25yNkJST3Q1L0lyRmxhWHJFSFZ6TUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBbzB1Q0cKMWViNGUvQ1gzQ0pyTzVVVVZnOFJNS1dhVHpxd091QUd5MlgxN2NhWEovNGw4bGZtWHBXTVBtUmdGVnAvTHcwQnhiRmcvVVUxei9DeQp2d2JaNzFxK3MySWh0TmVyTlh4VFBxWW44YUV0Mmhvam5jemQ3RHd0bmljMFhRL0NObm04eVVwaUxlMXIyWDFCUTN5MnFzcnRZYkUzCmdoVUpHb29XTU5qc3lkWkhjbmhMRUVZVWpsOE9yK3pITDZzUTE3YnhidXlHc3NMb0RaSnozS0wwRHpxL1lTTVFpWnhJUUc1d0FMUFQKdWpkRVdCRjZBbXFJOERjMDhCbnByTlJsYy9acGpHU1VPbm1GS2JBV0t3eUNQd2FjeC8wUUs1NFBMTGFlNHhXLzJUWWN1aVVhVWowYQo3Q0lNSE9Da29qM3c2RG5QZ2NCNzdWMGZiOFhRQzllWQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVApSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGxVMlZqSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHCkExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkJJREl3SGhjTk9Ua3dOekE1TVRJeE1UQXdXaGNOTVRrd056QTUKTWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwRwpBMVVFQ3hNV1ZDMVVaV3hsVTJWaklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTCmIyOTBJRU5CSURJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNyQzZNMTRJc3BGTEVVaGE4OEVPUTUKYnpWZFNxN2Q2bUdObFVuMGIyU2pHbUJtcEtsQUlvVFoxS1hsZUpNT2FBR3R1VTFjT3M3VHVLaENRTi9QbzdxQ1dXcVNHNndjbXRvSQpLeVVuK1dralIvSGc2eXg2bS9VVEF0QitOSHpDbmp3QVdhdjEyZ3oxTWp3cnJGRGExc1BlZzVUS3FBeVpNZzRJU0ZaYmF2dmE0VmhZCkFVbGZja0U4RlFZQmpsMnRxcmlUdE0yZTY2Zm9haTFTTk5zNjcxeDFVZHJiOHpINTduR1lNc1JVRlVRTStadFY3YTNmR0FpZ280YUsKU2U1VEJZOFpUTlhlV0htYjBtb2NRcXZGMWFmUGFBK1c1T0ZobUhaaHlKRjgxajRBNHBGUWgrR2RDdWF0bDlJZHhqcDl5N3phQXpUVgpqbHNCOVdvSHR4YTJia3AvQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJReHcza2J1dlZUMXhmZ2lYb3RGMndLc3l1ZE16QVBCZ05WCkhSTUVDREFHQVFIL0FnRUZNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFsR1JaclRsazV5bnIKRS81YXc0c1RWOGdFSlBCMGQ4Qmc0MmY3NlltbWc3K1dnbnh1MU1NOTc1NkFicnNwdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeQp6aGZ6TE1kaU5sWGlJdGlKVmJTWVNLcGsrdFljTnRoRWVGcGFJenBYbC9WNk1FK3VuMnBNU3l1T29BUGpQdUNwMU5KNzByT280bkk4CnJaNy9nRm5rbTBXMDlqdXd6VGtabURMbDZpRmhrT1F4SVk0MHNmY3ZOVXFGRU5ybmlqY2h2bGxqNFBLRmlERlQxRlFVaFhCNTlDNEcKZHlkMUx4KzRpdm4reGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQpDbTI2T1dNb2hwTHpHSVRZKzlIUEJWWmtWdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNvbVNpZ24gU2VjdXJlZCBDQQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxekNDQXBPZ0F3SUJBZ0lSQU1jb1J3bXp1R3hGakIzNkpQVTJUdWt3RFFZSktvWklodmNOQVFFRkJRQXdQREViTUJrR0ExVUUKQXhNU1EyOXRVMmxuYmlCVFpXTjFjbVZrSUVOQk1SQXdEZ1lEVlFRS0V3ZERiMjFUYVdkdU1Rc3dDUVlEVlFRR0V3SkpUREFlRncwdwpOREF6TWpReE1UTTNNakJhRncweU9UQXpNVFl4TlRBME5UWmFNRHd4R3pBWkJnTlZCQU1URWtOdmJWTnBaMjRnVTJWamRYSmxaQ0JEClFURVFNQTRHQTFVRUNoTUhRMjl0VTJsbmJqRUxNQWtHQTFVRUJoTUNTVXd3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXcKZ2dFS0FvSUJBUURHdFdoZkhaUVZ3NlFJVlMzam9GZDY3K2wwS3J1NWZGZEpHaEZlVHltSERFaldhdWVQMUg1WEpMa0dpZVFjUE9xcwo0OW9oZ0hNaEN1OTVtR3dmQ1AraFVIM3ltQnZKVkc4K3BTanNJUVFQUmJzSFBhSEEraXFZSFU0R2svdjFpRHVyWDhzV3YrYnpua3FICjdSbnF3cDlENVBHQnBYOFFUejdSU21LdFV4dkxnLzhIWmFXU0xXYXBXN2hhOUIyMElaRktGM3VlTXY1V0pEbXlWSVJEOVlUQzJMeEIKa015ZDFtamE2WUpRcVR0b3o3VmRBcFJnRnJGRDJVTmQzVjJIYnVxN3M4bHI5Z09VQ1hEZUZoRjZLK2gyajBrUW1IZTVZMXlMTTVkMQo5Z3VNc3F0YjNuUWdKVC9qOHhINWgyaUdOWEhESFl3dDYrVWFyQTl6MVlKWlFJRFRBZ01CQUFHamdhY3dnYVF3REFZRFZSMFRCQVV3CkF3RUIvekJFQmdOVkhSOEVQVEE3TURtZ042QTFoak5vZEhSd09pOHZabVZrYVhJdVkyOXRjMmxuYmk1amJ5NXBiQzlqY213dlEyOXQKVTJsbmJsTmxZM1Z5WldSRFFTNWpjbXd3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjhHQTFVZEl3UVlNQmFBRk1GTDdYQzI5ejU4QURzQQpqOGMrRGtXZkhsM3NNQjBHQTFVZERnUVdCQlRCUysxd3R2YytmQUE3QUkvSFBnNUZueDVkN0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DCkFRRUFGcy91a2hOUXEzc1Vuak8yUWlCcTFCVzlDYXY4Y3VqdlIzcVFyRkhCWkU3cGlMMURSWUhqWmlNL0VvWk5HZVFGc09ZM3dvM2EKQmlqSkQ0bWtVNmwxUDdDVys2dE1NMVg1ZUNaR2J4czJtUHRDZHNHQ3VZN2UrMFg1WXh0aU96a0d5bmQ2cUR3SnoydzJQUThLUlV0cApGaHBGZlRNRFpmbFNjWkFtbGF4TURQV0xrei9NZFhTRm1Mci9ZbnBOSDRuK3JyMlVBSm0vRWFYYzRIbkZGZ3Q5QW1FZDZvWDVBaFZQCjUxcUpUaFJ2NHpkTGhmWEJQR0hnL1FWQnNwSi93eDJnMEs1U1pHQnJHTVltbk5qMVpPUTJHbUtmaWc4Ky8yMU9HVlpPSUpGc256UXoKT2pSWFVEcHZnVjRHeHZVK2ZFNk9LODVsQmk1ZDBpcFRkRjdUYmllZWp3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ3liZXJ0cnVzdCBHbG9iYWwgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb1RDQ0FvbWdBd0lCQWdJTEJBQUFBQUFCRDRXcUxVZ3dEUVlKS29aSWh2Y05BUUVGQlFBd096RVlNQllHQTFVRUNoTVBRM2xpClpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTYjI5ME1CNFhEVEEyTVRJeE5UQTQKTURBd01Gb1hEVEl4TVRJeE5UQTRNREF3TUZvd096RVlNQllHQTFVRUNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRRApFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCitNaTh2UlJRWmhQLzhOTjU3Q1B5dHhySGpvWHhFbk9tR2FvUTI1eWlaWFJhZHo1UmZWYjIzQ08yMU8xZldMRTNUZFZKRG03MWFvZlcKMG96U0o4YmkvemFmbUdXZ0UwN0dLbVNiMVpBU3p4UUc5RHZqMUNpKzZBNzRxMDVJbEcyT2xURVFYTzJpTGIzVk9tMnlITHRnd0VaTApBZlZKcm41R2l0QjBqYUVNQXM3dS9PZVB1R3RtODM5RUFMOW1KUlFyM1JBd0hRZVdQMDMyYTdpUHQzc01wVGpyM2tmYjFWMDUvSWluCjg5Y3FkUEhvV3FJN24xQzZwb3hGTmNKUVpaWGNZNEx2M2I5M1RaeGl5V056RnRBcEQwbXBTUEN6cXJkc3hhY3dPVUJkcnNUaVhTWlQKOE00Y0l3aGhxSlFadWdSaVFPd2ZPSEIzRWdaeHB6QVlYU1VucFFJREFRQUJvNEdsTUlHaU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUzJDSHNOZXN5c0lFeUdWakplejZ0dWhTMXdWekEvQmdOVkhSOEVPREEyCk1EU2dNcUF3aGk1b2RIUndPaTh2ZDNkM01pNXdkV0pzYVdNdGRISjFjM1F1WTI5dEwyTnliQzlqZEM5amRISnZiM1F1WTNKc01COEcKQTFVZEl3UVlNQmFBRkxZSWV3MTZ6S3dnVElaV01sN1BxMjZGTFhCWE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQlc3d29qb0ZSTwpsWmZKK0luYVJjSFVvd0FsOUI4VHE3ZWpoVmhwd2pDdDJCV0tMZVBKellGYStITWpXcWQ4QmZQOUlqc08wUWJFMnpaTWN3U081YkFpCjVNWHpMcVhaSStPNFRrb2dwMjRDSko4aVlHZDdpeDF5Q2NVeFhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDIKaE8wajluMEhxMFYrMDkrenYrbUt0czJvb21jclV0VzNaZkE1VEdPZ2tYbVRVZzlVM1lPN245R1BwMU56dzh2L01PeDhCTGpZUkIrVApYM0VKSXJkdVB1b2NBMDZkR2lCaCs0RTM3Rjc4Q2tXcjErY1hWZENnNm1DYnB2YmpqRnNwd2daZ0ZKMHRsMHlwa3hXZFljUUJYMGpXCldMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZU1Rc3dDUVlEVlFRRwpFd0pVVnpFak1DRUdBMVVFQ2d3YVEyaDFibWRvZDJFZ1ZHVnNaV052YlNCRGJ5NHNJRXgwWkM0eEtqQW9CZ05WQkFzTUlXVlFTMGtnClVtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TkRFeU1qQXdNak14TWpkYUZ3MHpOREV5TWpBd01qTXgKTWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNd0lRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFcQpNQ2dHQTFVRUN3d2haVkJMU1NCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUNJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTRTVVA3bzNiaUROMVo4MnRIMzA2VG0yZDB5OFU4Mk4weXdFaGFqZnFoRkFIU3laYkNVTnMKSVo1cXlOVUQ5V0Jwajh6d0l1UWY1L2RxSWpHM0xCWHk0UDRBYWtQL2gyWEd0UnJCcDB4dEluQWhpakh5bDNTSkNSSW1ISjdLMlJLaQpsVHphNldlL0NLQms0OVpDdDBYdmwvVDI5ZGUxU2hVQ1dIMllXRXRndk0zWERab1RNMVBSWWZsNjFkZDRzNW96OXdDR3poMU5sRGl2CnFPeDRVWENLWEJDRFVTSDNFVDAwaGw3bFNNMlhnWUkxVEJuc1pmWnJ4UVdoN2tjVDFyTWhKNVFRQ3Rra083cStSQk5HTUQrWFBOalgKMTJydU96ampLOVNYRHJrYjV3ZEpmemNxK1hkNHoxVHRXMGFkbzRBT2tVUEIxbHRmRkxxZnBvMGtSMEJadjNJNHNqWnNOLytaMFYwTwpXUXFyYWZmQXNnUkZlbFFBcnI1VDlyWG40Zmc4b3pIU3FmNGhVbVRGcG1md2RRY0dsQlNCVmNZbjVBR1BGOEZxY2RlK1MvdVVXSDErCkVUT3hRdmRpYkJqV3p3bG9QbjlzOWg2UFlxMmxZOXNKcHg4aVFrRWViNW1LUHRmNVAwQjZlYkNsQVpMU25UMElGYVVRQVMyek1uYW8KbFEyemVwcjdCeEI0RVcvaGo4ZTZEeVVhZENybEhKaEJtZDhoaCtpVkJtb0tzMnBIZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5Lwp2djloYUxkbkc3dDRUWTNPWitYa3dZNjNJMmJpblpCMU5KaXBOaXVLbXBTNW5lek1pckg0SllsY1dyWXZqQjl0ZVNTblVtakRoRFhpClpvMWpEaVZOMVJteTVuazNweUtkVkRFQ0F3RUFBYU5xTUdnd0hRWURWUjBPQkJZRUZCNE05N1puOHVHU0pnbEZ3RlU1TG5jL1FrcWkKTUF3R0ExVWRFd1FGTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSApDbFo4N2x0NERKWDVHRlBCcGh6WUVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFDYk9EVTFrQlBwVkp1ZkdCdXZsMklDTzFKMkIwCjFHcVpORjVzQUZQWm4vS21zU1FIUkdvcXhxV09lQkxvUjlsWUd4TXFYbm1ibndvcVo2WWxQd1pwVm5QRGltWkkreW1CVjNRR3lwenEKS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUEpYdG9VSFJWbkF4WmZWbzlRWlFsVWdqZ1J5d1ZNUm5WdndkVgp4cnNTdFpmMFg0T0Z1bkhCMld5QkVYWUtDckMvZ3BmMzZqMzYrdXd0cVNpVU8xYmQwbEV1cnNDOUNCV01kMUkwbHRhYnJOTWRqbUVQCk5YdWJyamxwQzJKZ1FDQTJqNi83TnU0dENFb2R1TCtiWFBqcXBSdWdjNmJZK0c3Z013UmZhS29uaCszWndaQ2M3YjNqYWpXdlk5K3IKR05tNjV1bEs2bENLRDJHVEh1SXRHZUl3bERXU1hRNjJCNjhaZ0k5SGtGRkxMazNkaGVMU0NsSUtGNXI4R3JCUUF1VUJvMk0zSVV4RQp4SnRSbVJFT2M1d0dqMVF1cHloZVJEbUhWaTAzdllWRWxPRU1TeXljdzVLRk5HSExEN2liU2tOUy9qUTZmYmpwS2R4MnFjZ3crQlJ4CmdNWWVOa2gwSWtGY2g0TG9HSEdMUVlsRTUzNVlXNmk0alJQcHAyekRSKzJ6R3AxaXJvMkM2cFNlM1ZrUXc2M2Q0azNqTWRYSDdPankKc1A2U0hoWUtHdnpaOC9nbnRzbStIYlJzWkpCLzlPVEVXOWMzcmtJTzNhUWFiM3lJVk1VV2J1RjZhQzc0T3I4TnBEeUpPM2luVG1PRApCQ0VJWjQzeWdrblFXLzJ4elErRGhOUStJSVgzU2owcm5QMHFDZ2xONm9INEVadz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFx4YzNceDljXHg0Mlx4QzRceEIwVEFLIFVFS0FFIEtceEMzXHhCNmsgU2VydGlmaWthIEhpem1ldCBTYVx4QzRceDlGbGF5XHhjNFx4YjFceDYzXHhjNFx4YjFzXHhjNFx4YjEgLSBTXHhDM1x4QkNyXHhDM1x4QkNtIDMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZGekNDQS8rZ0F3SUJBZ0lCRVRBTkJna3Foa2lHOXcwQkFRVUZBRENDQVNzeEN6QUpCZ05WQkFZVEFsUlNNUmd3RmdZRFZRUUgKREE5SFpXSjZaU0F0SUV0dlkyRmxiR2t4UnpCRkJnTlZCQW9NUGxURHZISnJhWGxsSUVKcGJHbHRjMlZzSUhabElGUmxhMjV2Ykc5cQphV3NnUVhKaHhaOTB4TEZ5YldFZ1MzVnlkVzExSUMwZ1ZNT2NRc1N3VkVGTE1VZ3dSZ1lEVlFRTEREOVZiSFZ6WVd3Z1JXeGxhM1J5CmIyNXBheUIyWlNCTGNtbHdkRzlzYjJwcElFRnlZY1dmZE1TeGNtMWhJRVZ1YzNScGRNTzhjOE84SUMwZ1ZVVkxRVVV4SXpBaEJnTlYKQkFzTUdrdGhiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcE1Vb3dTQVlEVlFRRERFRlV3NXhDeExCVVFVc2dWVVZMUVVVZwpTOE8yYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzU0F0SUZQRHZITER2RzBnTXpBZUZ3MHdOekE0Ck1qUXhNVE0zTURkYUZ3MHhOekE0TWpFeE1UTTNNRGRhTUlJQkt6RUxNQWtHQTFVRUJoTUNWRkl4R0RBV0JnTlZCQWNNRDBkbFlucGwKSUMwZ1MyOWpZV1ZzYVRGSE1FVUdBMVVFQ2d3K1ZNTzhjbXRwZVdVZ1FtbHNhVzF6Wld3Z2RtVWdWR1ZyYm05c2IycHBheUJCY21IRgpuM1RFc1hKdFlTQkxkWEoxYlhVZ0xTQlV3NXhDeExCVVFVc3hTREJHQmdOVkJBc01QMVZzZFhOaGJDQkZiR1ZyZEhKdmJtbHJJSFpsCklFdHlhWEIwYjJ4dmFta2dRWEpoeFo5MHhMRnliV0VnUlc1emRHbDB3N3h6dzd3Z0xTQlZSVXRCUlRFak1DRUdBMVVFQ3d3YVMyRnQKZFNCVFpYSjBhV1pwYTJGemVXOXVJRTFsY210bGVta3hTakJJQmdOVkJBTU1RVlREbkVMRXNGUkJTeUJWUlV0QlJTQkx3N1pySUZObApjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4SUMwZ1U4Tzhjc084YlNBek1JSUJJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWltMUwveENJT3NQMmZwVG82aUJrY0s0aGdiNDZlenpiOFIxU2YxbjY4eUpNbGFDUXZFaE8KRWF2N3Q3V05lb01vakNaRzJFNlZRSWRobjhXZWJZR0hWMnlLTzdSbTZzeEEvT09xYkxMTEFkc3l2OUxyaGMraERWWERXemhYY0xoMQp4bm5SRkREdEcxaGJhKzgxOHFFaFRzWE9mSmxmYkxtNElwTlFwODFNY0dxK2FnVi9FNXdySHVyK1I4NEVwVytza3k1OEs1K2VlUk9SCjZPcWV5amgxam1Ld2xaTXE1ZC9wWHBkdUlGOWZoSHBFT1JsQUhMcFZLL3N3c29IdmhPUGM3Smc0T1FPRkNLbFVBd1VwOE1tUGkrb0wKaG1VWkVkUHBDU1BlYUpNRHlUWWNJVzdPakdieG1URFkxN1BESGZpQkxxaTlnZ3RtL29MTDRlQWFnc05BZ1FJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVV2WWlIeVkvMnBBb0xxdXZGL3BFam5hdEtpakl3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUIxOCtrbVBOT20zSnBJV21nVjA1MHZRYlRsc3d5YjJ6cmd4dk1UZnZDcjQKTjVFWTNBVElaSmtyR0cyQUExbkpydmhZMEQ3dHd5T2ZhVHlHT0J5ZTc5b25lTkdFTjNHS1BFczV6MzVGQnRZdDJJcE5lQkxXcmNMVAp5OUxRUWZNbU5rcWJsV3dNN3VYUlF5ZG13WWozZXJNZ2JPcXdhU3ZISU9nTUE4UkJCWm5pUCtScitLQ0dnY2VFeGgvVlM0RVNzaFloCkxCT2hnTEplREVvVG5pRFlZa0Nya09wa1NpK3NEUUVTZVVXb0w0Y1phTWppaGNjd3NuWDVPRCt5d0pPMGErSURSTTVub04rSjFxMk0KZHFNVHc1UmhLMnZaYk1FSENpSUhoV3lGSkVhcHZqK0xlSVNDZmlRTW5mMkJOK01scU8wMlRwVXN5WnlRMnV5cFFqeXR0Z0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkJ1eXBhc3MgQ2xhc3MgMiBDQSAxCj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVXpDQ0FqdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCTE1Rc3dDUVlEVlFRR0V3Sk9UekVkTUJzR0ExVUVDZ3dVClFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hIVEFiQmdOVkJBTU1GRUoxZVhCaGMzTWdRMnhoYzNNZ01pQkRRU0F4TUI0WERUQTIKTVRBeE16RXdNalV3T1ZvWERURTJNVEF4TXpFd01qVXdPVm93U3pFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaApjM01nUVZNdE9UZ3pNVFl6TXpJM01SMHdHd1lEVlFRRERCUkNkWGx3WVhOeklFTnNZWE56SURJZ1EwRWdNVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSXM4QjBYWTl0L214OHE2alVQRlI0MndXc0U0MjVLRUhLOFQxQTl2TmtZZ3hDN00KY1hBMG9qVFROeTdZM1RwM0w4RHJLZWhjMHJXcGtUU0hJbG4rek52bm1hK1d3YWpIUU4ybEZZeHV5SHlYQTh2bUlQTFhsMTh4b1M4Mwowcjd1dnFtdHFFeWVJV1pETzZpODh3bWpPTlZaSk1IQ1IzYXhpRnlDTzdzcnBnVFhqQWVQemRWQkhmQ3V1Q2tzbEZKZ05KUTcydUE0CjBaMHpQaFgwa3pMRkFOcTFLV1lPT25nUElWSmZBdVdTZXlYVGtoNHZGWjJCNUoyTzZPK0p6aFJNVkIwY2dSSk5jS2krRUFVWGZoL1IKdUZkVjdjMjdVc0t3SG5qQ1RUWm95MVltd1ZMQnZYYjNXTlZ5Zmg5RWRyc0FpUjBXblZFMTcwM0NWdTlyNEl3N0Rla0NBd0VBQWFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUDQyYVdZdjhlM3VjbzY4NHNEbnRrSEdBMXNnd0RnWURWUjBQCkFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQVZHbjRUaXJub0I2TkxKekt5UUpIeUlkRmtoYjVqYXRMUGdjSVYKMVhwK0RDbXNOeDRjZkhaU2xkcTFmeU9oS1hkbHlUS2RxQzVXcTJCMnpoYTBqWDk0d05XWlVZTi9YdG0rREtoUTdTTEhyUVZNZHZ2dAo3aDVIWlBiM0ozMWNLQTlGeFZ4aVhxYWFrWkczVXhjdTNLMWduWlprT2IxbmFMS3VCY3RONTE4ZlY0YlZJSndvKzI4VE9QWDJFWkwyCmZabGVId3pvcTBRa0tYSkFQVFpTcjR4WWtIUEI3R0VzZWFIc2g3VS8yazNaSVFBdzNwRGFEdE1hU0trK2hRc1VpNHk4UVo1cTl3NXcKd0RYM09hSmRadEI3V1orb1J4S2FKeU9rTFk0bmc1SWdvZGNWZi9FdUdPNzBTSDh2Zi9HaEdMV2hDNVNnWWlBeW5CMzIxTysvVElobwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCdXlwYXNzIENsYXNzIDMgQ0EgMQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFV6Q0NBanVnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFVRkFEQkxNUXN3Q1FZRFZRUUdFd0pPVHpFZE1Cc0dBMVVFQ2d3VQpRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SFRBYkJnTlZCQU1NRkVKMWVYQmhjM01nUTJ4aGMzTWdNeUJEUVNBeE1CNFhEVEExCk1EVXdPVEUwTVRNd00xb1hEVEUxTURVd09URTBNVE13TTFvd1N6RUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmgKYzNNZ1FWTXRPVGd6TVRZek16STNNUjB3R3dZRFZRUUREQlJDZFhsd1lYTnpJRU5zWVhOeklETWdRMEVnTVRDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtTTzEzVFpLV1RlWHgrSGdKSHFUam5tR2NaRUM0RFZDNjlUQjRzU3ZlWm44QUt4CmlmWmdpc1Jic0VMUndDR295K0diNzJSUnRxZlBGZlYwZ0dnRWtLQllvdVowcGxOVFZVaGpQNUpXM1NST2p2aTZLLy96TklxZUtOYzAKbjZ3djFnL3hwQys5VXJKSmhXMDVOZkJFTUpOR0pQTzI1MVA3dkdHdnFhTVUrOElYRjRSczRIeUkrTWtjVnl6d1BYNlV2Q1dUaE9pYQpBSnBGQlVKWGdQUk96dG11T2ZiSVV4QU1aVHBIZTJEQzF2cVJ5Y1p4YkwyUmh6eVJoa21yOHcrZ2JDWjJYaHlzbTNIbGpieWJJUjZjCjFqaCtKSUFWTVlLV3NVblRZamRiaUF3S1lqVCtwMGgrbWJFd2k1QTNsUnlvSDZVc2pmUlZ5TnZkV1FyQ3JYaWc5SXNDQXdFQUFhTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVU9CVG15UENwcEFQMFRqNGlvMXZ5MXVDdFFIUXdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFCWjZPTXlTVTlFMk5kRm0vc29UNEpYSkVWS2lyWmdDRlBCZHk3CnBZbXJFek1xbmppM2pHOENjbVBIYzNjZUNRYTZPeWg3cEVmSllXc0lDQ0Q4aWdXS0g3eTZ4c0wrejI3c0V6TnhaeTVwK3Frc1AyYkEKRWxsTkMxUUNrb1M3MnhMdmczQndlTWhUK3QvR3h2L2NpQzhId0VtZE1sZGcwL0wybVNsZjU2b0J6S3d6cUJ3S3U1SEVBNkJ2dGpUNQpodE96ZGxTWTlFcUJzMU9kVFVEczVYY1RSYTlicWgvWUwweUNlLzRxeEZpN1QveWUvUU5sR2lvT3c2VWdGcFJyZWFhaUVyUzdHcVFqCmVsL3dyb1FrNVBNcis0b2tveWVZWmRvd2RYYjhHWkhvMit1YlB6Sy9RSmNISnJyTTg1U0ZTbm9uazgrUVF0UzRXeGFtNTh0QUE5MTUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRUJHIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx4QzRceDlGbGF5XHhjNFx4YjFceDYzXHhjNFx4YjFzXHhjNFx4YjEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY1ekNDQTgrZ0F3SUJBZ0lJVEs5elFoeU9kQUl3RFFZSktvWklodmNOQVFFRkJRQXdnWUF4T0RBMkJnTlZCQU1NTDBWQ1J5QkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hNVGN3TlFZRFZRUUtEQzVGUWtjZwpRbWxzYWNXZmFXMGdWR1ZyYm05c2IycHBiR1Z5YVNCMlpTQklhWHB0WlhSc1pYSnBJRUV1eFo0dU1Rc3dDUVlEVlFRR0V3SlVVakFlCkZ3MHdOakE0TVRjd01ESXhNRGxhRncweE5qQTRNVFF3TURNeE1EbGFNSUdBTVRnd05nWURWUVFEREM5RlFrY2dSV3hsYTNSeWIyNXAKYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzVEUzTURVR0ExVUVDZ3d1UlVKSElFSnBiR25GbjJsdApJRlJsYTI1dmJHOXFhV3hsY21rZ2RtVWdTR2w2YldWMGJHVnlhU0JCTHNXZUxqRUxNQWtHQTFVRUJoTUNWRkl3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUR1b0lSaDBEcHFaaEF5MkRFNGY2ZW41ZjJoNGZ1WGQ3aHhsdWdUbGthRFQ3YnkKWDNKV2JoTmdwUUdSNGx2RnpWY2ZkMk5SL3k4OTI3ay9xcWsxNTNuUTlkQWt0aUhxNnlPVS9pbS8rNG1SREdTYUJVb3J6QXp1OFQyYgpnbW1rVFBpYWIrY2kyaEM2WDVMOEdDY0txS3BFK2k0c3RQdEdtZ2dEZzNLcmlPUnFjc25sWlI5dUtnK2RzK2c3NUF4dWV0cFgvZGZyCmVZdGVJQWJUZGd0c0FwV2psdVRMZGxIUktKMmhHdnhFb2szTWVuYW9EVDIvRjA4aWlGRDlycmJza0ZCS1c1K1ZRYXJLRDdKSy9vQ1oKVHFOR0ZhdjRjMEpxd21aMnNRb21GZDJUa3V6YnFWOVVJbEtSY0YwVDZranNiZ05zMmQxcy9Pc05BLyttZ3hLYjhhbVREOFVtVERHeQpZNWxoY3VjcVpKblN1T2wxNG55cHFab2Fxc05XMnhDYVBJTlN0bnVXdDZ5SGQ2aTU4bWNMbEVPenJ6NXora0kyc1NYRkNqRW1OMVpuCnVxTUxmZGIzaWMxbm9iYzZIbVpQOXFCVkZDVk1MRE1OcGtHTXZRUXhhaEJ5Q3AwT0xuYTlYdk5SaVl1b1AxVnp2OXM2eGlRRmxwSkkKcWt1TktnUGxWNUVROUdvb0ZXNUhkNFJjVVhTZkdlbm1IbU1XT2VNUkZlTllHa1M5eThSc1p0ZUVCdDh3OURlaVF5SjUwaEJzMzd2bQpFeEg4bllRS0UzdndPOUQ4b3dyWGllcVdmbzFJaFI1a1g5dFVvcXpWZWdKNWE5S0s4R2ZhWlhJTkZIRGs2WTU0anpKMGZGZnkxdGIwCk5va2IrQ2xzaTduMmw5R2tMcXErQ3huQ1JlbHdYUUlEQUozWm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIKL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNTg3R1Qvd1daNWI2U3FNSHdRU255MnJlMmtjd0h3WURWUjBqQkJnd0ZvQVU1ODdHVC93VwpaNWI2U3FNSHdRU255MnJlMmtjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFKdVltbDIrOHlnamRzWnM5My9tUUo3QU50eVZEUjJ0CkZjVTIyTlU1Ny9JZUlsNnpnclJkdTB3YXlwSU4zMGNrSHJNazJwR0k2WU53M1pQWDZicXozeFphUHQ3Z3lQdlQvV3dwK0JWR29HZ20KekpOU3JvSUJrNURLZDhwTlNlL2lXdGtxdlRET1RMS0J0akRPV1UvYVdSMXFlcVJGc0lJbWdZWjI5ZlVRQUxqdXN3bm9UNGNDQjY0awpYUEJmckFvd3pJcEFvSE1Fd2Z1SkpQYWFIRnkzUEFwbk5nVUlNYk92MkFGb0t1QjRqM1RldUZHa2pHd2dQYUw3czlRSi9YdkNnS3FUCmJDbVlJYWk3RnZPcEVsOTB0WWVZOHBVbTN6VHZpbE9SaUYwYWxLTS9mQ0w0MTRpNnBveVdxRDFTTkdLZkFCNVVWVUpueGsxR2o3c1UKUlQwS2xoYU9FS0dYbWRYVE1JWE0zclJ5dDd5S1BCZ3BhUDNjY1FmdUpEbHErdTJsckRnditSNFFEZ1p4R2hCTS9uVisveDVYT1VMSwoxK0VWb1ZaVldSdlJvNjhSMkU3RHBTdnZrTC9BN0lJVFc0M1djaXlUVG85cUtkK0ZQTk1ONEtJWUVzeFZMMGUzcDVzQy9rSDJpRXh0CjJxa0JSNE5rSjJJUWd0WVNlMTRESHpTcHlaSCtyMTF0aGllM0k2cDFHTW9nNTdBUDE0a09wbWNpWS9TRFFTc0dTN3RZMWRIWHQ3a1EKWTlpSlNyU3EzUlpqOVc2K1lLSDQ3ZWpXa0U4YXhzV2dLZE9uSWFqMVdqejN4MG1pSVpwS2xWSWdsbkthWnN2MzBvWkRmQ0srbHZtOQpBYWhIM2VVN1FQbDFLNXNyUm1TR2pSNzBqL3NIZDlEcVNhSWNqVklVcGdxVAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpjZXJ0U0lHTiBST09UIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WUQKVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQWVGdzB3TmpBM01EUXhOekl3TURSYQpGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFCkN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0kKSlVxT3RkdTBLQnVxVjVEbzBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISApyZkFRVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZFJkWTR6VFcyCnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRT0E3K2oweGJtMGJxUWZXd0NIVEQKMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3ZKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0MwpBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4Q0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCCkFmOEVCQU1DQWNZd0hRWURWUjBPQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUIKQVFBKzBoeUpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZTW5ROApTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1o0NGd4K0ZrYWdRbklsNlowCngyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SUpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHQKdkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053aS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOegpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE45dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNOTklDIFJPT1QKPT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZUQ0NBajJnQXdJQkFnSUVTVE1BQVRBTkJna3Foa2lHOXcwQkFRVUZBREF5TVFzd0NRWURWUVFHRXdKRFRqRU9NQXdHQTFVRQpDaE1GUTA1T1NVTXhFekFSQmdOVkJBTVRDa05PVGtsRElGSlBUMVF3SGhjTk1EY3dOREUyTURjd09URTBXaGNOTWpjd05ERTJNRGN3Ck9URTBXakF5TVFzd0NRWURWUVFHRXdKRFRqRU9NQXdHQTFVRUNoTUZRMDVPU1VNeEV6QVJCZ05WQkFNVENrTk9Ua2xESUZKUFQxUXcKZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFROZmMvYzNldDZGdHpGOExSYisxVnZHN3E2S1I1c216RApvKy9objdFN1NJWDFtbHdoSWhBc3hZTE8ydU9hYmpmaGh5emN1UXhhdW9oVjMvMnEyeDh4NmdIeDN6a0J3UlA5U0ZJaHhGWGYydGl6ClZIYTZkTEczZmRmQTZQWlp4VTNJdmEwZkZOcmZXRVFsTWhrcXgzNStqcTQ0c0RCN1IzSUpNZkF3MjhNYmRpbTdhWFpPVi9rYlpLS1QKVnJkdm1XN2JDZ1NjRWVPQUg4dGpsQkFLcWVGa2dqSDVqQ2Z0cHBrQTluQ1RHUGloTklhajNYckNHSG4yZW1VMXo1RHJ2VE9UbjFPcgpjenZtbXpRZ0x4M3ZxUjFqR3FDQTJ3TXYrU1lhaHRLTnU2bStVanFIWjBnTnY3U2cyQ2ErSTE5ek4zOG01cElFbzMvUElLZTM4enJLCnk1bkxBZ01CQUFHamN6QnhNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFmQmdOVkhTTUVHREFXZ0JSbDhqR3RLdmYzM1ZLV0NzY0MKd1E3dnB0VTdFVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQXNHQTFVZER3UUVBd0lCL2pBZEJnTlZIUTRFRmdRVVpmSXhyU3IzOTkxUwpsZ3JIQXNFTzc2YlZPeEV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUVzMTdzemtyci9EYnEyZmxUdExQMXNlMzFjcG9sbktPT0s1Ckd2K2U1bTR5M1I2dTZqVzM5Wk9SVHRwQzRjTVhZRkR5MFZ3bXVZSzM2bTNrbklUbkEza1hyNWc5bE52SHVnRG51TDhCVjhGM1JUSU0KTy9HMEhBaXcvVkdnb2QyYUhSTTJtbTIzeHp5NTRjWFpGL3FEMVQwVm9EeTdIZ3ZpeUpBL3FJWU0vUG1MWG9YTFQxdExZaEZIeFVWOApCUzlCc1o0UWFSdVpsdUJWZWZ0T2hwbTRsTnFHT0dxVG8rZkxidVhmNmlGVmlaeDlmWCtZOVFDSjd1T0V3RnlXdGNWRzZrYmdoVlcyCkc4a1Mxc0hOellEekFnRTh5R25MUlVoajJKVFE3SVVPTzA0UlpmU0NqS1k5cmk0aWxBbklYT284Z1YwV0tnT1hGbFVKMjRwQmdwNW0KbXhFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBcHBsaWNhdGlvbkNBIC0gSmFwYW5lc2UgR292ZXJubWVudAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9EQ0NBb2lnQXdJQkFnSUJNVEFOQmdrcWhraUc5dzBCQVFVRkFEQkRNUXN3Q1FZRFZRUUdFd0pLVURFY01Cb0dBMVVFQ2hNVApTbUZ3WVc1bGMyVWdSMjkyWlhKdWJXVnVkREVXTUJRR0ExVUVDeE1OUVhCd2JHbGpZWFJwYjI1RFFUQWVGdzB3TnpFeU1USXhOVEF3Ck1EQmFGdzB4TnpFeU1USXhOVEF3TURCYU1FTXhDekFKQmdOVkJBWVRBa3BRTVJ3d0dnWURWUVFLRXhOS1lYQmhibVZ6WlNCSGIzWmwKY201dFpXNTBNUll3RkFZRFZRUUxFdzFCY0hCc2FXTmhkR2x2YmtOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQXAyM2dkRTZIajZVRzNtaWkyNGFaUzJRTmNmQUtCWnVPcXVITUx0SnFPOEY2dEpkaGpZcSt4cHFjQnJTR1VlUTNEblI0CmZsK0tmNVNrMTBjSS9WQmFWdVJvckNoem9IdnBmeGlTUUU4dG5mV3VSRWh6TmdhZVpDdzdOQ1BiWENia2NYbVAxRzU1SXJtVHdjck4Kd1ZidGlHclhvRGtoQkZjc292VzhSMEZQWGpRaWxiVWZLVzFlU3ZOTmNyNUJWaUNIL09sUVI5Y3dGTzVjakZXNldZMkgvQ1BlazlBRQpqUDN2YmIzUWVzbWxPbXB5TThaS0RRVVhLaTE3c2FmWTF2Qys5RC9xRGlodFFXRWpkbmpEdUdXazgxcXV6TUtxMmVkWTNyWituWVZ1Cm55b0tiNThES1RDWEtCMjh0ODlVS1U1Uk1ma250aWdtL3FKajVrRVc4RE9ZUndJREFRQUJvNEdlTUlHYk1CMEdBMVVkRGdRV0JCUlUKV3NzbVAzSE1sRVlObGxQcWEwalFrLzVDZFRBT0JnTlZIUThCQWY4RUJBTUNBUVl3V1FZRFZSMFJCRkl3VUtST01Fd3hDekFKQmdOVgpCQVlUQWtwUU1SZ3dGZ1lEVlFRS0RBL21sNlhtbkt6bG03M21sTC9sdXB3eEl6QWhCZ05WQkFzTUd1T0NvdU9EbCtPRHF1T0NzZU9ECnZPT0N0K09EcCtPRHMwTkJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRGxxUkhaM09EcnMKbzJkR0QvbUxCcWo3YXBBeHpuN3MydEdKZkhyckxneTltVExuc0NUV3cvLzFzb2dKaHl6alZPR2pwcklJQzhDRnFNalNuSEgySFo5ZwovRGd6RStHZTNBdGYyaFpRS1hzdmNKRVBtYm8wTkkyVmRNVitlS2xtWGIzS0lYZENFS3htSmozZWthdjlGZkJ2N1d4ZkVQanpGdllECmlvK25FaEVNeS8wL2VjR2MvV0x1bzg5VURORXJYeGMrNHo2L3dDcytDWnYraUtaK3RKSVgvQ09VZ2IxdXA4V013dXNSUmR2NFFjbVcKZHVwd1gza1NhK1NqQjFvRjd5ZEp6eUdmaWt3SmNHYXBKc0VyRVU0ejBnNzgxbXpTRGpKa2FQK3RCWGhmQXgybzQ1Q3NKT0FQUUtkTApyb3NvdDRMS0dBZm10MXQwNlNBWmY3SWJpVlE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQvakNDQXVhZ0F3SUJBZ0lRRmF4dWxCbXllVXRCOWllcHd4Z1BIekFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUUKQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNElFZGxiMVJ5ZFhOMApJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFMk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5CmVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3pNQjRYRFRBNE1EUXdNakF3TURBd01Gb1hEVE0zTVRJd01USXoKTlRrMU9Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBbwpZeWtnTWpBd09DQkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMEJnTlZCQU1UCkxVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16Q0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOemlYbUpZSFROWE9USXordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1agpLL0JHdkVTeWlhSEFLQXhKY0NHVm4yVEFwcE1TQW1VbWhzYWxpZkQ2MTRTZ2NLOVBHcGMvQmtUVnlldHlFSDNrTVNqN0hHSG1LQWRFCmM1SWlhYWNEaUd5ZFk4aFMycGduNXdoTWNENjB5UkxCeFdlRFhUUHpBeEhzYXRCVDR0RzZObUNVZ0x0aFkyeGJGMzdmUUpRZXF3M0MKSVNod2lQL1dKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMRG1LdQpkbFcvWDNlK1Bra0JVejJZSlFOMkpGb2R0TnVKNm5ubHRyTTdQN3BNS0VGL0JxeHFqc0hROWdVZGZlWkNodU9sMVVjQ0F3RUFBYU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNUjV5bzZoVGdNZEhOeHIKMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBdHhSUFBWb0I3ZW5pOW42NHNtZWZ2MnQrVVhnbHBwK2R1YUl5OQpjcjVIcVE2WEVyaEs4V1RUT2Q4bE5OVEJ6VTZCOEE4RXhDU3pOSmJHcHFvdzMyaGhjOWY1am9XSjd3NWVsU2hLS2llUEVJNHVmSWJFCkFwN2FESGRsRGtRTmt2MzlzeFkyK2hFTkhZd09CNGxxS1ZiM2N2VGRGWngzTldaWHF4TlQySTdCUU1YWEV4WmFjc2UzYVFIRWVyR0QKQVdoOWpVR2hsQmpCSlZ6ODhQNkRBb2Q4RFEzUExnaGNTa0FOUHV5QlllWWsyOHJnRGkwSHNqNVczSTMxUVlVSFNKc01DOHRKUDMzcwp0LzNMaldlSkdxdnR1eDZqQUFnSUZ5cUNYREZkUm9vdEQ0YWJkTmxGKzlSQXNYcXFhQzJHc3BraTRjRXJ4NXo0ODErb2doTHJHUkV0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpRENDQWcyZ0F3SUJBZ0lRTmZ3bVhObUVUOGs5SmoxWG02N1hWakFLQmdncWhrak9QUVFEQXpDQmhERUxNQWtHQTFVRUJoTUMKVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakU0TURZR0ExVUVDeE12S0dNcElESXdNRGNnZEdoaGQzUmxMQ0JKYm1NdQpJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnClEwRWdMU0JITWpBZUZ3MHdOekV4TURVd01EQXdNREJhRncwek9EQXhNVGd5TXpVNU5UbGFNSUdFTVFzd0NRWURWUVFHRXdKVlV6RVYKTUJNR0ExVUVDaE1NZEdoaGQzUmxMQ0JKYm1NdU1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd055QjBhR0YzZEdVc0lFbHVZeTRnTFNCRwpiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0CklFY3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRW90V2NnbnVWbmZGU2VJZitpaGEvQmViZm93SlBEUWZHQUZHNkRBSlMKTFNLa1FqbkUvby9xeWNHKzFFMy9uM3FlNHJGOG1xMm5oZ2x6aDlIbm11TjZwYXB1KzdxemNNQm5pS0kxMUtPYXNmMnR3dTh4K3FpNQo4L3NJeHBIUit5bVZvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVCm10Z0FNQURuYTMrRkdPNkx0czZLRFBnUjRic3dDZ1lJS29aSXpqMEVBd01EYVFBd1pnSXhBTjM0NEZkSFc2Zm1Dc085OVlDS2x6VU4KRzRrOFZJWjNLTXFoOUhuZXRlWTRzUEJsY0l4L0FsVEN2Ly9Zb1Q3Wnp3SXhBTVNObFB6Y1U5TGNuWGdXSHhVekkxTlM0MW94WFozSwpycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSVFZQUdYdDBhbjZyUzBtdFpMTC9lUSt6QU5CZ2txaGtpRzl3MEJBUXNGQURDQnJqRUxNQWtHQTFVRQpCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyCmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXdNRGdnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHYKY21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNekFlRncwdwpPREEwTURJd01EQXdNREJhRncwek56RXlNREV5TXpVNU5UbGFNSUd1TVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoCmQzUmxMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1SUZObGNuWnBZMlZ6SUVScGRtbHphVzl1TVRnd05nWUQKVlFRTEV5OG9ZeWtnTWpBd09DQjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJRwpBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0SUVjek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXNyOG5MUHZiMkZ2ZGVIc2JubmRtZ2NzK3ZIeXU4NllubWpTamFERnhPRE5pNVBOeFpubXhxV1dqcFl2VmoyQXQKUDBMTXFtc3l3Q1BMTEVIZDVOLzhZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQworQnNVYTBMZmIxKzZhNEtpblZ2blNyMGVBWExiUzNUb08zOS9mUjhFdENhYjRMUmFyRWM5VmJqWHNDWlNLQUV4UUdiWTJTUzk5aXJZCjdDRkpYSnYyZXVsL1ZUVitsbXVOazVNbnk1Szc2cXhBd0ovQytJRFBYZlJhM001MGhxWStiQXRUeXIyU3poa0djdVlNWERocHh3VFcKdkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrT1FJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXJXeXFsR0NjN2VULytqNEtkQ3RqQS9lMldiOHdEUVlKCktvWklodmNOQVFFTEJRQURnZ0VCQUJwQTJKVmxyQW1TaWNZNTlCRGxxUTVtVTExNDN2b2trYnZuUkZIZnhoWTBDdTlxUkZIcUt3ZUsKQTNyRDZ6OEtMRklXb0N0RHVTV1FQM0NwTXlWdFJSb29PeWZQcXNNcFFodmZPMHpBTXpSYlFZaS9heXRscnlqdnN2WERxbWJPZTFidQp0OGpMWjhISm5Cb1l1TVREU1FQeFlBNVF6VWJGODNkNTk3WVY0RGpieHk4b29Bdy9keVowMlNVUzJqSGFHaDdjS1VHUklqeHBwN3NDCjhyWmNKd09KOUFicW0rUnlndU9oQ2NIcEFCblRQdFJ3YTdweHBxcFlydlM3Nld5Mjc0Zk1tN3YvT2VaV1lkTUtwOFJjVEdCN0JYY20KZXIvWUIxSXNZdmR3WTlrNXZHOGN3bm5jZGltdnpzVXNaQVJlaURadU1kUkFHbUkwTmo4MUFhNnNZNkE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNyakNDQWpXZ0F3SUJBZ0lRUExMMFNBb0E0djdySkR0ZVlEN0RhekFLQmdncWhrak9QUVFEQXpDQm1ERUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUTUNoaktTQXlNREEzSUVkbGIxUnlkWE4wSUVsdQpZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEUyTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazEKT1Zvd2daZ3hDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZwpNakF3TnlCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwQmdOVkJBTVRMVWRsCmIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITWpCMk1CQUdCeXFHU000OUFnRUcKQlN1QkJBQWlBMklBQkJXeDZQMERGVVBsck91SE54Rmk3OUtETmxKOVJWY0xTbzE3VkRzNmJsOFZBc0JRcHM4bEwzM0tTTGpIVUdNYwpLaUVJZkpvMjJBdiswU2JGV0RFd0tDWHpYVjJqdUxhbHRKTHRiQ3lmNjkxRGlhSThTMGlSSFZEc0p0L1dZQzY5SWFOQ01FQXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQlZmTlZkUlZmc2xzcTBEYWZ3Qm8vcSsKRVZYVk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01HU1dXYWJvQ2Q2THV2cGFpSWp3SDVIVFJxanlTa3dDWS90c1h6amJMa0dUcVE3bQpuZHd4SExLZ3B4Z2NlZUhITmdJd09sYXZtblJzOXZ1RDREUFRDRitobk1KYm4wYld0c3VSQm1PaUJ1Y3pyRDZvZ1JMUXk3clFrZ3UyCm5wYXFCQStLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdVRDQ0E2R2dBd0lCQWdJUVFCckVaQ0d6RXlFRERydmtFaHJGSFRBTkJna3Foa2lHOXcwQkFRc0ZBRENCdlRFTE1Ba0dBMVVFCkJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk8KWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdPQ0JXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1WawpJSFZ6WlNCdmJteDVNVGd3TmdZRFZRUURFeTlXWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3T0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHOU1Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdgpjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4T0RBMkJnTlZCQU1UTDFabGNtbFRhV2R1SUZWdWFYWmxjbk5oYkNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXgyRTNYckVCTk50aTF4V2IvMWhhakNNagoxbUNPa2RlUW1JTjY1bGdaT0l6Rjl1VmtoYlNpY2Z2dHZibmF6VTBBdE1ndGM2WEhhWEdWSHprOHNrUUhuT2dPK2sxS3hDSGZLV0dQCk1pSmhnc1dISDI2TWZGOFdJRkZFMFhCUFYrcmpIT1BNZWU1WTJBN0NzMFdUd0N6bm1oY3Jld0EzZWtFemVPRXo0dk1RR24rSExMNzIKOWZkQzR1Vy9oMktKWHdCTDM4WGQ1SFZFTWtFNkhuRnVhY3NMZFVZSTBjclNLNVhRei91NVFHdGtqRmROL0JNUmVZVHRYbFQyTko4SQpBZk1RSlFZWFN0cnhIWHBtYTVoZ1pxVFo3OUl1Z3ZIdzd3bnFSTWtWYXVJRGJqUFRySjlWQU1mMkNHcVV1Vi9jNERQeGhHRDVXeWNSCnRQd1c4cnRXYW9BbGpRSURBUUFCbzRHeU1JR3ZNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01HMEcKQ0NzR0FRVUZCd0VNQkdFd1g2RmRvRnN3V1RCWE1GVVdDV2x0WVdkbEwyZHBaakFoTUI4d0J3WUZLdzREQWhvRUZJL2wweHFHckkyTwphOFBQZ0dyVVNCZ3NleGt1TUNVV0kyaDBkSEE2THk5c2IyZHZMblpsY21semFXZHVMbU52YlM5MmMyeHZaMjh1WjJsbU1CMEdBMVVkCkRnUVdCQlMyZC9wcFNFZWZVeExWd3VvSE1uWUgwWmNIR1RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVN2ajRzQVBtTEdkNzVKUjMKWTh4dVRQbDlEZzNjeUxrMXVYQlBZL29rK215RGpFZWRPMlB6bXZsMk1wV1JzWGU4ckpxK3NlUXhJY2FCbFZaYURySEMxTEdtV2F6eApZOHU0VEIxWmtFcnZrQllvSDFxdUVQdUJVRGdNYk16eFBjUDFZK096NHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4ClAvamdkRmNyR0oyQnRNUW8ycFNYcFhEcnJCMitCeEh3MWR2ZDVZencxVEt3ZytaWDRvKy92cUdxdnowZHRkUTQ2dGV3WERwUGFqK1AKd0dac1k2cnAyYVFXOUlIUmxSUU9mYzJWTk5uU2ozQnpnWHVjZnIyWVlkaEZoNWlReGV1R01NWTF2L0QvdzFXSWcwdnZCWklHY2ZLNAptSk8zN00yQ1lmRTQ1aytYbUNwYWpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGhEQ0NBd3FnQXdJQkFnSVFMNEQrSTR3T0lnOUlaeElva1llc3N6QUtCZ2dxaGtqT1BRUURBekNCeWpFTE1Ba0dBMVVFQmhNQwpWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzCmIzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnoKWlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSelF3SGhjTk1EY3hNVEExTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlUKY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSbwpiM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1CklFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFTblZucDgKVXRwa213NHRYTmhlckpJOS9nSG1HVW85RkFOTCttQW5JTm1EaVduNlZNYWFHRjVWS21UZUJ2YU5TanV0RUR4bFBaQ0lCSW5nTUdHegpybDBCcDN2ZWZMSyt5bVZoQUlhdTJvOTcwSW10VFIxWm1rR3h2RWVBM0o1aXcvbWpnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSmFXMWhaMlV2WjJsbU1DRXcKSHpBSEJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnlhWE5wWjI0dQpZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZMTVdrZjN1cG03a3RTNUpqNGQ0Z1lEczViRzFNQW9HQ0NxR1NNNDlCQU1ECkEyZ0FNR1VDTUdZaERCZ21ZRm80ZTFaQzRLZjhOb1JSa1NBc2RrMURQY1FkaENQUXJOWjhOUWJPeldtOWtBM2JiRWhDSFE2cVFnSXgKQUp3OVNEa2pPVmdhRlJKWmFwN3YxVm15SFZJc21YSE54eW5mR3lwaGUzSFIzdlBBNVEwNlNxb3RwOWlHS3QwdUVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsOF4oCYdGFuw4PCunPDg8KtdHbDg8KhbnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEcKQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFM01EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMApkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCCmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1JkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3gKTWpBMk1UVXdPREl4V2pDQnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4TwpaWFJNYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbWFXTmhkR2x2CmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56SUVkdmJHUXBJRWJGa1hSaGJzTzYKYzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdQowakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVGxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3Ci9IcFl6WTZiN2NOR2JJUndYZHJ6QVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWsKSDNCNXI5czVWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHSUxkdwpmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDJCSnRyK1VCZEFEVEhMcGwxCm5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3VwpxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmhidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhCll0T1VaY1RoNW0yQytDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRnVMamJ2clc1S2ZuYQpOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1CmRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnlqQ0NBN0tnQXdJQkFnSUVBSmlXakRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKT1RERWVNQndHQTFVRQpDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnClVtOXZkQ0JEUVNBdElFY3lNQjRYRFRBNE1ETXlOakV4TVRneE4xb1hEVEl3TURNeU5URXhNRE14TUZvd1dqRUxNQWtHQTFVRUJoTUMKVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbGNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bApaR1Z5YkdGdVpHVnVJRkp2YjNRZ1EwRWdMU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTVZaCjUyOTFxajVMbkxXNHJKNEw1UG5aeXF0ZGo3VTVFSUxYcjFIZ08rRUFTR3JQMnVFR1F4R1pxaFFsRXEwaTZBQnRROFNwdU9VZmlVdG4KdldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFVaNXVXNk03WHhncFQwR3RKbHZPagpDd1YzU1BjbDVYQ3NNQlFnSmVOL2RWcmxTUGhPZXdNSEJQcUNZWWR1OER2RXBNZlE5WFErcFYwYUNQS2JKZEwyckFRbVBsVTZZaWlsCmU3SXdyL2czd3RHNjFqajk5TzlKTURlWkppRkloUUdwNVJibjNKQlYzdy9vT00yWk55RlBYZlVpYjJyRkVoWmdGMVh5WldhbXB6Q1IKT01FNEhZWUVoTG9hSlhoZW5hL01VR0RXRTRkUzdXTWZiV1Y5d2hVWWRNcmhmbVFwakhMWUZoTjlDMGxLOFNnYklIUnJ4VDNkc0twSQpDVDB1Z3BUTkdtWFpLNGlhbWJ3WWZwL3VmV1o4UHIyVXVJSE96Wmd3ZU1Gdlo5QytYK0JvN2Q3aXNja3NXWGlTcXQ4cllHUHk1VjY1CjQ4cjZmMUNHUHFJMEdBd0phQ2dSSE9UaHVWdytSN295UHhqTVc0VDE4MnQweEhKMDRlT0xvRXE5aldZdjZxMDEyaURUaUlKaDhCSWkKdHJ6UTFhVHNyMVNJSlNROHAyMnhjaWsvUGxlbWYxV3ZiaWJHL3VmTVFGeFJSSUVLZU41S3psVy9IZFhadDFidjhIYi9DM20xcjczNwpxV21SUnBkb2dCUTJIYk4vdXltWU5xVWcrb0pnWWpPazdOYTZCNmR1eGM4VXB1ZldralRZZ2ZYOEhWMnFYQjcybzAwN3VQYzVBZ01CCkFBR2pnWmN3Z1pRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCU0JnTlZIU0FFU3pCSk1FY0dCRlVkSUFBd1B6QTlCZ2dyQmdFRkJRY0MKQVJZeGFIUjBjRG92TDNkM2R5NXdhMmx2ZG1WeWFHVnBaQzV1YkM5d2IyeHBZMmxsY3k5eWIyOTBMWEJ2YkdsamVTMUhNakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkpGb01vY1ZIWW5pdGZHc05pZzBqUXQ4WW9qck1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUNBUUNvUVVwbktwS0JnbEJ1NGRmWXN6azc4d0lWQ1ZCUjd5MjlKSHVJaGp2NXRMeVNDWmE1OXNDckkyQUdlWXdSVGxIU2VZQXoKKzUxSXZ1eEJRNEVmZmtkQUhPVjZDTXFxaTNXdEZNVEM2R1k4Z2dlbjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3agpmL1NUN1p3YVViN2RSVUcva1NTMEg0enBYODk3SVptZmxaODVPa1ljYlBuTmU1eVF6U2lweDZsVnU2eGlOR0kxRTBzVU9sV0R1WWFOCmtxYkc5QWNsVk13V1Z4SktnbmpJRk5rWGdpWXRYU0FmZWE3KzFIQVdGcFdEMkRVNS8xSmRkUndXeFJOVnowZk1kV1ZTU3Q3d3NLZmsKQ3BZTCs2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEx2Snh4Y3lwRgpVUm1Gekk3OVI2ZDBsUjJvMGE5T0Y3RnBKc0txZUZkYnhVMm41WjRGRjVUS3NsK2dTUmlOTk9rbWJFZ2VxbWlTQmVHQ2MxcWIzQWRiCkNHMTluZGVOSWRuOEZDQ3F3a1hmUCtjQXNsSGt3dmdGdVhrYWpEVHpubHZrTjF0clN0OHNWNHBBV2phNjNYVkVDRGRDY0F6KzNGNGgKb0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkNZN0JYTjBVdGU0cWN2d1hxWlZVejl6a1F4U2dxSVhvYmlzUWsrVDhWeUpvVgpJUFZWWXBidGJaTlF2T1NxZUszWnl3cGxoNlptd2NTQm8zYzZXQjRMN29PTG5SN1NVcVRNSFcrd21HMlVNYlg0Y1FyY3VmeDlNbURtCjY2K0tBUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNBIERpc2lnCj09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRR0V3SlRTekVUTUJFR0ExVUVCeE1LClFuSmhkR2x6YkdGMllURVRNQkVHQTFVRUNoTUtSR2x6YVdjZ1lTNXpMakVSTUE4R0ExVUVBeE1JUTBFZ1JHbHphV2N3SGhjTk1EWXcKTXpJeU1ERXpPVE0wV2hjTk1UWXdNekl5TURFek9UTTBXakJLTVFzd0NRWURWUVFHRXdKVFN6RVRNQkVHQTFVRUJ4TUtRbkpoZEdsegpiR0YyWVRFVE1CRUdBMVVFQ2hNS1JHbHphV2NnWVM1ekxqRVJNQThHQTFVRUF4TUlRMEVnUkdsemFXY3dnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1M5akhCZllqOW1RR3AySHZ5Y1hYeE1jYnpkV2I2VVNoR2hKZDROTHhzL0x4RldZZ20KR0VyRU54K2hTa1M5NDNFRTlVUVg0ai84U0ZodlhKNTZDYnBSTnlJalprTWhzRHhrb3ZocUZRNC82MUhoVktuZEJwblhtanhVaXprRApQdy9GenNicmczSUNxQjl4OHkzNGRRamJZa3pvK3M3NTUyb2Z0bXMxZ3JyaWp4YVNmUVVNYkVZRFhjRHRhYjg2d1lxZzZJN1p1VVVvCmh3anN0TW9Wdm9MZHRVU0xMYTJHREdoaWJZVlc4cXdVWXpyRzBabXNOSGhXUzgrMnJUK01pdGNFNWVONFRQV0dxdldQK2oxc2NhTXQKeW1mcmFIdHVNNmtNZ2lpb1RHb2hRQlVnRENaYmc4S3BGaFhBSklKZEt4YXR5bVAyZEFDdzMwUEVFR0JXWjJORkFnTUJBQUdqZ2Y4dwpnZnd3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVamJKSmFKMXlDQ1c1d0NmMVVKTldTRVp4K1k4d0RnWURWUjBQCkFRSC9CQVFEQWdFR01EWUdBMVVkRVFRdk1DMkJFMk5oYjNCbGNtRjBiM0pBWkdsemFXY3VjMnVHRm1oMGRIQTZMeTkzZDNjdVpHbHoKYVdjdWMyc3ZZMkV3WmdZRFZSMGZCRjh3WFRBdG9DdWdLWVluYUhSMGNEb3ZMM2QzZHk1a2FYTnBaeTV6YXk5allTOWpjbXd2WTJGZgpaR2x6YVdjdVkzSnNNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkyRXVaR2x6YVdjdWMyc3ZZMkV2WTNKc0wyTmhYMlJwYzJsbkxtTnliREFhCkJnTlZIU0FFRXpBUk1BOEdEU3VCSHBHVDVnb0FBQUFCQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGMDBkR0ZNcnp2WS81OXQKV0RZY1BRdUJEUklyUmhDQS9lYzhKOUI2eUttMmZuUXdNNk02aW50MHdIbDVRcE50LzdFcEZJS3JJWXd2Ri9rL0ppLzFXY2J2Z0FhMwpta2twN001K2NUeHFFRUhBOXRPYXNueGFrWnpBckZ2SVRWNzM0VlAvUTNmOG5rdG5iTmZ6ZzlHZzRIOGwzN2lZQzVveU9Hd3dvUFAvCkNCVXo5MUJLZXo2alBpQ3AzQzlXZ0FydFFWQ3d5ZlRzc3VNbVJBQU9iNTRHdkNLV1UzQmx4RkFLUm11a0x5ZUJFaWNUWHhDaGRzNksKZXpmcXd6bGhBNVdZT3Vkc2lDVUkvSGxvRFlkOVl2aTBYL3ZGMkV5OVdMdy9RMXZVSGdGTlBHTytJKytNelZwUXVHaFUrUXFaTXhFQQo0WjdDUm5lQzlWa0dqQ0ZNaHduTjVhZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSnV1ci1TSwo9PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFNWpDQ0E4NmdBd0lCQWdJRU80NUwvREFOQmdrcWhraUc5dzBCQVFVRkFEQmRNUmd3RmdZSktvWklodmNOQVFrQkZnbHdhMmxBCmMyc3VaV1V4Q3pBSkJnTlZCQVlUQWtWRk1TSXdJQVlEVlFRS0V4bEJVeUJUWlhKMGFXWnBkSE5sWlhKcGJXbHphMlZ6YTNWek1SQXcKRGdZRFZRUURFd2RLZFhWeUxWTkxNQjRYRFRBeE1EZ3pNREUwTWpNd01Wb1hEVEUyTURneU5qRTBNak13TVZvd1hURVlNQllHQ1NxRwpTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNUXN3Q1FZRFZRUUdFd0pGUlRFaU1DQUdBMVVFQ2hNWlFWTWdVMlZ5ZEdsbWFYUnpaV1Z5CmFXMXBjMnRsYzJ0MWN6RVFNQTRHQTFVRUF4TUhTblYxY2kxVFN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFJRnhOajR6Qjliak1JMFRmbmN5UnN2UEdiSmdNVWFYaHZTWVJxVENaVVhQMDBCODQxb2lxQkI0TTh5SXNkT0JTdlppRjN0ZgpUUW91ME0rTEkrNVBBazY3Nnc3S3ZSaGo2SUFjamVFY2pUM2cvMXRmNm1UbGwrZy9tWDhNQ2drekFCcFRweUhoT0V2V2d4dXRyMlRDCitSeDZqR1pJVFdZZkdBcmlQcnNmQjJXVGhia2FzTG5FK3cwUjl2WFcrUnZITEN1M0dGSCs0SHYycUVpdmJEdFBMKy80MFVjZUpsZncKVVIwemx2L3ZXVDNhVGRFVk5NZnFQeFpJZTVFY2dFTVBQYmdGUHRHemxjM1l5Zy9DUTJmYnQ1UGdJb0l1dnZWb0tJTzV3VHRwZXlEYQpUcHh0NGJyTmozcHNzQWtpMTRzTDJ4elZXaVpiRGNEcTVXRFFuLzQxM3o4Q0F3RUFBYU9DQWF3d2dnR29NQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3Z2dFV0JnTlZIU0FFZ2dFTk1JSUJDVENDQVFVR0Npc0dBUVFCemg4QkFRRXdnZll3Z2RBR0NDc0dBUVVGQndJQ01JSEQKSG9IQUFGTUFaUUJsQUNBQWN3QmxBSElBZEFCcEFHWUFhUUJyQUdFQVlRQjBBQ0FBYndCdUFDQUFkZ0RrQUd3QWFnQmhBSE1BZEFCaApBSFFBZFFCa0FDQUFRUUJUQUMwQWFRQnpBQ0FBVXdCbEFISUFkQUJwQUdZQWFRQjBBSE1BWlFCbEFISUFhUUJ0QUdrQWN3QnJBR1VBCmN3QnJBSFVBY3dBZ0FHRUFiQUJoQUcwQUxRQlRBRXNBSUFCekFHVUFjZ0IwQUdrQVpnQnBBR3NBWVFCaEFIUUFhUUJrQUdVQUlBQnIKQUdrQWJnQnVBR2tBZEFCaEFHMEFhUUJ6QUdVQWF3QnpNQ0VHQ0NzR0FRVUZCd0lCRmhWb2RIUndPaTh2ZDNkM0xuTnJMbVZsTDJOdwpjeTh3S3dZRFZSMGZCQ1F3SWpBZ29CNmdISVlhYUhSMGNEb3ZMM2QzZHk1emF5NWxaUzlxZFhWeUwyTnliQzh3SFFZRFZSME9CQllFCkZBU3Fla2VqNUltdkdzOEtRS2NZUDIvdjZYMitNQjhHQTFVZEl3UVlNQmFBRkFTcWVrZWo1SW12R3M4S1FLY1lQMi92NlgyK01BNEcKQTFVZER3RUIvd1FFQXdJQjVqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFlOEVZbEZPaUNmUCtKbWVhVU9UREJTOHJOWGlSVEh5bwpFUkY1VEVsWnJNajNoV1ZjUnJzN0VLQUNyODFQdGN3Mkt1eGQvdStna2NtMmsyOThnRlRzeHdod0RZNzdndXdxWUhocE5qYlJ4WnlMCmFiVkF5SlJsZC9KWElXWTd6b1ZBdGpOakdyOTVIdnhjSGRNZGt4dUxERjJGdlprd01oZ0prVkxwZktHNi8yU1NtdXorTmU2TUw2NzgKSUlic1N0NGJlREkzcG9IU25hOWFFaGJLbVZ2OGIyME94YUFlaHNtUjBGeVlnbDlqRElwYXE5aVZwc3pMaXRhL1pFdU95b3F5c09raApNcDZxcUlXWU5JRTVJVHVvT2xJeVBmWnJONFlHV2hXWTNQQVJadjQwSUxjRDlFRVFmVG1FZVpaeVk3YVdBdVZydWEwWlRidkdSTnMyCnl5cWNqZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhvbmdrb25nIFBvc3QgUm9vdCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlETURDQ0FoaWdBd0lCQWdJQ0ErZ3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9UCkRVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHJiMjVuSUZCdmMzUWdVbTl2ZENCRFFTQXhNQjRYRFRBek1EVXgKTlRBMU1UTXhORm9YRFRJek1EVXhOVEEwTlRJeU9Wb3dSekVMTUFrR0ExVUVCaE1DU0VzeEZqQVVCZ05WQkFvVERVaHZibWRyYjI1bgpJRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBclA4NHR1bG1Ba25qb3JUaGtQbEFqM241NHIxNS9nSzk3aVNTSFNMMjJvVnlhZjdYUHduVTNaRzEKQXB6UWpWcmhWY05RaHJrcEpzTGoyYUR4YVFNb0lJQkZJaTFXcHp0VWxWWWlXUjhvM3g4Z1BXMmlOcjRqb0xGdXRiRW5QemxUQ2VxcgphdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaFpZNGJYU05tTzdpbE1sSElocXFoCnFaNS9kcFRDcG15M1FmRFZ5QVk0NXRRTTR2TTdURzFRak1TREo4RVRoRms5bm5WMHR0Z0NYanFRZXNCQ05uTHNhazNjNzhRQTN4TVkKVjE4bWVNaldDbmwzdi9ldnQzYTVwUXVFRjEwUTZtL2hxNVVSWDIwOG8xeE5nMXZ5c3htS2dJc0xod0lEQVFBQm95WXdKREFTQmdOVgpIUk1CQWY4RUNEQUdBUUgvQWdFRE1BNEdBMVVkRHdFQi93UUVBd0lCeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQURrYlZQSzdpCmg5bGVnWXNDbUVFSWpFeTgydHZ1Snh1QzUycEY3QmFMVDRXZzg3Snd2VnFXdXNwdWJlNUdpMjduS2k2V3N4a3o2N1NmcUxJMzdwaW8KbDdZdXRtY24xS1pKL1J5VFpYYWVRaS9jSW15YVQvSmFGVG14Y2RjclVlaHRISmpBMlNyMG9ZSjcxY2xCb2lNQmREaFZpdys1TG1laQpJQVEzMnB3TDB4Y2g0SStYZVRSdmhFZ0NJRE1iNWpSRW41Rnc5SUJlaEVQQ0tkSnNFaFRrWVkyc0VKQ2VoRkM3OEpadlJaK0s4OHBzClQvb1JPaFVWUnNQTkg0TmJMVUVTN1ZCblFSTTlJYXVVaXFwT2ZNR3grNmZXdFNjdmw2dHU0QjNpMFJ3c0gwVGkvTDZSb1p6NzFpbFQKYzRhZlU5aEREbDNXWTRKeEhZQjB5dmJpQW12WldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlU2lnbiBSb290Q0ExMQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyTUNrR0ExVUVDaE1pClNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0dBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlMKYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBME1EZ3dORFUyTkRkYU1GZ3hDekFKQmdOVkJBWVRBa3BRTVNzdwpLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpMQ0JKYm1NdU1Sd3dHZ1lEVlFRREV4TlRaV04xCmNtVlRhV2R1SUZKdmIzUkRRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkwKVEpzemkxb1VSYVRua0JiUjMxZlNJUkNrRi8zZnJOWWZwK1RiZlBmczM3Z0QycFJZL1YxeWZJdy9Yd0ZuZEJXVzR3SThoOXV1eXdHTwp3dk5teG9WRjlBTEdPclZpc3EvNm5MK2s1dFNBTUpqekRiYVRqNm5VMkRieXNQeUt5aXloRlRPVk1kckFHL0x1WXBtR1l6Ky8zWk1xCmc2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5VUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclAKTzdBeG1qVnV5SXNHMHdDUjhwUUlaVXl4TkFZQWVvbmk4TWNEV2MvVjF1aW5NclBtbUVDR3hjMG5Fb3ZNZTg2M0VUeGlZQWNqUGl0QQpicFNBQ1cyMnMyOTNielVJVVBzQ2g4VStpUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVy9oTlQ3S2xodFE2MHZGam1xQytDZlpYCnQ5NHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLQ2gKT0JabUxxZFdIeUdjQnZvZDdia2l4VGdtMkU1UDdLTi9lZDVHSWFHSGQ0OEhDSnF5cE1XdkR6S1lDM3htS2JhYmZTVlNTVU9yVEM0cgpibnB3cnhZTzR3SnMrMExtR0oxRjJGWEk2RHZkNStIMExnc2NORnhzV0VyN2pJaFFYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRCk9oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXclFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDEKeThoU3luK0IvdGxyMC9jUjdTWGYrT2Y1cFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MQpsZ2VMS0JPYmpCbU5RU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQUNFRElDT00gUm9vdAo9PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdFRDQ0E1MmdBd0lCQWdJSVlZM0hoanNCZ2dVd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFV01CUUdBMVVFQXd3TlFVTkZSRWxEClQwMGdVbTl2ZERFTU1Bb0dBMVVFQ3d3RFVFdEpNUTh3RFFZRFZRUUtEQVpGUkVsRFQwMHhDekFKQmdOVkJBWVRBa1ZUTUI0WERUQTQKTURReE9ERTJNalF5TWxvWERUSTRNRFF4TXpFMk1qUXlNbG93UkRFV01CUUdBMVVFQXd3TlFVTkZSRWxEVDAwZ1VtOXZkREVNTUFvRwpBMVVFQ3d3RFVFdEpNUTh3RFFZRFZRUUtEQVpGUkVsRFQwMHhDekFKQmdOVkJBWVRBa1ZUTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBLzVLVjRXZ0dkclFzeUZoSXl2MkFWQ2xWWXlUL2tHV2JFSFY3dzJyYllnSUI4aGlHdFh4YU9MSGsKV0xuNzA5Z3RuNzB5Tjc4c0ZXMit0ZlFoMGhPUjJRZXRBUVhXODcxM3psOUNnUXI1YXVPREFLZ3JMbFVUWTRIS1J4eDdYQlpYZWh1RApZQVE2UG1YRHpRSGUzcVRXRExxTzN0a0U3aGRXSXB1UFkvMU5GZ3UzZTNlTStTVzEwVzJaRWk1UEdyam02Z1NTcmowUnVWRkNQWWV3Ck1ZV3ZlVnFjL3VkT1hwSlBRL3lyT3EybEVpWm11ZUlNMTVqTzFGaWxsVUFLdDBTZEUzUXJ3cVhySWhXWUVOaUx4UVNmSFk5ZzVRWWIKbTgrNWVhQTlvaU0vUWo5citod0RlekNOem16QXYrWWJYNzludUlRWjFSWHZlOHVRTmpGaXlid0NxMFpmbS80YWFKUTBQWkNPcmZiawpIUWwvU29nNFA3NW4vVFNXOVIyOE1IVExPTzdWYkt2VS9QUUF0d0JiaFRJV2RqUHAyS09ablFVQXFoYm04NEY5YjMycWhtMnRGWFRUCnhLSnhxdlFVZmVjeXVCKzgxZkZPdlc4WEFqblhEcFZDT3NjQVB1a21ZeEhxQzlGSy94aWRzdGQ3THpyWmx2dm9IcEt1RTFYSTJTZjIKM0VnYnNDVEJoZU4zblpxazh3d1JIUTNJdEJUdXRZSlhDYjhnV0g4dklpUFljTXQ1Yk1sTDhxa3F5UHlISzljYVVQZ242QzlENHpxOQoyRmR4L2M2bVVsdjUzVTN0NWZadmllMjdrNXgySVhYd2trd3A5eStjQVM3K1VFYWVaQXdVc3dkYnhjSnpiUEVIWEVVa0ZEV3VnL0ZxClRZbDYrclBZTFdid05vZjFLMU1DQXdFQUFhT0JxakNCcHpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLYXoKNFNzclNiYlhjNkdxbFBVQjUzTmxUS3hRTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVcHJQaEt5dEp0dGR6b2FxVQo5UUhuYzJWTXJGQXdSQVlEVlIwZ0JEMHdPekE1QmdSVkhTQUFNREV3THdZSUt3WUJCUVVIQWdFV0kyaDBkSEE2THk5aFkyVmthV052CmJTNWxaR2xqYjIxbmNtOTFjQzVqYjIwdlpHOWpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUURPTEF0U1VXSW1mUXduZzQvRjl0cWcKYUh0UGtsN3FwSE15RVZORXNrVExuZXdQZVVLekVLYkhEWjNMdHZvL09uenF2NGhUR3p6M2d2b0ZOVFBoTmFoWHdPZjlqVTgva3pKUAplR1lEZHdkWTZaWElmajdRZVFDTThodFJNNXU4bE9rNmUyNVNMVEtlSTZSRis3WXVFN0NMR0xIZHp0VWRwMEovVmI3N1c3dEgxUHdrCnpRU3VsZ1VWMXF6T01QUEtDOFc2NGlMZ3BxMGk1QUx1ZEJGL1RQOTRIVFhhNWdJMDZ4Z1NZWGNHQ1JaajZoaXRvb2NmOHNlQUNRbDEKVGhDb2p6Mkd1SFVSd0NSaWlwWjdTa1hwN0ZuRnZtdUQ1dUhvckxVd0h2NEZCNEQ1NFNNTlVJOEZtUDhzWCtnN3RxM1BnYlVoaDhvSQpLaU1uTUNBcnorMlVXNnl5ZXRMSEtLR0tDNXROU2l4dGhUOEpjanhuNHRuY0I3cnJaWHRhQVdQV2tGdFBGMlk5ZndzWm81TmpFRklxCm54UVdXT0xjcGZTaEZvc09rWXVCeXB0Wit0aHJrUWRsVlY5U0g2ODYrNURkYWFWYm5HME9MTGI2enF5bGZESktaMERjTURRajNkY0UKSTJidy9GV0FwL3RtR1lJMVoySndPVjV2eCtxUVFFUUlIcml5MXR2dVdhY05HSGswdkZRWVhsUEtORkh0UlFybWpzZUNOajZuT0dPcApNQ3dYRUdDU24xV0hFbGtRd2c5bmFSSE1UaDUrU3BxdHIwQ29kYXhXa0hTNG9KeWxlVy9jNlJySWFRWHB1dm9EczN6azRFN0N6cDNvCnRrWU5ibjVYT21lVXdzc2ZuSGRLWjA1cGhrT1RPUHUyMjArRGtkUmdma3MrS3pnSFZaaGVwQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1BEQ0NBYVVDRUR5Uk1jc2Y5dEFiRHBxNDBFUy9FcjR3RFFZSktvWklodmNOQVFFRkJRQXdYekVMTUFrR0ExVUVCaE1DVlZNeApGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1CklFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUazJNREV5T1RBd01EQXdNRm9YRFRJNE1EZ3dNakl6TlRrMU9Wb3cKWHpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBegpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBCkE0R05BRENCaVFLQmdRREpYRm1lOGh1S0FSUzBFTjhFUU52alY2OXFSVUNQaEF3TDBUUFoyUkhQN2dKWUh5WDNLcWhFQmFyc0F4OTQKZjU2VHVab0FxaU45MXF5Rm9tTkZ4M0luelBSTXhuVngwam52VDBMd2RkOEtrTWFPSUcrWUQvaXNJMTl3S1Rha3lZYm5zWm9neTFPbApoZWM5dm4yYS9pUkZNOXgyRmUwUG9uRmtUR1V1Z1doRnB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUJCeVVxa0ZGQmt5CkNFSHd4V3NLekg0UElSbk41R2ZjWDZrYjVzcm9jNTBpMkpodWN3TmhrY1Y4c0VWQWJrU2RqYkN4bG5SaExRMnBSZEtra2lyV21uV1gKYmo5VC9VV1pZQjJvSzB6NVhxY0oySFV3MTlKbFlEMW4xa2hWZFdrL2tmVklDMGRwSW1tQ2xyN0p5RGlHU25vc2N4bElhVTVyZkdXLwpEL3h3em9pUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQ2pDQ0F2S2dBd0lCQWdJSkFNSitRd1JPUno4Wk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSCk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnYKYzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1bwpkVEFlRncwd09UQTJNVFl4TVRNd01UaGFGdzB5T1RFeU16QXhNVE13TVRoYU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEdBMVVFCkJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXQKVTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW9kVENDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT240ai9OanJkcUcyS2ZnUXZ2UGtkNm1KdmlacFdOd3JadXV5ak5BCmZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjY2JuYTdQN29mby9rTHgyeXFIV0gyTGVoNVR2UG1VcEcKMElNWmZjQ2hFaHlWYlVyMDJNZWxUVE11aFRsQWRYNFVmSUFTbUZESFFXZTRvSUJoVktac1RoL2duUTRINmNtNk0rZit3RlVvTEFLQQpweG4xbnR4VlV3T1hld2RJLzVuN040b2t4Rm5NVUJCampxcXBHckNFR29iNVg3dXhVRzZrMFFyTTFYRitINmNiZlBWVGJpSmZ5eXZtCjFIeGRydGJDeGt6bEJRSFo3VmY4d1NONS9QcklKSU9WODdWcVVRSFFkOWJwRXFINUdvUDdnaHU1c0pmMGRnWXpRMG1nL3d1MStyVUMKQXdFQUFhT0JnREIrTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlRMRDhiZgpRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWZCZ05WSFNNRUdEQVdnQlRMRDhiZlFrUE1QY3UxU0NPaEducW1LcnMwYURBYkJnTlZIUkVFCkZEQVNnUkJwYm1adlFHVXRjM3BwWjI1dkxtaDFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUURKMFE1ZUx0WE1zM3creS93OS93MG8KbFpNRXlML2F6WG00UTVEd3BMN3Y4dThobUx6VTFGMEc5dTVDN0RCc29LcXB5dkd2aXZvL0MzTnFQdW91UUg0ZnJsUmhlZXN1Q0RmWApJL09Nbjc0ZHNlR2tkZHVnNGxRVXNib2NLYVFZOWhLNm9oUVU0ekUxeUVEL3QrQUZkbGZCSEZueStML2s3U1ZpWElUd2ZuNGZzNzc1CnR5RVJ6QU1CVm5DbkVKSWVHelNCSHEyY0dzTUVQTzBDWWRZZUJ2TmZPb2Z5Sy9GRmgrVTlyTkhIVjRTOWE2N2MyUG0yRzJKd0N6MDIKeVVMeU10ZDZZZWJTMnozUHlLbkptOXpiV0VUWGJ6aXZmM2pUbzYwYWRib2N3VFo4ang1dEhNTjFScTQxQmFiMlhEMGg3bGJ3eVlJaQpMWHBVcTNERGZTSmxnbkNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkUtR3V2ZW4gS29rIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0akNDQXA2Z0F3SUJBZ0lRUkptTlBNQURKNzJjZHBXNTZ0dXN0VEFOQmdrcWhraUc5dzBCQVFVRkFEQjFNUXN3Q1FZRFZRUUcKRXdKVVVqRW9NQ1lHQTFVRUNoTWZSV3hsYTNSeWIyNXBheUJDYVd4bmFTQkhkWFpsYm14cFoya2dRUzVUTGpFOE1Eb0dBMVVFQXhNegpaUzFIZFhabGJpQkxiMnNnUld4bGEzUnliMjVwYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaFoyeGhlV2xqYVhOcE1CNFhEVEEzCk1ERXdOREV4TXpJME9Gb1hEVEUzTURFd05ERXhNekkwT0Zvd2RURUxNQWtHQTFVRUJoTUNWRkl4S0RBbUJnTlZCQW9USDBWc1pXdDAKY205dWFXc2dRbWxzWjJrZ1IzVjJaVzVzYVdkcElFRXVVeTR4UERBNkJnTlZCQU1UTTJVdFIzVjJaVzRnUzI5cklFVnNaV3QwY205dQphV3NnVTJWeWRHbG1hV3RoSUVocGVtMWxkQ0JUWVdkc1lYbHBZMmx6YVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQU1NU0lKNndYZ0JsalU1R3U0QmM2U3dHbDlYemNzbHd1ZWRMWllEQlM3NStQTmRVTVpUZTFSSzZVeFlDNmxoajcxdlkKOCswcUdxcHhTS1BjRUMxZlgrdGNTNXlXQ0VJbEtCSE1pbHBpQVZEVjZ3bFRML2pEai82ei9QMmRvdU5mZmI3dEMrQmc2Mm5zTSszWQpqZnNTU1lNQXlZdVhqRHR6S2pLekV2ZTVUZkwwVFczSDV0WW1Od2p5MmYxclhLUGxTRnhZdkVLK0ExcUJ1aHcxREFEVDlTTitjVEFJCkpqamNKUkZITGZPNkl4Q2x2N3dDOTBOZXgvNndOMUNaZXcrVHp1WkRMTU4rRGZJY1EyWmd5MkV4UjRlalQ2NjlWbXhNdkx6NEJjcGsKOU9rMG9TeTFjK0hDUHVqSXlUUWxDRnp6N2FiSGxKK3RpRU1sMStFNVlQNnNPVmtDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkovdVJMT1UxZnFSVHk3WlZab0VWdHN0eE51bE1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUIvWDdsVFcyTTlkVExuK3NSMEdzdEczMFpwSEZMUHFrL0NhT3YvZ0tsUjZEMWlkNGs5Q25VNThXNWQKRjRkdmFBWEJsR3paWGQvYXNsbkxwUkNLeXN3NXpaL3JUdDVTL3d6dzlKS3A4bXhUcTV2U1I2QWZkUGVibXZFdkZaOTZaREFZQnp3cQpEMmZLL0ErSllaMWxwVHpsdkJOYkNOdmovKzI3QnJ0cUJyRjZUMlhHZ3YwZW5JdTFEZTVJdTdpOXFnaTArNk44eTUvTmtIWmNocFo0ClZ3cG0rVmdhbmYyWEtXRGVFYWFRSEJrYzdnR1dJalEwTHBINXQ4UW4wWHZtdi91QVJGb1c1ZXZnMUFvNHZPU1I0OVhyWE1HczN4dHEKZko3bGRkSzJsNGZiekljclF6cUVDSytyUE52M1BHWXhockNkVTNudCtDUGVRdU10Z3ZFUDVmcVgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0TVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdAppSEw4UmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVGdIZU1DT0ZKCjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tS1BacE8vYkx5Q2lSNVoyS1lWYzMKckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emRRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbApPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWlhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyCnhtbUZnaGNDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKRkkvd1MzK29Ma1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVUlVtNwpsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXBqak01UmNPTzVMbFhiS3I4CkVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSzZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUUKYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOApZSXZEUVZFVEk1M085ekpybEFHb21lY3NNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdyCmtwZURNZG16dGNwSFdEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlENFRDQ0FzbWdBd0lCQWdJT1l5VUFBUUFDRkkwekZRTGtiUFF3RFFZSktvWklodmNOQVFFRkJRQXdlekVMTUFrR0ExVUVCaE1DClJFVXhIREFhQmdOVkJBb1RFMVJESUZSeWRYTjBRMlZ1ZEdWeUlFZHRZa2d4SkRBaUJnTlZCQXNURzFSRElGUnlkWE4wUTJWdWRHVnkKSUZWdWFYWmxjbk5oYkNCRFFURW9NQ1lHQTFVRUF4TWZWRU1nVkhKMWMzUkRaVzUwWlhJZ1ZXNXBkbVZ5YzJGc0lFTkJJRWxKU1RBZQpGdzB3T1RBNU1Ea3dPREUxTWpkYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUhzeEN6QUpCZ05WQkFZVEFrUkZNUnd3R2dZRFZRUUtFeE5VClF5QlVjblZ6ZEVObGJuUmxjaUJIYldKSU1TUXdJZ1lEVlFRTEV4dFVReUJVY25WemRFTmxiblJsY2lCVmJtbDJaWEp6WVd3Z1EwRXgKS0RBbUJnTlZCQU1USDFSRElGUnlkWE4wUTJWdWRHVnlJRlZ1YVhabGNuTmhiQ0JEUVNCSlNVa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREMycHhpc0xseEVyQUx5QnBYc3E2REZKbXpORXVia0tMRjUrY3ZBcUJOTGFUNmhkcWJKWVV0ClFDZ2diZXJndmJGSWd5SXBSSjlPZys0MVVSTnpkTlc4OGpCbWxGUEFRRFl2RElSbHpnOXV3bGlUNkN3TE91bkJqdnZ5YThvODRweE8KanVUNWZkTW5ueHZWWjNpSExYOExSN1BINk1sSWZLOHZ6QXJaUWUrZi9wcmhzcTc1VTdYbDZVYWZZT1BmamROLys1WitzN1Z5K0V1dApDSG5OYVlsQUovVXF3YTFEN0tSVHlHRzI5OUo1S21jWWRraHRXeVVCMFNiRnQxZHBJeFZiWVlxdDhCc3QyYTljOFNhUWFhblZERUQxCk00QkRqNXlqZGlwRnRLKy9mejZIUDNiRnpTcmVJTVVXV012NUcvVVB5dzBSVW1TNDBuWmlkNFB4V0ovL0FnTUJBQUdqWXpCaE1COEcKQTFVZEl3UVlNQmFBRkZibjRWc2xRNERnOW96aGNieU81WUF2eEVqaU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdFR01CMEdBMVVkRGdRV0JCUlc1K0ZiSlVPQTRQYU00WEc4anVXQUw4Ukk0akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmc4ZXY2bjlOQ2p3NXNXaStlMjJKTHVtekNlY1lWNDJGbWhmemRrSlFFdy9Ia0c4enJjVkpZQ3RzU1ZnWjFPSyt0NytyU2J5VXlLdSsKS0d3V2FPRElsMFlnb0dobllJZzVJRkhZYUFFUnpxZjJFUWYyN095c0doK3labTVXWjJCNmRGN0FiWmMycnJVTlhXWnp3Q1V5UmRoSwpCZ2VQeExjSHNVMEdEZUdsNi9SMXlycWMwTDJ6MHpJa1RPNSs0bllFUzBsVDJQTHBWRFA4NVhFZlBSUmNsa3Z4T3ZJQXUyeTArcFpWCkNJZ0p3Y3lSR1Ntd0lDMy95emlrUU9FWHZubGhnUDhIQTRaTVRuc0dueEdHalludUo4VGI0cndaamd2RHd4UEhMUU5qTzlQbzVLSXEKd29JSWxCWlU4TzhmSjVBbHVBME9LQnRIZDBlOUhLZ2w4WlMwWmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHRkRDQ0EveWdBd0lCQWdJSVUrdzc3dnV5U0Y4d0RRWUpLb1pJaHZjTkFRRUZCUUF3VVRFTE1Ba0dBMVVFQmhNQ1JWTXhRakJBCkJnTlZCQU1NT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWhjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTIKTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeU16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJdwpRQVlEVlFRREREbEJkWFJ2Y21sa1lXUWdaR1VnUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCCk5qSTJNelF3Tmpnd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1REQKVXRkOXRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU1jYXM5VVg0UApCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmR0w5SXRXWTE2Q2s2V2FWSUNxamFZCjdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpTkE5d0JqNGdHRnJPOTNJYkpXeVRkQlNUbzNPeERxcUgKRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2hYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SQpwbEQ5YW1NTDlaTVdHeG1Qc3UyYm04bVE5UUVNM3hrOUR6NDRJOGt2and6UkF2NGJWZFpPMEkwOHIwK2s4LzZ2S3RNRm5Ya0lvY3RYCk1iU2N5SkN5Wi9RWUZwTTYvRWZZMFhpV01SKzZLd3hmWFptdFk0bGFKQ0IyMk4vOXEwNm1JcXFkWHVZbmluMW9LYVBuaXJqYUVic1gKTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9US0k4eFdWdlR5UUttdEZMSwpicGY3UThVSUptK0s5THY5bnlpcURkVkY4eE02SGRqQWVJOUJaendlbEdTdWV3dkY2TmtCaURrYWw0WmtRZFU3aHd4dStnL0d2VWdVCnZ6bE4xSjVCdG8rV0hXT1drOW1WQm5neGFKNDNCanVBaVVWaE9TUEhHMFNqRmVVYytKSXd1d0lEQVFBQm80SHZNSUhzTUJJR0ExVWQKRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSApEaHBrTHpDQnBnWURWUjBnQklHZU1JR2JNSUdZQmdSVkhTQUFNSUdQTUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3T2k4dmQzZDNMbVpwCmNtMWhjSEp2Wm1WemFXOXVZV3d1WTI5dEwyTndjekJjQmdnckJnRUZCUWNDQWpCUUhrNEFVQUJoQUhNQVpRQnZBQ0FBWkFCbEFDQUEKYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbEFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeApBRGN3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUJkOW9QbTAzY1hGNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4CjUxdGtsall5R095bE1uZlg0MFMyd0JFcWdMazlhbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWsKUjcxa01ydjJKWVNpSjBMMUlMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUApUNDgxUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUzNhL0RUZzRmCkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrU2VUeTM2THNzVXpBS2gzbnRMRmwKb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYzZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUgpjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTVpjRndnYmc0L0VNeHN2WURORWV5clBzaUJzc2UzUmRISEY5bXVkTWFvdG9SCnNhUzhJOG5rdm9mL3VaUzIrRjBnU3RSZjU3MW9lMlh5RlI3U09xa3Q2ZGhySkt5WFdFUkhyVmtZOFNGbGNON09OR0NvUVBIelBLVEQKS0NPTS9pY3pRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCakxNaQo2RXQ4VmNhZCtxTVV1MldGYm01UEVuNEtQSjJWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkl6ZW5wZS5jb20KPT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNE1Rc3dDUVlEVlFRRwpFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWpiMjB3SGhjTk1EY3hNakV6Ck1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXUKUVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1amIyMHdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFESgowM3JLRHg2c3A0Ym9GbVZxc2NJYlJUSnhsZG4rRUZ2TXIrZWxlUUdQaWNQSzhsVng5M2UrZDVUemNxUXNSTmlla3BzVU9xSG5KSkFLCkNsYU94ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZITG1ZUlkyeFUKK3p5ZGNzQzhMdi9DdDkwTmR1TTYxL2UwYUw2aTllT0Jic0ZHYjEyTjRFM0dWRldKR2pNeENyRlh1YU9LbU1Qc096VEZsVUZwZm5YQwpQQ0RGWWJwUlI2QWdrSk9oa0V2elRueUZSVlNhMFFVbVFiQzFUUjB6dnNRRHlDVjh3WERiTy9RSkxWUW5TS3d2NGNTc1Bzakxra3hUCk9UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYksKRjdqSmVvZFdMQm9CSG15K0U2MFFyTFVrOVRpUm9kWkwydkc3MHQ1SHRmRzhnZlpaYTg4WlUrbU5GY3RLeTZsdlJPVWJRYy9oaHFmSwowR3FmdkV5TkJqTmFvb1hsa0RXZ1lsd1dUdkRqb3ZvREdyUXNjYk5ZTE41N0M5c2FEK3ZlSVI4R2R3WURzTW52bWZ6QXVVOExoaWorCjBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQlFGcU5lYitMejB2UHFoYkIKbGVTdFRJbytGNUhVc1dMbGd1V0FCS1FEZm8yLzJuK2lENWRQRE5NTis5ZlI1WEorSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJRApBUUFCbzRIMk1JSHpNSUd3QmdOVkhSRUVnYWd3Z2FXQkQybHVabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crClNWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZ1FUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkcKTmpJZ1V6Z3hRekJCQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPCkJCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCNHBnd1dTcDlNaURyQXl3NmwKRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYmxhUW5JVWRDU254SU92VkZmTE1NamxGNHJKVVQzc2I5ZmJnYQprRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2YXdtcXhpbnVhRWxuTUlBa2VqRVdPVnQrOFJ3dTNXd0pyZkl4d1lKT3VidjV2cjhxCmhUL0FRS002V2Z4WlN6d29KTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3MKZzFsd0xEWFdyelkwdE0wNytES283K040aWZ1TlJTemFuTGgrUUJ4aDV6NmlraXhMOHMzNm1MWXAvL1B5ZTZrZkxxQ1RWeXZlaFFQNQphVGZMbm5ocUJiVEZNWGlKN0hxbmhlRzVlenpldmg1NWhNNmZjQTVad2pVdWtDb3gyZVJGZWtHa0xoT2JOQTVtZTBtclpKZlFSc041Cm5YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSEMKQ2xndUdZRVF5VkIxL09wYUZzNFIxKzd2VUlndFlmOC9Rbk1GbEVQVmpqeE9BVG9acFI5R1RuZlFYZVdCSWlHSC9wUjloTmlUcmRabwpRMGl5Mit0ekpPZVJmMVNrdG9BK25hTThUSExDVjhTZzFNdzRKODdWQnA2aVNObnBuODZDY0RhVG1qdmZsaUhqV2JjTTJwRTM4UDFaCldyT1p5R2xzUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRFZRUUdFd0pGVlRGRApNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52CmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzNNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXUKUVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKeklHOW1JRU52YlcxbGNtTmxJRkp2YjNRZ0xTQXlNREE0TUI0WERUQTRNRGd3TVRFeQpNamsxTUZvWERUTTRNRGN6TVRFeU1qazFNRm93Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sClpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUYKRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbApjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0SURJd01EZ3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQ3ZBTXR3Tnl1QVdrbzZiSGlVZmFOL0doLzJOZFc5MjhzTlJISStKcktRVXJwak95aFliNld6YlpTbTg5MWtERlgyOXVmeUlpS0EKWHVGaXhyWXA0WUZzOHIvbGZUSnFWS0F5R1ZuK0g0dlhQV0NHaFNSdjR4R3pkejRnbGpVaGE3TUkyWEF1WlBlRWtsUFdEckNRaW9yagpoNDBHMDcyUUR1S1pvUnVHRHRxYUNyc0xZVkFHVXZHZWYzYnN5dy9RSGczUG1UQTlITVJGRUZpczF0UG8xK1hxeFFFSGQ5WlI1Z04vCmlraWxUV2gxdWVtOG5rNFpjZlV5UzV4dFlCa0wrOHlkZGR5L0pzMlBrM2c1ZVhOZUpRN0tYT3QzRWdmTFpFRkhjcE9yVU1QckNYWmsKTk5JNXQzWVJDUTEyUmNTcHJqMXFyN1Y5WlMrVVdCRHNYSHl2ZnVLMkdOblFtMDVhU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1ZwpEMnZsR3RzLzQrRWh5U25COGVzSG5GSWJBVVJSUEhzbDE4VGxVbFJkSlFmS0ZpQzRyZVJCN25vSS9wbHZnNmFSQXJCc05sVnE1MzMxCmx1YktnZGFYOFpTRDZlMndzV3NTYVI2cysxMnB4WmpwdEZ0WWVyNDlva1E2WTFuVUN5WGVHMCs5NVFHZXpkSXAxWjhYR1FwdnZ3eVEKMHdsZjJlT0tOY3g1V2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagp5YTZCWEJnMTRKQzd2anhQTnlLNWZ1dlBubmNocGowNGdmdEkyakU5SytPSjlkQzF2WDdnVU1RU2liTWptaEF4aGR1dWIrODRNeGgyCkVRSURBUUFCbzRJQmJEQ0NBV2d3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCRERBZEJnTlZIUTRFRmdRVStTU3NEN0sxK0huQSttQ0kKRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeG1oZ2JTa2diRXdnYTR4Q3pBSgpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sWlNCamRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oCmJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmgKYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXRJREl3TURpQwpDUUNqMmtKK3BMR3UyakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVkhTQUFNQ293S0FZSUt3WUJCUVVICkFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUpBU3J5STEKd3FNNThDN2U2YlhwZUh4SXZqOTlSWkplNmRxeEdmd1dQSiswVzJhZWF1ZkR1VjJJNkErdHp5TVAzaVU2WHN4UHBjRzFMYXdrMGxnSAozcUxQYVlSZ00rZ1FEUk9wSTlDRjVZNTdwcDQ5Y2hOeU0vV3FmY1pqSHdqMC9nRi9KTThyTEZRSjN1SXJiWkxHT1U4VzZqeCtla2JVClJXcEdxT3QxZ2xhbnE2QjhhQk16OXAwdzhHOG5PU1FqS3BEOWtDazE4cFBmTktYRzkvanZqQTlpU255dTAvVlUrSTIybWxhSEZvSTYKTTZ0YUlnajNncnJxTHVCSG1yUzFSYU1GTzluY0xrVkFPK3JjZitnNzY5SHNKdGcxcERERk9xeFhuck4ycFNCNytSNUtCV0lCcGloMQpZSmVTRFc0K1RUZEREWklWbkJnaXpWR1pvQ2thUEYrS01qTmJNTWVKTDBlWUQ2TUR4dmJ4ck44eThObUJHdVNjdmZhQUZQRFJMTG1GCjlkaWpzY2lsSWVVY0U1ZnVEcjNmS2Fudk5GTmIwK1JxRTRRR3RqSUN4Rkt1SXRMY3NpRkNHdHBBOENuSjdBb01YT0xRdXN4STB6Y0sKekJJS2lubXdQUU4vYVV2ME5DQjlzelRxamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2RwpuckRRV3ppbG0xRGVmaGlZdFVVNzlubTA2UGNhZXdhRCs5Q0wycnZIdlJpckNHODhnR3RBUHhrWnVtV0s1cjdWWE5NMjErOUFVaVJnCk9HY0VNZXlQODRMRzNybFY4enN4a1ZyY3RRZ1ZyWFlsQ2cxN0xvZmlES1lHdkNZUWJUZWQ3TjE0akh5QXhmRFpkMGpRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhTVENDQlRHZ0F3SUJBZ0lKQU1uTjArblZmU1BPTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdzTVFzd0NRWURWUVFHRXdKRlZURkQKTUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdgpiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11ClFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkRhR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RBZUZ3MHdPREE0TURFeE1qTXgKTkRCYUZ3MHpPREEzTXpFeE1qTXhOREJhTUlHc01Rc3dDUVlEVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZwpZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjBJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KClFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkQKYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1EZgpWdFBrT3B0MlJiUVQyLy9CdGhtTE4wRVlsVkpINnhlZEtZaU9OV3dHTWk1SFl2TkpCTDk5UkRheGNjeTlXZ2x6MWRtRlJQK1JWeVhmClhqYU9jTkZjY1VNZDJkcnZYTkw3RzcwNnRjdXRvOHhFcHcydUlSVS91WHBia25YWXBCSTRpUm1LdDREUzRqSnZWcHlSMW9nUUM3TjAKWkpKMFlQUDJ6eGhQWUxJajBNYzd6bUZMbVkvQ0ROQkFzcGpjRGFoT283a0tybUNnclVWU1k3cG12V2pnK2I0YXFJRzdIa0Y0ZGRQQgovZ0JWc0lkVTZDZVFOUjFNTTYyWC9KY3VtSVMvTE1tanY5R1lFUlR0WS9qS21JaFlGNW50UlFPWGZqeUdIb2lNdnZLUmhJOWxOTmdBClRIMjNNUmRhS1hvS0dDUXdvemUxZXFrQmZTYlcrUTZPV2ZIOUd6TzFLVHNYTzBHMklkM1V3RDJsbjU4ZlExREp1N3hzZXBlWTdzMk0KSC91Y1VhNkxjTDBubjNIQWE2eDlrR2JvMTEwNkRiRFZ3bzNWeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZQpPeDJZSXRhc3dUWGJvNkFsLzNLMWRoM2ViZWtzWml4U2hOQkZrczRjNWVVekhkd0hVMVNqcW9JN21qY3YzTjJnWk9ubTNiMnUvR1NGCkhUeW55UWJlaFA5cjZHc2FQTVdpczBMN2l3aytYd2hTeDJMRTFBVnh2OFJrNVBpaGcrZytFcHVvSHRRMlRTOXg5bzBvOW9PcEU5SmgKd1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZ3pDdExreWtQQWdNQgpBQUdqZ2dGcU1JSUJaakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VNTUIwR0ExVWREZ1FXQkJTNUNjcWNIdHZUYkRwcnJ1MVU4VnVUCkJqVXVYakNCNFFZRFZSMGpCSUhaTUlIV2dCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VEJqVXVYcUdCc3FTQnJ6Q0JyREVMTUFrR0ExVUUKQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcFpDQW9jMlZsSUdOMWNuSmxiblFnWVdSa2NtVnpjeUJoZENCM2QzY3VZMkZ0WlhKbQphWEp0WVM1amIyMHZZV1JrY21WemN5a3hFakFRQmdOVkJBVVRDVUU0TWpjME16STROekViTUJrR0ExVUVDaE1TUVVNZ1EyRnRaWEptCmFYSnRZU0JUTGtFdU1TY3dKUVlEVlFRREV4NUhiRzlpWVd3Z1EyaGhiV0psY25OcFoyNGdVbTl2ZENBdElESXdNRGlDQ1FESnpkUHAKMVgwanpqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMApkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSUNJZjNEZWtpalpCWlJHCi81QlhxZkV2M3hvTmEvcDhEaHhKSkhrbjJFYXFieWxaVW9od0V1cmRQZldiVTFSdjRXQ2lxQW01N090WmZNWTE4ZHdZNmZGbjVhKzYKUmVBSjNzcEVEOElYRG5lUlJYb3pYMStXTEdpTHdVZVBtSnM5d096TDlkV0Nrb1ExMGI0Mk9GWnlNVnRITGFvWHBHTlI2d29CclgvcwpkWjdMb1IveGZ4S3h1ZVJrZjJmV0l5cjB1RGxkbU9naHArRzlQVUlhZEpwd3IyaHNVRjFKei8vN0RsM21MRWZYZ1RwWkFMVnphMk1nCjlqRkZDRGtPOUhCK1FIQmFQOUJyUXFsMFBTZ3ZBbTExY3BVSmpVaGp4c1lqVjVLVFhqWEJqZmtLOXl5ZFloejJyWHpkcGpFZXRySEgKZm9VbStxUnF0ZHBqTU5Idmt6ZXlaaTk5QmZmbnQwdVlsRFhBMlRvcHdaMnlVRE1kU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdQpxcXFIVzJQb2srSnJxTlM0Y25ockcrMDU1RjNMbTZxSDFVOU9BUDdaYXA4OE1ROG9BZ0Y5bU9pbnNLSmtubm40U1BJVnFjem15RVRyClAzaVo4bnR4UGp6eG1LZkZHQkkvNXJzb00wTHBSUXA4YmZLR2VTL0ZnaGw5Q1lsOHNsUjJpSzdld2ZQTTRXN2JNZGFUcnBtZzd5VnEKYzVpSld6b3VFNGdldjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgowOWd3enhNTlR4WEpoTHluU0MzNE1DTjMyRVpMZVczMmpPMDZmMkFSZVBUcG02N1ZWTUIwZ05FTFFwL0IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUCkIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1RFVWR2UkdGa1pIa3VZMjl0TENCSmJtTXUKTVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQpNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWU14Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2CmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVJvd0dBWURWUVFLRXhGSGIwUmhaR1I1TG1OdmJTd2dTVzVqTGpFeE1DOEcKQTFVRUF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUw5eFlnangrbGswOXh2SkdLUDNnRWxZNlNLREU2YkZJRU1CTzRUeDVvVkpueWZxCjlvUWJUcUMwMjNDWXh6SUJzUVUrQjA3dTlQcFBMMWt3SXVlckdWWnI0b0FIL1BNV2RZQTVVWHZsK1RXMmRFNnBqWUlUNUxZL3FRT0QKK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3lEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZApmTWg4KzdBclU2U1NZbWxSSlFWaEdrU0JqQ3lwUTVZajM2dzZnWm9PS2NVY3FlbGRIcmFlbmpBS09jN3hpSUQ3UzEzTU11eUZZa01sCk5BSldKd0dSdER0d0tqOXVzZWljaUFGOW45VDUyMU50WUoyL0xPZFlxN2hmUnZ6T3hCc0RQQW5yU1RGY2FVYXo0RWNDQXdFQUFhTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkRxYWhRY1FaeWkyNy9hOQpCVUZ1SU1HVTJnL2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNaMjExNTFmbVhXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjCnZOanBMOURiV3U3UGRJeHp0RGhDMmdWNytBSjF1UDJsc2RldTl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3IKNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVgpOOEdiNURLajdUam8yR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUk0dUpFdmx6MzZoejEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vYm05cwpiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzWkNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwCmVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXcKRGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZwpWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVEl3TUFZRFZRUURFeWxUZEdGeVptbGxiR1FnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCCmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMM3R3UVA4OW8vOEFyRnYKVzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWduTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29UcwpiaG01aVN6Y2hGdlZkUHRyWDhXSnBSQlNpVVpWOUxoMUhPWi81RlN1Uy9oVmNsY0NHZmdYY1ZuckhpZ0hkTVdkU0w1c3RQU2tzUE5rCk4zbVN3T3hHWG4vaGJWTk1ZcS9OSHd0anV6cWQrL3g1QUpoaGRNOG1na0JqODdKeWFoa05tY3JVRG5YTU4vdUxpY0ZaOFdKL1g3TmYKWlRENHA3ZE5kbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwSFpiVQpKdFFJQkZuUW1BNE81dDc4dyt3ZmtQRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGSHdNTWgrbjJUQi94SDFvbzJLb29jNnJCMXNuTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2wKVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeAo0bWN1akpVREppNURuVW94OWc2MURMdTM0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3CkY1b2t4QkRnQlBmZzhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMW1NcFlqbjBxN3BCWgpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDd6Q0NBdGVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVApCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzCmIyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnNaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmwKSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVgpCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUCmRHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5ZG1salpYTWcKVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQwpBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcE9zZ1BmVHozYTNZNFk5azJZS2liWGx3QWdMSXZXWC8yCmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGEKaEhRVXcyZWVCR2c2MzQ1QVdoMUtUczlEa1R2blZ0WUFjTXRTN250OXJqcm52REg1UmZiQ1lNOFRXUUlyZ013MFI5KzUzcEJsYlFMUApMSkdtcHVmZWhSaEpmR1pPb3pwdHFiWHVOQzY2RFFPNE05OUg2N0ZyalNYWm04NkIwVVZHTXBad2g5NENEa2xEaGJac2M3dGs2bUZCCnJNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKeGZBTitxQWRjd0t6aUlvcmh0U3B6eUVaR0RNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElCQVFCTE5xYUVkMm5kT3htZlp5TUlidzVoeWYyRTNGL1lOb0hOMkJ0QkxaOWczY2NhYU5uUmJvYmhpQ1BQCkU5NUR6K0kwc3dTZEh5blZ2L2hleU5YQnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHkKeFFHamhkQnlQcTF6cXd1YmRReHRSYmVPbEt5V043V2cwSThWUnc3ajZJUGRqLzN2UVFGM3pDZXBZb1V6OGpjSTczSFBkd2JleUJrZAppRURQZlVZZC94N0g0YzcvSTl2RytvMVZUcWtDNTBjUlJqNzAvYjE3S1NhN3FXRmlOeWkyTFNyMkVJWmt5WENuMHEyM0tYQjU2anphCll5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ05zU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IENvbW1lcmNpYWwKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01CNFhEVEV3Ck1ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTlodFBad2Nyb1JYMUJpTExId0d5NDNORkJrUkpMTHRKSlJUV3pzTzNxeXhQeGtFeWxGZjZFcWRiCkR1S1BIeDZHR2FlcXRTMjVYdzJLd3ErRk5Ya3lMYnNjWWpmeXNWdEtQY3JOY1YvcFFyNlU2TWplK1NKSVpNYmxxOFlyYmEwRjhQclYKQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUxNZUlySm1xYlRGZXVyQ0ErdWtWNgpCZk85bTJrVnJuMU9JR1BFTlhZNkJ3TEpOLzNIUis3bzhYWWRjeFh5bDZTMXlIcDUyVUtxSzM5Yy9zNG1UNk5tZ1RXdlJMcFVIaHd3Ck1tV2Q1anlUWGxCT2V1TTYxRzdNR3Z2NTBqZXVKQ3FyVndNaUtBMUpkWCszS05wMXY0N2ozQTU1TVFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVuWlBHVTR0ZXlxOC9ueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUZpczlBUU96Y0FOL3dyOTFMb1dYeW05ZTJpWldFblN0QjAzVFg4bmZVWUdYVVBHCmhpNCtjN0ltZlUrVHFiYkVLcHFySVpjVXNkNk0wNnVKRmRockpOVHhGcTdZcEZ6VWYxR083UmdCc1pOanZiejRZWUNhbnJIT1FuRGkKcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0WjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdgowd3FpVU9QMk8rZ3VSTUxiWmppcE0xWkk4VzBiTTQwTmpEOWdONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoCnNVbEhSVWUwNzJvMEVjbE5tc3hadDlZQ25scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IE5ldHdvcmtpbmcKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3Ck1ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFCkhpM3lZSjB3VHN5RWhlSXN6eDZlL2phck0zYzFSTmcxbGhvOU51aDZEdGpWUjZGcWFZdlovTHM2cm5sYTFmVFdjYnVha0NOcm1yZUkKZEljTUhsKzVuaTM2cTFNcjNMdDJQcE5NQ0FpTUhxSWpITlJxclNLNm1RRXViV1hMdmlSbVZTUkxRRVN4RzlmaHdvWEEzaEEvUGUyNAovUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcDZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiCmgrMHQrbnZ1akFyanFXYUpHY3RCK2QxRU5tSFA0bmRHeUgzMjlKS0JOdjNiTlBGeWZ2TU1GcjIwRlFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVCeC9TNTV6YXdtNmlRTFN3ZWxBUVVIVEV5TDB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk90REl1ClVGVWFOVTUyUTNFZzc1TjNUaFZ3TG9mRHdSMXQzTXUxSjlRc1Z0RlNVenBFMG5QSXhCc0ZaVnBpa3B6dVFZMHgyK2MwNmxraDFRRjYKMTJTNFpEbk55ZTJ2N1VzRFNLZWdtUUdBM0dXak5xNWxXVWhQZ2t2SVpmRlhIZVZaTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyMwpXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHVvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5Ci9aRnZnckcrQ0pQYkZFZnhvamZIUlo0OHgzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IFByZW1pdW0KPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0TUI0WERURXdNREV5Ck9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnkKZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4QkxmcVYvK1FkM2Q5WitLNC9hczRUeDRtcnpZOEg5Nm9ETXEzSTBnVzY0dGIrZVQyVFp3YW1qUGpsR2poVnRuCkJLQVFKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaK2pqZVJGY1YKNWZpTXlObEk0ZzBXSngwZXlJT0ZKYmU2cWxWQnpBTWlTeTJSall2bWlhOW14K24vSytrOHJOclNzOFBoYUp5SitIb0FWdDcwVlpWcworN3BrM1dLTDN3dDNNdXRpekNhYW03dXFZb05NdEFaNk1NZ3B2KzBHVFplNUhNUXhLOVZmdkZNU0Y1eVpWeWxtZDJFaE1RY3VKVW1kCkdQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3NzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVIKcDlFaXhBcW5PRWhzcy9uL2ZhdUdWK082MW9WNGQ3cEQ2a2gvOXRpK0kyMGV2OUUyYkZoYzhlNmtHVlFhOVFQU2R1YmhqTDA4czlOSQpTK0xJK0grU3FIWkduRUpsUHFRZXdRY0RXa1l0dUpmenQ5V3lWU0h2dXR4TUFKZjdGSlVuTTcvb1EwZEcwZ2laRm1BN21uN1M1dTA0CjZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYUMxbkVXVEozczd4Z2FWWTUKL2JRR2V5eldaRGJadlVqdGhCOStwU0tQS3JoQzlJSzMxRk9RZUU0dEd2MkJiMFRYT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbworTnoyc25tS3RtY0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXYKTWlQSXMwbGFVWngyS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCOE9XeWN2cEVnak5DCjZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFFNS1NPeUFSaXFjVHROZDU2bCswT09GNlMKTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYzBqbHpDRmZlbVFhMFc1MFFCdUhDQUtpNEhFb0NDaFRRd1VISworNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRdTRtR2sraWJ5UTg2cDNxNG9mQjRSdnI4TnkvbGlvVHozLzRFMmFGb29DOGs0Z21WCkJ0V1Z5dUVrbHV0ODlwTUZ1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmcKSXhwSFlvV2x6QmswZ0crenJCcmpuL0I3U0szVkFkbG50cWx5aytvdFpyV3l1T1E5UExMdlRJenE2d2UvcXpXYVZZYThHS2ExcUY2MApnMnhyYVVEVG45enh3MmxydWVGdENmVHhxbEIyQ25wOWVoZWhWWlpDbVRFSjNXQVJqUVV3ZnVhT1J0R2RGTnJIRitRRmxvekVKTFViCnp4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlS2VDMnVBbG9HUndZUXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgpCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRJRVZEUXpBZUZ3MHhNREF4Ck1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUpCZ05WQkFZVEFsVlRNUlF3RWdZRFZRUUtEQXRCWm1acGNtMVUKY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdFZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQQpJZ05pQUFRTk1GNGJGWjBEMEtGNU5iYzZQSko2eWhVY3pXTHpuQ1pjQnozbFZQcWoxc3dTNnZRVVgraU9HYXN2TGtqbXJCaERlS3pRCk44TzlzczBzNWtmaUd1Wmp1RDB1TDNqRVQ5djBENlJvVEZWeWE1VWRUaGhDbFhqTU56eVI0cHRsS3ltalFqQkFNQjBHQTFVZERnUVcKQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBSwpCZ2dxaGtqT1BRUURBd05uQURCa0FqQVhDZk9IaUZCYXI4akFRcjlIWC9Wc2FvYmd4Q2QwNURoVDF3Vi9HelRqeGkrenlnazhONTNYCjU3aEc4ZjJoNG5FQ01FSlpoMFBVVWQrNjB3a3lXczZJZmxjOW5GOUNhL1VITGJYd2dwUDVXVyt1WlBwWTVZc2U0Mk8rdFlITmJ3S00KZVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk1NU0l3SUFZRFZRUUsKRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVY25WemRHVmtJRTVsZEhkdmNtc2dRMEV3SGhjTk1EZ3hNREl5Ck1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTNXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlUKWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNU0l3SUFZRFZRUURFeGxEWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIVVYrcnBES21ZWWUyYmcrRzBqQUMKbC9qWGFWZWhHRGxkYW1SNXhnRlpyRHd4U2poODBnVFNTeWpvSUY4N0I2TE1UWFBiODY1UHgxYlZXcWVXaWZyenEyalVJNFpaSjg4SgpKN3lzYm5LREhEQnkzK0NpNmRMaGRIVVp2U3FlZXhWVUJCdlhRem10VlNqRjRocTc5TURrcmpoSk04eDJoWjg1UmRLa252SVNqRkg0CmZPUXRmL1dzWCtzV243RXQwYnJNa1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzAKY3ZXMFFNOHhBY1BzM2hFdEYxMGZ1RkRSWGhtbmFkNEhNeWpLVUpYNXAxVExWSVpRUmFuNVNRSURBUUFCbzBJd1FEQVBCZ05WSFJNQgpBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlFJZHMzTEIvOGs5c1hON2J1UXZPS0VOMFoxOXpBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eXNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2oKalNmZUM0SmowTzdlRERkNVFWc2lzckNhUVZ5bWNPRFUwSGZMSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMQptUzFGaElybFFnblhkQUl2OTRuWW1lbThKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqClp0M2hydkpCVzhxWVZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0aW5vbWlzIC0gQXV0b3JpdMODwqkgUmFjaW5lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGbkRDQ0E0U2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SkdVakVUTUJFR0ExVUVDaE1LClEyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEpqQWtCZ05WQkFNTUhVTmxjblJwYm05dGFYTWcKTFNCQmRYUnZjbWwwdzZrZ1VtRmphVzVsTUI0WERUQTRNRGt4TnpBNE1qZzFPVm9YRFRJNE1Ea3hOekE0TWpnMU9Wb3dZekVMTUFrRwpBMVVFQmhNQ1JsSXhFekFSQmdOVkJBb1RDa05sY25ScGJtOXRhWE14RnpBVkJnTlZCQXNURGpBd01ESWdORE16T1RrNE9UQXpNU1l3CkpBWURWUVFEREIxRFpYSjBhVzV2YldseklDMGdRWFYwYjNKcGRNT3BJRkpoWTJsdVpUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dJUEFEQ0NBZ29DZ2dJQkFKMkZuNGJUNDYvSHNtdHVNK0NldDBJMFZaMzVnYjVqMkNOMkRwZFV6WmxNR3ZFNXg0allGMUFNbm1IYQp3RTVWM3VkYXVIcE9kNGNONWJqcitwNWVleDdFenloMHg1UDFGTVlpS0FUNWtjT3JKM05xRGk1Tjh5NG9IM0RmVlM5TzdjZHhid2x5Ckx1M1ZNcGZROFZoMzBXQzhUbDdibW9UMlIyRkZLL1pRcG45cWNTZEloRFdlclA1cHFaNTZYalVsK3JTblNUVjNscWMyVytITjN5TncKMkYxTXBRaUQ4YVlrT0JPbzdDK29vV2ZIcGkyR1IrNksvT3liRG5UMEswa0NlNUIxalB5Wk9RRTUxa3FKNVo1MnF6NldLRGdtaTkyTgpqTUQyQVI1dnBURVNPSDJWd25IdTdYU3U1RGFpUTNYVjhRQ2I0dVRYekVJRFMzaDY1WDI3dUs0dUlKUFQ1R0hmY2VGMlo1Yy90dDlxCmMxcGtJdVZDMjgrQkE1UFk5T01RNEhMMkFIQ3M4TUY2RHdWL3p6UnBSYldUNUJuYlVoWWpCWWtPalVqa0pXK3plTDlpOVFmNmxTVEMKbHJMb295UENYUVA4dzlQbGZNbDFJOWYwOWJ6ZTVOL05nTCtSaUgybkU3UTV1aXk2dmRGcnpQT2xLTzFFbm4xU28yK1dMaGwrSFBOYgp4eGFPdTJCOWQyWkhWSUlBRVdCc01zR29PQnZyYnBnVDF1NDQ5ZkNmRHUvK01ZSEIwaVNWTDFONmFhTHdENFpGamxpQ0swd2kxRjZnCjUzMG1KMGpmSlVhTlNpaDhocDc1bXhwWnVXVy9CZDIyUWwwOTVnQklnbDRnOXhHQzNzclluK1kzUnlZZTYzajNZY05CWkZnQ1FmbmEKNE5INCtlajlVamkyOVluZkFnTUJBQUdqV3pCWk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCUU5qTFpoMmtTNDBSUjl3NzU5WGtqd3pzcHFzREFYQmdOVkhTQUVFREFPTUF3R0NpcUJlZ0ZXQWdJQUFRRXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0lCQUNRK1lBWitIZTg2UHR2cXJ4eWFMQUVMOU1XMTJVa3g5RjFCallrTVR2OXNvdjMvNGdiSU9aL3gKV3FuZElsZ1ZxSXJUc2VZeUNZSURiTmMvQ01mNHVib0FiYm5XL0ZJeVhhUi9wREdVdTdaTU9IOG9NRFgvbnlOVHQ3YnVGSEFBUUN2YQpSNnMwZmw2blZqQmhLNHREclAyMmlDajFhN1krWUVxNlFwQTBaNDNxNjE5RlZEc1hySXZreG1VUDd0Q01YV1k1empLbjJCQ1h3SDQwCm5KK1U4L2FHSDg4YmM2MlVlWWRvY01NenBYRG4yTlU0bEc5amVldS9DZzRJNThVdkQwS2dLeFJBL3lIZ0JjVW40WVFSRTdyV2hoMUIKQ3hNamlkUEpDK2lLdW5xam8zTTNOWUI5RXJnemQwQTR3UHBlTU5MeXRxT3gxcUtWbDRHYlV1MXBUUCtBNUZQYlZGc0RiVlJmc2JqdgpKTDF2bnhIRHgyVENEeWhpaFdaZUdudXl0Kyt1TmNrWk02aTRKOXN6VmI5bzRYVklSRmI3emROSXUwZUpPcXhwOVlERzVFUlFMMVRFCnFrUEZNVEZZdlpiRjZuVnNtbld4VGZqM2wvK1dGdktYVGVqMjh4SDVPbjJLT0c0RXkrSFRSUldxcGRFZG5WMWo2Q1RtTmhUaWg2MGIKV2ZWRW0vdlhkM3dmQVhCaW9TQWFvc1VhS1BRaEErNHUyY0dBNnJuWmd0WmJkc0xMTzdYU0FQQ2pEdUd0YmtEMzI2QzAwRWF1RmRkRQp3azAxK2RJTDhoZjJyR2JWSkxKUDBSeVp3RzcxZmV0MEJMajVUWGNKMTdUUEJ6QUo4YmdBVnRrWEZoWUtLNGJmandFWkd1VzdnbVAvCnZndDJGbDQzTitiWWRKZWltVVY1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClJvb3QgQ0EgR2VuZXJhbGl0YXQgVmFsZW5jaWFuYQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdpekNDQlhPZ0F3SUJBZ0lFTzBYbGFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SkZVekVmTUIwR0ExVUUKQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUVDeE1HVUV0SlIxWkJNU2N3SlFZRFZRUURFeDVTYjI5MApJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtRXdIaGNOTURFd056QTJNVFl5TWpRM1doY05NakV3TnpBeE1UVXlNalEzCldqQm9NUXN3Q1FZRFZRUUdFd0pGVXpFZk1CMEdBMVVFQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUUKQ3hNR1VFdEpSMVpCTVNjd0pRWURWUVFERXg1U2IyOTBJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtRXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREdLcXRYRVRjdklvcktBM1FkeXUwdG9ndThNMUpBSmtlK1dtbW1PM0kyCkYwem8zN2k3TDNiaFFFWjBaUUtRVWdpMC82aU13ZURIaVZZUU9UUHZhTFJmWDlwdEk2R0pYaUtqU2did0ovQlh1ZmpwVGpKM0NqOUIKWlBQclplNTIvbFNxZlIwZ3J2UFhkTUlLWC9VSUtGSUl6RlZkMGcvYm1vR2x1Nkd6d1pUTlZPQXlkVEdSR21LeTNuWGl6MCtKMlpHUQpEMEVidEZwS2Q3MW5nK0NUNTE2bkRPZUIwL1JTckZPeUE4ZEVKdnQ1NWNzMFlGQVFleHZiYTlkSHExOThhTXB1blVFREVPNXJtWHRlCkphakNxK1RBODF5YzQ3N09NVXhrSGw2QW92V0RmZ3pXeW94VmpyN2d2a2tIRDZNa1FYcFlIWVRxV0JMSTRiZnQ3NVBlbEFneEFnTUIKQUFHamdnTTdNSUlETnpBeUJnZ3JCZ0VGQlFjQkFRUW1NQ1F3SWdZSUt3WUJCUVVITUFHR0ZtaDBkSEE2THk5dlkzTndMbkJyYVM1bgpkbUV1WlhNd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQ0NBalFHQTFVZElBU0NBaXN3Z2dJbk1JSUNJd1lLS3dZQkJBRy9WUUlCCkFEQ0NBaE13Z2dIb0JnZ3JCZ0VGQlFjQ0FqQ0NBZG9lZ2dIV0FFRUFkUUIwQUc4QWNnQnBBR1FBWVFCa0FDQUFaQUJsQUNBQVF3QmwKQUhJQWRBQnBBR1lBYVFCakFHRUFZd0JwQVBNQWJnQWdBRklBWVFEdEFIb0FJQUJrQUdVQUlBQnNBR0VBSUFCSEFHVUFiZ0JsQUhJQQpZUUJzQUdrQWRBQmhBSFFBSUFCV0FHRUFiQUJsQUc0QVl3QnBBR0VBYmdCaEFDNEFEUUFLQUV3QVlRQWdBRVFBWlFCakFHd0FZUUJ5CkFHRUFZd0JwQVBNQWJnQWdBR1FBWlFBZ0FGQUFjZ0RoQUdNQWRBQnBBR01BWVFCekFDQUFaQUJsQUNBQVF3QmxBSElBZEFCcEFHWUEKYVFCakFHRUFZd0JwQVBNQWJnQWdBSEVBZFFCbEFDQUFjZ0JwQUdjQVpRQWdBR1VBYkFBZ0FHWUFkUUJ1QUdNQWFRQnZBRzRBWVFCdApBR2tBWlFCdUFIUUFid0FnQUdRQVpRQWdBR3dBWVFBZ0FIQUFjZ0JsQUhNQVpRQnVBSFFBWlFBZ0FFRUFkUUIwQUc4QWNnQnBBR1FBCllRQmtBQ0FBWkFCbEFDQUFRd0JsQUhJQWRBQnBBR1lBYVFCakFHRUFZd0JwQVBNQWJnQWdBSE1BWlFBZ0FHVUFiZ0JqQUhVQVpRQnUKQUhRQWNnQmhBQ0FBWlFCdUFDQUFiQUJoQUNBQVpBQnBBSElBWlFCakFHTUFhUUR6QUc0QUlBQjNBR1VBWWdBZ0FHZ0FkQUIwQUhBQQpPZ0F2QUM4QWR3QjNBSGNBTGdCd0FHc0FhUUF1QUdjQWRnQmhBQzRBWlFCekFDOEFZd0J3QUhNd0pRWUlLd1lCQlFVSEFnRVdHV2gwCmRIQTZMeTkzZDNjdWNHdHBMbWQyWVM1bGN5OWpjSE13SFFZRFZSME9CQllFRkhzMTAwRFNISGdaWnU5MEVDamNQayt5ZUFUOE1JR1YKQmdOVkhTTUVnWTB3Z1lxQUZIczEwMERTSEhnWlp1OTBFQ2pjUGsreWVBVDhvV3lrYWpCb01Rc3dDUVlEVlFRR0V3SkZVekVmTUIwRwpBMVVFQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUVDeE1HVUV0SlIxWkJNU2N3SlFZRFZRUURFeDVTCmIyOTBJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtR0NCRHRGNVdnd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFDUmgKVHZXMXlFSUNLck5jZGEzRmJjcm5sRCtsYUpXSXdWVEFFR21pRWk4WVB5VlFxSHhLNnNZSjJmUjF4a0RhcjFDZFBhVVd1MjB4eHNkegpDa2orSUhMdGI4em9nMkVXUnBBQmxVdDlqcHBTQ1MvMmJ4emtvWEhQakNwYUYzT0RSMDBQTnZzRVRVbFI0aFRKWkdINzFCVGc5SjYzCk5JOEtKcjJYWFBSNU9rb3dHY3l0VDZDWWlyUXhseXJpYzIxK2VMajRpSWxQc1NLUlpFdjFVTjREMitYRmR1Y1RablYrWmZzQm41T0gKaUozNVJsZDhUV0N2bUhNVEk2UWdrWUg2MEdGbXVIM1JyOVp2SG13OTZSSDlxZm1DSW9hWk0zRmE2aGxYUFpITnFjQ2piZ2NUcHNudAorR2lqbnNOYWNnbUhLTkhFYzhSekdGOVFkUll4bjdmb2ZNTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQS1UcnVzdC1uUXVhbC0wMwo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEenpDQ0FyZWdBd0lCQWdJREFXd2VNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR05NUXN3Q1FZRFZRUUdFd0pCVkRGSU1FWUdBMVVFCkNndy9RUzFVY25WemRDQkhaWE11SUdZdUlGTnBZMmhsY21obGFYUnpjM2x6ZEdWdFpTQnBiU0JsYkdWcmRISXVJRVJoZEdWdWRtVnkKYTJWb2NpQkhiV0pJTVJrd0Z3WURWUVFMREJCQkxWUnlkWE4wTFc1UmRXRnNMVEF6TVJrd0Z3WURWUVFEREJCQkxWUnlkWE4wTFc1UgpkV0ZzTFRBek1CNFhEVEExTURneE56SXlNREF3TUZvWERURTFNRGd4TnpJeU1EQXdNRm93Z1kweEN6QUpCZ05WQkFZVEFrRlVNVWd3ClJnWURWUVFLREQ5QkxWUnlkWE4wSUVkbGN5NGdaaTRnVTJsamFHVnlhR1ZwZEhOemVYTjBaVzFsSUdsdElHVnNaV3QwY2k0Z1JHRjAKWlc1MlpYSnJaV2h5SUVkdFlrZ3hHVEFYQmdOVkJBc01FRUV0VkhKMWMzUXRibEYxWVd3dE1ETXhHVEFYQmdOVkJBTU1FRUV0VkhKMQpjM1F0YmxGMVlXd3RNRE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3RQV0Z1QS9PUU84QkJDNFNBCnpld3FvNTFydTI3Q1FvVDNVUlRob0tndFVhTlI4dDRqOERSRS81VHJ6QVVqbFVDNUIzaWxKZllLdlVXRzZObTl3QVNPaFVSaDczK24KeWZyQkpjeUZMR00vQldCelNRWGdZSGlWRUV2YytSRlp6bkYvUUp1S3FpVGZDMExpMjFhOFN0S2xESnUzUXo3ZGc5TW1FQUxQNmlQRQpTVTdsMCttMGlLc01ybUtTMUdXSDJXclg5SVdmNURNaUphWGx5RE82dzhkQjNGL0dhc3dBRG0weXFMYUhOZ0JpZDVzZUh6VExrRHg0CmlIUUY2M24xazNGbHlwM0hheGd0UFZ4TzU5WDRQekY5ajRmc0NpSXZJK24rdTMzSjRQVHM2M3pFc01NdFlyV2FjZGF4YXVqczJlM1YKY3V5K1Z3SE9CVldmM3RGZ2lCQ3pBZ01CQUFHak5qQTBNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdFUVlEVlIwT0JBb0VDRVJxbFdkVgplUkZQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBVmRSVTBWbElYTE9UaGFxL1l5L2tnTTQwCm96UmlQdmJZN21lSU1RUURid3ZVQi90T2RRL1RMdFBBRjhmR0tPd0dEUkVrRGc2bFhiK01zaE9XY2R6VXpnNE5DbWd5YkxsQk1SbXIKc1FkN1RaalRYTERSOEtkQ29MWEVqcS8rOFQvMDcwOUdBSGJyQXZ2NW5kSkFsc2VJT3JpZkVYbnpnR1dvdlIvVGVJR2dVVXczdEtaZApKWERSWnNsbytTNFJGR2p4VkpnSXJDYVNEOTZKbnRUNnMza3IwcU41MU95THJJZFRhRUpNVVZGMEhoc25MdVAxSHlsMFRlMnY5K0dTCm1ZSG92anJIRjFEMnQ4YjhtN0NLYTlhSUE1R1BCbmM2aFFMZG1OVkRlRC9HTUJXc20ydkxWN2VKVVlzNjZNbUVETnV4VUNBS0drcTYKYWhxOTdCdkl4WVNhelE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZXpDQ0FtT2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKClZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNeldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRRwpFd0pVVnpFU01CQUdBMVVFQ2d3SlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CCklGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkVBY0swSE1NeApRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISEszWExmSit1dGRHZEl6ZGpwOXhDCm9pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYUmZ3WlZ6c3JiK1JIOUpsRi9oM3grSmVqaUIwM0hGeVAKNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3pyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcgp5K1VQaXpnTjdncjgvZytZbnpBeDNXeFNaZm1MZ2I0aTRSeFlBN3FSRzRrSEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFPRnNtamQ2TFd2SlBlbFNER1JqakNEV211akFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDTUVySmsvOXE1NllBZjRsQwptdFlSNVZQT0w4enkyZ1hFL3VKUXhEcUdmY3phZmhBSk81STFLbE95L3VzckJkbHNYZWJRNzlOcVpwNFZLSVY2NklJQXJCNm5DV2xXClF0Tm9VUmkrVkpxL1JFRzZTYjRndW1sYzdyaDN6YzVzSDYyRGxoaDlEclVVT1lUeEtPa3RvNTU3SG5weVdvT3plVy92dFB6UUNxVlkKVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueQpZaDBpZ3p5WHhma1pZaWVzWlNMWDB6ekc1WTZ5VTh4Snpyd3cvbnNPTTVENzdkSVVrUjhIcnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURCZE1Rc3dDUVlEVlFRR0V3SktVREVsTUNNR0ExVUVDaE1jClUwVkRUMDBnVkhKMWMzUWdVM2x6ZEdWdGN5QkRUeTRzVEZSRUxqRW5NQ1VHQTFVRUN4TWVVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmgKZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWERUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQwpTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5ZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5CmFYUjVJRU52YlcxMWJtbGpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU5BVk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3J6YmwrZHArKworVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTVZBWDNOdVJGZzNzVVpkYmNERTNSCjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRaE5CcXlqb0dBRGRINUg1WFR6K0w2MmU0aUtyRnZsTlYKc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V09vam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xSwpFT3RPZ2hZNnJDY01VL0d0MVNTd2F3TlF3UzA4RnQxRU5DY2FkZnNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkFxRnFYZGxCWmg4ClFJSDRENWNzT1BFSzdEelBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUIKQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGY29KeERqclN6RytudEtFagp1L1lrbjhzWC9veW16c0xTMjh5Ti9ISDhBeW5CYkYwelgyUzJaVHVKYnhoMmVQWGNva2dmR1QrT2srdngraGZ1elU3akJCSlYxdVhrCjNmcytCWHppSFY3R3A3eVhUMmc2OWVrdUNrTzJyMWRjWW1oOHQvMmppb1NnckdLK0t3bUhOUEJxQWJ1YktWWTgvZ0EzenlOczhVNnEKdG5SR0VteVI3alRWN0pxUjUwUytrREZ5MVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOQptdlZYSXdBSElSYy9Tam5SQlVrTHA3WTNnYVZkaktvelhvRW9mS2Q5SitzQXJvMDMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRUMtQUNDCj09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlZqQ0NCRDZnQXdJQkFnSVE3aXM5NjlRaDNoU29ZcXdFODkzRUFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQjh6RUxNQWtHQTFVRQpCaE1DUlZNeE96QTVCZ05WQkFvVE1rRm5aVzVqYVdFZ1EyRjBZV3hoYm1FZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2SUNoT1NVWWdVUzB3Ck9EQXhNVGMyTFVrcE1TZ3dKZ1lEVlFRTEV4OVRaWEoyWldseklGQjFZbXhwWTNNZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2TVRVd013WUQKVlFRTEV5eFdaV2RsZFNCb2RIUndjem92TDNkM2R5NWpZWFJqWlhKMExtNWxkQzkyWlhKaGNuSmxiQ0FvWXlrd016RTFNRE1HQTFVRQpDeE1zU21WeVlYSnhkV2xoSUVWdWRHbDBZWFJ6SUdSbElFTmxjblJwWm1sallXTnBieUJEWVhSaGJHRnVaWE14RHpBTkJnTlZCQU1UCkJrVkRMVUZEUXpBZUZ3MHdNekF4TURjeU16QXdNREJhRncwek1UQXhNRGN5TWpVNU5UbGFNSUh6TVFzd0NRWURWUVFHRXdKRlV6RTcKTURrR0ExVUVDaE15UVdkbGJtTnBZU0JEWVhSaGJHRnVZU0JrWlNCRFpYSjBhV1pwWTJGamFXOGdLRTVKUmlCUkxUQTRNREV4TnpZdApTU2t4S0RBbUJnTlZCQXNUSDFObGNuWmxhWE1nVUhWaWJHbGpjeUJrWlNCRFpYSjBhV1pwWTJGamFXOHhOVEF6QmdOVkJBc1RMRlpsCloyVjFJR2gwZEhCek9pOHZkM2QzTG1OaGRHTmxjblF1Ym1WMEwzWmxjbUZ5Y21Wc0lDaGpLVEF6TVRVd013WURWUVFMRXl4S1pYSmgKY25GMWFXRWdSVzUwYVhSaGRITWdaR1VnUTJWeWRHbG1hV05oWTJsdklFTmhkR0ZzWVc1bGN6RVBNQTBHQTFVRUF4TUdSVU10UVVORApNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXN5TEhUK0tYUXBXSVI0TkE5aDBYODROekpCNVI4NWlLCnc1SzQvMENRQlhDSFlNa0FxYldVWlJraUZSZkNRMnhtUkpvTkJENDViNlZMZXFwanQ0cEVuZGxqa1lSbTRDZ1B1a0xqYm83M0ZDZVQKYWU2UkRxTmZEckhyWnFKeVR4SVRobVY2UHR0UEIvU25DV0RhT2tLWng3Si9zeGFWSE1mNU5MV1VoZFdaWHFCSW9IN25GMlc0b25XNApIdlBsUW4ydjdmT0tTR1JkZ2hTVDJNRGsvN05RY3ZKMjlyTmRRbEI1MEpRK2F3d0F2dGhyRGs0cTdEN1N6SUtpR0dVekUzZWVtbDBhCkU5akQyejNJbDNydWNPMm41bnpiY2M4dGxHTGZiZGIxT0w0L3BZVUtHYmlvMkFsMVFuREU2dS9MRHNnMHFCSWltQXk0RTVTMlMrencKMEpEbkp3SURBUUFCbzRIak1JSGdNQjBHQTFVZEVRUVdNQlNCRW1WalgyRmpZMEJqWVhSalpYSjBMbTVsZERBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVW9NT0xSS28zcFVXL2w0QmEwZkY0b3B2cFhZMHdmd1lEClZSMGdCSGd3ZGpCMEJnc3JCZ0VFQWZWNEFRTUJDakJsTUN3R0NDc0dBUVVGQndJQkZpQm9kSFJ3Y3pvdkwzZDNkeTVqWVhSalpYSjAKTG01bGRDOTJaWEpoY25KbGJEQTFCZ2dyQmdFRkJRY0NBakFwR2lkV1pXZGxkU0JvZEhSd2N6b3ZMM2QzZHk1allYUmpaWEowTG01bApkQzkyWlhKaGNuSmxiQ0F3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUtCSVc0SUI5azFJdURsVk5aeUFlbE9aMVZyL3NYRTd6RGtKCmxGN1cydSsrQVZ0ZDB4N1kvWDFQemFCQjREU1R2OHZpaHB3M2twQldITnpyS1FYbHhKN0hOZCtLRE0zRklVUHBxb2psTmNBWlFtTmEKQWw2a1NCZzZoVy9jbmJ3L25aekJoN2g2WVFqcGR3dC9jS3Q2M2RtWExHUWVoYis4ZEphaHczb1M3QXdhYm9NTVBPaHlScC83U05WZQpsK2F4b2ZqazcwWWxsSnlKMjJrNHZ1eGNEbGJIWlZIbFVJaUl2MExWS3ozbCticWVMclBLOUhPU0FndStUR2JySVA2NXk3V1pmK2EyCkUvcktTMDNaN2xOR0JqdkdUcTJUV29GK2JDcExhZ1ZGalBJaHBER1FoMnhsbkoybFlKVTZVbi8xMGFzSWJ2UHVXL21JUFg2NGIyNEQKNUVJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNVENDQXhtZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCbFRFTE1Ba0dBMVVFQmhNQ1IxSXhSREJDQmdOVkJBb1QKTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eQphWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6CklGSnZiM1JEUVNBeU1ERXhNQjRYRFRFeE1USXdOakV6TkRrMU1sb1hEVE14TVRJd01URXpORGsxTWxvd2daVXhDekFKQmdOVkJBWVQKQWtkU01VUXdRZ1lEVlFRS0V6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1egpJRU5sY25RdUlFRjFkR2h2Y21sMGVURkFNRDRHQTFVRUF4TTNTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vCklFbHVjM1JwZEhWMGFXOXVjeUJTYjI5MFEwRWdNakF4TVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQUtsVEFPTXVwdmFPK21EWUxaVSsrQ3dxVkU3TnVZUmhsRmhQanoyTDVFUHpkWW1OVWVURE45S0tpRTE1SHJjUzNVTjRTb3FTNXRkSQoxUStrT2lsRU5iZ0g5bWdkVmMwNFVmQ01KREdGcjRQSmZlbDNyKzBhZTUwWCtiT2RPRkFQcGxwNWtZQ3ZONjZtMHpIN3RTWUpuVHhhCjcxSEZLOStXWGVzeUhnTGFjRW5zYmd6SW1qZU45L0UyWUVzbUxJS2UwSGp6RFE5anBGRXc0ZmtySnhJSDJPcTlHR0tZc0ZrM2ZiN3UKOHlCUlFscUQ3NU82YVJYeFlwMmZtVG1Db2JkMExvdlV4UXQ3TC9ESUN0bzllUXFha3h5bEtISnprVU9hcDlGTmhZUzVxWFNQRkVESAozTjZzUVdSc3RCbWJBbU50SkdTUFJMSWw2czVkZEF4ak1seU5oK1VDQXdFQUFhT0JpVENCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1Bc0dBMVVkRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVcHBGQy9STmhTaU9lQ0tRcDVkZ1RCQ1B1UVNVd1J3WURWUjBlQkVBd1BxQTgKTUFXQ0F5NW5jakFGZ2dNdVpYVXdCb0lFTG1Wa2RUQUdnZ1F1YjNKbk1BV0JBeTVuY2pBRmdRTXVaWFV3Qm9FRUxtVmtkVEFHZ1FRdQpiM0puTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0ClhkTWlLYWhzb2cycDZ6MEdXNWs2eDh6RG1qUi9xdzdJVGh6aCt1VGN6UTIrdnlUK2JPZHJ3ZzNJQnA1T2pXRW9wbXI5NWZaaTZoZzgKVHFCVG5iSTZuT3VsbkpFV3RrMkM0QXdGU0tsczljejR5NTFKdFBBQ3BmMXdBKzJLSWFXdUU0Wkp3ek56dm9jN2RJc1hSU1pNRnBHRAovbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzTm5xL29uTjY5NC9CdFpxaEZMS1BNNThOCjd5TGNabnVFdlVVWEJqMDh5cmwzTkkvSzZzOC9NVDdqaU9PQVNTWElsN1dkbXBsTnNEejRTZ0NiWk4yZk9VdlJKOWU0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K ###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/cacert.pem,importbuddy/lib/requestcore/cacert.pem ###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/index.php,importbuddy/lib/requestcore/index.php PD9waHAgLy8gU2lsZW5jZSBpcyBnb2xkZW4u ###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/index.php,importbuddy/lib/requestcore/index.php ###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/requestcore.class.php,importbuddy/lib/requestcore/requestcore.class.php PD9waHAKLyoqCiAqIEhhbmRsZXMgYWxsIEhUVFAgcmVxdWVzdHMgdXNpbmcgY1VSTCBhbmQgbWFuYWdlcyB0aGUgcmVzcG9uc2VzLgogKgogKiBAdmVyc2lvbiAyMDEyLjAxLjE3CiAqIEBjb3B5cmlnaHQgMjAwNi0yMDExIFJ5YW4gUGFybWFuCiAqIEBjb3B5cmlnaHQgMjAwNi0yMDEwIEZvbGVlbyBJbmMuCiAqIEBjb3B5cmlnaHQgMjAxMC0yMDExIEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCiAqIEBjb3B5cmlnaHQgMjAwOC0yMDExIENvbnRyaWJ1dG9ycwogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICovCmNsYXNzIFJlcXVlc3RDb3JlCnsKCS8qKgoJICogVGhlIFVSTCBiZWluZyByZXF1ZXN0ZWQuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF91cmw7CgoJLyoqCgkgKiBUaGUgaGVhZGVycyBiZWluZyBzZW50IGluIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlcXVlc3RfaGVhZGVyczsKCgkvKioKCSAqIFRoZSBib2R5IGJlaW5nIHNlbnQgaW4gdGhlIHJlcXVlc3QuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF9ib2R5OwoKCS8qKgoJICogVGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5IHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlc3BvbnNlOwoKCS8qKgoJICogVGhlIGhlYWRlcnMgcmV0dXJuZWQgYnkgdGhlIHJlcXVlc3QuCgkgKi8KCXB1YmxpYyAkcmVzcG9uc2VfaGVhZGVyczsKCgkvKioKCSAqIFRoZSBib2R5IHJldHVybmVkIGJ5IHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlc3BvbnNlX2JvZHk7CgoJLyoqCgkgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgcmVxdWVzdC4KCSAqLwoJcHVibGljICRyZXNwb25zZV9jb2RlOwoKCS8qKgoJICogQWRkaXRpb25hbCByZXNwb25zZSBkYXRhLgoJICovCglwdWJsaWMgJHJlc3BvbnNlX2luZm87CgoJLyoqCgkgKiBUaGUgaGFuZGxlIGZvciB0aGUgY1VSTCBvYmplY3QuCgkgKi8KCXB1YmxpYyAkY3VybF9oYW5kbGU7CgoJLyoqCgkgKiBUaGUgbWV0aG9kIGJ5IHdoaWNoIHRoZSByZXF1ZXN0IGlzIGJlaW5nIG1hZGUuCgkgKi8KCXB1YmxpYyAkbWV0aG9kOwoKCS8qKgoJICogU3RvcmVzIHRoZSBwcm94eSBzZXR0aW5ncyB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHByb3h5ID0gbnVsbDsKCgkvKioKCSAqIFRoZSB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHVzZXJuYW1lID0gbnVsbDsKCgkvKioKCSAqIFRoZSBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHBhc3N3b3JkID0gbnVsbDsKCgkvKioKCSAqIEN1c3RvbSBDVVJMT1BUIHNldHRpbmdzLgoJICovCglwdWJsaWMgJGN1cmxvcHRzID0gbnVsbDsKCgkvKioKCSAqIFRoZSBzdGF0ZSBvZiBkZWJ1ZyBtb2RlLgoJICovCglwdWJsaWMgJGRlYnVnX21vZGUgPSBmYWxzZTsKCgkvKioKCSAqIFRoZSBkZWZhdWx0IGNsYXNzIHRvIHVzZSBmb3IgSFRUUCBSZXF1ZXN0cyAoZGVmYXVsdHMgdG8gPFJlcXVlc3RDb3JlPikuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF9jbGFzcyA9ICdSZXF1ZXN0Q29yZSc7CgoJLyoqCgkgKiBUaGUgZGVmYXVsdCBjbGFzcyB0byB1c2UgZm9yIEhUVFAgUmVzcG9uc2VzIChkZWZhdWx0cyB0byA8UmVzcG9uc2VDb3JlPikuCgkgKi8KCXB1YmxpYyAkcmVzcG9uc2VfY2xhc3MgPSAnUmVzcG9uc2VDb3JlJzsKCgkvKioKCSAqIERlZmF1bHQgdXNlcmFnZW50IHN0cmluZyB0byB1c2UuCgkgKi8KCXB1YmxpYyAkdXNlcmFnZW50ID0gJ1JlcXVlc3RDb3JlLzEuNC40JzsKCgkvKioKCSAqIEZpbGUgdG8gcmVhZCBmcm9tIHdoaWxlIHN0cmVhbWluZyB1cC4KCSAqLwoJcHVibGljICRyZWFkX2ZpbGUgPSBudWxsOwoKCS8qKgoJICogVGhlIHJlc291cmNlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW0gPSBudWxsOwoKCS8qKgoJICogVGhlIHNpemUgb2YgdGhlIHN0cmVhbSB0byByZWFkIGZyb20uCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW1fc2l6ZSA9IG51bGw7CgoJLyoqCgkgKiBUaGUgbGVuZ3RoIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBzdHJlYW0uCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW1fcmVhZCA9IDA7CgoJLyoqCgkgKiBGaWxlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICovCglwdWJsaWMgJHdyaXRlX2ZpbGUgPSBudWxsOwoKCS8qKgoJICogVGhlIHJlc291cmNlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICovCglwdWJsaWMgJHdyaXRlX3N0cmVhbSA9IG51bGw7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIGludGVuZGVkIHN0YXJ0aW5nIHNlZWsgcG9zaXRpb24uCgkgKi8KCXB1YmxpYyAkc2Vla19wb3NpdGlvbiA9IG51bGw7CgoJLyoqCgkgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNhY2VydC5wZW0gZmlsZSB0byB1c2UuCgkgKi8KCXB1YmxpYyAkY2FjZXJ0X2xvY2F0aW9uID0gZmFsc2U7CgoJLyoqCgkgKiBUaGUgc3RhdGUgb2YgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4KCSAqLwoJcHVibGljICRzc2xfdmVyaWZpY2F0aW9uID0gdHJ1ZTsKCgkvKioKCSAqIFRoZSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgc3RyZWFtIGlzIHJlYWQgZnJvbS4KCSAqLwoJcHVibGljICRyZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrID0gbnVsbDsKCgkvKioKCSAqIFRoZSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgc3RyZWFtIGlzIHdyaXR0ZW4gdG8uCgkgKi8KCXB1YmxpYyAkcmVnaXN0ZXJlZF9zdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2sgPSBudWxsOwoKCS8qKgoJICogV2hldGhlciBvciBub3QgdGhlIHNldF90aW1lX2xpbWl0IGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQuCgkgKi8KCXB1YmxpYyAkYWxsb3dfc2V0X3RpbWVfbGltaXQgPSB0cnVlOwoKCS8qKgoJICogV2hldGhlciBvciBub3QgdG8gdXNlIGd6aXAgZW5jb2RpbmcgdmlhIENVUkxPUFRfRU5DT0RJTkcKCSAqLwoJcHVibGljICR1c2VfZ3ppcF9lbmNvbmRpbmcgPSB0cnVlOwoKCgkvKiUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiolKi8KCS8vIENPTlNUQU5UUwoKCS8qKgoJICogR0VUIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfR0VUID0gJ0dFVCc7CgoJLyoqCgkgKiBQT1NUIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfUE9TVCA9ICdQT1NUJzsKCgkvKioKCSAqIFBVVCBIVFRQIE1ldGhvZAoJICovCgljb25zdCBIVFRQX1BVVCA9ICdQVVQnOwoKCS8qKgoJICogREVMRVRFIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfREVMRVRFID0gJ0RFTEVURSc7CgoJLyoqCgkgKiBIRUFEIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfSEVBRCA9ICdIRUFEJzsKCgoJLyolKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJSovCgkvLyBDT05TVFJVQ1RPUi9ERVNUUlVDVE9SCgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdXJsIChPcHRpb25hbCkgVGhlIFVSTCB0byByZXF1ZXN0IG9yIHNlcnZpY2UgZW5kcG9pbnQgdG8gcXVlcnkuCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eSAoT3B0aW9uYWwpIFRoZSBmYXV4LXVybCB0byB1c2UgZm9yIHByb3h5IHNldHRpbmdzLiBUYWtlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogYHByb3h5Oi8vdXNlcjpwYXNzQGhvc3RuYW1lOnBvcnRgCgkgKiBAcGFyYW0gYXJyYXkgJGhlbHBlcnMgKE9wdGlvbmFsKSBBbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBjbGFzc25hbWVzIHRvIHVzZSBmb3IgcmVxdWVzdCwgYW5kIHJlc3BvbnNlIGZ1bmN0aW9uYWxpdHkuIEdldHMgcGFzc2VkIGluIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhbGxpbmcgY2xhc3MuCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHVybCA9IG51bGwsICRwcm94eSA9IG51bGwsICRoZWxwZXJzID0gbnVsbCkKCXsKCQkvLyBTZXQgc29tZSBkZWZhdWx0IHZhbHVlcy4KCQkkdGhpcy0+cmVxdWVzdF91cmwgPSAkdXJsOwoJCSR0aGlzLT5tZXRob2QgPSBzZWxmOjpIVFRQX0dFVDsKCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzID0gYXJyYXkoKTsKCQkkdGhpcy0+cmVxdWVzdF9ib2R5ID0gJyc7CgoJCS8vIERldGVybWluZSBpZiBzZXRfdGltZV9saW1pdCBjYW4gYmUgY2FsbGVkCgkJaWYgKHN0cnBvcyhpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAnc2V0X3RpbWVfbGltaXQnKSAhPT0gZmFsc2UpCgkJewoJCQkkdGhpcy0+YWxsb3dfc2V0X3RpbWVfbGltaXQgPSBmYWxzZTsKCQl9CgoJCS8vIFNldCBhIG5ldyBSZXF1ZXN0IGNsYXNzIGlmIG9uZSB3YXMgc2V0LgoJCWlmIChpc3NldCgkaGVscGVyc1sncmVxdWVzdCddKSAmJiAhZW1wdHkoJGhlbHBlcnNbJ3JlcXVlc3QnXSkpCgkJewoJCQkkdGhpcy0+cmVxdWVzdF9jbGFzcyA9ICRoZWxwZXJzWydyZXF1ZXN0J107CgkJfQoKCQkvLyBTZXQgYSBuZXcgUmVxdWVzdCBjbGFzcyBpZiBvbmUgd2FzIHNldC4KCQlpZiAoaXNzZXQoJGhlbHBlcnNbJ3Jlc3BvbnNlJ10pICYmICFlbXB0eSgkaGVscGVyc1sncmVzcG9uc2UnXSkpCgkJewoJCQkkdGhpcy0+cmVzcG9uc2VfY2xhc3MgPSAkaGVscGVyc1sncmVzcG9uc2UnXTsKCQl9CgoJCWlmICgkcHJveHkpCgkJewoJCQkkdGhpcy0+c2V0X3Byb3h5KCRwcm94eSk7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBEZXN0cnVjdHMgdGhlIGluc3RhbmNlLiBDbG9zZXMgb3BlbmVkIGZpbGUgaGFuZGxlcy4KCSAqCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCgl7CgkJaWYgKGlzc2V0KCR0aGlzLT5yZWFkX2ZpbGUpICYmIGlzc2V0KCR0aGlzLT5yZWFkX3N0cmVhbSkpCgkJewoJCQlmY2xvc2UoJHRoaXMtPnJlYWRfc3RyZWFtKTsKCQl9CgoJCWlmIChpc3NldCgkdGhpcy0+d3JpdGVfZmlsZSkgJiYgaXNzZXQoJHRoaXMtPndyaXRlX3N0cmVhbSkpCgkJewoJCQlmY2xvc2UoJHRoaXMtPndyaXRlX3N0cmVhbSk7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoKCS8qJSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiUqLwoJLy8gUkVRVUVTVCBNRVRIT0RTCgoJLyoqCgkgKiBTZXRzIHRoZSBjcmVkZW50aWFscyB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVzZXIgKFJlcXVpcmVkKSBUaGUgdXNlcm5hbWUgdG8gYXV0aGVudGljYXRlIHdpdGguCgkgKiBAcGFyYW0gc3RyaW5nICRwYXNzIChSZXF1aXJlZCkgVGhlIHBhc3N3b3JkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jcmVkZW50aWFscygkdXNlciwgJHBhc3MpCgl7CgkJJHRoaXMtPnVzZXJuYW1lID0gJHVzZXI7CgkJJHRoaXMtPnBhc3N3b3JkID0gJHBhc3M7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogQWRkcyBhIGN1c3RvbSBIVFRQIGhlYWRlciB0byB0aGUgY1VSTCByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGtleSAoUmVxdWlyZWQpIFRoZSBjdXN0b20gSFRUUCBoZWFkZXIgdG8gc2V0LgoJICogQHBhcmFtIG1peGVkICR2YWx1ZSAoUmVxdWlyZWQpIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGN1c3RvbSBIVFRQIGhlYWRlci4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRfaGVhZGVyKCRrZXksICR2YWx1ZSkKCXsKCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWyRrZXldID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFJlbW92ZXMgYW4gSFRUUCBoZWFkZXIgZnJvbSB0aGUgY1VSTCByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGtleSAoUmVxdWlyZWQpIFRoZSBjdXN0b20gSFRUUCBoZWFkZXIgdG8gc2V0LgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZV9oZWFkZXIoJGtleSkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPnJlcXVlc3RfaGVhZGVyc1ska2V5XSkpCgkJewoJCQl1bnNldCgkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWyRrZXldKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBtZXRob2QgdHlwZSBmb3IgdGhlIHJlcXVlc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbWV0aG9kIChSZXF1aXJlZCkgT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOiA8SFRUUF9HRVQ+LCA8SFRUUF9QT1NUPiwgPEhUVFBfUFVUPiwgPEhUVFBfSEVBRD4sIDxIVFRQX0RFTEVURT4uCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZCgkbWV0aG9kKQoJewoJCSR0aGlzLT5tZXRob2QgPSBzdHJ0b3VwcGVyKCRtZXRob2QpOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgYSBjdXN0b20gdXNlcmFnZW50IHN0cmluZyBmb3IgdGhlIGNsYXNzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVhIChSZXF1aXJlZCkgVGhlIHVzZXJhZ2VudCBzdHJpbmcgdG8gdXNlLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF91c2VyYWdlbnQoJHVhKQoJewoJCSR0aGlzLT51c2VyYWdlbnQgPSAkdWE7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBib2R5IHRvIHNlbmQgaW4gdGhlIHJlcXVlc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkYm9keSAoUmVxdWlyZWQpIFRoZSB0ZXh0dWFsIGNvbnRlbnQgdG8gc2VuZCBhbG9uZyBpbiB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdC4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfYm9keSgkYm9keSkKCXsKCQkkdGhpcy0+cmVxdWVzdF9ib2R5ID0gJGJvZHk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBVUkwgdG8gbWFrZSB0aGUgcmVxdWVzdCB0by4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR1cmwgKFJlcXVpcmVkKSBUaGUgVVJMIHRvIG1ha2UgdGhlIHJlcXVlc3QgdG8uCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3JlcXVlc3RfdXJsKCR1cmwpCgl7CgkJJHRoaXMtPnJlcXVlc3RfdXJsID0gJHVybDsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBTZXQgYWRkaXRpb25hbCBDVVJMT1BUIHNldHRpbmdzLiBUaGVzZSB3aWxsIG1lcmdlIHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MsIGFuZCBvdmVycmlkZSBpZgoJICogdGhlcmUgaXMgYSBkdXBsaWNhdGUuCgkgKgoJICogQHBhcmFtIGFycmF5ICRjdXJsb3B0cyAoT3B0aW9uYWwpIEEgc2V0IG9mIGtleS12YWx1ZSBwYWlycyB0aGF0IHNldCBgQ1VSTE9QVGAgb3B0aW9ucy4gVGhlc2Ugd2lsbCBtZXJnZSB3aXRoIHRoZSBleGlzdGluZyBDVVJMT1BUcywgYW5kIG9uZXMgcGFzc2VkIGhlcmUgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdHMuIEtleXMgc2hvdWxkIGJlIHRoZSBgQ1VSTE9QVF8qYCBjb25zdGFudHMsIG5vdCBzdHJpbmdzLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jdXJsb3B0cygkY3VybG9wdHMpCgl7CgkJJHRoaXMtPmN1cmxvcHRzID0gJGN1cmxvcHRzOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGxlbmd0aCBpbiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKgoJICogQHBhcmFtIGludGVnZXIgJHNpemUgKFJlcXVpcmVkKSBUaGUgbGVuZ3RoIGluIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX3N0cmVhbV9zaXplKCRzaXplKQoJewoJCSR0aGlzLT5yZWFkX3N0cmVhbV9zaXplID0gJHNpemU7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHJlc291cmNlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuIFJlYWRzIHRoZSBzdHJlYW0gZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbiB1bnRpbAoJICogRU9GIG9yIGAkc2l6ZWAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuIElmIGAkc2l6ZWAgaXMgbm90IGdpdmVuIGl0IHdpbGwgYmUgZGV0ZXJtaW5lZCBieSA8cGhwOmZzdGF0KCk+IGFuZAoJICogPHBocDpmdGVsbCgpPi4KCSAqCgkgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc291cmNlIChSZXF1aXJlZCkgVGhlIHJlYWRhYmxlIHJlc291cmNlIHRvIHJlYWQgZnJvbS4KCSAqIEBwYXJhbSBpbnRlZ2VyICRzaXplIChPcHRpb25hbCkgVGhlIHNpemUgb2YgdGhlIHN0cmVhbSB0byByZWFkLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX3N0cmVhbSgkcmVzb3VyY2UsICRzaXplID0gbnVsbCkKCXsKCQlpZiAoIWlzc2V0KCRzaXplKSB8fCAkc2l6ZSA8IDApCgkJewoJCQkkc3RhdHMgPSBmc3RhdCgkcmVzb3VyY2UpOwoKCQkJaWYgKCRzdGF0cyAmJiAkc3RhdHNbJ3NpemUnXSA+PSAwKQoJCQl7CgkJCQkkcG9zaXRpb24gPSBmdGVsbCgkcmVzb3VyY2UpOwoKCQkJCWlmICgkcG9zaXRpb24gIT09IGZhbHNlICYmICRwb3NpdGlvbiA+PSAwKQoJCQkJewoJCQkJCSRzaXplID0gJHN0YXRzWydzaXplJ10gLSAkcG9zaXRpb247CgkJCQl9CgkJCX0KCQl9CgoJCSR0aGlzLT5yZWFkX3N0cmVhbSA9ICRyZXNvdXJjZTsKCgkJcmV0dXJuICR0aGlzLT5zZXRfcmVhZF9zdHJlYW1fc2l6ZSgkc2l6ZSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBmaWxlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gKFJlcXVpcmVkKSBUaGUgcmVhZGFibGUgbG9jYXRpb24gdG8gcmVhZCBmcm9tLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX2ZpbGUoJGxvY2F0aW9uKQoJewoJCSR0aGlzLT5yZWFkX2ZpbGUgPSAkbG9jYXRpb247CgkJJHJlYWRfZmlsZV9oYW5kbGUgPSBmb3BlbigkbG9jYXRpb24sICdyJyk7CgoJCXJldHVybiAkdGhpcy0+c2V0X3JlYWRfc3RyZWFtKCRyZWFkX2ZpbGVfaGFuZGxlKTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHJlc291cmNlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkcmVzb3VyY2UgKFJlcXVpcmVkKSBUaGUgd3JpdGVhYmxlIHJlc291cmNlIHRvIHdyaXRlIHRvLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF93cml0ZV9zdHJlYW0oJHJlc291cmNlKQoJewoJCSR0aGlzLT53cml0ZV9zdHJlYW0gPSAkcmVzb3VyY2U7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGZpbGUgdG8gd3JpdGUgdG8gd2hpbGUgc3RyZWFtaW5nIGRvd24uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gKFJlcXVpcmVkKSBUaGUgd3JpdGVhYmxlIGxvY2F0aW9uIHRvIHdyaXRlIHRvLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF93cml0ZV9maWxlKCRsb2NhdGlvbikKCXsKCQkkdGhpcy0+d3JpdGVfZmlsZSA9ICRsb2NhdGlvbjsKCQkkd3JpdGVfZmlsZV9oYW5kbGUgPSBmb3BlbigkbG9jYXRpb24sICd3Jyk7CgoJCXJldHVybiAkdGhpcy0+c2V0X3dyaXRlX3N0cmVhbSgkd3JpdGVfZmlsZV9oYW5kbGUpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBwcm94eSB0byB1c2UgZm9yIG1ha2luZyByZXF1ZXN0cy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eSAoUmVxdWlyZWQpIFRoZSBmYXV4LXVybCB0byB1c2UgZm9yIHByb3h5IHNldHRpbmdzLiBUYWtlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogYHByb3h5Oi8vdXNlcjpwYXNzQGhvc3RuYW1lOnBvcnRgCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3Byb3h5KCRwcm94eSkKCXsKCQkkcHJveHkgPSBwYXJzZV91cmwoJHByb3h5KTsKCQkkcHJveHlbJ3VzZXInXSA9IGlzc2V0KCRwcm94eVsndXNlciddKSA/ICRwcm94eVsndXNlciddIDogbnVsbDsKCQkkcHJveHlbJ3Bhc3MnXSA9IGlzc2V0KCRwcm94eVsncGFzcyddKSA/ICRwcm94eVsncGFzcyddIDogbnVsbDsKCQkkcHJveHlbJ3BvcnQnXSA9IGlzc2V0KCRwcm94eVsncG9ydCddKSA/ICRwcm94eVsncG9ydCddIDogbnVsbDsKCQkkdGhpcy0+cHJveHkgPSAkcHJveHk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBpbnRlbmRlZCBzdGFydGluZyBzZWVrIHBvc2l0aW9uLgoJICoKCSAqIEBwYXJhbSBpbnRlZ2VyICRwb3NpdGlvbiAoUmVxdWlyZWQpIFRoZSBieXRlLXBvc2l0aW9uIG9mIHRoZSBzdHJlYW0gdG8gYmVnaW4gcmVhZGluZyBmcm9tLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9zZWVrX3Bvc2l0aW9uKCRwb3NpdGlvbikKCXsKCQkkdGhpcy0+c2Vla19wb3NpdGlvbiA9IGlzc2V0KCRwb3NpdGlvbikgPyAoaW50ZWdlcikgJHBvc2l0aW9uIDogbnVsbDsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW5ldmVyIGEgZGF0YSBzdHJlYW0gaXMgcmVhZCBmcm9tIHVzaW5nCgkgKiA8Q0ZSZXF1ZXN0OjpzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaygpPi4KCSAqCgkgKiBUaGUgdXNlci1kZWZpbmVkIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgdGhyZWUgYXJndW1lbnRzOgoJICoKCSAqIDx1bD4KCSAqIAk8bGk+PGNvZGU+JGN1cmxfaGFuZGxlPC9jb2RlPiAtIDxjb2RlPnJlc291cmNlPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGNVUkwgaGFuZGxlIHJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgaW4tcHJvZ3Jlc3MgdHJhbnNmZXIuPC9saT4KCSAqIAk8bGk+PGNvZGU+JGZpbGVfaGFuZGxlPC9jb2RlPiAtIDxjb2RlPnJlc291cmNlPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGZpbGUgaGFuZGxlIHJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uPC9saT4KCSAqIAk8bGk+PGNvZGU+JGxlbmd0aDwvY29kZT4gLSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGxlbmd0aCBpbiBraWxvYnl0ZXMgb2YgdGhlIGRhdGEgY2h1bmsgdGhhdCB3YXMgdHJhbnNmZXJyZWQuPC9saT4KCSAqIDwvdWw+CgkgKgoJICogQHBhcmFtIHN0cmluZ3xhcnJheXxmdW5jdGlvbiAkY2FsbGJhY2sgKFJlcXVpcmVkKSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IDxwaHA6Y2FsbF91c2VyX2Z1bmMoKT4sIHNvIHlvdSBjYW4gcGFzcyB0aGUgZm9sbG93aW5nIHZhbHVlczogPHVsPgoJICogCTxsaT5UaGUgbmFtZSBvZiBhIGdsb2JhbCBmdW5jdGlvbiB0byBleGVjdXRlLCBwYXNzZWQgYXMgYSBzdHJpbmcuPC9saT4KCSAqIAk8bGk+QSBtZXRob2QgdG8gZXhlY3V0ZSwgcGFzc2VkIGFzIDxjb2RlPmFycmF5KCdDbGFzc05hbWUnLCAnTWV0aG9kTmFtZScpPC9jb2RlPi48L2xpPgoJICogCTxsaT5BbiBhbm9ueW1vdXMgZnVuY3Rpb24gKFBIUCA1LjMrKS48L2xpPjwvdWw+CgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJfc3RyZWFtaW5nX3JlYWRfY2FsbGJhY2soJGNhbGxiYWNrKQoJewoJCSR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrID0gJGNhbGxiYWNrOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbmV2ZXIgYSBkYXRhIHN0cmVhbSBpcyB3cml0dGVuIHRvIHVzaW5nCgkgKiA8Q0ZSZXF1ZXN0OjpzdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2soKT4uCgkgKgoJICogVGhlIHVzZXItZGVmaW5lZCBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IHR3byBhcmd1bWVudHM6CgkgKgoJICogPHVsPgoJICogCTxsaT48Y29kZT4kY3VybF9oYW5kbGU8L2NvZGU+IC0gPGNvZGU+cmVzb3VyY2U8L2NvZGU+IC0gUmVxdWlyZWQgLSBUaGUgY1VSTCBoYW5kbGUgcmVzb3VyY2UgdGhhdCByZXByZXNlbnRzIHRoZSBpbi1wcm9ncmVzcyB0cmFuc2Zlci48L2xpPgoJICogCTxsaT48Y29kZT4kbGVuZ3RoPC9jb2RlPiAtIDxjb2RlPmludGVnZXI8L2NvZGU+IC0gUmVxdWlyZWQgLSBUaGUgbGVuZ3RoIGluIGtpbG9ieXRlcyBvZiB0aGUgZGF0YSBjaHVuayB0aGF0IHdhcyB0cmFuc2ZlcnJlZC48L2xpPgoJICogPC91bD4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nfGFycmF5fGZ1bmN0aW9uICRjYWxsYmFjayAoUmVxdWlyZWQpIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgPHBocDpjYWxsX3VzZXJfZnVuYygpPiwgc28geW91IGNhbiBwYXNzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiA8dWw+CgkgKiAJPGxpPlRoZSBuYW1lIG9mIGEgZ2xvYmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIHBhc3NlZCBhcyBhIHN0cmluZy48L2xpPgoJICogCTxsaT5BIG1ldGhvZCB0byBleGVjdXRlLCBwYXNzZWQgYXMgPGNvZGU+YXJyYXkoJ0NsYXNzTmFtZScsICdNZXRob2ROYW1lJyk8L2NvZGU+LjwvbGk+CgkgKiAJPGxpPkFuIGFub255bW91cyBmdW5jdGlvbiAoUEhQIDUuMyspLjwvbGk+PC91bD4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlcl9zdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2soJGNhbGxiYWNrKQoJewoJCSR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjayA9ICRjYWxsYmFjazsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKiUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiolKi8KCS8vIFBSRVBBUkUsIFNFTkQsIEFORCBQUk9DRVNTIFJFUVVFU1QKCgkvKioKCSAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJ5IGNVUkwgZm9yIHN0cmVhbWluZyB1cC4KCSAqCgkgKiBAcGFyYW0gcmVzb3VyY2UgJGN1cmxfaGFuZGxlIChSZXF1aXJlZCkgVGhlIGNVUkwgaGFuZGxlIGZvciB0aGUgcmVxdWVzdC4KCSAqIEBwYXJhbSByZXNvdXJjZSAkZmlsZV9oYW5kbGUgKFJlcXVpcmVkKSBUaGUgb3BlbiBmaWxlIGhhbmRsZSByZXNvdXJjZS4KCSAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggKFJlcXVpcmVkKSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KCSAqIEByZXR1cm4gYmluYXJ5IEJpbmFyeSBkYXRhIGZyb20gYSBzdHJlYW0uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaygkY3VybF9oYW5kbGUsICRmaWxlX2hhbmRsZSwgJGxlbmd0aCkKCXsKCQkvLyBPbmNlIHdlJ3ZlIHNlbnQgYXMgbXVjaCBhcyB3ZSdyZSBzdXBwb3NlZCB0byBzZW5kLi4uCgkJaWYgKCR0aGlzLT5yZWFkX3N0cmVhbV9yZWFkID49ICR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKQoJCXsKCQkJLy8gU2VuZCBFT0YKCQkJcmV0dXJuICcnOwoJCX0KCgkJLy8gSWYgd2UncmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiB1cGxvYWQgYW5kIG5lZWQgdG8gc2Vlay4uLgoJCWlmICgkdGhpcy0+cmVhZF9zdHJlYW1fcmVhZCA9PSAwICYmIGlzc2V0KCR0aGlzLT5zZWVrX3Bvc2l0aW9uKSAmJiAkdGhpcy0+c2Vla19wb3NpdGlvbiAhPT0gZnRlbGwoJHRoaXMtPnJlYWRfc3RyZWFtKSkKCQl7CgkJCWlmIChmc2VlaygkdGhpcy0+cmVhZF9zdHJlYW0sICR0aGlzLT5zZWVrX3Bvc2l0aW9uKSAhPT0gMCkKCQkJewoJCQkJdGhyb3cgbmV3IFJlcXVlc3RDb3JlX0V4Y2VwdGlvbignVGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcgYW5kIGlzIGVpdGhlciBub3QgYXQgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBvciB0aGUgcG9zaXRpb24gaXMgdW5rbm93bi4nKTsKCQkJfQoJCX0KCgkJJHJlYWQgPSBmcmVhZCgkdGhpcy0+cmVhZF9zdHJlYW0sIG1pbigkdGhpcy0+cmVhZF9zdHJlYW1fc2l6ZSAtICR0aGlzLT5yZWFkX3N0cmVhbV9yZWFkLCAkbGVuZ3RoKSk7IC8vIFJlbWFpbmluZyB1cGxvYWQgZGF0YSBvciBjVVJMJ3MgcmVxdWVzdGVkIGNodW5rIHNpemUKCQkkdGhpcy0+cmVhZF9zdHJlYW1fcmVhZCArPSBzdHJsZW4oJHJlYWQpOwoKCQkkb3V0ID0gJHJlYWQgPT09IGZhbHNlID8gJycgOiAkcmVhZDsKCgkJLy8gRXhlY3V0ZSBjYWxsYmFjayBmdW5jdGlvbgoJCWlmICgkdGhpcy0+cmVnaXN0ZXJlZF9zdHJlYW1pbmdfcmVhZF9jYWxsYmFjaykKCQl7CgkJCWNhbGxfdXNlcl9mdW5jKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrLCAkY3VybF9oYW5kbGUsICRmaWxlX2hhbmRsZSwgJG91dCk7CgkJfQoKCQlyZXR1cm4gJG91dDsKCX0KCgkvKioKCSAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJ5IGNVUkwgZm9yIHN0cmVhbWluZyBkb3duLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkY3VybF9oYW5kbGUgKFJlcXVpcmVkKSBUaGUgY1VSTCBoYW5kbGUgZm9yIHRoZSByZXF1ZXN0LgoJICogQHBhcmFtIGJpbmFyeSAkZGF0YSAoUmVxdWlyZWQpIFRoZSBkYXRhIHRvIHdyaXRlLgoJICogQHJldHVybiBpbnRlZ2VyIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0cmVhbWluZ193cml0ZV9jYWxsYmFjaygkY3VybF9oYW5kbGUsICRkYXRhKQoJewoJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOwoJCSR3cml0dGVuX3RvdGFsID0gMDsKCQkkd3JpdHRlbl9sYXN0ID0gMDsKCgkJd2hpbGUgKCR3cml0dGVuX3RvdGFsIDwgJGxlbmd0aCkKCQl7CgkJCSR3cml0dGVuX2xhc3QgPSBmd3JpdGUoJHRoaXMtPndyaXRlX3N0cmVhbSwgc3Vic3RyKCRkYXRhLCAkd3JpdHRlbl90b3RhbCkpOwoKCQkJaWYgKCR3cml0dGVuX2xhc3QgPT09IGZhbHNlKQoJCQl7CgkJCQlyZXR1cm4gJHdyaXR0ZW5fdG90YWw7CgkJCX0KCgkJCSR3cml0dGVuX3RvdGFsICs9ICR3cml0dGVuX2xhc3Q7CgkJfQoKCQkvLyBFeGVjdXRlIGNhbGxiYWNrIGZ1bmN0aW9uCgkJaWYgKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjaykKCQl7CgkJCWNhbGxfdXNlcl9mdW5jKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjaywgJGN1cmxfaGFuZGxlLCAkd3JpdHRlbl90b3RhbCk7CgkJfQoKCQlyZXR1cm4gJHdyaXR0ZW5fdG90YWw7Cgl9CgoJLyoqCgkgKiBQcmVwYXJlcyBhbmQgYWRkcyB0aGUgZGV0YWlscyBvZiB0aGUgY1VSTCByZXF1ZXN0LiBUaGlzIGNhbiBiZSBwYXNzZWQgYWxvbmcgdG8gYSA8cGhwOmN1cmxfbXVsdGlfZXhlYygpPgoJICogZnVuY3Rpb24uCgkgKgoJICogQHJldHVybiByZXNvdXJjZSBUaGUgaGFuZGxlIGZvciB0aGUgY1VSTCBvYmplY3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmVwX3JlcXVlc3QoKQoJewoJCSRjdXJsX2hhbmRsZSA9IGN1cmxfaW5pdCgpOwoKCQkvLyBTZXQgZGVmYXVsdCBvcHRpb25zLgoJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9VUkwsICR0aGlzLT5yZXF1ZXN0X3VybCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0ZJTEVUSU1FLCB0cnVlKTsKCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwgZmFsc2UpOwoJCWlmICggZGVmaW5lZCggJ0NVUkxPUFRfQ0xPU0VQT0xJQ1knICkgJiYgaXNfbG9uZyggQ1VSTE9QVF9DTE9TRVBPTElDWSApICkgeyAvLyBOb3QgYXZhaWxhYmxlIG9uIHNvbWUgc3lzdGVtcyByZXN1bHRpbmcgaW4gd2FybmluZy4gU2VlIHplbmRlc2sgdGlja2V0IDE1OTI2LiBNYXkgbm90IGV2ZW4gYmUgZGVmaW5lZCBpbiA1LjYrLgoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfQ0xPU0VQT0xJQ1ksIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEKTsKCQl9CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX01BWFJFRElSUywgNSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0hFQURFUiwgdHJ1ZSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfVElNRU9VVCwgNTE4NDAwMCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAxMjApOwoJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9OT1NJR05BTCwgdHJ1ZSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFRkVSRVIsICR0aGlzLT5yZXF1ZXN0X3VybCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoaXMtPnVzZXJhZ2VudCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgYXJyYXkoJHRoaXMsICdzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaycpKTsKCgkJLy8gVmVyaWZpY2F0aW9uIG9mIHRoZSBTU0wgY2VydAoJCWlmICgkdGhpcy0+c3NsX3ZlcmlmaWNhdGlvbikKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgdHJ1ZSk7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMik7CgkJfQoJCWVsc2UKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgZmFsc2UpOwoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIGZhbHNlKTsKCQl9CgoJCS8vIGNobW9kIHRoZSBmaWxlIGFzIDA3NTUKCQlpZiAoJHRoaXMtPmNhY2VydF9sb2NhdGlvbiA9PT0gdHJ1ZSkKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DQUlORk8sIGRpcm5hbWUoX19GSUxFX18pIC4gJy9jYWNlcnQucGVtJyk7CgkJfQoJCWVsc2VpZiAoaXNfc3RyaW5nKCR0aGlzLT5jYWNlcnRfbG9jYXRpb24pKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0NBSU5GTywgJHRoaXMtPmNhY2VydF9sb2NhdGlvbik7CgkJfQoKCQkvLyBEZWJ1ZyBtb2RlCgkJaWYgKCR0aGlzLT5kZWJ1Z19tb2RlKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1ZFUkJPU0UsIHRydWUpOwoJCX0KCgkJLy8gSGFuZGxlIG9wZW5fYmFzZWRpciAmIHNhZmUgbW9kZQoJCWlmICghaW5pX2dldCgnc2FmZV9tb2RlJykgJiYgIWluaV9nZXQoJ29wZW5fYmFzZWRpcicpKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKCQl9CgoJCS8vIEVuYWJsZSBhIHByb3h5IGNvbm5lY3Rpb24gaWYgcmVxdWVzdGVkLgoJCWlmICgkdGhpcy0+cHJveHkpCgkJewoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfSFRUUFBST1hZVFVOTkVMLCB0cnVlKTsKCgkJCSRob3N0ID0gJHRoaXMtPnByb3h5Wydob3N0J107CgkJCSRob3N0IC49ICgkdGhpcy0+cHJveHlbJ3BvcnQnXSkgPyAnOicgLiAkdGhpcy0+cHJveHlbJ3BvcnQnXSA6ICcnOwoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUFJPWFksICRob3N0KTsKCgkJCWlmIChpc3NldCgkdGhpcy0+cHJveHlbJ3VzZXInXSkgJiYgaXNzZXQoJHRoaXMtPnByb3h5WydwYXNzJ10pKQoJCQl7CgkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUFJPWFlVU0VSUFdELCAkdGhpcy0+cHJveHlbJ3VzZXInXSAuICc6JyAuICR0aGlzLT5wcm94eVsncGFzcyddKTsKCQkJfQoJCX0KCgkJLy8gU2V0IGNyZWRlbnRpYWxzIGZvciBIVFRQIEJhc2ljL0RpZ2VzdCBBdXRoZW50aWNhdGlvbi4KCQlpZiAoJHRoaXMtPnVzZXJuYW1lICYmICR0aGlzLT5wYXNzd29yZCkKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9IVFRQQVVUSCwgQ1VSTEFVVEhfQU5ZKTsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1VTRVJQV0QsICR0aGlzLT51c2VybmFtZSAuICc6JyAuICR0aGlzLT5wYXNzd29yZCk7CgkJfQoKCQkvLyBIYW5kbGUgdGhlIGVuY29kaW5nIGlmIHdlIGNhbi4KCQlpZiAoJHRoaXMtPnVzZV9nemlwX2VuY29uZGluZyAmJiBleHRlbnNpb25fbG9hZGVkKCd6bGliJykpCgkJewoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfRU5DT0RJTkcsICdnemlwLCBkZWZsYXRlJyk7CgkJfQoKCQkvLyBQcm9jZXNzIGN1c3RvbSBoZWFkZXJzCgkJaWYgKGlzc2V0KCR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpICYmIGNvdW50KCR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpKQoJCXsKCQkJJHRlbXBfaGVhZGVycyA9IGFycmF5KCk7CgoJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJ0V4cGVjdCcsICR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpKQoJCQl7CgkJCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWydFeHBlY3QnXSA9ICcnOwoJCQl9CgoJCQlmb3JlYWNoICgkdGhpcy0+cmVxdWVzdF9oZWFkZXJzIGFzICRrID0+ICR2KQoJCQl7CgkJCQkkdGVtcF9oZWFkZXJzW10gPSAkayAuICc6ICcgLiAkdjsKCQkJfQoKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0hUVFBIRUFERVIsICR0ZW1wX2hlYWRlcnMpOwoJCX0KCgkJc3dpdGNoICgkdGhpcy0+bWV0aG9kKQoJCXsKCQkJY2FzZSBzZWxmOjpIVFRQX1BVVDoKCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCAnUFVUJyk7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPnJlYWRfc3RyZWFtKSkKCQkJCXsKCQkJCQlpZiAoIWlzc2V0KCR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKSB8fCAkdGhpcy0+cmVhZF9zdHJlYW1fc2l6ZSA8IDApCgkJCQkJewoJCQkJCQl0aHJvdyBuZXcgUmVxdWVzdENvcmVfRXhjZXB0aW9uKCdUaGUgc3RyZWFtIHNpemUgZm9yIHRoZSBzdHJlYW1pbmcgdXBsb2FkIGNhbm5vdCBiZSBkZXRlcm1pbmVkLicpOwoJCQkJCX0KCgkJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0lORklMRVNJWkUsICR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKTsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfVVBMT0FELCB0cnVlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfYm9keSk7CgkJCQl9CgkJCQlicmVhazsKCgkJCWNhc2Ugc2VsZjo6SFRUUF9QT1NUOgoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1BPU1QsIHRydWUpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0X2JvZHkpOwoJCQkJYnJlYWs7CgoJCQljYXNlIHNlbGY6OkhUVFBfSEVBRDoKCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBzZWxmOjpIVFRQX0hFQUQpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX05PQk9EWSwgMSk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6IC8vIEFzc3VtZWQgR0VUCgkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJHRoaXMtPm1ldGhvZCk7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPndyaXRlX3N0cmVhbSkpCgkJCQl7CgkJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGFycmF5KCR0aGlzLCAnc3RyZWFtaW5nX3dyaXRlX2NhbGxiYWNrJykpOwoJCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9IRUFERVIsIGZhbHNlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfYm9keSk7CgkJCQl9CgkJCQlicmVhazsKCQl9CgoJCS8vIE1lcmdlIGluIHRoZSBDVVJMT1BUcwoJCWlmIChpc3NldCgkdGhpcy0+Y3VybG9wdHMpICYmIHNpemVvZigkdGhpcy0+Y3VybG9wdHMpID4gMCkKCQl7CgkJCWZvcmVhY2ggKCR0aGlzLT5jdXJsb3B0cyBhcyAkayA9PiAkdikKCQkJewoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCAkaywgJHYpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGN1cmxfaGFuZGxlOwoJfQoKCS8qKgoJICogVGFrZSB0aGUgcG9zdC1wcm9jZXNzZWQgY1VSTCBkYXRhIGFuZCBicmVhayBpdCBkb3duIGludG8gdXNlZnVsIGhlYWRlci9ib2R5L2luZm8gY2h1bmtzLiBVc2VzIHRoZQoJICogZGF0YSBzdG9yZWQgaW4gdGhlIGBjdXJsX2hhbmRsZWAgYW5kIGByZXNwb25zZWAgcHJvcGVydGllcyB1bmxlc3MgcmVwbGFjZW1lbnQgZGF0YSBpcyBwYXNzZWQgaW4gdmlhCgkgKiBwYXJhbWV0ZXJzLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkY3VybF9oYW5kbGUgKE9wdGlvbmFsKSBUaGUgcmVmZXJlbmNlIHRvIHRoZSBhbHJlYWR5IGV4ZWN1dGVkIGNVUkwgcmVxdWVzdC4KCSAqIEBwYXJhbSBzdHJpbmcgJHJlc3BvbnNlIChPcHRpb25hbCkgVGhlIGFjdHVhbCByZXNwb25zZSBjb250ZW50IGl0c2VsZiB0aGF0IG5lZWRzIHRvIGJlIHBhcnNlZC4KCSAqIEByZXR1cm4gUmVzcG9uc2VDb3JlIEEgPFJlc3BvbnNlQ29yZT4gb2JqZWN0IGNvbnRhaW5pbmcgYSBwYXJzZWQgSFRUUCByZXNwb25zZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NfcmVzcG9uc2UoJGN1cmxfaGFuZGxlID0gbnVsbCwgJHJlc3BvbnNlID0gbnVsbCkKCXsKCQkvLyBBY2NlcHQgYSBjdXN0b20gb25lIGlmIGl0J3MgcGFzc2VkLgoJCWlmICgkY3VybF9oYW5kbGUgJiYgJHJlc3BvbnNlKQoJCXsKCQkJJHRoaXMtPmN1cmxfaGFuZGxlID0gJGN1cmxfaGFuZGxlOwoJCQkkdGhpcy0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7CgkJfQoKCQkvLyBBcyBsb25nIGFzIHRoaXMgY2FtZSBiYWNrIGFzIGEgdmFsaWQgcmVzb3VyY2UuLi4KCQlpZiAoaXNfcmVzb3VyY2UoJHRoaXMtPmN1cmxfaGFuZGxlKSkKCQl7CgkJCS8vIERldGVybWluZSB3aGF0J3Mgd2hhdC4KCQkJJGhlYWRlcl9zaXplID0gY3VybF9nZXRpbmZvKCR0aGlzLT5jdXJsX2hhbmRsZSwgQ1VSTElORk9fSEVBREVSX1NJWkUpOwoJCQkkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2UsIDAsICRoZWFkZXJfc2l6ZSk7CgkJCSR0aGlzLT5yZXNwb25zZV9ib2R5ID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZSwgJGhlYWRlcl9zaXplKTsKCQkJJHRoaXMtPnJlc3BvbnNlX2NvZGUgPSBjdXJsX2dldGluZm8oJHRoaXMtPmN1cmxfaGFuZGxlLCBDVVJMSU5GT19IVFRQX0NPREUpOwoJCQkkdGhpcy0+cmVzcG9uc2VfaW5mbyA9IGN1cmxfZ2V0aW5mbygkdGhpcy0+Y3VybF9oYW5kbGUpOwoKCQkJLy8gUGFyc2Ugb3V0IHRoZSBoZWFkZXJzCgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzID0gZXhwbG9kZSgiXHJcblxyXG4iLCB0cmltKCR0aGlzLT5yZXNwb25zZV9oZWFkZXJzKSk7CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzID0gYXJyYXlfcG9wKCR0aGlzLT5yZXNwb25zZV9oZWFkZXJzKTsKCQkJJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMgPSBleHBsb2RlKCJcclxuIiwgJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMpOwoJCQlhcnJheV9zaGlmdCgkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyk7CgoJCQkvLyBMb29wIHRocm91Z2ggYW5kIHNwbGl0IHVwIHRoZSBoZWFkZXJzLgoJCQkkaGVhZGVyX2Fzc29jID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMgYXMgJGhlYWRlcikKCQkJewoJCQkJJGt2ID0gZXhwbG9kZSgnOiAnLCAkaGVhZGVyKTsKCQkJCSRoZWFkZXJfYXNzb2Nbc3RydG9sb3dlcigka3ZbMF0pXSA9ICRrdlsxXTsKCQkJfQoKCQkJLy8gUmVzZXQgdGhlIGhlYWRlcnMgdG8gdGhlIGFwcHJvcHJpYXRlIHByb3BlcnR5LgoJCQkkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyA9ICRoZWFkZXJfYXNzb2M7CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWydfaW5mbyddID0gJHRoaXMtPnJlc3BvbnNlX2luZm87CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWydfaW5mbyddWydtZXRob2QnXSA9ICR0aGlzLT5tZXRob2Q7CgoJCQlpZiAoJGN1cmxfaGFuZGxlICYmICRyZXNwb25zZSkKCQkJewoJCQkJcmV0dXJuIG5ldyAkdGhpcy0+cmVzcG9uc2VfY2xhc3MoJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMsICR0aGlzLT5yZXNwb25zZV9ib2R5LCAkdGhpcy0+cmVzcG9uc2VfY29kZSwgJHRoaXMtPmN1cmxfaGFuZGxlKTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuIGZhbHNlCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogU2VuZHMgdGhlIHJlcXVlc3QsIGNhbGxpbmcgbmVjZXNzYXJ5IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHVwZGF0ZSBidWlsdC1pbiBwcm9wZXJ0aWVzLgoJICoKCSAqIEBwYXJhbSBib29sZWFuICRwYXJzZSAoT3B0aW9uYWwpIFdoZXRoZXIgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIHdpdGggUmVzcG9uc2VDb3JlIG9yIG5vdC4KCSAqIEByZXR1cm4gc3RyaW5nIFRoZSByZXN1bHRpbmcgdW5wYXJzZWQgZGF0YSBmcm9tIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2VuZF9yZXF1ZXN0KCRwYXJzZSA9IGZhbHNlKQoJewoJCWlmICgkdGhpcy0+YWxsb3dfc2V0X3RpbWVfbGltaXQpCgkJewoJCQlzZXRfdGltZV9saW1pdCgwKTsKCQl9CgoJCSRjdXJsX2hhbmRsZSA9ICR0aGlzLT5wcmVwX3JlcXVlc3QoKTsKCQkkdGhpcy0+cmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGN1cmxfaGFuZGxlKTsKCgkJaWYgKCR0aGlzLT5yZXNwb25zZSA9PT0gZmFsc2UpCgkJewoJCQl0aHJvdyBuZXcgY1VSTF9FeGNlcHRpb24oJ2NVUkwgcmVzb3VyY2U6ICcgLiAoc3RyaW5nKSAkY3VybF9oYW5kbGUgLiAnOyBjVVJMIGVycm9yOiAnIC4gY3VybF9lcnJvcigkY3VybF9oYW5kbGUpIC4gJyAoY1VSTCBlcnJvciBjb2RlICcgLiBjdXJsX2Vycm5vKCRjdXJsX2hhbmRsZSkgLiAnKS4gU2VlIGh0dHA6Ly9jdXJsLmhheHguc2UvbGliY3VybC9jL2xpYmN1cmwtZXJyb3JzLmh0bWwgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGVycm9yIGNvZGVzLicpOwoJCX0KCgkJJHBhcnNlZF9yZXNwb25zZSA9ICR0aGlzLT5wcm9jZXNzX3Jlc3BvbnNlKCRjdXJsX2hhbmRsZSwgJHRoaXMtPnJlc3BvbnNlKTsKCgkJY3VybF9jbG9zZSgkY3VybF9oYW5kbGUpOwoKCQlpZiAoJHBhcnNlKQoJCXsKCQkJcmV0dXJuICRwYXJzZWRfcmVzcG9uc2U7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwoJfQoKCS8qKgoJICogU2VuZHMgdGhlIHJlcXVlc3QgdXNpbmcgPHBocDpjdXJsX211bHRpX2V4ZWMoKT4sIGVuYWJsaW5nIHBhcmFsbGVsIHJlcXVlc3RzLiBVc2VzIHRoZSAicm9sbGluZyIgbWV0aG9kLgoJICoKCSAqIEBwYXJhbSBhcnJheSAkaGFuZGxlcyAoUmVxdWlyZWQpIEFuIGluZGV4ZWQgYXJyYXkgb2YgY1VSTCBoYW5kbGVzIHRvIHByb2Nlc3Mgc2ltdWx0YW5lb3VzbHkuCgkgKiBAcGFyYW0gYXJyYXkgJG9wdCAoT3B0aW9uYWwpIEFuIGFzc29jaWF0aXZlIGFycmF5IG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGtleXM6IDx1bD4KCSAqIAk8bGk+PGNvZGU+Y2FsbGJhY2s8L2NvZGU+IC0gPGNvZGU+c3RyaW5nfGFycmF5PC9jb2RlPiAtIE9wdGlvbmFsIC0gVGhlIHN0cmluZyBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gcGFzcyB0aGUgcmVzcG9uc2UgZGF0YSB0by4gSWYgdGhpcyBpcyBhIG1ldGhvZCwgcGFzcyBhbiBhcnJheSB3aGVyZSB0aGUgPGNvZGU+WzBdPC9jb2RlPiBpbmRleCBpcyB0aGUgY2xhc3MgYW5kIHRoZSA8Y29kZT5bMV08L2NvZGU+IGluZGV4IGlzIHRoZSBtZXRob2QgbmFtZS48L2xpPgoJICogCTxsaT48Y29kZT5saW1pdDwvY29kZT4gLSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAtIE9wdGlvbmFsIC0gVGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgdG8gbWFrZS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBzY2FsaW5nIGFyb3VuZCBzbG93IHNlcnZlciByZXNwb25zZXMuIERlZmF1bHRzIHRvIHRydXN0aW5nIGNVUkxzIGp1ZGdlbWVudCBhcyB0byBob3cgbWFueSB0byB1c2UuPC9saT48L3VsPgoJICogQHJldHVybiBhcnJheSBQb3N0LXByb2Nlc3NlZCBjVVJMIHJlc3BvbnNlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNlbmRfbXVsdGlfcmVxdWVzdCgkaGFuZGxlcywgJG9wdCA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5hbGxvd19zZXRfdGltZV9saW1pdCkKCQl7CgkJCXNldF90aW1lX2xpbWl0KDApOwoJCX0KCgkJLy8gU2tpcCBldmVyeXRoaW5nIGlmIHRoZXJlIGFyZSBubyBoYW5kbGVzIHRvIHByb2Nlc3MuCgkJaWYgKGNvdW50KCRoYW5kbGVzKSA9PT0gMCkgcmV0dXJuIGFycmF5KCk7CgoJCWlmICghJG9wdCkgJG9wdCA9IGFycmF5KCk7CgoJCS8vIEluaXRpYWxpemUgYW55IG1pc3Npbmcgb3B0aW9ucwoJCSRsaW1pdCA9IGlzc2V0KCRvcHRbJ2xpbWl0J10pID8gJG9wdFsnbGltaXQnXSA6IC0xOwoKCQkvLyBJbml0aWFsaXplCgkJJGhhbmRsZV9saXN0ID0gJGhhbmRsZXM7CgkJJGh0dHAgPSBuZXcgJHRoaXMtPnJlcXVlc3RfY2xhc3MoKTsKCQkkbXVsdGlfaGFuZGxlID0gY3VybF9tdWx0aV9pbml0KCk7CgkJJGhhbmRsZXNfcG9zdCA9IGFycmF5KCk7CgkJJGFkZGVkID0gY291bnQoJGhhbmRsZXMpOwoJCSRsYXN0X2hhbmRsZSA9IG51bGw7CgkJJGNvdW50ID0gMDsKCQkkaSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCB0aGUgY1VSTCBoYW5kbGVzIGFuZCBhZGQgYXMgbWFueSBhcyBpdCBzZXQgYnkgdGhlIGxpbWl0IHBhcmFtZXRlci4KCQl3aGlsZSAoJGkgPCAkYWRkZWQpCgkJewoJCQlpZiAoJGxpbWl0ID4gMCAmJiAkaSA+PSAkbGltaXQpIGJyZWFrOwoJCQljdXJsX211bHRpX2FkZF9oYW5kbGUoJG11bHRpX2hhbmRsZSwgYXJyYXlfc2hpZnQoJGhhbmRsZXMpKTsKCQkJJGkrKzsKCQl9CgoJCWRvCgkJewoJCQkkYWN0aXZlID0gZmFsc2U7CgoJCQkvLyBTdGFydCBleGVjdXRpbmcgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UuCgkJCXdoaWxlICgoJHN0YXR1cyA9IGN1cmxfbXVsdGlfZXhlYygkbXVsdGlfaGFuZGxlLCAkYWN0aXZlKSkgPT09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSkKCQkJewoJCQkJLy8gU3RhcnQgbG9va2luZyBmb3IgcG9zc2libGUgcmVzcG9uc2VzIGltbWVkaWF0ZWx5IHdoZW4gd2UgaGF2ZSB0byBhZGQgbW9yZSBoYW5kbGVzCgkJCQlpZiAoY291bnQoJGhhbmRsZXMpID4gMCkgYnJlYWs7CgkJCX0KCgkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggcmVxdWVzdHMgZmluaXNoZWQuCgkJCSR0b19wcm9jZXNzID0gYXJyYXkoKTsKCgkJCXdoaWxlICgkZG9uZSA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKCRtdWx0aV9oYW5kbGUpKQoJCQl7CgkJCQkvLyBTaW5jZSBjdXJsX2Vycm5vKCkgaXNuJ3QgcmVsaWFibGUgZm9yIGhhbmRsZXMgdGhhdCB3ZXJlIGluIG11bHRpcmVxdWVzdHMsIHdlIGNoZWNrIHRoZSAncmVzdWx0JyBvZiB0aGUgaW5mbyByZWFkLCB3aGljaCBjb250YWlucyB0aGUgY3VybCBlcnJvciBudW1iZXIsIChsaXN0ZWQgaGVyZSBodHRwOi8vY3VybC5oYXh4LnNlL2xpYmN1cmwvYy9saWJjdXJsLWVycm9ycy5odG1sICkKCQkJCWlmICgkZG9uZVsncmVzdWx0J10gPiAwKQoJCQkJewoJCQkJCXRocm93IG5ldyBjVVJMX011bHRpX0V4Y2VwdGlvbignY1VSTCByZXNvdXJjZTogJyAuIChzdHJpbmcpICRkb25lWydoYW5kbGUnXSAuICc7IGNVUkwgZXJyb3I6ICcgLiBjdXJsX2Vycm9yKCRkb25lWydoYW5kbGUnXSkgLiAnIChjVVJMIGVycm9yIGNvZGUgJyAuICRkb25lWydyZXN1bHQnXSAuICcpLiBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9saWJjdXJsL2MvbGliY3VybC1lcnJvcnMuaHRtbCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgZXJyb3IgY29kZXMuJyk7CgkJCQl9CgoJCQkJLy8gQmVjYXVzZSBjdXJsX211bHRpX2luZm9fcmVhZCgpIG1pZ2h0IHJldHVybiBtb3JlIHRoYW4gb25lIG1lc3NhZ2UgYWJvdXQgYSByZXF1ZXN0LCB3ZSBjaGVjayB0byBzZWUgaWYgdGhpcyByZXF1ZXN0IGlzIGFscmVhZHkgaW4gb3VyIGFycmF5IG9mIGNvbXBsZXRlZCByZXF1ZXN0cwoJCQkJZWxzZWlmICghaXNzZXQoJHRvX3Byb2Nlc3NbKGludCkgJGRvbmVbJ2hhbmRsZSddXSkpCgkJCQl7CgkJCQkJJHRvX3Byb2Nlc3NbKGludCkgJGRvbmVbJ2hhbmRsZSddXSA9ICRkb25lOwoJCQkJfQoJCQl9CgoJCQkvLyBBY3R1YWxseSBkZWFsIHdpdGggdGhlIHJlcXVlc3QKCQkJZm9yZWFjaCAoJHRvX3Byb2Nlc3MgYXMgJHBrZXkgPT4gJGRvbmUpCgkJCXsKCQkJCSRyZXNwb25zZSA9ICRodHRwLT5wcm9jZXNzX3Jlc3BvbnNlKCRkb25lWydoYW5kbGUnXSwgY3VybF9tdWx0aV9nZXRjb250ZW50KCRkb25lWydoYW5kbGUnXSkpOwoJCQkJJGtleSA9IGFycmF5X3NlYXJjaCgkZG9uZVsnaGFuZGxlJ10sICRoYW5kbGVfbGlzdCwgdHJ1ZSk7CgkJCQkkaGFuZGxlc19wb3N0WyRrZXldID0gJHJlc3BvbnNlOwoKCQkJCWlmIChjb3VudCgkaGFuZGxlcykgPiAwKQoJCQkJewoJCQkJCWN1cmxfbXVsdGlfYWRkX2hhbmRsZSgkbXVsdGlfaGFuZGxlLCBhcnJheV9zaGlmdCgkaGFuZGxlcykpOwoJCQkJfQoKCQkJCWN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgkbXVsdGlfaGFuZGxlLCAkZG9uZVsnaGFuZGxlJ10pOwoJCQkJY3VybF9jbG9zZSgkZG9uZVsnaGFuZGxlJ10pOwoJCQl9CgkJfQoJCXdoaWxlICgkYWN0aXZlIHx8IGNvdW50KCRoYW5kbGVzX3Bvc3QpIDwgJGFkZGVkKTsKCgkJY3VybF9tdWx0aV9jbG9zZSgkbXVsdGlfaGFuZGxlKTsKCgkJa3NvcnQoJGhhbmRsZXNfcG9zdCwgU09SVF9OVU1FUklDKTsKCQlyZXR1cm4gJGhhbmRsZXNfcG9zdDsKCX0KCgoJLyolKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJSovCgkvLyBSRVNQT05TRSBNRVRIT0RTCgoJLyoqCgkgKiBHZXQgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBmcm9tIHRoZSByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciAoT3B0aW9uYWwpIEEgc3BlY2lmaWMgaGVhZGVyIHZhbHVlIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gYWxsIGhlYWRlcnMuCgkgKiBAcmV0dXJuIHN0cmluZ3xhcnJheSBBbGwgb3Igc2VsZWN0ZWQgaGVhZGVyIHZhbHVlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yZXNwb25zZV9oZWFkZXIoJGhlYWRlciA9IG51bGwpCgl7CgkJaWYgKCRoZWFkZXIpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnNbc3RydG9sb3dlcigkaGVhZGVyKV07CgkJfQoJCXJldHVybiAkdGhpcy0+cmVzcG9uc2VfaGVhZGVyczsKCX0KCgkvKioKCSAqIEdldCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGZyb20gdGhlIHJlcXVlc3QuCgkgKgoJICogQHJldHVybiBzdHJpbmcgVGhlIHJlc3BvbnNlIGJvZHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVzcG9uc2VfYm9keSgpCgl7CgkJcmV0dXJuICR0aGlzLT5yZXNwb25zZV9ib2R5OwoJfQoKCS8qKgoJICogR2V0IHRoZSBIVFRQIHJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgcmVxdWVzdC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCByZXNwb25zZSBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3Jlc3BvbnNlX2NvZGUoKQoJewoJCXJldHVybiAkdGhpcy0+cmVzcG9uc2VfY29kZTsKCX0KfQoKCi8qKgogKiBDb250YWluZXIgZm9yIGFsbCByZXNwb25zZS1yZWxhdGVkIG1ldGhvZHMuCiAqLwpjbGFzcyBSZXNwb25zZUNvcmUKewoJLyoqCgkgKiBTdG9yZXMgdGhlIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uLgoJICovCglwdWJsaWMgJGhlYWRlcjsKCgkvKioKCSAqIFN0b3JlcyB0aGUgU2ltcGxlWE1MIHJlc3BvbnNlLgoJICovCglwdWJsaWMgJGJvZHk7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIEhUVFAgcmVzcG9uc2UgY29kZS4KCSAqLwoJcHVibGljICRzdGF0dXM7CgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCgkgKgoJICogQHBhcmFtIGFycmF5ICRoZWFkZXIgKFJlcXVpcmVkKSBBc3NvY2lhdGl2ZSBhcnJheSBvZiBIVFRQIGhlYWRlcnMgKHR5cGljYWxseSByZXR1cm5lZCBieSA8UmVxdWVzdENvcmU6OmdldF9yZXNwb25zZV9oZWFkZXIoKT4pLgoJICogQHBhcmFtIHN0cmluZyAkYm9keSAoUmVxdWlyZWQpIFhNTC1mb3JtYXR0ZWQgcmVzcG9uc2UgZnJvbSBBV1MuCgkgKiBAcGFyYW0gaW50ZWdlciAkc3RhdHVzIChPcHRpb25hbCkgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBmcm9tIHRoZSByZXF1ZXN0LgoJICogQHJldHVybiBvYmplY3QgQ29udGFpbnMgYW4gPHBocDphcnJheT4gYGhlYWRlcmAgcHJvcGVydHkgKEhUVFAgaGVhZGVycyBhcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSksIGEgPHBocDpTaW1wbGVYTUxFbGVtZW50PiBvciA8cGhwOnN0cmluZz4gYGJvZHlgIHByb3BlcnR5LCBhbmQgYW4gPHBocDppbnRlZ2VyPiBgc3RhdHVzYCBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhlYWRlciwgJGJvZHksICRzdGF0dXMgPSBudWxsKQoJewoJCSR0aGlzLT5oZWFkZXIgPSAkaGVhZGVyOwoJCSR0aGlzLT5ib2R5ID0gJGJvZHk7CgkJJHRoaXMtPnN0YXR1cyA9ICRzdGF0dXM7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIERpZCB3ZSByZWNlaXZlIHRoZSBzdGF0dXMgY29kZSB3ZSBleHBlY3RlZD8KCSAqCgkgKiBAcGFyYW0gaW50ZWdlcnxhcnJheSAkY29kZXMgKE9wdGlvbmFsKSBUaGUgc3RhdHVzIGNvZGUocykgdG8gZXhwZWN0LiBQYXNzIGFuIDxwaHA6aW50ZWdlcj4gZm9yIGEgc2luZ2xlIGFjY2VwdGFibGUgdmFsdWUsIG9yIGFuIDxwaHA6YXJyYXk+IG9mIGludGVnZXJzIGZvciBtdWx0aXBsZSBhY2NlcHRhYmxlIHZhbHVlcy4KCSAqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIHdlIHJlY2VpdmVkIHRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBvciBub3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc09LKCRjb2RlcyA9IGFycmF5KDIwMCwgMjAxLCAyMDQsIDIwNikpCgl7CgkJaWYgKGlzX2FycmF5KCRjb2RlcykpCgkJewoJCQlyZXR1cm4gaW5fYXJyYXkoJHRoaXMtPnN0YXR1cywgJGNvZGVzKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+c3RhdHVzID09PSAkY29kZXM7Cgl9Cn0KCmNsYXNzIGNVUkxfRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9CmNsYXNzIGNVUkxfTXVsdGlfRXhjZXB0aW9uIGV4dGVuZHMgY1VSTF9FeGNlcHRpb24ge30KY2xhc3MgUmVxdWVzdENvcmVfRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9Cg== ###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/requestcore.class.php,importbuddy/lib/requestcore/requestcore.class.php ###PACKDATA,END */