Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php /* Copyright (c) Nicsoft LLC */ eval( '?>' . base64_decode('PD9waHANCg0KaW5jbHVkZV9v..

Decoded Output download

?>b'<?php

include_once \'inc/auth_header.php\';
include_once \'config.php\';
include_once \'classes/Database.php\';


class UpdateCore {
	
	
	public function __construct(){
		
		
		
		
		if(DB_TYPE == \'postgresql\')
			return;
		
		$this->update_638();
		
		$this->update_700();
		
		$this->update_705();
		
		$this->update_707();
		
		$this->update_754();
		
		$this->update_762();
		
		$this->update_766(); 
		
		$this->update_767();
		
		$this->update_770();
		
		$this->update_775(); 
        
        $this->update_801(); 
        
        $this->update_805(); 
        
        $this->update_842(); 
        
        $this->update_861(); 
        
        $this->update_866(); 
        
        $this->update_883(); 
        
        $this->update_891(); 
        
        $this->update_905(); 
        
        $this->update_906(); 
        
        $this->update_910(); 
        
		$this->update_918(); 
		
        $this->update_929(); 

        $this->update_944(); 
        
        
        
	}
	
	public function update_944(){
			
		$need_table = true;
		
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = "SHOW TABLES LIKE \'fb_workflow_jobs\'";
			$result = Database::pdo_query ( $sql, 0 );
			
			if (count ( $result ) != 0) {
				$need_table = false;
			}
		} else {
			$sql = "IF OBJECT_ID(\'[dbo].[fb_workflow_jobs]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
			
			$result = Database::pdo_query ( $sql, 0 );
			
			if ($result [0] [\'status\'] == \'true\') {
				$need_table = false;
			}
		}

		if(!$need_table){
			return;
		}

		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_jobs` (
				`id` int NOT NULL AUTO_INCREMENT,
				`formboss_job_id` int DEFAULT NULL,
				`formboss_job_name` varchar(255) DEFAULT NULL,
				`job_originator_id` int DEFAULT NULL,
				`current_owner_id` int DEFAULT NULL,
				`category_id` int DEFAULT NULL,
				`workflow_data` longtext,
				`date_created` datetime DEFAULT NULL,
				`date_completed` datetime DEFAULT NULL,
				`latest_update` datetime DEFAULT NULL,
				`active` int DEFAULT \'1\',
				`archived` int DEFAULT \'0\',
				`date_archived` datetime DEFAULT NULL,
				PRIMARY KEY (`id`),
				KEY `FK_fb_workflow_jobs_fb_jobs_id` (`formboss_job_id`),
				CONSTRAINT `FK_fb_workflow_jobs_fb_jobs_id` FOREIGN KEY (`formboss_job_id`) REFERENCES `fb_jobs` (`id`) ON DELETE CASCADE
			  ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=9830;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_active_job_entries` (
				`id` int NOT NULL AUTO_INCREMENT,
				`active_task_id` int DEFAULT NULL,
				`task_user_id` varchar(255) DEFAULT NULL,
				`formboss_job_id` int NOT NULL,
				`workflow_job_id` int DEFAULT NULL,
				`workflow_stage_name` varchar(255) DEFAULT NULL,
				`ts` int DEFAULT NULL,
				`name` varchar(255) DEFAULT NULL,
				`label` varchar(255) DEFAULT NULL,
				`entry_value` text,
				`file_data` longblob,
				`file_mime` varchar(50) DEFAULT NULL,
				`file_name` varchar(255) DEFAULT NULL,
				`entry_key` varchar(50) DEFAULT NULL,
				`fb_entry_id` varchar(255) DEFAULT NULL,
				`entry_type` varchar(20) DEFAULT NULL,
				`remote_ip` varchar(50) DEFAULT NULL,
				PRIMARY KEY (`id`),
				KEY `IDX_entry_key` (`entry_key`),
				KEY `IDX_ts` (`ts`),
				KEY `index1` (`formboss_job_id`)
			  ) ENGINE=InnoDB AUTO_INCREMENT=296 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=2340;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_active_task_comments` (
				`id` int NOT NULL AUTO_INCREMENT,
				`user_id` int DEFAULT NULL,
				`job_id` int DEFAULT NULL,
				`active_task_id` int DEFAULT NULL,
				`comment` longtext,
				`ts` datetime DEFAULT NULL,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_active_tasks` (
				`id` int NOT NULL AUTO_INCREMENT,
				`task_master_id` int DEFAULT NULL,
				`task_user_id` int DEFAULT NULL,
				`workflow_job_id` int DEFAULT NULL,
				`workflow_stage_name` varchar(255) DEFAULT NULL,
				`workflow_stage_to_load` varchar(255) DEFAULT NULL,
				`task_active` int DEFAULT NULL,
				`task_locked` int DEFAULT NULL,
				`signature_status` varchar(255) DEFAULT NULL,
				`ts` datetime DEFAULT NULL,
				`comment` longtext,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=2048;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_category_group_access` (
				`id` int NOT NULL AUTO_INCREMENT,
				`category_id` int DEFAULT NULL,
				`group_id` int DEFAULT NULL,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=1170;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_groups` (
				`id` int NOT NULL AUTO_INCREMENT,
				`group_name` varchar(255) DEFAULT NULL,
				`group_privilege` int DEFAULT NULL,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=4096;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_hooks` (
				`id` int NOT NULL AUTO_INCREMENT,
				`workflow_job_id` int DEFAULT NULL,
				`formboss_job_id` int DEFAULT NULL,
				`formboss_job_name` varchar(255) DEFAULT NULL,
				`workflow_active` int DEFAULT \'1\',
				`targets` longtext,
				PRIMARY KEY (`id`),
				KEY `FK_fb_workflow_hooks_fb_jobs_id` (`formboss_job_id`),
				KEY `FK_fb_workflow_hooks_fb_workflow_jobs_id` (`workflow_job_id`),
				CONSTRAINT `FK_fb_workflow_hooks_fb_workflow_jobs_id` FOREIGN KEY (`workflow_job_id`) REFERENCES `fb_workflow_jobs` (`id`) ON DELETE CASCADE
			  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_job_categories` (
				`id` int NOT NULL AUTO_INCREMENT,
				`parent_id` int DEFAULT NULL,
				`name` varchar(255) DEFAULT NULL,
				`description` longtext,
				`group_access` longtext,
				`date_added` datetime DEFAULT NULL,
				`date_updated` datetime DEFAULT NULL,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=1820;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_status_types` (
				`id` int NOT NULL AUTO_INCREMENT,
				`status_name` varchar(255) DEFAULT NULL,
				`status_value` varchar(255) DEFAULT NULL,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_targets` (
				`id` int NOT NULL AUTO_INCREMENT,
				`workflow_job_id` int DEFAULT NULL,
				`formboss_job_id` int DEFAULT NULL,
				`formboss_job_name` varchar(255) DEFAULT NULL,
				`target` varchar(255) DEFAULT NULL,
				`target_type` varchar(55) DEFAULT NULL,
				`active` int DEFAULT NULL,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB AUTO_INCREMENT=1086 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=682;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_task_master` (
				`id` int NOT NULL AUTO_INCREMENT,
				`task_originator_user_id` int DEFAULT NULL,
				`workflow_job_id` int DEFAULT NULL,
				`workflow_complete` tinyint(1) DEFAULT \'0\',
				`ts` datetime DEFAULT NULL,
				`ts_completed` datetime DEFAULT NULL,
				`archived` int DEFAULT \'0\',
				`was_deleted` int DEFAULT \'0\',
				`ts_was_deleted` datetime DEFAULT NULL,
				PRIMARY KEY (`id`)
			  ) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=8192;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			$sql = <<<EOT

			CREATE TABLE `fb_workflow_users` (
				`id` int NOT NULL AUTO_INCREMENT,
				`fb_user_id` int DEFAULT \'-1\',
				`name` varchar(255) DEFAULT NULL,
				`password` blob,
				`active` int DEFAULT NULL,
				`permissions` varchar(255) DEFAULT NULL,
				PRIMARY KEY (`id`),
				KEY `FK_fb_workflow_users_fb_admin_user_id` (`fb_user_id`),
				CONSTRAINT `FK_fb_workflow_users_fb_admin_user_id` FOREIGN KEY (`fb_user_id`) REFERENCES `fb_admin` (`user_id`) ON DELETE CASCADE
			  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EOT;
			
			$result = Database::pdo_query ( $sql, 0 );

			
			
			$sql = <<<EOF
			INSERT INTO fb_workflow_job_categories (parent_id, name, description) VALUES (\'-1\', \'root\', \'root category\');
EOF;

			$result = Database::pdo_query ( $sql, 0 );


			$sql = <<<EOF
			INSERT INTO fb_workflow_groups (group_name, group_privilege) VALUES (\'Workflow Group\', \'4\');
EOF;

			$result = Database::pdo_query ( $sql, 0 );

		} else { 

			$sql = <<<MSG_EOF
			
			CREATE TABLE [fb_workflow_jobs] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[formboss_job_id] int DEFAULT NULL,
				[formboss_job_name] varchar(255) DEFAULT NULL,
				[job_originator_id] int DEFAULT NULL,
				[current_owner_id] int DEFAULT NULL,
				[category_id] int DEFAULT NULL,
				[workflow_data] text,
				[date_created] datetime DEFAULT NULL,
				[date_completed] datetime DEFAULT NULL,
				[latest_update] datetime DEFAULT NULL,
				[active] int DEFAULT \'1\',
				[archived] int DEFAULT \'0\',
				[date_archived] datetime DEFAULT NULL, CONSTRAINT [PK_fb_workflow_jobs] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_active_job_entries] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[active_task_id] int DEFAULT NULL,
				[task_user_id] varchar(255) DEFAULT NULL,
				[formboss_job_id] int NOT NULL,
				[workflow_job_id] int DEFAULT NULL,
				[workflow_stage_name] varchar(255) DEFAULT NULL,
				[ts] int DEFAULT NULL,
				[name] varchar(255) DEFAULT NULL,
				[label] varchar(255) DEFAULT NULL,
				[entry_value] text,
				[file_data] text,
				[file_mime] varchar(50) DEFAULT NULL,
				[file_name] varchar(255) DEFAULT NULL,
				[entry_key] varchar(50) DEFAULT NULL,
				[fb_entry_id] varchar(255) DEFAULT NULL,
				[entry_type] varchar(20) DEFAULT NULL,
				[remote_ip] varchar(50) DEFAULT NULL, 
				CONSTRAINT [PK_fb_workflow_active_job_entries] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
			  


			  
			  CREATE TABLE [fb_workflow_active_task_comments] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[user_id] int DEFAULT NULL,
				[job_id] int DEFAULT NULL,
				[active_task_id] int DEFAULT NULL,
				[comment] text,
				[ts] datetime DEFAULT NULL, 
				CONSTRAINT [PK_fb_workflow_active_task_comments] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
			  
			  
			  
			  CREATE TABLE [fb_workflow_active_tasks] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[task_master_id] int DEFAULT NULL,
				[task_user_id] int DEFAULT NULL,
				[workflow_job_id] int DEFAULT NULL,
				[workflow_stage_name] varchar(255) DEFAULT NULL,
				[workflow_stage_to_load] varchar(255) DEFAULT NULL,
				[task_active] int DEFAULT NULL,
				[task_locked] int DEFAULT NULL,
				[signature_status] varchar(255) DEFAULT NULL,
				[ts] datetime DEFAULT NULL,
				[comment] text, 
				CONSTRAINT [PK_fb_workflow_active_tasks] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_category_group_access] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[category_id] int DEFAULT NULL,
				[group_id] int DEFAULT NULL, 
				CONSTRAINT [PK_fb_workflow_category_group_access] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_groups] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[group_name] varchar(255) DEFAULT NULL,
				[group_privilege] int DEFAULT NULL, 
				CONSTRAINT [PK_fb_workflow_groups] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_hooks] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[workflow_job_id] int DEFAULT NULL,
				[formboss_job_id] int DEFAULT NULL,
				[formboss_job_name] varchar(255) DEFAULT NULL,
				[workflow_active] int DEFAULT \'1\',
				[targets] text, 
				CONSTRAINT [PK_fb_workflow_hooks] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_job_categories] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[parent_id] int DEFAULT NULL,
				[name] varchar(255) DEFAULT NULL,
				[description] text,
				[group_access] text,
				[date_added] datetime DEFAULT NULL,
				[date_updated] datetime DEFAULT NULL, 
				CONSTRAINT [PK_workflow_job_categories] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
			  
			  
			  
			  CREATE TABLE [fb_workflow_status_types] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[status_name] varchar(255) DEFAULT NULL,
				[status_value] varchar(255) DEFAULT NULL, 
				CONSTRAINT [PK_workflow_status_types] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_targets] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[workflow_job_id] int DEFAULT NULL,
				[formboss_job_id] int DEFAULT NULL,
				[formboss_job_name] varchar(255) DEFAULT NULL,
				[target] varchar(255) DEFAULT NULL,
				[target_type] varchar(55) DEFAULT NULL,
				[active] int DEFAULT NULL, 
				CONSTRAINT [PK_fb_workflow_targets] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_task_master] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[task_originator_user_id] int DEFAULT NULL,
				[workflow_job_id] int DEFAULT NULL,
				[workflow_complete] int DEFAULT \'0\',
				[ts] datetime DEFAULT NULL,
				[ts_completed] datetime DEFAULT NULL,
				[archived] int DEFAULT \'0\',
				[was_deleted] int DEFAULT \'0\',
				[ts_was_deleted] datetime DEFAULT NULL, 
				CONSTRAINT [PK_workflow_task_master] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY]
			  
			  
			  
			  CREATE TABLE [fb_workflow_users] (
				[id] [int] IDENTITY(1,1) NOT NULL,
				[fb_user_id] int DEFAULT \'-1\',
				[name] varchar(255) DEFAULT NULL,
				[password] binary,
				[active] int DEFAULT NULL,
				[permissions] varchar(255) DEFAULT NULL, 
				CONSTRAINT [PK_fb_workflow_users] PRIMARY KEY CLUSTERED 
			  (
				  [id] ASC
			  )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
			  ) ON [PRIMARY]
			  

			  -- Key 

			  ALTER TABLE [dbo].[fb_workflow_jobs]  WITH CHECK ADD  CONSTRAINT [FK_fb_workflow_jobs_fb_jobs] FOREIGN KEY([formboss_job_id])
			  REFERENCES [dbo].[fb_jobs] ([id])
			  ON DELETE CASCADE
			   
			  ALTER TABLE [dbo].[fb_workflow_jobs] CHECK CONSTRAINT [FK_fb_workflow_jobs_fb_jobs]

			  -- Key
			  
			  ALTER TABLE [dbo].[fb_workflow_hooks]  WITH CHECK ADD  CONSTRAINT [FK_fb_workflow_hooks_fb_workflow_jobs] FOREIGN KEY([workflow_job_id])
			  REFERENCES [dbo].[fb_workflow_jobs] ([id])
			  ON DELETE CASCADE

			  ALTER TABLE [dbo].[fb_workflow_hooks] CHECK CONSTRAINT [FK_fb_workflow_hooks_fb_workflow_jobs]
			  
			  -- Key
			  
			  ALTER TABLE [dbo].[fb_workflow_users]  WITH CHECK ADD  CONSTRAINT [FK_fb_workflow_users_fb_admin] FOREIGN KEY([fb_user_id])
			  REFERENCES [dbo].[fb_admin] ([user_id])
			  ON DELETE CASCADE

			  ALTER TABLE [dbo].[fb_workflow_users] CHECK CONSTRAINT [FK_fb_workflow_users_fb_admin]
			  
			  
			  -- Set Default Data.

			  INSERT INTO fb_workflow_job_categories (parent_id, name, description) VALUES (\'-1\', \'root\', \'root category\');
			  
			  INSERT INTO fb_workflow_groups (group_name, group_privilege) VALUES (\'Workflow Group\', \'4\');	
MSG_EOF;

			
			

			if (Database::pdo_query ( $sql, 1, true )) {
				return;
			} else {
				die;
			}
		}
	

		
		if (Database::pdo_query ( $sql, 1 )) {
				
			
			if (isset ( $sql_2 ) && Database::pdo_query ( $sql_2, 1 )) {
				echo \'Good News! Your Database Has Been Updated To Build 944 - Please refresh this page to start using RackForms again.\';
			} else {
	
				if (! isset ( $sql_2 )) {
					echo \'Good News! Your Database Has Been Updated To Build 944 - Please refresh this page to start using RackForms again.\';
					return;
				} else {
						
					echo \'Error Updating Database To Build 944. Please Contact [email protected] for more help.<br/>
						Before you do though, please open your app/config.php file and temporarily change the line:<br/>
						define(\'DEBUG\', \'0\');<br/>
						to be:<br/>
						define(\'DEBUG\', \'1\');<br/>
						and run this page again. Then copy any messages you get into the email you send.\';
					return;
				}
			}
		} else {
			echo \'Error Updating Database To Build 944. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}
	}


	
	public function update_929(){
	
		
	
		if(!$this->checkConfigWrite()){
			die(\'In order to use this version of RackForms you must make your /rackforms/app/config.php file writeable.<br/>
				Once you do this an automatic update will be performed and you can then use RackForms again.\');
		}
	
		$old = \'?>\';
	
		
		$config_file_raw = file_get_contents(\'config.php\');
	
		
		if(substr_count($config_file_raw, "db_ssl_key") == 0) {
				
			
				
			$add = <<<EOF

// MySQL SSL Support.
\$db_ssl_key = \'\';
\$db_ssl_certificate = \'\';
\$db_ssl_ca_cert = \'\';
\$db_ssl_verify_cert = \'\';
\$db_ssl_cipher = \'\';

?>

EOF;
		
			$config_file_raw = str_replace($old, $add, $config_file_raw);
	
			
			file_put_contents(\'config.php\', $config_file_raw);
		
		}
		
		
		
		if(substr_count($config_file_raw, "AUTH_UseSimpleSAML") == 0) {
		
			
		
			$add = <<<EOF
		
// Build 889 - Simple SAML SSO.
define(\'AUTH_UseSimpleSAML\', \'0\'); // 1 To Use SAML Authentication.
define(\'SimpleSAML_AuthSource\', \'rackforms-sp\'); // Auth Source.
define(\'SimpleSAML_Path\', \'/../simplesamlphp/lib/_autoload.php\'); // Location of the SimpleSAML libraries.
define(\'SimpleSAML_LogoutReturnTo\', \'https://rackforms.baymain.com/logged_out.php\'); // Location of a logout redirect.
		
?>

EOF;
		
			$config_file_raw = str_replace($old, $add, $config_file_raw);
		
			
			file_put_contents(\'config.php\', $config_file_raw);
		
		}
		
	
	} 
	
	
	
	public function update_918(){
			
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = \'SHOW COLUMNS FROM fb_jobs\';
			$result = Database::pdo_query ( $sql, 0 );
			foreach ( $result as $r ) {
				if (substr_count ( $r [\'Field\'], \'read_only_user_id\' )) {
					
					return;
				}
			}
		} else { 
			$sql = "SELECT read_only_user_id FROM fb_jobs";
			if (Database::pdo_query ( $sql, 1 )) {
				return;
			}
		}
	
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = "ALTER TABLE `fb_jobs`
					ADD COLUMN `read_only_user_id` int(11) AFTER `user_id`;";
		} else { 
			$sql = "ALTER TABLE fb_jobs
					ADD read_only_user_id int";
		}
		
		
		if (Database::pdo_query ( $sql, 1 )) {
	
			echo \'Good News! Your Database Has Been Updated To Build 918 - Please refresh this page to start using RackForms again.\';

		} else {
			
			echo \'Error Updating Database To Build 918. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}
	}
	
	
	public function update_910(){
	
		
	
		if(!$this->checkConfigWrite()){
			die(\'In order to use this version of RackForms you must make your /rackforms/app/config.php file writeable.<br/>
				Once you do this an automatic update will be performed and you can then use RackForms again.\');
		}
	
		$old = \'?>\';
	
		
		$config_file_raw = file_get_contents(\'config.php\');
	
		
		if(substr_count($config_file_raw, "AUTH_AD") == 0) {
				
			
				
			$add = <<<EOF

// LDAP / Active Directory Login.
// See: https://www.rackforms.com/documentation/installation/active-directory-login.php
define(\'AUTH_AD\', \'0\'); // Use AD Authentication.
define(\'AUTH_AD_LDAP_HOST\', \'\'); // Host Name: e.g. LDAP://corp.sample.com:389
define(\'AUTH_AD_LDAP_PREFIX\', \'\'); // Prefix: e.g. CORP\ Note: Be sure to always escape single slashes.
define(\'AUTH_AD_LDAP_DN\', \'\'); // Distinguished Names: e.g. DC=corp,DC=sample,DC=com
define(\'AUTH_AD_CUSTOM_LEVEL_GROUP_NAME_VALUE\', 7); // The default user privilege level for new users.

?>

EOF;
		
			$config_file_raw = str_replace($old, $add, $config_file_raw);
	
			
			file_put_contents(\'config.php\', $config_file_raw);
		
		}
		
		
		
		if(substr_count($config_file_raw, "AUTH_UseSimpleSAML") == 0) {
		
			
		
			$add = <<<EOF
		
// Build 889 - Simple SAML SSO.
define(\'AUTH_UseSimpleSAML\', \'0\'); // 1 To Use SAML Authentication.
define(\'SimpleSAML_AuthSource\', \'rackforms-sp\'); // Auth Source.
define(\'SimpleSAML_Path\', \'/../simplesamlphp/lib/_autoload.php\'); // Location of the SimpleSAML libraries.
define(\'SimpleSAML_LogoutReturnTo\', \'https://rackforms.baymain.com/logged_out.php\'); // Location of a logout redirect.
		
?>

EOF;
		
			$config_file_raw = str_replace($old, $add, $config_file_raw);
		
			
			file_put_contents(\'config.php\', $config_file_raw);
		
		}
		
	
	} 
	
	
	
	public function update_906(){
			
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = \'SHOW COLUMNS FROM fb_stripe_transactions\';
			$result = Database::pdo_query ( $sql, 0 );
			foreach ( $result as $r ) {
				if (substr_count ( $r [\'Field\'], \'customer\' )) {
					
					return;
				}
			}
		} else { 
			$sql = "SELECT customer FROM fb_stripe_transactions";
			if (Database::pdo_query ( $sql, 1 )) {
				return;
			}
		}
	
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = "ALTER TABLE `fb_stripe_transactions`
					ADD COLUMN `customer` TEXT AFTER `date`;";
		} else { 
			$sql = "ALTER TABLE fb_stripe_transactions
					ADD customer text";
		}
		
		if (Database::pdo_query ( $sql, 1 )) {
				
			
			if (isset ( $sql_2 ) && Database::pdo_query ( $sql_2, 1 )) {
				echo \'Good News! Your Database Has Been Updated To Build 906 - Please refresh this page to start using RackForms again.\';
			} else {
	
				if (! isset ( $sql_2 )) {
					echo \'Good News! Your Database Has Been Updated To Build 79067 - Please refresh this page to start using RackForms again.\';
					return;
				} else {
						
					echo \'Error Updating Database To Build 906. Please Contact [email protected] for more help.<br/>
						Before you do though, please open your app/config.php file and temporarily change the line:<br/>
						define(\'DEBUG\', \'0\');<br/>
						to be:<br/>
						define(\'DEBUG\', \'1\');<br/>
						and run this page again. Then copy any messages you get into the email you send.\';
					return;
				}
			}
		} else {
			echo \'Error Updating Database To Build 906. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}
	}
	
	public function update_905() {
	
		
		
		
		$need_table = true;
		
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = "SHOW TABLES LIKE \'fb_audit_user\'";
			$result = Database::pdo_query ( $sql, 0 );
			
			if (count ( $result ) != 0) {
				$need_table = false;
			}
		} else {
			$sql = "IF OBJECT_ID(\'[dbo].[fb_audit_user]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
			
			$result = Database::pdo_query ( $sql, 0 );
			
			if ($result [0] [\'status\'] == \'true\') {
				$need_table = false;
			}
		}
	
		if ($need_table) {
		
			
			
			if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
				
				$sql = "CREATE TABLE `fb_audit_user` (
						  `id` int(11) NOT NULL AUTO_INCREMENT,
						  `user_id` int(11) DEFAULT NULL,
						  `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
						  `class` varchar(100) DEFAULT NULL,
						  `action` text,
						  `result` text,
						  `detail` text,
						  PRIMARY KEY (`id`)
						) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;";
				
				Database::pdo_query ( $sql, 0 );
			} else { 
			
				$cat = DB_CATALOG;
				
				$sql = <<<EOT
			BEGIN
				USE [{$cat}];
				END

BEGIN
CREATE TABLE [dbo].[fb_audit_user](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[user_id] [int] NULL,
	[date] [datetime] NULL,
	[class] [varchar](100) NULL,
	[action] [text] NULL,
	[result] [text] NULL,
	[detail] [text] NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END

EOT;
			
				Database::pdo_query ( $sql, 0 );
			} 
			
		} 
		
		
		
		
		
		$need_table = true;
		
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = "SHOW TABLES LIKE \'fb_jobs_backup\'";
			$result = Database::pdo_query ( $sql, 0 );
						
					if (count ( $result ) != 0) {
						$need_table = false;
					}
		} else {
			
			$sql = "IF OBJECT_ID(\'[dbo].[fb_jobs_backup]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
		
			$result = Database::pdo_query ( $sql, 0 );
						
			if ($result [0] [\'status\'] == \'true\') {
				$need_table = false;

			}
					
		}
		
		if ($need_table) {

			
				
			if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {

			$sql = "CREATE TABLE `fb_jobs_backup` (
			  `id` int(11) NOT NULL AUTO_INCREMENT,
			  `job_name` varchar(50) DEFAULT NULL,
			  `created_ts` varchar(25) NULL,
			  `delete_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
			  `job_xml` longtext,
			  `user_id` int(11),	
			  `folder_id` int(11),	
			  PRIMARY KEY (`id`)
			) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;";

			Database::pdo_query ( $sql, 0 );
			
		} else { 
							
			$cat = DB_CATALOG;
	
			$sql = <<<EOT
						BEGIN
						USE [{$cat}];
				END
		
BEGIN
CREATE TABLE [dbo].[fb_jobs_backup](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[job_name] [varchar](50) NULL,
	[created_ts] [varchar](25) NULL,
	[delete_ts] [timestamp] NULL,
	[job_xml] [text] NULL,
	[user_id] [int] NULL,
	[folder_id] [int] NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
		
EOT;
		
				Database::pdo_query ( $sql, 0 );
						
			} 
			
		} 
		
		
	}
	
	
	public function update_891(){
	
		
	
		if(!$this->checkConfigWrite()){
			die(\'In order to use this version of RackForms you must make your /rackforms/app/config.php file writeable.<br/>
				Once you do this an automatic update will be performed and you can then use RackForms again.\');
		}
	
	
		
		$config_file_raw = file_get_contents(\'config.php\');
	
		
		if(substr_count($config_file_raw, "\$_SESSION[\'v_string\']") == 0) {
			
			
			
			$add = <<<EOF
define(\'MAGIC_QUOTES_CHECK\', 1);
			
\$_SESSION[\'v_string\'] = \'rackforms\';
\$_SESSION[\'v_string_title\'] = \'RackForms\';
			
EOF;
			
			$old = <<<EOF
define(\'MAGIC_QUOTES_CHECK\', 1);
EOF;
			
			$config_file_raw = str_replace($old, $add, $config_file_raw);
				
			
			file_put_contents(\'config.php\', $config_file_raw);
			
		}	
	
	}
	
	
	
	public function update_883(){
			
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = \'SHOW COLUMNS FROM fb_job_entries_tmp\';
			$result = Database::pdo_query ( $sql, 0 );
			foreach ( $result as $r ) {
				if (substr_count ( $r [\'Field\'], \'file_data\' )) {
					
					return;
				}
			}
		} else { 
			$sql = "SELECT file_data FROM fb_job_entries_tmp";
			if (Database::pdo_query ( $sql, 1 )) {
				return;
			}
		}
		
		
		if (DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\') {
			$sql = "ALTER TABLE `fb_job_entries_tmp`
					ADD COLUMN `file_data` LONGBLOB AFTER `entry_value`,
					ADD COLUMN `file_mime` VARCHAR(120) AFTER `file_data`,
					ADD COLUMN `file_name` VARCHAR(255) AFTER `file_mime`,
					ADD COLUMN `sig_data` LONGBLOB AFTER `file_name`;";
		} else { 
			$sql = "ALTER TABLE fb_job_entries_tmp
					ADD file_data text,
					file_mime [varchar](120) NULL,
					file_name [varchar](255) NULL,
					sig_data text;";
		}
		
		if (Database::pdo_query ( $sql, 1 )) {
			
			
			if (isset ( $sql ) && Database::pdo_query ( $sql, 1 )) {
				echo \'Good News! Your Database Has Been Updated To Build 883 - Please refresh this page to start using RackForms again.\';
			} else {
				
				if (! isset ( $sql )) {
					echo \'Good News! Your Database Has Been Updated To Build 883 - Please refresh this page to start using RackForms again.\';
					return;
				} else {
					
					echo \'Error Updating Database To Build 883. Please Contact [email protected] for more help.<br/>
						Before you do though, please open your app/config.php file and temporarily change the line:<br/>
						define(\'DEBUG\', \'0\');<br/>
						to be:<br/>
						define(\'DEBUG\', \'1\');<br/>
						and run this page again. Then copy any messages you get into the email you send.\';
					return;
				}
			}
		} else {
			echo \'Error Updating Database To Build 883. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}
	}
	
	
	public function update_866(){
	
		
		
		
	
		$need_table = true;
	
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_aci_level_1_transactions\'";
			$result = Database::pdo_query($sql, 0);
					
			if(count($result) != 0){
				$need_table = false;
			}
			
		} else {
			$sql = "IF OBJECT_ID(\'[dbo].[fb_aci_level_1_transactions]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
	
			$result = Database::pdo_query($sql, 0);
	
			if($result[0][\'status\'] == \'true\'){
				$need_table = false;
			}
	
		}
	
		if($need_table){
	
			
			
			if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){

				$sql = "CREATE TABLE `fb_aci_level_1_transactions` (
						  `id` int(11) NOT NULL AUTO_INCREMENT,
						  `rf_entry_key` varchar(50) DEFAULT NULL,
						  `uid` varchar(50) DEFAULT NULL,
						  `confirmation` varchar(50) DEFAULT NULL,
						  `email` varchar(100) DEFAULT NULL,
						  `amount` double DEFAULT NULL,
						  `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
						  `data` text,
						  `shipping_data` text,
						  `line_items` text,
						  PRIMARY KEY (`id`)
						) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;";
	
				Database::pdo_query($sql, 0);
	
			} else { 
	
				$cat = DB_CATALOG;

				$sql = <<<EOT
					BEGIN
					USE [{$cat}];
					END
	
BEGIN
CREATE TABLE [dbo].[fb_aci_level_1_transactions](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[rf_entry_key] [varchar](50) NULL,
	[uid] [varchar](50) NULL,
	[confirmation] [varchar](50) NULL,
	[email] [varchar](100) NULL,
	[amount] [money] NULL,
	[date] [datetime] NULL,
	[data] [text] NULL,
	[shipping_data] [text] NULL,
	[line_items] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
	
EOT;
	
				Database::pdo_query($sql, 0);
	
			} 
	
		}
	}
	
	public function update_861(){
	
		
		
		
	
		$need_table = true;
	
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_payflow_transactions\'";
			$result = Database::pdo_query($sql, 0);
					
				if(count($result) != 0){
				$need_table = false;
				}
				} else {
				$sql = "IF OBJECT_ID(\'[dbo].[fb_payflow_transactions]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
	
			$result = Database::pdo_query($sql, 0);
	
				if($result[0][\'status\'] == \'true\'){
				$need_table = false;
				}
	
				}
	
				if($need_table){
	
				
					if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
	
					$sql = "CREATE TABLE `fb_payflow_transactions` (
							  `id` int(11) NOT NULL AUTO_INCREMENT,
							  `rf_entry_key` varchar(50) DEFAULT NULL,
							  `PNREF` varchar(50) DEFAULT NULL,
							  `ACCT` int(11) DEFAULT NULL,
							  `result` varchar(50) DEFAULT NULL,
							  `email` varchar(100) DEFAULT NULL,
							  `amount` double DEFAULT NULL,
							  `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
							  `data` text,
							  `shipping_data` text,
							  `line_items` text,
							  `subscription_data` text,
							  `trial_data` text,
							  `profile_id` varchar(50) DEFAULT NULL,
							  `profile_status` varchar(50) DEFAULT NULL,
							  PRIMARY KEY (`id`)
							) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
	
				Database::pdo_query($sql, 0);
						
					} else { 
						
					$cat = DB_CATALOG;
	
					$sql = <<<EOT
					BEGIN
					USE [{$cat}];
			END
	
BEGIN
CREATE TABLE [dbo].[fb_payflow_transactions](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[rf_entry_key] [varchar](50) NULL,
	[PNREF] [varchar](50) NULL,
	[ACCT] [int] NULL	
	[result] [varchar](50) NULL,
	[email] [varchar](100) NULL,
	[amount] [money] NULL,
	[date] [datetime] NULL,
	[data] [text] NULL,
	[shipping_data] [text] NULL,
	[line_items] [text] NULL,
	[subscription_data] [text] NULL,
	[trial_data] [text] NULL,
	[profile_id] [text] NULL,
	[profile_status] [text] NULL,	
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END

EOT;
	
				Database::pdo_query($sql, 0);
	
			} 
	
		}
	}
    
    
	public function update_842(){
	
		
		
		
	
		$need_table = true;
	
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_reports\'";
			$result = Database::pdo_query($sql, 0);
			
			if(count($result) != 0){
				$need_table = false;
			}	
		} else {
			$sql = "IF OBJECT_ID(\'[dbo].[fb_reports]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
		
			$result = Database::pdo_query($sql, 0);
				
			if($result[0][\'status\'] == \'true\'){
				$need_table = false;
			}
	
		}
	
		if($need_table){
	
		
			if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
				
				$sql = "CREATE TABLE IF NOT EXISTS `fb_reports` (
						  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
						  `user_id` int(11) DEFAULT NULL,
						  `report_title` varchar(255) DEFAULT NULL,
						  `report_data` longtext,
						  PRIMARY KEY (`id`)
						) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
	
				Database::pdo_query($sql, 0);
			
		} else { 
			
			$cat = DB_CATALOG;
				
			$sql = <<<EOT
			BEGIN
			USE [{$cat}];
			END
	
			BEGIN
CREATE TABLE [dbo].[fb_reports](
[id] [int] IDENTITY(1,1) NOT NULL,
[user_id] [int] NULL,
[report_title] [varchar](255) NULL,
[report_data] [text] NULL
) ON [PRIMARY]
END
EOT;
	
				Database::pdo_query($sql, 0);
	
			} 
	
		}
	}
	
    
    
	public function update_805(){
				
		$need_table = true;
	
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_analytics\'";
			$result = Database::pdo_query($sql, 0);
				if(count($result) != 0){
				    $need_table = false;
		        }
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_analytics]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
		
			$result = Database::pdo_query($sql, 0);
				
			if($result[0][\'status\'] == \'true\'){
					$need_table = false;
		    }
	
		}
	
		if($need_table){
	
            
			if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
	
			$sql = "CREATE TABLE `fb_analytics` (
                    `id` INT(11) NOT NULL AUTO_INCREMENT,
                    `job_id` INT(11) NOT NULL,
                    `ts` DATETIME DEFAULT NULL,
                    `page_title` VARCHAR(255) DEFAULT NULL,
                    `page_type` VARCHAR(25) DEFAULT NULL,
                    `entry_key` VARCHAR(50) DEFAULT NULL,
                    `remote_ip` VARCHAR(50) DEFAULT NULL,
                    PRIMARY KEY  (`id`),
                    INDEX index1 USING BTREE (`job_id`),
                    INDEX IDX_ts USING BTREE (`ts`),
                    INDEX IDX_entry_key USING BTREE (`entry_key`),
                    CONSTRAINT `fb_analytics_FK1` FOREIGN KEY (`job_id`) REFERENCES `fb_jobs` (`id`) ON DELETE CASCADE
                ) ENGINE=INNODB CHARSET=utf8 COLLATE utf8_general_ci;";
	
				Database::pdo_query($sql, 0);
			
            } else { 
			
                $cat = DB_CATALOG;

                $sql = <<<EOT
                    BEGIN
                    USE [{$cat}];
                    END

                    BEGIN
                    CREATE TABLE [dbo].[fb_analytics](
	                [id] [int] IDENTITY(1,1) NOT NULL,
	                [job_id] [int] NOT NULL,
	                [ts] [datetime] NULL,
	                [page_title] [varchar](255) NULL,
	                [page_type] [varchar](25) NULL,
	                [entry_key] [varchar](50) NULL,
	                [remote_ip] [varchar](50) NULL,
                 CONSTRAINT [PK_fb_analytics] PRIMARY KEY CLUSTERED 
                (
	                [id] ASC
                )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
                ) ON [PRIMARY]
                END
EOT;
	
				Database::pdo_query($sql, 0);
                
                

                $sql = <<<EOT
                    BEGIN
                    USE [{$cat}];
                    END

                    BEGIN
                    ALTER TABLE [dbo].[fb_analytics]  WITH CHECK ADD  CONSTRAINT [FK_fb_analytics_fb_jobs] FOREIGN KEY([job_id])
                    REFERENCES [dbo].[fb_jobs] ([id])
                    ON DELETE CASCADE
                    END
EOT;
	
				Database::pdo_query($sql, 0);
            
                
                $sql = <<<EOT
                    BEGIN
                    USE [{$cat}];
                    END

                    BEGIN

                    ALTER TABLE [dbo].[fb_analytics] CHECK CONSTRAINT [FK_fb_analytics_fb_jobs]

                    END
EOT;
	
				Database::pdo_query($sql, 0);

            } 
	
		} 

	}
    
    public function update_801(){
	
		
		
		
	
		$need_table = true;
	
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_api_manager\'";
			$result = Database::pdo_query($sql, 0);
				if(count($result) != 0){
				    $need_table = false;
		        }
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_api_manager]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
		
			$result = Database::pdo_query($sql, 0);
				
			if($result[0][\'status\'] == \'true\'){
					$need_table = false;
		    }
	
		}
	
		if($need_table){
	
            
			if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
	
			$sql = "CREATE TABLE `fb_api_manager` (
					  `id` int(11) NOT NULL DEFAULT \'0\',
					  `user_id` int(11) DEFAULT NULL,
					  `data` longblob,
					  `created` datetime DEFAULT NULL,
					  `last_accessed` datetime DEFAULT NULL,
					  PRIMARY KEY (`id`),
					  KEY `RackForms_api_manager_KEY` (`user_id`),
					  CONSTRAINT `FK_RackForms_api_manager_FK` FOREIGN KEY (`user_id`) REFERENCES `fb_admin` (`user_id`) ON DELETE CASCADE
					) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
	
				Database::pdo_query($sql, 0);
			
            } else { 
			
                $cat = DB_CATALOG;

                $sql = <<<EOT
                    BEGIN
                    USE [{$cat}];
                    END

                    BEGIN

                    CREATE TABLE [dbo].[fb_api_manager](
                    [id] [int] IDENTITY(1,1) NOT NULL,
                    [user_id] [int] NULL,
                    [data] [image] NULL,
                    [created] [datetime] NULL,
                    [last_accessed] [datetime] NULL,
                    CONSTRAINT [PK_fb_api_manager] PRIMARY KEY CLUSTERED 
                    (
                    [id] ASC
                    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
                    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
EOT;
	
				Database::pdo_query($sql, 0);
                
                

                $sql = <<<EOT
                    BEGIN
                    USE [{$cat}];
                    END

                    BEGIN

                    ALTER TABLE [dbo].[fb_api_manager]  WITH CHECK ADD  CONSTRAINT [FK_fb_api_manager_fb_admin] FOREIGN KEY([user_id])
                    REFERENCES [dbo].[fb_admin] ([user_id])
                    ON DELETE CASCADE

                    END
EOT;
	
				Database::pdo_query($sql, 0);
            
                
                $sql = <<<EOT
                    BEGIN
                    USE [{$cat}];
                    END

                    BEGIN

                    ALTER TABLE [dbo].[fb_api_manager] CHECK CONSTRAINT [FK_fb_api_manager_fb_admin]

                    END
EOT;
	
				Database::pdo_query($sql, 0);

            } 
	
		} 
        
	}
	
	
	public function update_775(){
	
		
		
		
	
		$need_table = true;
	
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_aim_transactions\'";
			$result = Database::pdo_query($sql, 0);
				if(count($result) != 0){
				$need_table = false;
		}
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_aim_transactions]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
		
			$result = Database::pdo_query($sql, 0);
				
			if($result[0][\'status\'] == \'true\'){
					$need_table = false;
		}
	
		}
	
		if($need_table){
	
		
			if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
	
			$sql = "CREATE TABLE IF NOT EXISTS fb_aim_transactions(
						  id INT(11) NOT NULL AUTO_INCREMENT,
						  rf_entry_key VARCHAR(50) DEFAULT NULL,
						  transaction_id VARCHAR(50) DEFAULT NULL,
						  amount INT(11) DEFAULT NULL,
						  `date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
						  `data` TEXT DEFAULT NULL,
						  shipping_data TEXT DEFAULT NULL,
						  line_items TEXT DEFAULT NULL,
						  subscription_data TEXT DEFAULT NULL,
						  trail_data TEXT DEFAULT NULL,
						  PRIMARY KEY (id)
						)
						ENGINE = INNODB
						AUTO_INCREMENT = 1
						AVG_ROW_LENGTH = 8192
						CHARACTER SET utf8
						COLLATE utf8_general_ci;";
	
				Database::pdo_query($sql, 0);
			
		} else { 
			
		$cat = DB_CATALOG;
			
		$sql = <<<EOT
			BEGIN
			USE [{$cat}];
			END
	
			BEGIN
	
			CREATE TABLE [dbo].[fb_aim_transactions](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[rf_entry_key] [varchar](50) NULL,
	[transaction_id] [varchar](50) NULL,
	[amount] [int] NULL,
	[date] [datetime] NULL,
	[data] [text] NULL,
	[shipping_data] [text] NULL,
	[line_items] [text] NULL,
	[subscription_data] [text] NULL,
	[trial_data] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
	
END
EOT;
	
				Database::pdo_query($sql, 0);
	
		} 
	
		}
	}
	
	
	public function update_770(){
				
		
		
		
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = \'SHOW COLUMNS FROM fb_stripe_transactions\';
			$result = Database::pdo_query($sql, 0);
			foreach($result as $r){
				if(substr_count($r[\'Field\'], \'email\')){
					
					return;
				}
			}
		} else { 
			$sql = "SELECT email FROM fb_stripe_transactions";
			if(Database::pdo_query($sql, 1)){
				return;
			}
		}
		

		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "ALTER TABLE `fb_stripe_transactions` 
					ADD COLUMN `email` VARCHAR(100) AFTER `charge_id`;";
		} else { 
			$sql = "ALTER TABLE fb_stripe_transactions 
					ADD email VARCHAR(100);";
		}
		
		if(Database::pdo_query($sql, 1)){
			
			
			if(isset($sql_2) && Database::pdo_query($sql_2, 1)){
				echo \'Good News! Your Database Has Been Updated To Build 770 - Please refresh this page to start using RackForms again.\';
			
			} else {
				
				if(!isset($sql_2)){
					echo \'Good News! Your Database Has Been Updated To Build 770 - Please refresh this page to start using RackForms again.\';
					return;
				} else {

					echo \'Error Updating Database To Build 770. Please Contact [email protected] for more help.<br/>
						Before you do though, please open your app/config.php file and temporarily change the line:<br/>
						define(\'DEBUG\', \'0\');<br/>
						to be:<br/>
						define(\'DEBUG\', \'1\');<br/>
						and run this page again. Then copy any messages you get into the email you send.\';
					return;
					
				}
					
			}

		} else {
			echo \'Error Updating Database To Build 770. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}

	}
	
	
	public function update_767(){
				
		
		
		
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = \'SHOW COLUMNS FROM fb_stripe_transactions\';
			$result = Database::pdo_query($sql, 0);
			foreach($result as $r){
				if(substr_count($r[\'Field\'], \'line_items\')){
					
					return;
				}
			}
		} else { 
			$sql = "SELECT line_items FROM fb_stripe_transactions";
			if(Database::pdo_query($sql, 1)){
				return;
			}
		}
		

		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "ALTER TABLE `fb_stripe_transactions` 
					ADD COLUMN `line_items` TEXT AFTER `shipping_data`;";
		} else { 
			$sql = "ALTER TABLE fb_stripe_transactions 
					ADD line_items text;";
		}
		
		if(Database::pdo_query($sql, 1)){
			
			
			if(isset($sql_2) && Database::pdo_query($sql_2, 1)){
				echo \'Good News! Your Database Has Been Updated To Build 767 - Please refresh this page to start using RackForms again.\';
			
			} else {
				
				if(!isset($sql_2)){
					echo \'Good News! Your Database Has Been Updated To Build 767 - Please refresh this page to start using RackForms again.\';
					return;
				} else {

					echo \'Error Updating Database To Build 767. Please Contact [email protected] for more help.<br/>
						Before you do though, please open your app/config.php file and temporarily change the line:<br/>
						define(\'DEBUG\', \'0\');<br/>
						to be:<br/>
						define(\'DEBUG\', \'1\');<br/>
						and run this page again. Then copy any messages you get into the email you send.\';
					return;
					
				}
					
			}

		} else {
			echo \'Error Updating Database To Build 767. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}

	}
	
	public function update_766(){
		
		
		
		
		
		$need_table = true;
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_stripe_transactions\'";
			$result = Database::pdo_query($sql, 0);
			if(count($result) != 0){
				$need_table = false;
			}
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_stripe_transactions]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
			
			$result = Database::pdo_query($sql, 0);
			
			if($result[0][\'status\'] == \'true\'){
				$need_table = false;
			}

		}
		
		if($need_table){
		
			
			if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
				
				$sql = "CREATE TABLE IF NOT EXISTS fb_stripe_transactions(
						  id INT(11) NOT NULL AUTO_INCREMENT,
						  rf_entry_key VARCHAR(50) DEFAULT NULL,
						  charge_id VARCHAR(50) DEFAULT NULL,
						  amount INT(11) DEFAULT NULL,
						  `date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
						  `data` TEXT DEFAULT NULL,
						  shipping_data TEXT DEFAULT NULL,
						  line_items TEXT DEFAULT NULL,
						  subscription_data TEXT DEFAULT NULL,
						  trail_data TEXT DEFAULT NULL,
						  PRIMARY KEY (id)
						)
						ENGINE = INNODB
						AUTO_INCREMENT = 1
						AVG_ROW_LENGTH = 8192
						CHARACTER SET utf8
						COLLATE utf8_general_ci;";
				
				Database::pdo_query($sql, 0);
			
			} else { 
			
			$cat = DB_CATALOG;
			
			$sql = <<<EOT
BEGIN
USE [{$cat}];
END

BEGIN

CREATE TABLE [dbo].[fb_stripe_transactions](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[rf_entry_key] [varchar](50) NULL,
	[charge_id] [varchar](50) NULL,
	[amount] [int] NULL,
	[date] [datetime] NULL,
	[data] [text] NULL,
	[shipping_data] [text] NULL,
	[line_items] [text] NULL,
	[subscription_data] [text] NULL,
	[trial_data] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

END
EOT;

				Database::pdo_query($sql, 0);
	
			} 
		
		}
	}
	
	
	public function update_762(){
		
		
		
		
		
		$need_table = true;
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_job_folders\'";
			$result = Database::pdo_query($sql, 0);
			if(count($result) != 0){
				$need_table = false;
			}
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_job_folders]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
			
			$result = Database::pdo_query($sql, 0);
			
			if($result[0][\'status\'] == \'true\'){
				$need_table = false;
			}

		}
		
		if($need_table){
		
			
			if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
				
				$sql = "CREATE TABLE rackforms.fb_job_folders(
						  f_id INT(11) NOT NULL AUTO_INCREMENT,
						  name VARCHAR(255) DEFAULT NULL,
						  PRIMARY KEY (f_id)
						)
						ENGINE = INNODB
						AUTO_INCREMENT = 1
						CHARACTER SET utf8
						COLLATE utf8_general_ci;";
				
				Database::pdo_query($sql, 0);
			
			} else { 
			
			$cat = DB_CATALOG;
			
			$sql = <<<EOT
BEGIN
USE [{$cat}];
END

BEGIN

CREATE TABLE [dbo].[fb_job_folders](
	[f_id] [int] IDENTITY(1,1) NOT NULL,
	[name] [varchar](100) NULL
) ON [PRIMARY]

END
EOT;

				Database::pdo_query($sql, 0);
	
			} 
		
		}
		
		
		
		
		
		
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = \'SHOW COLUMNS FROM fb_jobs\';
			$result = Database::pdo_query($sql, 0);
			foreach($result as $r){
				if(substr_count($r[\'Field\'], \'folder_id\')){
					
					return;
				}
			}
		} else { 
			$sql = "SELECT folder_id FROM fb_jobs";
			if(Database::pdo_query($sql, 1)){
				return;
			}
		}
		

		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "ALTER TABLE `fb_jobs` 
					ADD COLUMN `folder_id` INT(11) DEFAULT 0 AFTER `job_xml`;";
		} else { 
			$sql = "ALTER TABLE fb_jobs 
					ADD folder_id INT(11);";
			
			$sql_2 = "ALTER TABLE [dbo].[fb_jobs] ADD  CONSTRAINT [DF_fb_jobs_folder_id]  DEFAULT ((0)) FOR [folder_id]";
		}
		
		if(Database::pdo_query($sql, 1)){
			
			
			if(isset($sql_2) && Database::pdo_query($sql_2, 1)){
				echo \'Good News! Your Database Has Been Updated To Build 762 - Please refresh this page to start using RackForms again.\';
			
			} else {
				
				if(!isset($sql_2)){
					echo \'Good News! Your Database Has Been Updated To Build 762 - Please refresh this page to start using RackForms again.\';
					return;
				} else {

					echo \'Error Updating Database To Build 762. Please Contact [email protected] for more help.<br/>
						Before you do though, please open your app/config.php file and temporarily change the line:<br/>
						define(\'DEBUG\', \'0\');<br/>
						to be:<br/>
						define(\'DEBUG\', \'1\');<br/>
						and run this page again. Then copy any messages you get into the email you send.\';
					return;
					
				}
					
			}

		} else {
			echo \'Error Updating Database To Build 762. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}

	}
	
	public function update_754(){
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_digital_signatures\'";
			$result = Database::pdo_query($sql, 0);
			if(count($result) != 0){
				return;
			}
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_digital_signatures]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
			
			$result = Database::pdo_query($sql, 0);
			
			if($result[0][\'status\'] == \'true\'){
				return;
			}

		}
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			
			$sql = "CREATE TABLE fb_digital_signatures(
					  id INT(11) NOT NULL AUTO_INCREMENT,
					  entry_id VARCHAR(255) DEFAULT NULL,
					  field_id VARCHAR(255) DEFAULT NULL,
					  signator VARCHAR(255) DEFAULT NULL,
					  signature TEXT DEFAULT NULL,
					  signature_image LONGBLOB DEFAULT NULL,
					  sig_hash VARCHAR(128) DEFAULT NULL,
					  ip VARCHAR(46) DEFAULT NULL,
					  created INT(11) DEFAULT NULL,
					  PRIMARY KEY (id)
					)
					ENGINE = INNODB
					AUTO_INCREMENT = 1
					CHARACTER SET utf8
					COLLATE utf8_general_ci;";
			
			Database::pdo_query($sql, 0);
			
		} else { 
			
			$cat = DB_CATALOG;
			
			$sql = <<<EOT
BEGIN
USE [{$cat}];
END

BEGIN

CREATE TABLE [dbo].[fb_digital_signatures](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[entry_id] [varchar](255) NULL,
	[field_id] [varchar](255) NULL,
	[signator] [varchar](255) NULL,
	[signature] [text] NULL,
	[signature_image] [image] NULL,
	[sig_hash] [varchar](128) NULL,
	[ip] [varchar](48) NULL,
	[created] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

END
EOT;

			Database::pdo_query($sql, 0);

		} 
			
			
			
			
			echo \'<div style="background-color: Yellow; height: 30px; padding-top:10px">&nbsp;&nbsp;&nbsp;&nbsp;Your Database Has Been Updated To Build 754 - Please Refresh The Page To Finish This Process.</div>\';

		
	}
	
	
	public function update_707(){
		
		
		$sql = "SELECT option_name FROM fb_options WHERE option_name = \'load_a_saved_job_sort\'";
		$result = Database::pdo_query($sql, 0);
		if(count($result) != 0){
			return;
		}	
		
		
	
		$sql = "INSERT INTO fb_options (option_name, option_value, option_version) VALUES (\'load_a_saved_job_sort\', \'id,DESC\', \'707\');";
		
		Database::pdo_query($sql, 0);

		
		
		
		echo \'RackForms First Run Message: - Your RackForms Database Has Been Updated With New Settings - Please Refresh This Page To Start Using RackForms Again.\';
		
	}
	
	
	public function update_705(){
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_options\'";
			$result = Database::pdo_query($sql, 0);
			if(count($result) != 0){
				return;
			}
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_options]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
			
			$result = Database::pdo_query($sql, 0);
			
			if($result[0][\'status\'] == \'true\'){
				return;
			}

		}
		
		
		
		
		if(!$this->checkConfigWrite()){
			die(\'In order to use this version of RackForms you must make your /RackForms/app/config.php file writeable.<br/>
				Once you do this an automatic update will be performed and you can then use RackForms again.\');
		}
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			
			$sql = "CREATE TABLE fb_options(
					  option_name VARCHAR(255) DEFAULT NULL,
					  option_value TEXT DEFAULT NULL,
					  option_version INT(11) DEFAULT NULL
					)
					ENGINE = INNODB
					CHARACTER SET utf8
					COLLATE utf8_general_ci;";
			
			Database::pdo_query($sql, 0);
			
		} else { 
			
			$cat = DB_CATALOG;
			
			$sql = <<<EOT
BEGIN
USE [{$cat}];
END

BEGIN

CREATE TABLE [dbo].[fb_options](
	[option_name] [varchar](255) NULL,
	[option_value] [text] NULL,
	[option_version] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

END
EOT;

			Database::pdo_query($sql, 0);

		} 
		


			
			$config_file_raw = file_get_contents(\'config.php\');			

			
			$newfile = $config_file_raw;
			
			
			$datetime = date(\'Y-m-d  H:i:s\', time());
			$replace = "// UPDATE - 705 :: {$datetime}
?>";
			$newfile = str_replace(\'?>\', $replace, $newfile);
			
			
			file_put_contents(\'config.php\', $newfile);
			
			
			
			
			echo \' - Your Database and Config File Has Been Updated To Build 705 - Please Refresh This Page To Start Using RackForms Again.\';

		
	}
	
	
	
	public function update_700(){
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "SHOW TABLES LIKE \'fb_formblocks\'";
			$result = Database::pdo_query($sql, 0);
			if(count($result) != 0){
				return;
			}
		} else { 
			$sql = "IF OBJECT_ID(\'[dbo].[fb_formblocks]\') IS NOT NULL SELECT \'true\' AS status; ELSE SELECT \'false\' AS status ";
			
			$result = Database::pdo_query($sql, 0);
			
			if($result[0][\'status\'] == \'true\'){
				return;
			}

		}
		
		
		
		
		if(!$this->checkConfigWrite()){
			die(\'In order to use this version of RackForms you must make your /RackForms/app/config.php file writeable.<br/>
				Once you do this an automatic update will be performed and you can then use RackForms again.\');
		}
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			
			$sql = "CREATE TABLE fb_formblocks(
						id INT(11) NOT NULL AUTO_INCREMENT,
						user_id INT(11) DEFAULT NULL,
						name VARCHAR(255) DEFAULT NULL,
						category VARCHAR(255) DEFAULT NULL,
						description VARCHAR(255) DEFAULT NULL,
						layout VARCHAR(255) DEFAULT NULL,
						pagetype INT(11) DEFAULT NULL,
						content LONGTEXT DEFAULT NULL,
						PRIMARY KEY (id)
					)
					ENGINE = INNODB
					AUTO_INCREMENT = 1
					AVG_ROW_LENGTH = 6553
					CHARACTER SET utf8
					COLLATE utf8_general_ci;";
			
			Database::pdo_query($sql, 0);
			
		} else { 
			
			$cat = DB_CATALOG;
			
			$sql = <<<EOT
BEGIN
USE [{$cat}];
END

BEGIN

CREATE TABLE [dbo].[fb_formblocks](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[user_id] [int] NULL,
	[name] [varchar](255) NULL,
	[category] [varchar](255) NULL,
	[description] [varchar](255) NULL,
	[layout] [varchar](255) NULL,
	[pagetype] [int] NULL,
	[content] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

END
EOT;

			Database::pdo_query($sql, 0);

		} 
		
		
			

			
			$config_file_raw = file_get_contents(\'config.php\');			
			
			$new_config_data = <<<EOF
define(\'ENCODE_PW\', 1);

// Build 700 - Add the values below to block that module from loading into the editor.
\$excluded_form_modules = array(\'\'); // Use: ecomm to block the ecomm module from loading in the editor.
\$excluded_confirmation_modules = array(\'\'); // Use: confirm-ecomm to block the ecomm confirmation module.
EOF;

			
			$newfile = $config_file_raw;
			
			
			$newfile = str_replace("define(\'ENCODE_PW\', 1);", $new_config_data, $newfile);
			
			
			$datetime = date(\'Y-m-d  H:i:s\', time());
			$replace = "// UPDATE - 700 :: {$datetime}
?>";
			$newfile = str_replace(\'?>\', $replace, $newfile);
			
			
			file_put_contents(\'config.php\', $newfile);
			
			
			
			
			echo \' - Your Database and Config File Has Been Updated To Build 700 - Please Refresh This Page To Start Using RackForms Again.\';

		
	}
	
	
	
	public function update_638(){
		
		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = \'SHOW COLUMNS FROM fb_jobs\';
			$result = Database::pdo_query($sql, 0);
			foreach($result as $r){
				if(substr_count($r[\'Field\'], \'created_ts\')){
					
					return;
				}
			}
		} else { 
			$sql = "SELECT created_ts FROM fb_jobs";
			if(Database::pdo_query($sql, 1)){
				return;
			}
		}
		
		
		if(!$this->checkConfigWrite()){
			die(\'In order to use this version of RackForms you must make your /RackForms/app/config.php file writeable.<br/>
				Once you do this an automatic update will be performed and you can then use RackForms again.\');
		}

		
		$config_file_raw = file_get_contents(\'config.php\');

		
		if(DB_TYPE == \'mysql\' || DB_TYPE == \'mysqli\'){
			$sql = "ALTER TABLE `fb_jobs` 
					ADD COLUMN `created_ts` DATETIME AFTER `created`,
					ADD COLUMN `last_edit_ts` DATETIME AFTER `last_edit`;";
		} else { 
			$sql = "ALTER TABLE fb_jobs 
					ADD created_ts DATETIME, last_edit_ts DATETIME;";
		}
		
		if(Database::pdo_query($sql, 1)){
			
			$newfile = $config_file_raw;
			$datetime = date(\'Y-m-d  H:i:s\', time());
			$replace = "// UPDATE - 638 :: {$datetime}
?>";
			$newfile = str_replace(\'?>\', $replace, $newfile);
			file_put_contents(\'config.php\', $newfile);
			echo \'Good News! Your Database Has Been Updated To Build 638 - Please refresh this page to start using RackForms again.\';
		} else {
			echo \'Error Updating Database To Build 638. Please Contact [email protected] for more help.<br/>
					Before you do though, please open your app/config.php file and temporarily change the line:<br/>
					define(\'DEBUG\', \'0\');<br/>
					to be:<br/>
					define(\'DEBUG\', \'1\');<br/>
					and run this page again. Then copy any messages you get into the email you send.\';
		}

	}
	
	
	
	
	
	
	public function checkConfigWrite(){
		return is_writable(\'config.php\');
	}
	
} 
?>'

Did this file decode correctly?

Original Code

<?php /* Copyright (c) Nicsoft LLC */ eval( '?>' . base64_decode('PD9waHANCg0KaW5jbHVkZV9vbmNlICdpbmMvYXV0aF9oZWFkZXIucGhwJzsNCmluY2x1ZGVfb25jZSAnY29uZmlnLnBocCc7DQppbmNsdWRlX29uY2UgJ2NsYXNzZXMvRGF0YWJhc2UucGhwJzsNCg0KDQpjbGFzcyBVcGRhdGVDb3JlIHsNCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXsNCgkJDQoJCQ0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ3Bvc3RncmVzcWwnKQ0KCQkJcmV0dXJuOw0KCQkNCgkJJHRoaXMtPnVwZGF0ZV82MzgoKTsNCgkJDQoJCSR0aGlzLT51cGRhdGVfNzAwKCk7DQoJCQ0KCQkkdGhpcy0+dXBkYXRlXzcwNSgpOw0KCQkNCgkJJHRoaXMtPnVwZGF0ZV83MDcoKTsNCgkJDQoJCSR0aGlzLT51cGRhdGVfNzU0KCk7DQoJCQ0KCQkkdGhpcy0+dXBkYXRlXzc2MigpOw0KCQkNCgkJJHRoaXMtPnVwZGF0ZV83NjYoKTsgDQoJCQ0KCQkkdGhpcy0+dXBkYXRlXzc2NygpOw0KCQkNCgkJJHRoaXMtPnVwZGF0ZV83NzAoKTsNCgkJDQoJCSR0aGlzLT51cGRhdGVfNzc1KCk7IA0KICAgICAgICANCiAgICAgICAgJHRoaXMtPnVwZGF0ZV84MDEoKTsgDQogICAgICAgIA0KICAgICAgICAkdGhpcy0+dXBkYXRlXzgwNSgpOyANCiAgICAgICAgDQogICAgICAgICR0aGlzLT51cGRhdGVfODQyKCk7IA0KICAgICAgICANCiAgICAgICAgJHRoaXMtPnVwZGF0ZV84NjEoKTsgDQogICAgICAgIA0KICAgICAgICAkdGhpcy0+dXBkYXRlXzg2NigpOyANCiAgICAgICAgDQogICAgICAgICR0aGlzLT51cGRhdGVfODgzKCk7IA0KICAgICAgICANCiAgICAgICAgJHRoaXMtPnVwZGF0ZV84OTEoKTsgDQogICAgICAgIA0KICAgICAgICAkdGhpcy0+dXBkYXRlXzkwNSgpOyANCiAgICAgICAgDQogICAgICAgICR0aGlzLT51cGRhdGVfOTA2KCk7IA0KICAgICAgICANCiAgICAgICAgJHRoaXMtPnVwZGF0ZV85MTAoKTsgDQogICAgICAgIA0KCQkkdGhpcy0+dXBkYXRlXzkxOCgpOyANCgkJDQogICAgICAgICR0aGlzLT51cGRhdGVfOTI5KCk7IA0KDQogICAgICAgICR0aGlzLT51cGRhdGVfOTQ0KCk7IA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KCX0NCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzk0NCgpew0KCQkJDQoJCSRuZWVkX3RhYmxlID0gdHJ1ZTsNCgkJDQoJCQ0KCQlpZiAoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpIHsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfd29ya2Zsb3dfam9icyciOw0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoJCQkNCgkJCWlmIChjb3VudCAoICRyZXN1bHQgKSAhPSAwKSB7DQoJCQkJJG5lZWRfdGFibGUgPSBmYWxzZTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCSRzcWwgPSAiSUYgT0JKRUNUX0lEKCdbZGJvXS5bZmJfd29ya2Zsb3dfam9ic10nKSBJUyBOT1QgTlVMTCBTRUxFQ1QgJ3RydWUnIEFTIHN0YXR1czsgRUxTRSBTRUxFQ1QgJ2ZhbHNlJyBBUyBzdGF0dXMgIjsNCgkJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoJCQkNCgkJCWlmICgkcmVzdWx0IFswXSBbJ3N0YXR1cyddID09ICd0cnVlJykgew0KCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoJCQl9DQoJCX0NCg0KCQlpZighJG5lZWRfdGFibGUpew0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJDQoJCWlmIChEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJykgew0KDQoJCQkkc3FsID0gPDw8RU9UDQoNCgkJCUNSRUFURSBUQUJMRSBgZmJfd29ya2Zsb3dfam9ic2AgKA0KCQkJCWBpZGAgaW50IE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCWBmb3JtYm9zc19qb2JfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJYGZvcm1ib3NzX2pvYl9uYW1lYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCWBqb2Jfb3JpZ2luYXRvcl9pZGAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgY3VycmVudF9vd25lcl9pZGAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgY2F0ZWdvcnlfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJYHdvcmtmbG93X2RhdGFgIGxvbmd0ZXh0LA0KCQkJCWBkYXRlX2NyZWF0ZWRgIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlgZGF0ZV9jb21wbGV0ZWRgIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlgbGF0ZXN0X3VwZGF0ZWAgZGF0ZXRpbWUgREVGQVVMVCBOVUxMLA0KCQkJCWBhY3RpdmVgIGludCBERUZBVUxUICcxJywNCgkJCQlgYXJjaGl2ZWRgIGludCBERUZBVUxUICcwJywNCgkJCQlgZGF0ZV9hcmNoaXZlZGAgZGF0ZXRpbWUgREVGQVVMVCBOVUxMLA0KCQkJCVBSSU1BUlkgS0VZIChgaWRgKSwNCgkJCQlLRVkgYEZLX2ZiX3dvcmtmbG93X2pvYnNfZmJfam9ic19pZGAgKGBmb3JtYm9zc19qb2JfaWRgKSwNCgkJCQlDT05TVFJBSU5UIGBGS19mYl93b3JrZmxvd19qb2JzX2ZiX2pvYnNfaWRgIEZPUkVJR04gS0VZIChgZm9ybWJvc3Nfam9iX2lkYCkgUkVGRVJFTkNFUyBgZmJfam9ic2AgKGBpZGApIE9OIERFTEVURSBDQVNDQURFDQoJCQkgICkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD0yNCBERUZBVUxUIENIQVJTRVQ9dXRmOCBBVkdfUk9XX0xFTkdUSD05ODMwOw0KRU9UOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCg0KCQkJJHNxbCA9IDw8PEVPVA0KDQoJCQlDUkVBVEUgVEFCTEUgYGZiX3dvcmtmbG93X2FjdGl2ZV9qb2JfZW50cmllc2AgKA0KCQkJCWBpZGAgaW50IE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCWBhY3RpdmVfdGFza19pZGAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgdGFza191c2VyX2lkYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCWBmb3JtYm9zc19qb2JfaWRgIGludCBOT1QgTlVMTCwNCgkJCQlgd29ya2Zsb3dfam9iX2lkYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWB3b3JrZmxvd19zdGFnZV9uYW1lYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCWB0c2AgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgbmFtZWAgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlgbGFiZWxgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJYGVudHJ5X3ZhbHVlYCB0ZXh0LA0KCQkJCWBmaWxlX2RhdGFgIGxvbmdibG9iLA0KCQkJCWBmaWxlX21pbWVgIHZhcmNoYXIoNTApIERFRkFVTFQgTlVMTCwNCgkJCQlgZmlsZV9uYW1lYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCWBlbnRyeV9rZXlgIHZhcmNoYXIoNTApIERFRkFVTFQgTlVMTCwNCgkJCQlgZmJfZW50cnlfaWRgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJYGVudHJ5X3R5cGVgIHZhcmNoYXIoMjApIERFRkFVTFQgTlVMTCwNCgkJCQlgcmVtb3RlX2lwYCB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsDQoJCQkJUFJJTUFSWSBLRVkgKGBpZGApLA0KCQkJCUtFWSBgSURYX2VudHJ5X2tleWAgKGBlbnRyeV9rZXlgKSwNCgkJCQlLRVkgYElEWF90c2AgKGB0c2ApLA0KCQkJCUtFWSBgaW5kZXgxYCAoYGZvcm1ib3NzX2pvYl9pZGApDQoJCQkgICkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD0yOTYgREVGQVVMVCBDSEFSU0VUPXV0ZjggQVZHX1JPV19MRU5HVEg9MjM0MDsNCkVPVDsNCgkJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoNCgkJCSRzcWwgPSA8PDxFT1QNCg0KCQkJQ1JFQVRFIFRBQkxFIGBmYl93b3JrZmxvd19hY3RpdmVfdGFza19jb21tZW50c2AgKA0KCQkJCWBpZGAgaW50IE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCWB1c2VyX2lkYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWBqb2JfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJYGFjdGl2ZV90YXNrX2lkYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWBjb21tZW50YCBsb25ndGV4dCwNCgkJCQlgdHNgIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlQUklNQVJZIEtFWSAoYGlkYCkNCgkJCSAgKSBFTkdJTkU9SW5ub0RCIERFRkFVTFQgQ0hBUlNFVD11dGY4Ow0KRU9UOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCg0KCQkJJHNxbCA9IDw8PEVPVA0KDQoJCQlDUkVBVEUgVEFCTEUgYGZiX3dvcmtmbG93X2FjdGl2ZV90YXNrc2AgKA0KCQkJCWBpZGAgaW50IE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCWB0YXNrX21hc3Rlcl9pZGAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgdGFza191c2VyX2lkYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWB3b3JrZmxvd19qb2JfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJYHdvcmtmbG93X3N0YWdlX25hbWVgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJYHdvcmtmbG93X3N0YWdlX3RvX2xvYWRgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJYHRhc2tfYWN0aXZlYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWB0YXNrX2xvY2tlZGAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgc2lnbmF0dXJlX3N0YXR1c2AgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlgdHNgIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlgY29tbWVudGAgbG9uZ3RleHQsDQoJCQkJUFJJTUFSWSBLRVkgKGBpZGApDQoJCQkgICkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD02MSBERUZBVUxUIENIQVJTRVQ9dXRmOCBBVkdfUk9XX0xFTkdUSD0yMDQ4Ow0KRU9UOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCg0KCQkJJHNxbCA9IDw8PEVPVA0KDQoJCQlDUkVBVEUgVEFCTEUgYGZiX3dvcmtmbG93X2NhdGVnb3J5X2dyb3VwX2FjY2Vzc2AgKA0KCQkJCWBpZGAgaW50IE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCWBjYXRlZ29yeV9pZGAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgZ3JvdXBfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJUFJJTUFSWSBLRVkgKGBpZGApDQoJCQkgICkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD00NSBERUZBVUxUIENIQVJTRVQ9dXRmOCBBVkdfUk9XX0xFTkdUSD0xMTcwOw0KRU9UOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCg0KCQkJJHNxbCA9IDw8PEVPVA0KDQoJCQlDUkVBVEUgVEFCTEUgYGZiX3dvcmtmbG93X2dyb3Vwc2AgKA0KCQkJCWBpZGAgaW50IE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCWBncm91cF9uYW1lYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCWBncm91cF9wcml2aWxlZ2VgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJUFJJTUFSWSBLRVkgKGBpZGApDQoJCQkgICkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD03IERFRkFVTFQgQ0hBUlNFVD11dGY4IEFWR19ST1dfTEVOR1RIPTQwOTY7DQpFT1Q7DQoJCQkNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMCApOw0KDQoJCQkkc3FsID0gPDw8RU9UDQoNCgkJCUNSRUFURSBUQUJMRSBgZmJfd29ya2Zsb3dfaG9va3NgICgNCgkJCQlgaWRgIGludCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQlgd29ya2Zsb3dfam9iX2lkYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWBmb3JtYm9zc19qb2JfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJYGZvcm1ib3NzX2pvYl9uYW1lYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCWB3b3JrZmxvd19hY3RpdmVgIGludCBERUZBVUxUICcxJywNCgkJCQlgdGFyZ2V0c2AgbG9uZ3RleHQsDQoJCQkJUFJJTUFSWSBLRVkgKGBpZGApLA0KCQkJCUtFWSBgRktfZmJfd29ya2Zsb3dfaG9va3NfZmJfam9ic19pZGAgKGBmb3JtYm9zc19qb2JfaWRgKSwNCgkJCQlLRVkgYEZLX2ZiX3dvcmtmbG93X2hvb2tzX2ZiX3dvcmtmbG93X2pvYnNfaWRgIChgd29ya2Zsb3dfam9iX2lkYCksDQoJCQkJQ09OU1RSQUlOVCBgRktfZmJfd29ya2Zsb3dfaG9va3NfZmJfd29ya2Zsb3dfam9ic19pZGAgRk9SRUlHTiBLRVkgKGB3b3JrZmxvd19qb2JfaWRgKSBSRUZFUkVOQ0VTIGBmYl93b3JrZmxvd19qb2JzYCAoYGlkYCkgT04gREVMRVRFIENBU0NBREUNCgkJCSAgKSBFTkdJTkU9SW5ub0RCIERFRkFVTFQgQ0hBUlNFVD11dGY4Ow0KRU9UOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCg0KCQkJJHNxbCA9IDw8PEVPVA0KDQoJCQlDUkVBVEUgVEFCTEUgYGZiX3dvcmtmbG93X2pvYl9jYXRlZ29yaWVzYCAoDQoJCQkJYGlkYCBpbnQgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJYHBhcmVudF9pZGAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgbmFtZWAgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlgZGVzY3JpcHRpb25gIGxvbmd0ZXh0LA0KCQkJCWBncm91cF9hY2Nlc3NgIGxvbmd0ZXh0LA0KCQkJCWBkYXRlX2FkZGVkYCBkYXRldGltZSBERUZBVUxUIE5VTEwsDQoJCQkJYGRhdGVfdXBkYXRlZGAgZGF0ZXRpbWUgREVGQVVMVCBOVUxMLA0KCQkJCVBSSU1BUlkgS0VZIChgaWRgKQ0KCQkJICApIEVOR0lORT1Jbm5vREIgQVVUT19JTkNSRU1FTlQ9MjkgREVGQVVMVCBDSEFSU0VUPXV0ZjggQVZHX1JPV19MRU5HVEg9MTgyMDsNCkVPVDsNCgkJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoNCgkJCSRzcWwgPSA8PDxFT1QNCg0KCQkJQ1JFQVRFIFRBQkxFIGBmYl93b3JrZmxvd19zdGF0dXNfdHlwZXNgICgNCgkJCQlgaWRgIGludCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQlgc3RhdHVzX25hbWVgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJYHN0YXR1c192YWx1ZWAgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlQUklNQVJZIEtFWSAoYGlkYCkNCgkJCSAgKSBFTkdJTkU9SW5ub0RCIERFRkFVTFQgQ0hBUlNFVD11dGY4Ow0KRU9UOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCg0KCQkJJHNxbCA9IDw8PEVPVA0KDQoJCQlDUkVBVEUgVEFCTEUgYGZiX3dvcmtmbG93X3RhcmdldHNgICgNCgkJCQlgaWRgIGludCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQlgd29ya2Zsb3dfam9iX2lkYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWBmb3JtYm9zc19qb2JfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJYGZvcm1ib3NzX2pvYl9uYW1lYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCWB0YXJnZXRgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJYHRhcmdldF90eXBlYCB2YXJjaGFyKDU1KSBERUZBVUxUIE5VTEwsDQoJCQkJYGFjdGl2ZWAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlQUklNQVJZIEtFWSAoYGlkYCkNCgkJCSAgKSBFTkdJTkU9SW5ub0RCIEFVVE9fSU5DUkVNRU5UPTEwODYgREVGQVVMVCBDSEFSU0VUPXV0ZjggQVZHX1JPV19MRU5HVEg9NjgyOw0KRU9UOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCg0KCQkJJHNxbCA9IDw8PEVPVA0KDQoJCQlDUkVBVEUgVEFCTEUgYGZiX3dvcmtmbG93X3Rhc2tfbWFzdGVyYCAoDQoJCQkJYGlkYCBpbnQgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQoJCQkJYHRhc2tfb3JpZ2luYXRvcl91c2VyX2lkYCBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCWB3b3JrZmxvd19qb2JfaWRgIGludCBERUZBVUxUIE5VTEwsDQoJCQkJYHdvcmtmbG93X2NvbXBsZXRlYCB0aW55aW50KDEpIERFRkFVTFQgJzAnLA0KCQkJCWB0c2AgZGF0ZXRpbWUgREVGQVVMVCBOVUxMLA0KCQkJCWB0c19jb21wbGV0ZWRgIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlgYXJjaGl2ZWRgIGludCBERUZBVUxUICcwJywNCgkJCQlgd2FzX2RlbGV0ZWRgIGludCBERUZBVUxUICcwJywNCgkJCQlgdHNfd2FzX2RlbGV0ZWRgIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlQUklNQVJZIEtFWSAoYGlkYCkNCgkJCSAgKSBFTkdJTkU9SW5ub0RCIEFVVE9fSU5DUkVNRU5UPTI1IERFRkFVTFQgQ0hBUlNFVD11dGY4IEFWR19ST1dfTEVOR1RIPTgxOTI7DQpFT1Q7DQoJCQkNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMCApOw0KDQoJCQkkc3FsID0gPDw8RU9UDQoNCgkJCUNSRUFURSBUQUJMRSBgZmJfd29ya2Zsb3dfdXNlcnNgICgNCgkJCQlgaWRgIGludCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQlgZmJfdXNlcl9pZGAgaW50IERFRkFVTFQgJy0xJywNCgkJCQlgbmFtZWAgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlgcGFzc3dvcmRgIGJsb2IsDQoJCQkJYGFjdGl2ZWAgaW50IERFRkFVTFQgTlVMTCwNCgkJCQlgcGVybWlzc2lvbnNgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJUFJJTUFSWSBLRVkgKGBpZGApLA0KCQkJCUtFWSBgRktfZmJfd29ya2Zsb3dfdXNlcnNfZmJfYWRtaW5fdXNlcl9pZGAgKGBmYl91c2VyX2lkYCksDQoJCQkJQ09OU1RSQUlOVCBgRktfZmJfd29ya2Zsb3dfdXNlcnNfZmJfYWRtaW5fdXNlcl9pZGAgRk9SRUlHTiBLRVkgKGBmYl91c2VyX2lkYCkgUkVGRVJFTkNFUyBgZmJfYWRtaW5gIChgdXNlcl9pZGApIE9OIERFTEVURSBDQVNDQURFDQoJCQkgICkgRU5HSU5FPUlubm9EQiBERUZBVUxUIENIQVJTRVQ9dXRmODsNCkVPVDsNCgkJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoNCgkJCQ0KCQkJDQoJCQkkc3FsID0gPDw8RU9GDQoJCQlJTlNFUlQgSU5UTyBmYl93b3JrZmxvd19qb2JfY2F0ZWdvcmllcyAocGFyZW50X2lkLCBuYW1lLCBkZXNjcmlwdGlvbikgVkFMVUVTICgnLTEnLCAncm9vdCcsICdyb290IGNhdGVnb3J5Jyk7DQpFT0Y7DQoNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMCApOw0KDQoNCgkJCSRzcWwgPSA8PDxFT0YNCgkJCUlOU0VSVCBJTlRPIGZiX3dvcmtmbG93X2dyb3VwcyAoZ3JvdXBfbmFtZSwgZ3JvdXBfcHJpdmlsZWdlKSBWQUxVRVMgKCdXb3JrZmxvdyBHcm91cCcsICc0Jyk7DQpFT0Y7DQoNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMCApOw0KDQoJCX0gZWxzZSB7IA0KDQoJCQkkc3FsID0gPDw8TVNHX0VPRg0KCQkJDQoJCQlDUkVBVEUgVEFCTEUgW2ZiX3dvcmtmbG93X2pvYnNdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW2Zvcm1ib3NzX2pvYl9pZF0gaW50IERFRkFVTFQgTlVMTCwNCgkJCQlbZm9ybWJvc3Nfam9iX25hbWVdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJW2pvYl9vcmlnaW5hdG9yX2lkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVtjdXJyZW50X293bmVyX2lkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVtjYXRlZ29yeV9pZF0gaW50IERFRkFVTFQgTlVMTCwNCgkJCQlbd29ya2Zsb3dfZGF0YV0gdGV4dCwNCgkJCQlbZGF0ZV9jcmVhdGVkXSBkYXRldGltZSBERUZBVUxUIE5VTEwsDQoJCQkJW2RhdGVfY29tcGxldGVkXSBkYXRldGltZSBERUZBVUxUIE5VTEwsDQoJCQkJW2xhdGVzdF91cGRhdGVdIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlbYWN0aXZlXSBpbnQgREVGQVVMVCAnMScsDQoJCQkJW2FyY2hpdmVkXSBpbnQgREVGQVVMVCAnMCcsDQoJCQkJW2RhdGVfYXJjaGl2ZWRdIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwgQ09OU1RSQUlOVCBbUEtfZmJfd29ya2Zsb3dfam9ic10gUFJJTUFSWSBLRVkgQ0xVU1RFUkVEIA0KCQkJICAoDQoJCQkJICBbaWRdIEFTQw0KCQkJICApV0lUSCAoUEFEX0lOREVYID0gT0ZGLCBTVEFUSVNUSUNTX05PUkVDT01QVVRFID0gT0ZGLCBJR05PUkVfRFVQX0tFWSA9IE9GRiwgQUxMT1dfUk9XX0xPQ0tTID0gT04sIEFMTE9XX1BBR0VfTE9DS1MgPSBPTikgT04gW1BSSU1BUlldDQoJCQkgICkgT04gW1BSSU1BUlldIFRFWFRJTUFHRV9PTiBbUFJJTUFSWV0NCgkJCSAgDQoJCQkgIA0KCQkJICANCgkJCSAgQ1JFQVRFIFRBQkxFIFtmYl93b3JrZmxvd19hY3RpdmVfam9iX2VudHJpZXNdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW2FjdGl2ZV90YXNrX2lkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVt0YXNrX3VzZXJfaWRdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJW2Zvcm1ib3NzX2pvYl9pZF0gaW50IE5PVCBOVUxMLA0KCQkJCVt3b3JrZmxvd19qb2JfaWRdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW3dvcmtmbG93X3N0YWdlX25hbWVdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJW3RzXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVtuYW1lXSB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCVtsYWJlbF0gdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlbZW50cnlfdmFsdWVdIHRleHQsDQoJCQkJW2ZpbGVfZGF0YV0gdGV4dCwNCgkJCQlbZmlsZV9taW1lXSB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsDQoJCQkJW2ZpbGVfbmFtZV0gdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlbZW50cnlfa2V5XSB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsDQoJCQkJW2ZiX2VudHJ5X2lkXSB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCVtlbnRyeV90eXBlXSB2YXJjaGFyKDIwKSBERUZBVUxUIE5VTEwsDQoJCQkJW3JlbW90ZV9pcF0gdmFyY2hhcig1MCkgREVGQVVMVCBOVUxMLCANCgkJCQlDT05TVFJBSU5UIFtQS19mYl93b3JrZmxvd19hY3RpdmVfam9iX2VudHJpZXNdIFBSSU1BUlkgS0VZIENMVVNURVJFRCANCgkJCSAgKA0KCQkJCSAgW2lkXSBBU0MNCgkJCSAgKVdJVEggKFBBRF9JTkRFWCA9IE9GRiwgU1RBVElTVElDU19OT1JFQ09NUFVURSA9IE9GRiwgSUdOT1JFX0RVUF9LRVkgPSBPRkYsIEFMTE9XX1JPV19MT0NLUyA9IE9OLCBBTExPV19QQUdFX0xPQ0tTID0gT04pIE9OIFtQUklNQVJZXQ0KCQkJICApIE9OIFtQUklNQVJZXSBURVhUSU1BR0VfT04gW1BSSU1BUlldDQoJCQkgIA0KDQoNCgkJCSAgDQoJCQkgIENSRUFURSBUQUJMRSBbZmJfd29ya2Zsb3dfYWN0aXZlX3Rhc2tfY29tbWVudHNdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW3VzZXJfaWRdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW2pvYl9pZF0gaW50IERFRkFVTFQgTlVMTCwNCgkJCQlbYWN0aXZlX3Rhc2tfaWRdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW2NvbW1lbnRdIHRleHQsDQoJCQkJW3RzXSBkYXRldGltZSBERUZBVUxUIE5VTEwsIA0KCQkJCUNPTlNUUkFJTlQgW1BLX2ZiX3dvcmtmbG93X2FjdGl2ZV90YXNrX2NvbW1lbnRzXSBQUklNQVJZIEtFWSBDTFVTVEVSRUQgDQoJCQkgICgNCgkJCQkgIFtpZF0gQVNDDQoJCQkgIClXSVRIIChQQURfSU5ERVggPSBPRkYsIFNUQVRJU1RJQ1NfTk9SRUNPTVBVVEUgPSBPRkYsIElHTk9SRV9EVVBfS0VZID0gT0ZGLCBBTExPV19ST1dfTE9DS1MgPSBPTiwgQUxMT1dfUEFHRV9MT0NLUyA9IE9OKSBPTiBbUFJJTUFSWV0NCgkJCSAgKSBPTiBbUFJJTUFSWV0gVEVYVElNQUdFX09OIFtQUklNQVJZXSANCgkJCSAgDQoJCQkgIA0KCQkJICANCgkJCSAgQ1JFQVRFIFRBQkxFIFtmYl93b3JrZmxvd19hY3RpdmVfdGFza3NdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW3Rhc2tfbWFzdGVyX2lkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVt0YXNrX3VzZXJfaWRdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW3dvcmtmbG93X2pvYl9pZF0gaW50IERFRkFVTFQgTlVMTCwNCgkJCQlbd29ya2Zsb3dfc3RhZ2VfbmFtZV0gdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlbd29ya2Zsb3dfc3RhZ2VfdG9fbG9hZF0gdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlbdGFza19hY3RpdmVdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW3Rhc2tfbG9ja2VkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVtzaWduYXR1cmVfc3RhdHVzXSB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCVt0c10gZGF0ZXRpbWUgREVGQVVMVCBOVUxMLA0KCQkJCVtjb21tZW50XSB0ZXh0LCANCgkJCQlDT05TVFJBSU5UIFtQS19mYl93b3JrZmxvd19hY3RpdmVfdGFza3NdIFBSSU1BUlkgS0VZIENMVVNURVJFRCANCgkJCSAgKA0KCQkJCSAgW2lkXSBBU0MNCgkJCSAgKVdJVEggKFBBRF9JTkRFWCA9IE9GRiwgU1RBVElTVElDU19OT1JFQ09NUFVURSA9IE9GRiwgSUdOT1JFX0RVUF9LRVkgPSBPRkYsIEFMTE9XX1JPV19MT0NLUyA9IE9OLCBBTExPV19QQUdFX0xPQ0tTID0gT04pIE9OIFtQUklNQVJZXQ0KCQkJICApIE9OIFtQUklNQVJZXSBURVhUSU1BR0VfT04gW1BSSU1BUlldDQoJCQkgIA0KCQkJICANCgkJCSAgDQoJCQkgIENSRUFURSBUQUJMRSBbZmJfd29ya2Zsb3dfY2F0ZWdvcnlfZ3JvdXBfYWNjZXNzXSAoDQoJCQkJW2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCQkJCVtjYXRlZ29yeV9pZF0gaW50IERFRkFVTFQgTlVMTCwNCgkJCQlbZ3JvdXBfaWRdIGludCBERUZBVUxUIE5VTEwsIA0KCQkJCUNPTlNUUkFJTlQgW1BLX2ZiX3dvcmtmbG93X2NhdGVnb3J5X2dyb3VwX2FjY2Vzc10gUFJJTUFSWSBLRVkgQ0xVU1RFUkVEIA0KCQkJICAoDQoJCQkJICBbaWRdIEFTQw0KCQkJICApV0lUSCAoUEFEX0lOREVYID0gT0ZGLCBTVEFUSVNUSUNTX05PUkVDT01QVVRFID0gT0ZGLCBJR05PUkVfRFVQX0tFWSA9IE9GRiwgQUxMT1dfUk9XX0xPQ0tTID0gT04sIEFMTE9XX1BBR0VfTE9DS1MgPSBPTikgT04gW1BSSU1BUlldDQoJCQkgICkgT04gW1BSSU1BUlldDQoJCQkgIA0KCQkJICANCgkJCSAgDQoJCQkgIENSRUFURSBUQUJMRSBbZmJfd29ya2Zsb3dfZ3JvdXBzXSAoDQoJCQkJW2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCQkJCVtncm91cF9uYW1lXSB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCVtncm91cF9wcml2aWxlZ2VdIGludCBERUZBVUxUIE5VTEwsIA0KCQkJCUNPTlNUUkFJTlQgW1BLX2ZiX3dvcmtmbG93X2dyb3Vwc10gUFJJTUFSWSBLRVkgQ0xVU1RFUkVEIA0KCQkJICAoDQoJCQkJICBbaWRdIEFTQw0KCQkJICApV0lUSCAoUEFEX0lOREVYID0gT0ZGLCBTVEFUSVNUSUNTX05PUkVDT01QVVRFID0gT0ZGLCBJR05PUkVfRFVQX0tFWSA9IE9GRiwgQUxMT1dfUk9XX0xPQ0tTID0gT04sIEFMTE9XX1BBR0VfTE9DS1MgPSBPTikgT04gW1BSSU1BUlldDQoJCQkgICkgT04gW1BSSU1BUlldDQoJCQkgIA0KCQkJICANCgkJCSAgDQoJCQkgIENSRUFURSBUQUJMRSBbZmJfd29ya2Zsb3dfaG9va3NdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW3dvcmtmbG93X2pvYl9pZF0gaW50IERFRkFVTFQgTlVMTCwNCgkJCQlbZm9ybWJvc3Nfam9iX2lkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVtmb3JtYm9zc19qb2JfbmFtZV0gdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQlbd29ya2Zsb3dfYWN0aXZlXSBpbnQgREVGQVVMVCAnMScsDQoJCQkJW3RhcmdldHNdIHRleHQsIA0KCQkJCUNPTlNUUkFJTlQgW1BLX2ZiX3dvcmtmbG93X2hvb2tzXSBQUklNQVJZIEtFWSBDTFVTVEVSRUQgDQoJCQkgICgNCgkJCQkgIFtpZF0gQVNDDQoJCQkgIClXSVRIIChQQURfSU5ERVggPSBPRkYsIFNUQVRJU1RJQ1NfTk9SRUNPTVBVVEUgPSBPRkYsIElHTk9SRV9EVVBfS0VZID0gT0ZGLCBBTExPV19ST1dfTE9DS1MgPSBPTiwgQUxMT1dfUEFHRV9MT0NLUyA9IE9OKSBPTiBbUFJJTUFSWV0NCgkJCSAgKSBPTiBbUFJJTUFSWV0gVEVYVElNQUdFX09OIFtQUklNQVJZXQ0KCQkJICANCgkJCSAgDQoJCQkgIA0KCQkJICBDUkVBVEUgVEFCTEUgW2ZiX3dvcmtmbG93X2pvYl9jYXRlZ29yaWVzXSAoDQoJCQkJW2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCQkJCVtwYXJlbnRfaWRdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW25hbWVdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJW2Rlc2NyaXB0aW9uXSB0ZXh0LA0KCQkJCVtncm91cF9hY2Nlc3NdIHRleHQsDQoJCQkJW2RhdGVfYWRkZWRdIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQlbZGF0ZV91cGRhdGVkXSBkYXRldGltZSBERUZBVUxUIE5VTEwsIA0KCQkJCUNPTlNUUkFJTlQgW1BLX3dvcmtmbG93X2pvYl9jYXRlZ29yaWVzXSBQUklNQVJZIEtFWSBDTFVTVEVSRUQgDQoJCQkgICgNCgkJCQkgIFtpZF0gQVNDDQoJCQkgIClXSVRIIChQQURfSU5ERVggPSBPRkYsIFNUQVRJU1RJQ1NfTk9SRUNPTVBVVEUgPSBPRkYsIElHTk9SRV9EVVBfS0VZID0gT0ZGLCBBTExPV19ST1dfTE9DS1MgPSBPTiwgQUxMT1dfUEFHRV9MT0NLUyA9IE9OKSBPTiBbUFJJTUFSWV0NCgkJCSAgKSBPTiBbUFJJTUFSWV0gVEVYVElNQUdFX09OIFtQUklNQVJZXSANCgkJCSAgDQoJCQkgIA0KCQkJICANCgkJCSAgQ1JFQVRFIFRBQkxFIFtmYl93b3JrZmxvd19zdGF0dXNfdHlwZXNdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW3N0YXR1c19uYW1lXSB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCVtzdGF0dXNfdmFsdWVdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsIA0KCQkJCUNPTlNUUkFJTlQgW1BLX3dvcmtmbG93X3N0YXR1c190eXBlc10gUFJJTUFSWSBLRVkgQ0xVU1RFUkVEIA0KCQkJICAoDQoJCQkJICBbaWRdIEFTQw0KCQkJICApV0lUSCAoUEFEX0lOREVYID0gT0ZGLCBTVEFUSVNUSUNTX05PUkVDT01QVVRFID0gT0ZGLCBJR05PUkVfRFVQX0tFWSA9IE9GRiwgQUxMT1dfUk9XX0xPQ0tTID0gT04sIEFMTE9XX1BBR0VfTE9DS1MgPSBPTikgT04gW1BSSU1BUlldDQoJCQkgICkgT04gW1BSSU1BUlldDQoJCQkgIA0KCQkJICANCgkJCSAgDQoJCQkgIENSRUFURSBUQUJMRSBbZmJfd29ya2Zsb3dfdGFyZ2V0c10gKA0KCQkJCVtpZF0gW2ludF0gSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwNCgkJCQlbd29ya2Zsb3dfam9iX2lkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVtmb3JtYm9zc19qb2JfaWRdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW2Zvcm1ib3NzX2pvYl9uYW1lXSB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCVt0YXJnZXRdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJW3RhcmdldF90eXBlXSB2YXJjaGFyKDU1KSBERUZBVUxUIE5VTEwsDQoJCQkJW2FjdGl2ZV0gaW50IERFRkFVTFQgTlVMTCwgDQoJCQkJQ09OU1RSQUlOVCBbUEtfZmJfd29ya2Zsb3dfdGFyZ2V0c10gUFJJTUFSWSBLRVkgQ0xVU1RFUkVEIA0KCQkJICAoDQoJCQkJICBbaWRdIEFTQw0KCQkJICApV0lUSCAoUEFEX0lOREVYID0gT0ZGLCBTVEFUSVNUSUNTX05PUkVDT01QVVRFID0gT0ZGLCBJR05PUkVfRFVQX0tFWSA9IE9GRiwgQUxMT1dfUk9XX0xPQ0tTID0gT04sIEFMTE9XX1BBR0VfTE9DS1MgPSBPTikgT04gW1BSSU1BUlldDQoJCQkgICkgT04gW1BSSU1BUlldDQoJCQkgIA0KCQkJICANCgkJCSAgDQoJCQkgIENSRUFURSBUQUJMRSBbZmJfd29ya2Zsb3dfdGFza19tYXN0ZXJdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW3Rhc2tfb3JpZ2luYXRvcl91c2VyX2lkXSBpbnQgREVGQVVMVCBOVUxMLA0KCQkJCVt3b3JrZmxvd19qb2JfaWRdIGludCBERUZBVUxUIE5VTEwsDQoJCQkJW3dvcmtmbG93X2NvbXBsZXRlXSBpbnQgREVGQVVMVCAnMCcsDQoJCQkJW3RzXSBkYXRldGltZSBERUZBVUxUIE5VTEwsDQoJCQkJW3RzX2NvbXBsZXRlZF0gZGF0ZXRpbWUgREVGQVVMVCBOVUxMLA0KCQkJCVthcmNoaXZlZF0gaW50IERFRkFVTFQgJzAnLA0KCQkJCVt3YXNfZGVsZXRlZF0gaW50IERFRkFVTFQgJzAnLA0KCQkJCVt0c193YXNfZGVsZXRlZF0gZGF0ZXRpbWUgREVGQVVMVCBOVUxMLCANCgkJCQlDT05TVFJBSU5UIFtQS193b3JrZmxvd190YXNrX21hc3Rlcl0gUFJJTUFSWSBLRVkgQ0xVU1RFUkVEIA0KCQkJICAoDQoJCQkJICBbaWRdIEFTQw0KCQkJICApV0lUSCAoUEFEX0lOREVYID0gT0ZGLCBTVEFUSVNUSUNTX05PUkVDT01QVVRFID0gT0ZGLCBJR05PUkVfRFVQX0tFWSA9IE9GRiwgQUxMT1dfUk9XX0xPQ0tTID0gT04sIEFMTE9XX1BBR0VfTE9DS1MgPSBPTikgT04gW1BSSU1BUlldDQoJCQkgICkgT04gW1BSSU1BUlldDQoJCQkgIA0KCQkJICANCgkJCSAgDQoJCQkgIENSRUFURSBUQUJMRSBbZmJfd29ya2Zsb3dfdXNlcnNdICgNCgkJCQlbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJCQkJW2ZiX3VzZXJfaWRdIGludCBERUZBVUxUICctMScsDQoJCQkJW25hbWVdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJW3Bhc3N3b3JkXSBiaW5hcnksDQoJCQkJW2FjdGl2ZV0gaW50IERFRkFVTFQgTlVMTCwNCgkJCQlbcGVybWlzc2lvbnNdIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsIA0KCQkJCUNPTlNUUkFJTlQgW1BLX2ZiX3dvcmtmbG93X3VzZXJzXSBQUklNQVJZIEtFWSBDTFVTVEVSRUQgDQoJCQkgICgNCgkJCQkgIFtpZF0gQVNDDQoJCQkgIClXSVRIIChQQURfSU5ERVggPSBPRkYsIFNUQVRJU1RJQ1NfTk9SRUNPTVBVVEUgPSBPRkYsIElHTk9SRV9EVVBfS0VZID0gT0ZGLCBBTExPV19ST1dfTE9DS1MgPSBPTiwgQUxMT1dfUEFHRV9MT0NLUyA9IE9OKSBPTiBbUFJJTUFSWV0NCgkJCSAgKSBPTiBbUFJJTUFSWV0NCgkJCSAgDQoNCgkJCSAgLS0gS2V5IA0KDQoJCQkgIEFMVEVSIFRBQkxFIFtkYm9dLltmYl93b3JrZmxvd19qb2JzXSAgV0lUSCBDSEVDSyBBREQgIENPTlNUUkFJTlQgW0ZLX2ZiX3dvcmtmbG93X2pvYnNfZmJfam9ic10gRk9SRUlHTiBLRVkoW2Zvcm1ib3NzX2pvYl9pZF0pDQoJCQkgIFJFRkVSRU5DRVMgW2Rib10uW2ZiX2pvYnNdIChbaWRdKQ0KCQkJICBPTiBERUxFVEUgQ0FTQ0FERQ0KCQkJICAgDQoJCQkgIEFMVEVSIFRBQkxFIFtkYm9dLltmYl93b3JrZmxvd19qb2JzXSBDSEVDSyBDT05TVFJBSU5UIFtGS19mYl93b3JrZmxvd19qb2JzX2ZiX2pvYnNdDQoNCgkJCSAgLS0gS2V5DQoJCQkgIA0KCQkJICBBTFRFUiBUQUJMRSBbZGJvXS5bZmJfd29ya2Zsb3dfaG9va3NdICBXSVRIIENIRUNLIEFERCAgQ09OU1RSQUlOVCBbRktfZmJfd29ya2Zsb3dfaG9va3NfZmJfd29ya2Zsb3dfam9ic10gRk9SRUlHTiBLRVkoW3dvcmtmbG93X2pvYl9pZF0pDQoJCQkgIFJFRkVSRU5DRVMgW2Rib10uW2ZiX3dvcmtmbG93X2pvYnNdIChbaWRdKQ0KCQkJICBPTiBERUxFVEUgQ0FTQ0FERQ0KDQoJCQkgIEFMVEVSIFRBQkxFIFtkYm9dLltmYl93b3JrZmxvd19ob29rc10gQ0hFQ0sgQ09OU1RSQUlOVCBbRktfZmJfd29ya2Zsb3dfaG9va3NfZmJfd29ya2Zsb3dfam9ic10NCgkJCSAgDQoJCQkgIC0tIEtleQ0KCQkJICANCgkJCSAgQUxURVIgVEFCTEUgW2Rib10uW2ZiX3dvcmtmbG93X3VzZXJzXSAgV0lUSCBDSEVDSyBBREQgIENPTlNUUkFJTlQgW0ZLX2ZiX3dvcmtmbG93X3VzZXJzX2ZiX2FkbWluXSBGT1JFSUdOIEtFWShbZmJfdXNlcl9pZF0pDQoJCQkgIFJFRkVSRU5DRVMgW2Rib10uW2ZiX2FkbWluXSAoW3VzZXJfaWRdKQ0KCQkJICBPTiBERUxFVEUgQ0FTQ0FERQ0KDQoJCQkgIEFMVEVSIFRBQkxFIFtkYm9dLltmYl93b3JrZmxvd191c2Vyc10gQ0hFQ0sgQ09OU1RSQUlOVCBbRktfZmJfd29ya2Zsb3dfdXNlcnNfZmJfYWRtaW5dDQoJCQkgIA0KCQkJICANCgkJCSAgLS0gU2V0IERlZmF1bHQgRGF0YS4NCg0KCQkJICBJTlNFUlQgSU5UTyBmYl93b3JrZmxvd19qb2JfY2F0ZWdvcmllcyAocGFyZW50X2lkLCBuYW1lLCBkZXNjcmlwdGlvbikgVkFMVUVTICgnLTEnLCAncm9vdCcsICdyb290IGNhdGVnb3J5Jyk7DQoJCQkgIA0KCQkJICBJTlNFUlQgSU5UTyBmYl93b3JrZmxvd19ncm91cHMgKGdyb3VwX25hbWUsIGdyb3VwX3ByaXZpbGVnZSkgVkFMVUVTICgnV29ya2Zsb3cgR3JvdXAnLCAnNCcpOwkNCk1TR19FT0Y7DQoNCgkJCQ0KCQkJDQoNCgkJCWlmIChEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMSwgdHJ1ZSApKSB7DQoJCQkJcmV0dXJuOw0KCQkJfSBlbHNlIHsNCgkJCQlkaWU7DQoJCQl9DQoJCX0NCgkNCg0KCQkNCgkJaWYgKERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAxICkpIHsNCgkJCQkNCgkJCQ0KCQkJaWYgKGlzc2V0ICggJHNxbF8yICkgJiYgRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWxfMiwgMSApKSB7DQoJCQkJZWNobyAnR29vZCBOZXdzISBZb3VyIERhdGFiYXNlIEhhcyBCZWVuIFVwZGF0ZWQgVG8gQnVpbGQgOTQ0IC0gUGxlYXNlIHJlZnJlc2ggdGhpcyBwYWdlIHRvIHN0YXJ0IHVzaW5nIFJhY2tGb3JtcyBhZ2Fpbi4nOw0KCQkJfSBlbHNlIHsNCgkNCgkJCQlpZiAoISBpc3NldCAoICRzcWxfMiApKSB7DQoJCQkJCWVjaG8gJ0dvb2QgTmV3cyEgWW91ciBEYXRhYmFzZSBIYXMgQmVlbiBVcGRhdGVkIFRvIEJ1aWxkIDk0NCAtIFBsZWFzZSByZWZyZXNoIHRoaXMgcGFnZSB0byBzdGFydCB1c2luZyBSYWNrRm9ybXMgYWdhaW4uJzsNCgkJCQkJcmV0dXJuOw0KCQkJCX0gZWxzZSB7DQoJCQkJCQkNCgkJCQkJZWNobyAnRXJyb3IgVXBkYXRpbmcgRGF0YWJhc2UgVG8gQnVpbGQgOTQ0LiBQbGVhc2UgQ29udGFjdCBzdXBwb3J0QHJhY2tmb3Jtcy5jb20gZm9yIG1vcmUgaGVscC48YnIvPg0KCQkJCQkJQmVmb3JlIHlvdSBkbyB0aG91Z2gsIHBsZWFzZSBvcGVuIHlvdXIgYXBwL2NvbmZpZy5waHAgZmlsZSBhbmQgdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBsaW5lOjxici8+DQoJCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzBcJyk7PGJyLz4NCgkJCQkJCXRvIGJlOjxici8+DQoJCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzFcJyk7PGJyLz4NCgkJCQkJCWFuZCBydW4gdGhpcyBwYWdlIGFnYWluLiBUaGVuIGNvcHkgYW55IG1lc3NhZ2VzIHlvdSBnZXQgaW50byB0aGUgZW1haWwgeW91IHNlbmQuJzsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsNCgkJCWVjaG8gJ0Vycm9yIFVwZGF0aW5nIERhdGFiYXNlIFRvIEJ1aWxkIDk0NC4gUGxlYXNlIENvbnRhY3Qgc3VwcG9ydEByYWNrZm9ybXMuY29tIGZvciBtb3JlIGhlbHAuPGJyLz4NCgkJCQkJQmVmb3JlIHlvdSBkbyB0aG91Z2gsIHBsZWFzZSBvcGVuIHlvdXIgYXBwL2NvbmZpZy5waHAgZmlsZSBhbmQgdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBsaW5lOjxici8+DQoJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMFwnKTs8YnIvPg0KCQkJCQl0byBiZTo8YnIvPg0KCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzFcJyk7PGJyLz4NCgkJCQkJYW5kIHJ1biB0aGlzIHBhZ2UgYWdhaW4uIFRoZW4gY29weSBhbnkgbWVzc2FnZXMgeW91IGdldCBpbnRvIHRoZSBlbWFpbCB5b3Ugc2VuZC4nOw0KCQl9DQoJfQ0KDQoNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzkyOSgpew0KCQ0KCQkNCgkNCgkJaWYoISR0aGlzLT5jaGVja0NvbmZpZ1dyaXRlKCkpew0KCQkJZGllKCdJbiBvcmRlciB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIFJhY2tGb3JtcyB5b3UgbXVzdCBtYWtlIHlvdXIgL3JhY2tmb3Jtcy9hcHAvY29uZmlnLnBocCBmaWxlIHdyaXRlYWJsZS48YnIvPg0KCQkJCU9uY2UgeW91IGRvIHRoaXMgYW4gYXV0b21hdGljIHVwZGF0ZSB3aWxsIGJlIHBlcmZvcm1lZCBhbmQgeW91IGNhbiB0aGVuIHVzZSBSYWNrRm9ybXMgYWdhaW4uJyk7DQoJCX0NCgkNCgkJJG9sZCA9ICc/Pic7DQoJDQoJCQ0KCQkkY29uZmlnX2ZpbGVfcmF3ID0gZmlsZV9nZXRfY29udGVudHMoJ2NvbmZpZy5waHAnKTsNCgkNCgkJDQoJCWlmKHN1YnN0cl9jb3VudCgkY29uZmlnX2ZpbGVfcmF3LCAiZGJfc3NsX2tleSIpID09IDApIHsNCgkJCQkNCgkJCQ0KCQkJCQ0KCQkJJGFkZCA9IDw8PEVPRg0KDQovLyBNeVNRTCBTU0wgU3VwcG9ydC4NClwkZGJfc3NsX2tleSA9ICcnOw0KXCRkYl9zc2xfY2VydGlmaWNhdGUgPSAnJzsNClwkZGJfc3NsX2NhX2NlcnQgPSAnJzsNClwkZGJfc3NsX3ZlcmlmeV9jZXJ0ID0gJyc7DQpcJGRiX3NzbF9jaXBoZXIgPSAnJzsNCg0KPz4NCg0KRU9GOw0KCQkNCgkJCSRjb25maWdfZmlsZV9yYXcgPSBzdHJfcmVwbGFjZSgkb2xkLCAkYWRkLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkNCgkJCQ0KCQkJZmlsZV9wdXRfY29udGVudHMoJ2NvbmZpZy5waHAnLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkJDQoJCX0NCgkJDQoJCQ0KCQkNCgkJaWYoc3Vic3RyX2NvdW50KCRjb25maWdfZmlsZV9yYXcsICJBVVRIX1VzZVNpbXBsZVNBTUwiKSA9PSAwKSB7DQoJCQ0KCQkJDQoJCQ0KCQkJJGFkZCA9IDw8PEVPRg0KCQkNCi8vIEJ1aWxkIDg4OSAtIFNpbXBsZSBTQU1MIFNTTy4NCmRlZmluZSgnQVVUSF9Vc2VTaW1wbGVTQU1MJywgJzAnKTsgLy8gMSBUbyBVc2UgU0FNTCBBdXRoZW50aWNhdGlvbi4NCmRlZmluZSgnU2ltcGxlU0FNTF9BdXRoU291cmNlJywgJ3JhY2tmb3Jtcy1zcCcpOyAvLyBBdXRoIFNvdXJjZS4NCmRlZmluZSgnU2ltcGxlU0FNTF9QYXRoJywgJy8uLi9zaW1wbGVzYW1scGhwL2xpYi9fYXV0b2xvYWQucGhwJyk7IC8vIExvY2F0aW9uIG9mIHRoZSBTaW1wbGVTQU1MIGxpYnJhcmllcy4NCmRlZmluZSgnU2ltcGxlU0FNTF9Mb2dvdXRSZXR1cm5UbycsICdodHRwczovL3JhY2tmb3Jtcy5iYXltYWluLmNvbS9sb2dnZWRfb3V0LnBocCcpOyAvLyBMb2NhdGlvbiBvZiBhIGxvZ291dCByZWRpcmVjdC4NCgkJDQo/Pg0KDQpFT0Y7DQoJCQ0KCQkJJGNvbmZpZ19maWxlX3JhdyA9IHN0cl9yZXBsYWNlKCRvbGQsICRhZGQsICRjb25maWdfZmlsZV9yYXcpOw0KCQkNCgkJCQ0KCQkJZmlsZV9wdXRfY29udGVudHMoJ2NvbmZpZy5waHAnLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkJDQoJCX0NCgkJDQoJDQoJfSANCgkNCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzkxOCgpew0KCQkJDQoJCQ0KCQlpZiAoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpIHsNCgkJCSRzcWwgPSAnU0hPVyBDT0xVTU5TIEZST00gZmJfam9icyc7DQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCgkJCWZvcmVhY2ggKCAkcmVzdWx0IGFzICRyICkgew0KCQkJCWlmIChzdWJzdHJfY291bnQgKCAkciBbJ0ZpZWxkJ10sICdyZWFkX29ubHlfdXNlcl9pZCcgKSkgew0KCQkJCQkNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIlNFTEVDVCByZWFkX29ubHlfdXNlcl9pZCBGUk9NIGZiX2pvYnMiOw0KCQkJaWYgKERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAxICkpIHsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0NCgkNCgkJDQoJCWlmIChEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJykgew0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBgZmJfam9ic2ANCgkJCQkJQUREIENPTFVNTiBgcmVhZF9vbmx5X3VzZXJfaWRgIGludCgxMSkgQUZURVIgYHVzZXJfaWRgOyI7DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBmYl9qb2JzDQoJCQkJCUFERCByZWFkX29ubHlfdXNlcl9pZCBpbnQiOw0KCQl9DQoJCQ0KCQkNCgkJaWYgKERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAxICkpIHsNCgkNCgkJCWVjaG8gJ0dvb2QgTmV3cyEgWW91ciBEYXRhYmFzZSBIYXMgQmVlbiBVcGRhdGVkIFRvIEJ1aWxkIDkxOCAtIFBsZWFzZSByZWZyZXNoIHRoaXMgcGFnZSB0byBzdGFydCB1c2luZyBSYWNrRm9ybXMgYWdhaW4uJzsNCg0KCQl9IGVsc2Ugew0KCQkJDQoJCQllY2hvICdFcnJvciBVcGRhdGluZyBEYXRhYmFzZSBUbyBCdWlsZCA5MTguIFBsZWFzZSBDb250YWN0IHN1cHBvcnRAcmFja2Zvcm1zLmNvbSBmb3IgbW9yZSBoZWxwLjxici8+DQoJCQkJCUJlZm9yZSB5b3UgZG8gdGhvdWdoLCBwbGVhc2Ugb3BlbiB5b3VyIGFwcC9jb25maWcucGhwIGZpbGUgYW5kIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgbGluZTo8YnIvPg0KCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzBcJyk7PGJyLz4NCgkJCQkJdG8gYmU6PGJyLz4NCgkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcxXCcpOzxici8+DQoJCQkJCWFuZCBydW4gdGhpcyBwYWdlIGFnYWluLiBUaGVuIGNvcHkgYW55IG1lc3NhZ2VzIHlvdSBnZXQgaW50byB0aGUgZW1haWwgeW91IHNlbmQuJzsNCgkJfQ0KCX0NCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzkxMCgpew0KCQ0KCQkNCgkNCgkJaWYoISR0aGlzLT5jaGVja0NvbmZpZ1dyaXRlKCkpew0KCQkJZGllKCdJbiBvcmRlciB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIFJhY2tGb3JtcyB5b3UgbXVzdCBtYWtlIHlvdXIgL3JhY2tmb3Jtcy9hcHAvY29uZmlnLnBocCBmaWxlIHdyaXRlYWJsZS48YnIvPg0KCQkJCU9uY2UgeW91IGRvIHRoaXMgYW4gYXV0b21hdGljIHVwZGF0ZSB3aWxsIGJlIHBlcmZvcm1lZCBhbmQgeW91IGNhbiB0aGVuIHVzZSBSYWNrRm9ybXMgYWdhaW4uJyk7DQoJCX0NCgkNCgkJJG9sZCA9ICc/Pic7DQoJDQoJCQ0KCQkkY29uZmlnX2ZpbGVfcmF3ID0gZmlsZV9nZXRfY29udGVudHMoJ2NvbmZpZy5waHAnKTsNCgkNCgkJDQoJCWlmKHN1YnN0cl9jb3VudCgkY29uZmlnX2ZpbGVfcmF3LCAiQVVUSF9BRCIpID09IDApIHsNCgkJCQkNCgkJCQ0KCQkJCQ0KCQkJJGFkZCA9IDw8PEVPRg0KDQovLyBMREFQIC8gQWN0aXZlIERpcmVjdG9yeSBMb2dpbi4NCi8vIFNlZTogaHR0cHM6Ly93d3cucmFja2Zvcm1zLmNvbS9kb2N1bWVudGF0aW9uL2luc3RhbGxhdGlvbi9hY3RpdmUtZGlyZWN0b3J5LWxvZ2luLnBocA0KZGVmaW5lKCdBVVRIX0FEJywgJzAnKTsgLy8gVXNlIEFEIEF1dGhlbnRpY2F0aW9uLg0KZGVmaW5lKCdBVVRIX0FEX0xEQVBfSE9TVCcsICcnKTsgLy8gSG9zdCBOYW1lOiBlLmcuIExEQVA6Ly9jb3JwLnNhbXBsZS5jb206Mzg5DQpkZWZpbmUoJ0FVVEhfQURfTERBUF9QUkVGSVgnLCAnJyk7IC8vIFByZWZpeDogZS5nLiBDT1JQXFwgTm90ZTogQmUgc3VyZSB0byBhbHdheXMgZXNjYXBlIHNpbmdsZSBzbGFzaGVzLg0KZGVmaW5lKCdBVVRIX0FEX0xEQVBfRE4nLCAnJyk7IC8vIERpc3Rpbmd1aXNoZWQgTmFtZXM6IGUuZy4gREM9Y29ycCxEQz1zYW1wbGUsREM9Y29tDQpkZWZpbmUoJ0FVVEhfQURfQ1VTVE9NX0xFVkVMX0dST1VQX05BTUVfVkFMVUUnLCA3KTsgLy8gVGhlIGRlZmF1bHQgdXNlciBwcml2aWxlZ2UgbGV2ZWwgZm9yIG5ldyB1c2Vycy4NCg0KPz4NCg0KRU9GOw0KCQkNCgkJCSRjb25maWdfZmlsZV9yYXcgPSBzdHJfcmVwbGFjZSgkb2xkLCAkYWRkLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkNCgkJCQ0KCQkJZmlsZV9wdXRfY29udGVudHMoJ2NvbmZpZy5waHAnLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkJDQoJCX0NCgkJDQoJCQ0KCQkNCgkJaWYoc3Vic3RyX2NvdW50KCRjb25maWdfZmlsZV9yYXcsICJBVVRIX1VzZVNpbXBsZVNBTUwiKSA9PSAwKSB7DQoJCQ0KCQkJDQoJCQ0KCQkJJGFkZCA9IDw8PEVPRg0KCQkNCi8vIEJ1aWxkIDg4OSAtIFNpbXBsZSBTQU1MIFNTTy4NCmRlZmluZSgnQVVUSF9Vc2VTaW1wbGVTQU1MJywgJzAnKTsgLy8gMSBUbyBVc2UgU0FNTCBBdXRoZW50aWNhdGlvbi4NCmRlZmluZSgnU2ltcGxlU0FNTF9BdXRoU291cmNlJywgJ3JhY2tmb3Jtcy1zcCcpOyAvLyBBdXRoIFNvdXJjZS4NCmRlZmluZSgnU2ltcGxlU0FNTF9QYXRoJywgJy8uLi9zaW1wbGVzYW1scGhwL2xpYi9fYXV0b2xvYWQucGhwJyk7IC8vIExvY2F0aW9uIG9mIHRoZSBTaW1wbGVTQU1MIGxpYnJhcmllcy4NCmRlZmluZSgnU2ltcGxlU0FNTF9Mb2dvdXRSZXR1cm5UbycsICdodHRwczovL3JhY2tmb3Jtcy5iYXltYWluLmNvbS9sb2dnZWRfb3V0LnBocCcpOyAvLyBMb2NhdGlvbiBvZiBhIGxvZ291dCByZWRpcmVjdC4NCgkJDQo/Pg0KDQpFT0Y7DQoJCQ0KCQkJJGNvbmZpZ19maWxlX3JhdyA9IHN0cl9yZXBsYWNlKCRvbGQsICRhZGQsICRjb25maWdfZmlsZV9yYXcpOw0KCQkNCgkJCQ0KCQkJZmlsZV9wdXRfY29udGVudHMoJ2NvbmZpZy5waHAnLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkJDQoJCX0NCgkJDQoJDQoJfSANCgkNCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzkwNigpew0KCQkJDQoJCQ0KCQlpZiAoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpIHsNCgkJCSRzcWwgPSAnU0hPVyBDT0xVTU5TIEZST00gZmJfc3RyaXBlX3RyYW5zYWN0aW9ucyc7DQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCgkJCWZvcmVhY2ggKCAkcmVzdWx0IGFzICRyICkgew0KCQkJCWlmIChzdWJzdHJfY291bnQgKCAkciBbJ0ZpZWxkJ10sICdjdXN0b21lcicgKSkgew0KCQkJCQkNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIlNFTEVDVCBjdXN0b21lciBGUk9NIGZiX3N0cmlwZV90cmFuc2FjdGlvbnMiOw0KCQkJaWYgKERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAxICkpIHsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0NCgkNCgkJDQoJCWlmIChEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJykgew0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBgZmJfc3RyaXBlX3RyYW5zYWN0aW9uc2ANCgkJCQkJQUREIENPTFVNTiBgY3VzdG9tZXJgIFRFWFQgQUZURVIgYGRhdGVgOyI7DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBmYl9zdHJpcGVfdHJhbnNhY3Rpb25zDQoJCQkJCUFERCBjdXN0b21lciB0ZXh0IjsNCgkJfQ0KCQkNCgkJaWYgKERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAxICkpIHsNCgkJCQkNCgkJCQ0KCQkJaWYgKGlzc2V0ICggJHNxbF8yICkgJiYgRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWxfMiwgMSApKSB7DQoJCQkJZWNobyAnR29vZCBOZXdzISBZb3VyIERhdGFiYXNlIEhhcyBCZWVuIFVwZGF0ZWQgVG8gQnVpbGQgOTA2IC0gUGxlYXNlIHJlZnJlc2ggdGhpcyBwYWdlIHRvIHN0YXJ0IHVzaW5nIFJhY2tGb3JtcyBhZ2Fpbi4nOw0KCQkJfSBlbHNlIHsNCgkNCgkJCQlpZiAoISBpc3NldCAoICRzcWxfMiApKSB7DQoJCQkJCWVjaG8gJ0dvb2QgTmV3cyEgWW91ciBEYXRhYmFzZSBIYXMgQmVlbiBVcGRhdGVkIFRvIEJ1aWxkIDc5MDY3IC0gUGxlYXNlIHJlZnJlc2ggdGhpcyBwYWdlIHRvIHN0YXJ0IHVzaW5nIFJhY2tGb3JtcyBhZ2Fpbi4nOw0KCQkJCQlyZXR1cm47DQoJCQkJfSBlbHNlIHsNCgkJCQkJCQ0KCQkJCQllY2hvICdFcnJvciBVcGRhdGluZyBEYXRhYmFzZSBUbyBCdWlsZCA5MDYuIFBsZWFzZSBDb250YWN0IHN1cHBvcnRAcmFja2Zvcm1zLmNvbSBmb3IgbW9yZSBoZWxwLjxici8+DQoJCQkJCQlCZWZvcmUgeW91IGRvIHRob3VnaCwgcGxlYXNlIG9wZW4geW91ciBhcHAvY29uZmlnLnBocCBmaWxlIGFuZCB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGxpbmU6PGJyLz4NCgkJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMFwnKTs8YnIvPg0KCQkJCQkJdG8gYmU6PGJyLz4NCgkJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMVwnKTs8YnIvPg0KCQkJCQkJYW5kIHJ1biB0aGlzIHBhZ2UgYWdhaW4uIFRoZW4gY29weSBhbnkgbWVzc2FnZXMgeW91IGdldCBpbnRvIHRoZSBlbWFpbCB5b3Ugc2VuZC4nOw0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJZWNobyAnRXJyb3IgVXBkYXRpbmcgRGF0YWJhc2UgVG8gQnVpbGQgOTA2LiBQbGVhc2UgQ29udGFjdCBzdXBwb3J0QHJhY2tmb3Jtcy5jb20gZm9yIG1vcmUgaGVscC48YnIvPg0KCQkJCQlCZWZvcmUgeW91IGRvIHRob3VnaCwgcGxlYXNlIG9wZW4geW91ciBhcHAvY29uZmlnLnBocCBmaWxlIGFuZCB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGxpbmU6PGJyLz4NCgkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcwXCcpOzxici8+DQoJCQkJCXRvIGJlOjxici8+DQoJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMVwnKTs8YnIvPg0KCQkJCQlhbmQgcnVuIHRoaXMgcGFnZSBhZ2Fpbi4gVGhlbiBjb3B5IGFueSBtZXNzYWdlcyB5b3UgZ2V0IGludG8gdGhlIGVtYWlsIHlvdSBzZW5kLic7DQoJCX0NCgl9DQoJDQoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZV85MDUoKSB7DQoJDQoJCQ0KCQkNCgkJDQoJCSRuZWVkX3RhYmxlID0gdHJ1ZTsNCgkJDQoJCQ0KCQlpZiAoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpIHsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfYXVkaXRfdXNlciciOw0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoJCQkNCgkJCWlmIChjb3VudCAoICRyZXN1bHQgKSAhPSAwKSB7DQoJCQkJJG5lZWRfdGFibGUgPSBmYWxzZTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCSRzcWwgPSAiSUYgT0JKRUNUX0lEKCdbZGJvXS5bZmJfYXVkaXRfdXNlcl0nKSBJUyBOT1QgTlVMTCBTRUxFQ1QgJ3RydWUnIEFTIHN0YXR1czsgRUxTRSBTRUxFQ1QgJ2ZhbHNlJyBBUyBzdGF0dXMgIjsNCgkJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoJCQkNCgkJCWlmICgkcmVzdWx0IFswXSBbJ3N0YXR1cyddID09ICd0cnVlJykgew0KCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoJCQl9DQoJCX0NCgkNCgkJaWYgKCRuZWVkX3RhYmxlKSB7DQoJCQ0KCQkJDQoJCQkNCgkJCWlmIChEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJykgew0KCQkJCQ0KCQkJCSRzcWwgPSAiQ1JFQVRFIFRBQkxFIGBmYl9hdWRpdF91c2VyYCAoDQoJCQkJCQkgIGBpZGAgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQkJCSAgYHVzZXJfaWRgIGludCgxMSkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBgZGF0ZWAgdGltZXN0YW1wIE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwNCgkJCQkJCSAgYGNsYXNzYCB2YXJjaGFyKDEwMCkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBgYWN0aW9uYCB0ZXh0LA0KCQkJCQkJICBgcmVzdWx0YCB0ZXh0LA0KCQkJCQkJICBgZGV0YWlsYCB0ZXh0LA0KCQkJCQkJICBQUklNQVJZIEtFWSAoYGlkYCkNCgkJCQkJCSkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD0xIERFRkFVTFQgQ0hBUlNFVD11dGY4OyI7DQoJCQkJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSAoICRzcWwsIDAgKTsNCgkJCX0gZWxzZSB7IA0KCQkJDQoJCQkJJGNhdCA9IERCX0NBVEFMT0c7DQoJCQkJDQoJCQkJJHNxbCA9IDw8PEVPVA0KCQkJQkVHSU4NCgkJCQlVU0UgW3skY2F0fV07DQoJCQkJRU5EDQoNCkJFR0lODQpDUkVBVEUgVEFCTEUgW2Rib10uW2ZiX2F1ZGl0X3VzZXJdKA0KCVtpZF0gW2ludF0gSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwNCglbdXNlcl9pZF0gW2ludF0gTlVMTCwNCglbZGF0ZV0gW2RhdGV0aW1lXSBOVUxMLA0KCVtjbGFzc10gW3ZhcmNoYXJdKDEwMCkgTlVMTCwNCglbYWN0aW9uXSBbdGV4dF0gTlVMTCwNCglbcmVzdWx0XSBbdGV4dF0gTlVMTCwNCglbZGV0YWlsXSBbdGV4dF0gTlVMTCwNCikgT04gW1BSSU1BUlldIFRFWFRJTUFHRV9PTiBbUFJJTUFSWV0NCkVORA0KDQpFT1Q7DQoJCQkNCgkJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMCApOw0KCQkJfSANCgkJCQ0KCQl9IA0KCQkNCgkJDQoJCQ0KCQkNCgkJDQoJCSRuZWVkX3RhYmxlID0gdHJ1ZTsNCgkJDQoJCQ0KCQlpZiAoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpIHsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfam9ic19iYWNrdXAnIjsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMCApOw0KCQkJCQkJDQoJCQkJCWlmIChjb3VudCAoICRyZXN1bHQgKSAhPSAwKSB7DQoJCQkJCQkkbmVlZF90YWJsZSA9IGZhbHNlOw0KCQkJCQl9DQoJCX0gZWxzZSB7DQoJCQkNCgkJCSRzcWwgPSAiSUYgT0JKRUNUX0lEKCdbZGJvXS5bZmJfam9ic19iYWNrdXBdJykgSVMgTk9UIE5VTEwgU0VMRUNUICd0cnVlJyBBUyBzdGF0dXM7IEVMU0UgU0VMRUNUICdmYWxzZScgQVMgc3RhdHVzICI7DQoJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoJCQkJCQkNCgkJCWlmICgkcmVzdWx0IFswXSBbJ3N0YXR1cyddID09ICd0cnVlJykgew0KCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoNCgkJCX0NCgkJCQkJDQoJCX0NCgkJDQoJCWlmICgkbmVlZF90YWJsZSkgew0KDQoJCQkNCgkJCQkNCgkJCWlmIChEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJykgew0KDQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSBgZmJfam9ic19iYWNrdXBgICgNCgkJCSAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJICBgam9iX25hbWVgIHZhcmNoYXIoNTApIERFRkFVTFQgTlVMTCwNCgkJCSAgYGNyZWF0ZWRfdHNgIHZhcmNoYXIoMjUpIE5VTEwsDQoJCQkgIGBkZWxldGVfZGF0ZWAgdGltZXN0YW1wIE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwNCgkJCSAgYGpvYl94bWxgIGxvbmd0ZXh0LA0KCQkJICBgdXNlcl9pZGAgaW50KDExKSwJDQoJCQkgIGBmb2xkZXJfaWRgIGludCgxMSksCQ0KCQkJICBQUklNQVJZIEtFWSAoYGlkYCkNCgkJCSkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD0xIERFRkFVTFQgQ0hBUlNFVD11dGY4OyI7DQoNCgkJCURhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoJCQkNCgkJfSBlbHNlIHsgDQoJCQkJCQkJDQoJCQkkY2F0ID0gREJfQ0FUQUxPRzsNCgkNCgkJCSRzcWwgPSA8PDxFT1QNCgkJCQkJCUJFR0lODQoJCQkJCQlVU0UgW3skY2F0fV07DQoJCQkJRU5EDQoJCQ0KQkVHSU4NCkNSRUFURSBUQUJMRSBbZGJvXS5bZmJfam9ic19iYWNrdXBdKA0KCVtpZF0gW2ludF0gSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwNCglbam9iX25hbWVdIFt2YXJjaGFyXSg1MCkgTlVMTCwNCglbY3JlYXRlZF90c10gW3ZhcmNoYXJdKDI1KSBOVUxMLA0KCVtkZWxldGVfdHNdIFt0aW1lc3RhbXBdIE5VTEwsDQoJW2pvYl94bWxdIFt0ZXh0XSBOVUxMLA0KCVt1c2VyX2lkXSBbaW50XSBOVUxMLA0KCVtmb2xkZXJfaWRdIFtpbnRdIE5VTEwsDQopIE9OIFtQUklNQVJZXSBURVhUSU1BR0VfT04gW1BSSU1BUlldDQpFTkQNCgkJDQpFT1Q7DQoJCQ0KCQkJCURhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAwICk7DQoJCQkJCQkNCgkJCX0gDQoJCQkNCgkJfSANCgkJDQoJCQ0KCX0NCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzg5MSgpew0KCQ0KCQkNCgkNCgkJaWYoISR0aGlzLT5jaGVja0NvbmZpZ1dyaXRlKCkpew0KCQkJZGllKCdJbiBvcmRlciB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIFJhY2tGb3JtcyB5b3UgbXVzdCBtYWtlIHlvdXIgL3JhY2tmb3Jtcy9hcHAvY29uZmlnLnBocCBmaWxlIHdyaXRlYWJsZS48YnIvPg0KCQkJCU9uY2UgeW91IGRvIHRoaXMgYW4gYXV0b21hdGljIHVwZGF0ZSB3aWxsIGJlIHBlcmZvcm1lZCBhbmQgeW91IGNhbiB0aGVuIHVzZSBSYWNrRm9ybXMgYWdhaW4uJyk7DQoJCX0NCgkNCgkNCgkJDQoJCSRjb25maWdfZmlsZV9yYXcgPSBmaWxlX2dldF9jb250ZW50cygnY29uZmlnLnBocCcpOw0KCQ0KCQkNCgkJaWYoc3Vic3RyX2NvdW50KCRjb25maWdfZmlsZV9yYXcsICJcJF9TRVNTSU9OWyd2X3N0cmluZyddIikgPT0gMCkgew0KCQkJDQoJCQkNCgkJCQ0KCQkJJGFkZCA9IDw8PEVPRg0KZGVmaW5lKCdNQUdJQ19RVU9URVNfQ0hFQ0snLCAxKTsNCgkJCQ0KXCRfU0VTU0lPTlsndl9zdHJpbmcnXSA9ICdyYWNrZm9ybXMnOw0KXCRfU0VTU0lPTlsndl9zdHJpbmdfdGl0bGUnXSA9ICdSYWNrRm9ybXMnOw0KCQkJDQpFT0Y7DQoJCQkNCgkJCSRvbGQgPSA8PDxFT0YNCmRlZmluZSgnTUFHSUNfUVVPVEVTX0NIRUNLJywgMSk7DQpFT0Y7DQoJCQkNCgkJCSRjb25maWdfZmlsZV9yYXcgPSBzdHJfcmVwbGFjZSgkb2xkLCAkYWRkLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkJCQkNCgkJCQ0KCQkJZmlsZV9wdXRfY29udGVudHMoJ2NvbmZpZy5waHAnLCAkY29uZmlnX2ZpbGVfcmF3KTsNCgkJCQ0KCQl9CQ0KCQ0KCX0NCgkNCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzg4Mygpew0KCQkJDQoJCQ0KCQlpZiAoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpIHsNCgkJCSRzcWwgPSAnU0hPVyBDT0xVTU5TIEZST00gZmJfam9iX2VudHJpZXNfdG1wJzsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMCApOw0KCQkJZm9yZWFjaCAoICRyZXN1bHQgYXMgJHIgKSB7DQoJCQkJaWYgKHN1YnN0cl9jb3VudCAoICRyIFsnRmllbGQnXSwgJ2ZpbGVfZGF0YScgKSkgew0KCQkJCQkNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIlNFTEVDVCBmaWxlX2RhdGEgRlJPTSBmYl9qb2JfZW50cmllc190bXAiOw0KCQkJaWYgKERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAxICkpIHsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0NCgkJDQoJCQ0KCQlpZiAoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpIHsNCgkJCSRzcWwgPSAiQUxURVIgVEFCTEUgYGZiX2pvYl9lbnRyaWVzX3RtcGANCgkJCQkJQUREIENPTFVNTiBgZmlsZV9kYXRhYCBMT05HQkxPQiBBRlRFUiBgZW50cnlfdmFsdWVgLA0KCQkJCQlBREQgQ09MVU1OIGBmaWxlX21pbWVgIFZBUkNIQVIoMTIwKSBBRlRFUiBgZmlsZV9kYXRhYCwNCgkJCQkJQUREIENPTFVNTiBgZmlsZV9uYW1lYCBWQVJDSEFSKDI1NSkgQUZURVIgYGZpbGVfbWltZWAsDQoJCQkJCUFERCBDT0xVTU4gYHNpZ19kYXRhYCBMT05HQkxPQiBBRlRFUiBgZmlsZV9uYW1lYDsiOw0KCQl9IGVsc2UgeyANCgkJCSRzcWwgPSAiQUxURVIgVEFCTEUgZmJfam9iX2VudHJpZXNfdG1wDQoJCQkJCUFERCBmaWxlX2RhdGEgdGV4dCwNCgkJCQkJZmlsZV9taW1lIFt2YXJjaGFyXSgxMjApIE5VTEwsDQoJCQkJCWZpbGVfbmFtZSBbdmFyY2hhcl0oMjU1KSBOVUxMLA0KCQkJCQlzaWdfZGF0YSB0ZXh0OyI7DQoJCX0NCgkJDQoJCWlmIChEYXRhYmFzZTo6cGRvX3F1ZXJ5ICggJHNxbCwgMSApKSB7DQoJCQkNCgkJCQ0KCQkJaWYgKGlzc2V0ICggJHNxbCApICYmIERhdGFiYXNlOjpwZG9fcXVlcnkgKCAkc3FsLCAxICkpIHsNCgkJCQllY2hvICdHb29kIE5ld3MhIFlvdXIgRGF0YWJhc2UgSGFzIEJlZW4gVXBkYXRlZCBUbyBCdWlsZCA4ODMgLSBQbGVhc2UgcmVmcmVzaCB0aGlzIHBhZ2UgdG8gc3RhcnQgdXNpbmcgUmFja0Zvcm1zIGFnYWluLic7DQoJCQl9IGVsc2Ugew0KCQkJCQ0KCQkJCWlmICghIGlzc2V0ICggJHNxbCApKSB7DQoJCQkJCWVjaG8gJ0dvb2QgTmV3cyEgWW91ciBEYXRhYmFzZSBIYXMgQmVlbiBVcGRhdGVkIFRvIEJ1aWxkIDg4MyAtIFBsZWFzZSByZWZyZXNoIHRoaXMgcGFnZSB0byBzdGFydCB1c2luZyBSYWNrRm9ybXMgYWdhaW4uJzsNCgkJCQkJcmV0dXJuOw0KCQkJCX0gZWxzZSB7DQoJCQkJCQ0KCQkJCQllY2hvICdFcnJvciBVcGRhdGluZyBEYXRhYmFzZSBUbyBCdWlsZCA4ODMuIFBsZWFzZSBDb250YWN0IHN1cHBvcnRAcmFja2Zvcm1zLmNvbSBmb3IgbW9yZSBoZWxwLjxici8+DQoJCQkJCQlCZWZvcmUgeW91IGRvIHRob3VnaCwgcGxlYXNlIG9wZW4geW91ciBhcHAvY29uZmlnLnBocCBmaWxlIGFuZCB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGxpbmU6PGJyLz4NCgkJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMFwnKTs8YnIvPg0KCQkJCQkJdG8gYmU6PGJyLz4NCgkJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMVwnKTs8YnIvPg0KCQkJCQkJYW5kIHJ1biB0aGlzIHBhZ2UgYWdhaW4uIFRoZW4gY29weSBhbnkgbWVzc2FnZXMgeW91IGdldCBpbnRvIHRoZSBlbWFpbCB5b3Ugc2VuZC4nOw0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJZWNobyAnRXJyb3IgVXBkYXRpbmcgRGF0YWJhc2UgVG8gQnVpbGQgODgzLiBQbGVhc2UgQ29udGFjdCBzdXBwb3J0QHJhY2tmb3Jtcy5jb20gZm9yIG1vcmUgaGVscC48YnIvPg0KCQkJCQlCZWZvcmUgeW91IGRvIHRob3VnaCwgcGxlYXNlIG9wZW4geW91ciBhcHAvY29uZmlnLnBocCBmaWxlIGFuZCB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGxpbmU6PGJyLz4NCgkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcwXCcpOzxici8+DQoJCQkJCXRvIGJlOjxici8+DQoJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMVwnKTs8YnIvPg0KCQkJCQlhbmQgcnVuIHRoaXMgcGFnZSBhZ2Fpbi4gVGhlbiBjb3B5IGFueSBtZXNzYWdlcyB5b3UgZ2V0IGludG8gdGhlIGVtYWlsIHlvdSBzZW5kLic7DQoJCX0NCgl9DQoJDQoJDQoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZV84NjYoKXsNCgkNCgkJDQoJCQ0KCQkNCgkNCgkJJG5lZWRfdGFibGUgPSB0cnVlOw0KCQ0KCQkNCgkJaWYoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpew0KCQkJJHNxbCA9ICJTSE9XIFRBQkxFUyBMSUtFICdmYl9hY2lfbGV2ZWxfMV90cmFuc2FjdGlvbnMnIjsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJCQkNCgkJCWlmKGNvdW50KCRyZXN1bHQpICE9IDApew0KCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoJCQl9DQoJCQkNCgkJfSBlbHNlIHsNCgkJCSRzcWwgPSAiSUYgT0JKRUNUX0lEKCdbZGJvXS5bZmJfYWNpX2xldmVsXzFfdHJhbnNhY3Rpb25zXScpIElTIE5PVCBOVUxMIFNFTEVDVCAndHJ1ZScgQVMgc3RhdHVzOyBFTFNFIFNFTEVDVCAnZmFsc2UnIEFTIHN0YXR1cyAiOw0KCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJDQoJCQlpZigkcmVzdWx0WzBdWydzdGF0dXMnXSA9PSAndHJ1ZScpew0KCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoJCQl9DQoJDQoJCX0NCgkNCgkJaWYoJG5lZWRfdGFibGUpew0KCQ0KCQkJDQoJCQkNCgkJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCg0KCQkJCSRzcWwgPSAiQ1JFQVRFIFRBQkxFIGBmYl9hY2lfbGV2ZWxfMV90cmFuc2FjdGlvbnNgICgNCgkJCQkJCSAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCQkJICBgcmZfZW50cnlfa2V5YCB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIGB1aWRgIHZhcmNoYXIoNTApIERFRkFVTFQgTlVMTCwNCgkJCQkJCSAgYGNvbmZpcm1hdGlvbmAgdmFyY2hhcig1MCkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBgZW1haWxgIHZhcmNoYXIoMTAwKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIGBhbW91bnRgIGRvdWJsZSBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIGBkYXRlYCB0aW1lc3RhbXAgTlVMTCBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLA0KCQkJCQkJICBgZGF0YWAgdGV4dCwNCgkJCQkJCSAgYHNoaXBwaW5nX2RhdGFgIHRleHQsDQoJCQkJCQkgIGBsaW5lX2l0ZW1zYCB0ZXh0LA0KCQkJCQkJICBQUklNQVJZIEtFWSAoYGlkYCkNCgkJCQkJCSkgRU5HSU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD0xIERFRkFVTFQgQ0hBUlNFVD11dGY4OyI7DQoJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkNCgkJCX0gZWxzZSB7IA0KCQ0KCQkJCSRjYXQgPSBEQl9DQVRBTE9HOw0KDQoJCQkJJHNxbCA9IDw8PEVPVA0KCQkJCQlCRUdJTg0KCQkJCQlVU0UgW3skY2F0fV07DQoJCQkJCUVORA0KCQ0KQkVHSU4NCkNSRUFURSBUQUJMRSBbZGJvXS5bZmJfYWNpX2xldmVsXzFfdHJhbnNhY3Rpb25zXSgNCglbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJW3JmX2VudHJ5X2tleV0gW3ZhcmNoYXJdKDUwKSBOVUxMLA0KCVt1aWRdIFt2YXJjaGFyXSg1MCkgTlVMTCwNCglbY29uZmlybWF0aW9uXSBbdmFyY2hhcl0oNTApIE5VTEwsDQoJW2VtYWlsXSBbdmFyY2hhcl0oMTAwKSBOVUxMLA0KCVthbW91bnRdIFttb25leV0gTlVMTCwNCglbZGF0ZV0gW2RhdGV0aW1lXSBOVUxMLA0KCVtkYXRhXSBbdGV4dF0gTlVMTCwNCglbc2hpcHBpbmdfZGF0YV0gW3RleHRdIE5VTEwsDQoJW2xpbmVfaXRlbXNdIFt0ZXh0XSBOVUxMDQopIE9OIFtQUklNQVJZXSBURVhUSU1BR0VfT04gW1BSSU1BUlldDQpFTkQNCgkNCkVPVDsNCgkNCgkJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQ0KCQkJfSANCgkNCgkJfQ0KCX0NCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzg2MSgpew0KCQ0KCQkNCgkJDQoJCQ0KCQ0KCQkkbmVlZF90YWJsZSA9IHRydWU7DQoJDQoJCQ0KCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJCQkkc3FsID0gIlNIT1cgVEFCTEVTIExJS0UgJ2ZiX3BheWZsb3dfdHJhbnNhY3Rpb25zJyI7DQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQkJDQoJCQkJaWYoY291bnQoJHJlc3VsdCkgIT0gMCl7DQoJCQkJJG5lZWRfdGFibGUgPSBmYWxzZTsNCgkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkkc3FsID0gIklGIE9CSkVDVF9JRCgnW2Rib10uW2ZiX3BheWZsb3dfdHJhbnNhY3Rpb25zXScpIElTIE5PVCBOVUxMIFNFTEVDVCAndHJ1ZScgQVMgc3RhdHVzOyBFTFNFIFNFTEVDVCAnZmFsc2UnIEFTIHN0YXR1cyAiOw0KCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJDQoJCQkJaWYoJHJlc3VsdFswXVsnc3RhdHVzJ10gPT0gJ3RydWUnKXsNCgkJCQkkbmVlZF90YWJsZSA9IGZhbHNlOw0KCQkJCX0NCgkNCgkJCQl9DQoJDQoJCQkJaWYoJG5lZWRfdGFibGUpew0KCQ0KCQkJCQ0KCQkJCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJDQoJCQkJCSRzcWwgPSAiQ1JFQVRFIFRBQkxFIGBmYl9wYXlmbG93X3RyYW5zYWN0aW9uc2AgKA0KCQkJCQkJCSAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCQkJCSAgYHJmX2VudHJ5X2tleWAgdmFyY2hhcig1MCkgREVGQVVMVCBOVUxMLA0KCQkJCQkJCSAgYFBOUkVGYCB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkJICBgQUNDVGAgaW50KDExKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkJICBgcmVzdWx0YCB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkJICBgZW1haWxgIHZhcmNoYXIoMTAwKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkJICBgYW1vdW50YCBkb3VibGUgREVGQVVMVCBOVUxMLA0KCQkJCQkJCSAgYGRhdGVgIHRpbWVzdGFtcCBOVUxMIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVAsDQoJCQkJCQkJICBgZGF0YWAgdGV4dCwNCgkJCQkJCQkgIGBzaGlwcGluZ19kYXRhYCB0ZXh0LA0KCQkJCQkJCSAgYGxpbmVfaXRlbXNgIHRleHQsDQoJCQkJCQkJICBgc3Vic2NyaXB0aW9uX2RhdGFgIHRleHQsDQoJCQkJCQkJICBgdHJpYWxfZGF0YWAgdGV4dCwNCgkJCQkJCQkgIGBwcm9maWxlX2lkYCB2YXJjaGFyKDUwKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkJICBgcHJvZmlsZV9zdGF0dXNgIHZhcmNoYXIoNTApIERFRkFVTFQgTlVMTCwNCgkJCQkJCQkgIFBSSU1BUlkgS0VZIChgaWRgKQ0KCQkJCQkJCSkgRU5HSU5FPUlubm9EQiBERUZBVUxUIENIQVJTRVQ9dXRmODsiOw0KCQ0KCQkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQkJCQkNCgkJCQkJfSBlbHNlIHsgDQoJCQkJCQkNCgkJCQkJJGNhdCA9IERCX0NBVEFMT0c7DQoJDQoJCQkJCSRzcWwgPSA8PDxFT1QNCgkJCQkJQkVHSU4NCgkJCQkJVVNFIFt7JGNhdH1dOw0KCQkJRU5EDQoJDQpCRUdJTg0KQ1JFQVRFIFRBQkxFIFtkYm9dLltmYl9wYXlmbG93X3RyYW5zYWN0aW9uc10oDQoJW2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCVtyZl9lbnRyeV9rZXldIFt2YXJjaGFyXSg1MCkgTlVMTCwNCglbUE5SRUZdIFt2YXJjaGFyXSg1MCkgTlVMTCwNCglbQUNDVF0gW2ludF0gTlVMTAkNCglbcmVzdWx0XSBbdmFyY2hhcl0oNTApIE5VTEwsDQoJW2VtYWlsXSBbdmFyY2hhcl0oMTAwKSBOVUxMLA0KCVthbW91bnRdIFttb25leV0gTlVMTCwNCglbZGF0ZV0gW2RhdGV0aW1lXSBOVUxMLA0KCVtkYXRhXSBbdGV4dF0gTlVMTCwNCglbc2hpcHBpbmdfZGF0YV0gW3RleHRdIE5VTEwsDQoJW2xpbmVfaXRlbXNdIFt0ZXh0XSBOVUxMLA0KCVtzdWJzY3JpcHRpb25fZGF0YV0gW3RleHRdIE5VTEwsDQoJW3RyaWFsX2RhdGFdIFt0ZXh0XSBOVUxMLA0KCVtwcm9maWxlX2lkXSBbdGV4dF0gTlVMTCwNCglbcHJvZmlsZV9zdGF0dXNdIFt0ZXh0XSBOVUxMLAkNCikgT04gW1BSSU1BUlldIFRFWFRJTUFHRV9PTiBbUFJJTUFSWV0NCkVORA0KDQpFT1Q7DQoJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkNCgkJCX0gDQoJDQoJCX0NCgl9DQogICAgDQogICAgDQoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZV84NDIoKXsNCgkNCgkJDQoJCQ0KCQkNCgkNCgkJJG5lZWRfdGFibGUgPSB0cnVlOw0KCQ0KCQkNCgkJaWYoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpew0KCQkJJHNxbCA9ICJTSE9XIFRBQkxFUyBMSUtFICdmYl9yZXBvcnRzJyI7DQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQ0KCQkJaWYoY291bnQoJHJlc3VsdCkgIT0gMCl7DQoJCQkJJG5lZWRfdGFibGUgPSBmYWxzZTsNCgkJCX0JDQoJCX0gZWxzZSB7DQoJCQkkc3FsID0gIklGIE9CSkVDVF9JRCgnW2Rib10uW2ZiX3JlcG9ydHNdJykgSVMgTk9UIE5VTEwgU0VMRUNUICd0cnVlJyBBUyBzdGF0dXM7IEVMU0UgU0VMRUNUICdmYWxzZScgQVMgc3RhdHVzICI7DQoJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQkJDQoJCQlpZigkcmVzdWx0WzBdWydzdGF0dXMnXSA9PSAndHJ1ZScpew0KCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoJCQl9DQoJDQoJCX0NCgkNCgkJaWYoJG5lZWRfdGFibGUpew0KCQ0KCQkNCgkJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCQkNCgkJCQkkc3FsID0gIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGBmYl9yZXBvcnRzYCAoDQoJCQkJCQkgIGBpZGAgaW50KDExKSB1bnNpZ25lZCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQkJCSAgYHVzZXJfaWRgIGludCgxMSkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBgcmVwb3J0X3RpdGxlYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBgcmVwb3J0X2RhdGFgIGxvbmd0ZXh0LA0KCQkJCQkJICBQUklNQVJZIEtFWSAoYGlkYCkNCgkJCQkJCSkgRU5HSU5FPUlubm9EQiBERUZBVUxUIENIQVJTRVQ9dXRmODsiOw0KCQ0KCQkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQkNCgkJfSBlbHNlIHsgDQoJCQkNCgkJCSRjYXQgPSBEQl9DQVRBTE9HOw0KCQkJCQ0KCQkJJHNxbCA9IDw8PEVPVA0KCQkJQkVHSU4NCgkJCVVTRSBbeyRjYXR9XTsNCgkJCUVORA0KCQ0KCQkJQkVHSU4NCkNSRUFURSBUQUJMRSBbZGJvXS5bZmJfcmVwb3J0c10oDQpbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQpbdXNlcl9pZF0gW2ludF0gTlVMTCwNCltyZXBvcnRfdGl0bGVdIFt2YXJjaGFyXSgyNTUpIE5VTEwsDQpbcmVwb3J0X2RhdGFdIFt0ZXh0XSBOVUxMDQopIE9OIFtQUklNQVJZXQ0KRU5EDQpFT1Q7DQoJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkNCgkJCX0gDQoJDQoJCX0NCgl9DQoJDQogICAgDQogICAgDQoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZV84MDUoKXsNCgkJCQkNCgkJJG5lZWRfdGFibGUgPSB0cnVlOw0KCQ0KCQkNCgkJaWYoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpew0KCQkJJHNxbCA9ICJTSE9XIFRBQkxFUyBMSUtFICdmYl9hbmFseXRpY3MnIjsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJCWlmKGNvdW50KCRyZXN1bHQpICE9IDApew0KCQkJCSAgICAkbmVlZF90YWJsZSA9IGZhbHNlOw0KCQkgICAgICAgIH0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIklGIE9CSkVDVF9JRCgnW2Rib10uW2ZiX2FuYWx5dGljc10nKSBJUyBOT1QgTlVMTCBTRUxFQ1QgJ3RydWUnIEFTIHN0YXR1czsgRUxTRSBTRUxFQ1QgJ2ZhbHNlJyBBUyBzdGF0dXMgIjsNCgkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQkNCgkJCWlmKCRyZXN1bHRbMF1bJ3N0YXR1cyddID09ICd0cnVlJyl7DQoJCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoJCSAgICB9DQoJDQoJCX0NCgkNCgkJaWYoJG5lZWRfdGFibGUpew0KCQ0KICAgICAgICAgICAgDQoJCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJDQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSBgZmJfYW5hbHl0aWNzYCAoDQogICAgICAgICAgICAgICAgICAgIGBpZGAgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCiAgICAgICAgICAgICAgICAgICAgYGpvYl9pZGAgSU5UKDExKSBOT1QgTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgYHRzYCBEQVRFVElNRSBERUZBVUxUIE5VTEwsDQogICAgICAgICAgICAgICAgICAgIGBwYWdlX3RpdGxlYCBWQVJDSEFSKDI1NSkgREVGQVVMVCBOVUxMLA0KICAgICAgICAgICAgICAgICAgICBgcGFnZV90eXBlYCBWQVJDSEFSKDI1KSBERUZBVUxUIE5VTEwsDQogICAgICAgICAgICAgICAgICAgIGBlbnRyeV9rZXlgIFZBUkNIQVIoNTApIERFRkFVTFQgTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgYHJlbW90ZV9pcGAgVkFSQ0hBUig1MCkgREVGQVVMVCBOVUxMLA0KICAgICAgICAgICAgICAgICAgICBQUklNQVJZIEtFWSAgKGBpZGApLA0KICAgICAgICAgICAgICAgICAgICBJTkRFWCBpbmRleDEgVVNJTkcgQlRSRUUgKGBqb2JfaWRgKSwNCiAgICAgICAgICAgICAgICAgICAgSU5ERVggSURYX3RzIFVTSU5HIEJUUkVFIChgdHNgKSwNCiAgICAgICAgICAgICAgICAgICAgSU5ERVggSURYX2VudHJ5X2tleSBVU0lORyBCVFJFRSAoYGVudHJ5X2tleWApLA0KICAgICAgICAgICAgICAgICAgICBDT05TVFJBSU5UIGBmYl9hbmFseXRpY3NfRksxYCBGT1JFSUdOIEtFWSAoYGpvYl9pZGApIFJFRkVSRU5DRVMgYGZiX2pvYnNgIChgaWRgKSBPTiBERUxFVEUgQ0FTQ0FERQ0KICAgICAgICAgICAgICAgICkgRU5HSU5FPUlOTk9EQiBDSEFSU0VUPXV0ZjggQ09MTEFURSB1dGY4X2dlbmVyYWxfY2k7IjsNCgkNCgkJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJDQogICAgICAgICAgICB9IGVsc2UgeyANCgkJCQ0KICAgICAgICAgICAgICAgICRjYXQgPSBEQl9DQVRBTE9HOw0KDQogICAgICAgICAgICAgICAgJHNxbCA9IDw8PEVPVA0KICAgICAgICAgICAgICAgICAgICBCRUdJTg0KICAgICAgICAgICAgICAgICAgICBVU0UgW3skY2F0fV07DQogICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIEJFR0lODQogICAgICAgICAgICAgICAgICAgIENSRUFURSBUQUJMRSBbZGJvXS5bZmJfYW5hbHl0aWNzXSgNCgkgICAgICAgICAgICAgICAgW2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCSAgICAgICAgICAgICAgICBbam9iX2lkXSBbaW50XSBOT1QgTlVMTCwNCgkgICAgICAgICAgICAgICAgW3RzXSBbZGF0ZXRpbWVdIE5VTEwsDQoJICAgICAgICAgICAgICAgIFtwYWdlX3RpdGxlXSBbdmFyY2hhcl0oMjU1KSBOVUxMLA0KCSAgICAgICAgICAgICAgICBbcGFnZV90eXBlXSBbdmFyY2hhcl0oMjUpIE5VTEwsDQoJICAgICAgICAgICAgICAgIFtlbnRyeV9rZXldIFt2YXJjaGFyXSg1MCkgTlVMTCwNCgkgICAgICAgICAgICAgICAgW3JlbW90ZV9pcF0gW3ZhcmNoYXJdKDUwKSBOVUxMLA0KICAgICAgICAgICAgICAgICBDT05TVFJBSU5UIFtQS19mYl9hbmFseXRpY3NdIFBSSU1BUlkgS0VZIENMVVNURVJFRCANCiAgICAgICAgICAgICAgICAoDQoJICAgICAgICAgICAgICAgIFtpZF0gQVNDDQogICAgICAgICAgICAgICAgKVdJVEggKFBBRF9JTkRFWCA9IE9GRiwgU1RBVElTVElDU19OT1JFQ09NUFVURSA9IE9GRiwgSUdOT1JFX0RVUF9LRVkgPSBPRkYsIEFMTE9XX1JPV19MT0NLUyA9IE9OLCBBTExPV19QQUdFX0xPQ0tTID0gT04pIE9OIFtQUklNQVJZXQ0KICAgICAgICAgICAgICAgICkgT04gW1BSSU1BUlldDQogICAgICAgICAgICAgICAgRU5EDQpFT1Q7DQoJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgICRzcWwgPSA8PDxFT1QNCiAgICAgICAgICAgICAgICAgICAgQkVHSU4NCiAgICAgICAgICAgICAgICAgICAgVVNFIFt7JGNhdH1dOw0KICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICBCRUdJTg0KICAgICAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSBbZGJvXS5bZmJfYW5hbHl0aWNzXSAgV0lUSCBDSEVDSyBBREQgIENPTlNUUkFJTlQgW0ZLX2ZiX2FuYWx5dGljc19mYl9qb2JzXSBGT1JFSUdOIEtFWShbam9iX2lkXSkNCiAgICAgICAgICAgICAgICAgICAgUkVGRVJFTkNFUyBbZGJvXS5bZmJfam9ic10gKFtpZF0pDQogICAgICAgICAgICAgICAgICAgIE9OIERFTEVURSBDQVNDQURFDQogICAgICAgICAgICAgICAgICAgIEVORA0KRU9UOw0KCQ0KCQkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkc3FsID0gPDw8RU9UDQogICAgICAgICAgICAgICAgICAgIEJFR0lODQogICAgICAgICAgICAgICAgICAgIFVTRSBbeyRjYXR9XTsNCiAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgQkVHSU4NCg0KICAgICAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSBbZGJvXS5bZmJfYW5hbHl0aWNzXSBDSEVDSyBDT05TVFJBSU5UIFtGS19mYl9hbmFseXRpY3NfZmJfam9ic10NCg0KICAgICAgICAgICAgICAgICAgICBFTkQNCkVPVDsNCgkNCgkJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KDQogICAgICAgICAgICB9IA0KCQ0KCQl9IA0KDQoJfQ0KICAgIA0KICAgIHB1YmxpYyBmdW5jdGlvbiB1cGRhdGVfODAxKCl7DQoJDQoJCQ0KCQkNCgkJDQoJDQoJCSRuZWVkX3RhYmxlID0gdHJ1ZTsNCgkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfYXBpX21hbmFnZXInIjsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJCWlmKGNvdW50KCRyZXN1bHQpICE9IDApew0KCQkJCSAgICAkbmVlZF90YWJsZSA9IGZhbHNlOw0KCQkgICAgICAgIH0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIklGIE9CSkVDVF9JRCgnW2Rib10uW2ZiX2FwaV9tYW5hZ2VyXScpIElTIE5PVCBOVUxMIFNFTEVDVCAndHJ1ZScgQVMgc3RhdHVzOyBFTFNFIFNFTEVDVCAnZmFsc2UnIEFTIHN0YXR1cyAiOw0KCQkNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJCQ0KCQkJaWYoJHJlc3VsdFswXVsnc3RhdHVzJ10gPT0gJ3RydWUnKXsNCgkJCQkJJG5lZWRfdGFibGUgPSBmYWxzZTsNCgkJICAgIH0NCgkNCgkJfQ0KCQ0KCQlpZigkbmVlZF90YWJsZSl7DQoJDQogICAgICAgICAgICANCgkJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkNCgkJCSRzcWwgPSAiQ1JFQVRFIFRBQkxFIGBmYl9hcGlfbWFuYWdlcmAgKA0KCQkJCQkgIGBpZGAgaW50KDExKSBOT1QgTlVMTCBERUZBVUxUICcwJywNCgkJCQkJICBgdXNlcl9pZGAgaW50KDExKSBERUZBVUxUIE5VTEwsDQoJCQkJCSAgYGRhdGFgIGxvbmdibG9iLA0KCQkJCQkgIGBjcmVhdGVkYCBkYXRldGltZSBERUZBVUxUIE5VTEwsDQoJCQkJCSAgYGxhc3RfYWNjZXNzZWRgIGRhdGV0aW1lIERFRkFVTFQgTlVMTCwNCgkJCQkJICBQUklNQVJZIEtFWSAoYGlkYCksDQoJCQkJCSAgS0VZIGBSYWNrRm9ybXNfYXBpX21hbmFnZXJfS0VZYCAoYHVzZXJfaWRgKSwNCgkJCQkJICBDT05TVFJBSU5UIGBGS19SYWNrRm9ybXNfYXBpX21hbmFnZXJfRktgIEZPUkVJR04gS0VZIChgdXNlcl9pZGApIFJFRkVSRU5DRVMgYGZiX2FkbWluYCAoYHVzZXJfaWRgKSBPTiBERUxFVEUgQ0FTQ0FERQ0KCQkJCQkpIEVOR0lORT1Jbm5vREIgREVGQVVMVCBDSEFSU0VUPXV0Zjg7IjsNCgkNCgkJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJDQogICAgICAgICAgICB9IGVsc2UgeyANCgkJCQ0KICAgICAgICAgICAgICAgICRjYXQgPSBEQl9DQVRBTE9HOw0KDQogICAgICAgICAgICAgICAgJHNxbCA9IDw8PEVPVA0KICAgICAgICAgICAgICAgICAgICBCRUdJTg0KICAgICAgICAgICAgICAgICAgICBVU0UgW3skY2F0fV07DQogICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIEJFR0lODQoNCiAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIFtkYm9dLltmYl9hcGlfbWFuYWdlcl0oDQogICAgICAgICAgICAgICAgICAgIFtpZF0gW2ludF0gSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgW3VzZXJfaWRdIFtpbnRdIE5VTEwsDQogICAgICAgICAgICAgICAgICAgIFtkYXRhXSBbaW1hZ2VdIE5VTEwsDQogICAgICAgICAgICAgICAgICAgIFtjcmVhdGVkXSBbZGF0ZXRpbWVdIE5VTEwsDQogICAgICAgICAgICAgICAgICAgIFtsYXN0X2FjY2Vzc2VkXSBbZGF0ZXRpbWVdIE5VTEwsDQogICAgICAgICAgICAgICAgICAgIENPTlNUUkFJTlQgW1BLX2ZiX2FwaV9tYW5hZ2VyXSBQUklNQVJZIEtFWSBDTFVTVEVSRUQgDQogICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgW2lkXSBBU0MNCiAgICAgICAgICAgICAgICAgICAgKVdJVEggKFBBRF9JTkRFWCA9IE9GRiwgU1RBVElTVElDU19OT1JFQ09NUFVURSA9IE9GRiwgSUdOT1JFX0RVUF9LRVkgPSBPRkYsIEFMTE9XX1JPV19MT0NLUyA9IE9OLCBBTExPV19QQUdFX0xPQ0tTID0gT04pIE9OIFtQUklNQVJZXQ0KICAgICAgICAgICAgICAgICAgICApIE9OIFtQUklNQVJZXSBURVhUSU1BR0VfT04gW1BSSU1BUlldDQpFTkQNCkVPVDsNCgkNCgkJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgJHNxbCA9IDw8PEVPVA0KICAgICAgICAgICAgICAgICAgICBCRUdJTg0KICAgICAgICAgICAgICAgICAgICBVU0UgW3skY2F0fV07DQogICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIEJFR0lODQoNCiAgICAgICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgW2Rib10uW2ZiX2FwaV9tYW5hZ2VyXSAgV0lUSCBDSEVDSyBBREQgIENPTlNUUkFJTlQgW0ZLX2ZiX2FwaV9tYW5hZ2VyX2ZiX2FkbWluXSBGT1JFSUdOIEtFWShbdXNlcl9pZF0pDQogICAgICAgICAgICAgICAgICAgIFJFRkVSRU5DRVMgW2Rib10uW2ZiX2FkbWluXSAoW3VzZXJfaWRdKQ0KICAgICAgICAgICAgICAgICAgICBPTiBERUxFVEUgQ0FTQ0FERQ0KDQogICAgICAgICAgICAgICAgICAgIEVORA0KRU9UOw0KCQ0KCQkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkc3FsID0gPDw8RU9UDQogICAgICAgICAgICAgICAgICAgIEJFR0lODQogICAgICAgICAgICAgICAgICAgIFVTRSBbeyRjYXR9XTsNCiAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgQkVHSU4NCg0KICAgICAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSBbZGJvXS5bZmJfYXBpX21hbmFnZXJdIENIRUNLIENPTlNUUkFJTlQgW0ZLX2ZiX2FwaV9tYW5hZ2VyX2ZiX2FkbWluXQ0KDQogICAgICAgICAgICAgICAgICAgIEVORA0KRU9UOw0KCQ0KCQkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoNCiAgICAgICAgICAgIH0gDQoJDQoJCX0gDQogICAgICAgIA0KCX0NCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzc3NSgpew0KCQ0KCQkNCgkJDQoJCQ0KCQ0KCQkkbmVlZF90YWJsZSA9IHRydWU7DQoJDQoJCQ0KCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJCQkkc3FsID0gIlNIT1cgVEFCTEVTIExJS0UgJ2ZiX2FpbV90cmFuc2FjdGlvbnMnIjsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJCWlmKGNvdW50KCRyZXN1bHQpICE9IDApew0KCQkJCSRuZWVkX3RhYmxlID0gZmFsc2U7DQoJCX0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIklGIE9CSkVDVF9JRCgnW2Rib10uW2ZiX2FpbV90cmFuc2FjdGlvbnNdJykgSVMgTk9UIE5VTEwgU0VMRUNUICd0cnVlJyBBUyBzdGF0dXM7IEVMU0UgU0VMRUNUICdmYWxzZScgQVMgc3RhdHVzICI7DQoJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQkJDQoJCQlpZigkcmVzdWx0WzBdWydzdGF0dXMnXSA9PSAndHJ1ZScpew0KCQkJCQkkbmVlZF90YWJsZSA9IGZhbHNlOw0KCQl9DQoJDQoJCX0NCgkNCgkJaWYoJG5lZWRfdGFibGUpew0KCQ0KCQkNCgkJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkNCgkJCSRzcWwgPSAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZmJfYWltX3RyYW5zYWN0aW9ucygNCgkJCQkJCSAgaWQgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQkJCSAgcmZfZW50cnlfa2V5IFZBUkNIQVIoNTApIERFRkFVTFQgTlVMTCwNCgkJCQkJCSAgdHJhbnNhY3Rpb25faWQgVkFSQ0hBUig1MCkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBhbW91bnQgSU5UKDExKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIGBkYXRlYCBUSU1FU1RBTVAgTlVMTCBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLA0KCQkJCQkJICBgZGF0YWAgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIHNoaXBwaW5nX2RhdGEgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIGxpbmVfaXRlbXMgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIHN1YnNjcmlwdGlvbl9kYXRhIFRFWFQgREVGQVVMVCBOVUxMLA0KCQkJCQkJICB0cmFpbF9kYXRhIFRFWFQgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBQUklNQVJZIEtFWSAoaWQpDQoJCQkJCQkpDQoJCQkJCQlFTkdJTkUgPSBJTk5PREINCgkJCQkJCUFVVE9fSU5DUkVNRU5UID0gMQ0KCQkJCQkJQVZHX1JPV19MRU5HVEggPSA4MTkyDQoJCQkJCQlDSEFSQUNURVIgU0VUIHV0ZjgNCgkJCQkJCUNPTExBVEUgdXRmOF9nZW5lcmFsX2NpOyI7DQoJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQ0KCQl9IGVsc2UgeyANCgkJCQ0KCQkkY2F0ID0gREJfQ0FUQUxPRzsNCgkJCQ0KCQkkc3FsID0gPDw8RU9UDQoJCQlCRUdJTg0KCQkJVVNFIFt7JGNhdH1dOw0KCQkJRU5EDQoJDQoJCQlCRUdJTg0KCQ0KCQkJQ1JFQVRFIFRBQkxFIFtkYm9dLltmYl9haW1fdHJhbnNhY3Rpb25zXSgNCglbaWRdIFtpbnRdIElERU5USVRZKDEsMSkgTk9UIE5VTEwsDQoJW3JmX2VudHJ5X2tleV0gW3ZhcmNoYXJdKDUwKSBOVUxMLA0KCVt0cmFuc2FjdGlvbl9pZF0gW3ZhcmNoYXJdKDUwKSBOVUxMLA0KCVthbW91bnRdIFtpbnRdIE5VTEwsDQoJW2RhdGVdIFtkYXRldGltZV0gTlVMTCwNCglbZGF0YV0gW3RleHRdIE5VTEwsDQoJW3NoaXBwaW5nX2RhdGFdIFt0ZXh0XSBOVUxMLA0KCVtsaW5lX2l0ZW1zXSBbdGV4dF0gTlVMTCwNCglbc3Vic2NyaXB0aW9uX2RhdGFdIFt0ZXh0XSBOVUxMLA0KCVt0cmlhbF9kYXRhXSBbdGV4dF0gTlVMTA0KKSBPTiBbUFJJTUFSWV0gVEVYVElNQUdFX09OIFtQUklNQVJZXQ0KCQ0KRU5EDQpFT1Q7DQoJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkNCgkJfSANCgkNCgkJfQ0KCX0NCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzc3MCgpew0KCQkJCQ0KCQkNCgkJDQoJCQ0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAnU0hPVyBDT0xVTU5TIEZST00gZmJfc3RyaXBlX3RyYW5zYWN0aW9ucyc7DQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCWZvcmVhY2goJHJlc3VsdCBhcyAkcil7DQoJCQkJaWYoc3Vic3RyX2NvdW50KCRyWydGaWVsZCddLCAnZW1haWwnKSl7DQoJCQkJCQ0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KCQl9IGVsc2UgeyANCgkJCSRzcWwgPSAiU0VMRUNUIGVtYWlsIEZST00gZmJfc3RyaXBlX3RyYW5zYWN0aW9ucyI7DQoJCQlpZihEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDEpKXsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0NCgkJDQoNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAiQUxURVIgVEFCTEUgYGZiX3N0cmlwZV90cmFuc2FjdGlvbnNgIA0KCQkJCQlBREQgQ09MVU1OIGBlbWFpbGAgVkFSQ0hBUigxMDApIEFGVEVSIGBjaGFyZ2VfaWRgOyI7DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBmYl9zdHJpcGVfdHJhbnNhY3Rpb25zIA0KCQkJCQlBREQgZW1haWwgVkFSQ0hBUigxMDApOyI7DQoJCX0NCgkJDQoJCWlmKERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMSkpew0KCQkJDQoJCQkNCgkJCWlmKGlzc2V0KCRzcWxfMikgJiYgRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsXzIsIDEpKXsNCgkJCQllY2hvICdHb29kIE5ld3MhIFlvdXIgRGF0YWJhc2UgSGFzIEJlZW4gVXBkYXRlZCBUbyBCdWlsZCA3NzAgLSBQbGVhc2UgcmVmcmVzaCB0aGlzIHBhZ2UgdG8gc3RhcnQgdXNpbmcgUmFja0Zvcm1zIGFnYWluLic7DQoJCQkNCgkJCX0gZWxzZSB7DQoJCQkJDQoJCQkJaWYoIWlzc2V0KCRzcWxfMikpew0KCQkJCQllY2hvICdHb29kIE5ld3MhIFlvdXIgRGF0YWJhc2UgSGFzIEJlZW4gVXBkYXRlZCBUbyBCdWlsZCA3NzAgLSBQbGVhc2UgcmVmcmVzaCB0aGlzIHBhZ2UgdG8gc3RhcnQgdXNpbmcgUmFja0Zvcm1zIGFnYWluLic7DQoJCQkJCXJldHVybjsNCgkJCQl9IGVsc2Ugew0KDQoJCQkJCWVjaG8gJ0Vycm9yIFVwZGF0aW5nIERhdGFiYXNlIFRvIEJ1aWxkIDc3MC4gUGxlYXNlIENvbnRhY3Qgc3VwcG9ydEByYWNrZm9ybXMuY29tIGZvciBtb3JlIGhlbHAuPGJyLz4NCgkJCQkJCUJlZm9yZSB5b3UgZG8gdGhvdWdoLCBwbGVhc2Ugb3BlbiB5b3VyIGFwcC9jb25maWcucGhwIGZpbGUgYW5kIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgbGluZTo8YnIvPg0KCQkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcwXCcpOzxici8+DQoJCQkJCQl0byBiZTo8YnIvPg0KCQkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcxXCcpOzxici8+DQoJCQkJCQlhbmQgcnVuIHRoaXMgcGFnZSBhZ2Fpbi4gVGhlbiBjb3B5IGFueSBtZXNzYWdlcyB5b3UgZ2V0IGludG8gdGhlIGVtYWlsIHlvdSBzZW5kLic7DQoJCQkJCXJldHVybjsNCgkJCQkJDQoJCQkJfQ0KCQkJCQkNCgkJCX0NCg0KCQl9IGVsc2Ugew0KCQkJZWNobyAnRXJyb3IgVXBkYXRpbmcgRGF0YWJhc2UgVG8gQnVpbGQgNzcwLiBQbGVhc2UgQ29udGFjdCBzdXBwb3J0QHJhY2tmb3Jtcy5jb20gZm9yIG1vcmUgaGVscC48YnIvPg0KCQkJCQlCZWZvcmUgeW91IGRvIHRob3VnaCwgcGxlYXNlIG9wZW4geW91ciBhcHAvY29uZmlnLnBocCBmaWxlIGFuZCB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGxpbmU6PGJyLz4NCgkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcwXCcpOzxici8+DQoJCQkJCXRvIGJlOjxici8+DQoJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMVwnKTs8YnIvPg0KCQkJCQlhbmQgcnVuIHRoaXMgcGFnZSBhZ2Fpbi4gVGhlbiBjb3B5IGFueSBtZXNzYWdlcyB5b3UgZ2V0IGludG8gdGhlIGVtYWlsIHlvdSBzZW5kLic7DQoJCX0NCg0KCX0NCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzc2Nygpew0KCQkJCQ0KCQkNCgkJDQoJCQ0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAnU0hPVyBDT0xVTU5TIEZST00gZmJfc3RyaXBlX3RyYW5zYWN0aW9ucyc7DQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCWZvcmVhY2goJHJlc3VsdCBhcyAkcil7DQoJCQkJaWYoc3Vic3RyX2NvdW50KCRyWydGaWVsZCddLCAnbGluZV9pdGVtcycpKXsNCgkJCQkJDQoJCQkJCXJldHVybjsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJTRUxFQ1QgbGluZV9pdGVtcyBGUk9NIGZiX3N0cmlwZV90cmFuc2FjdGlvbnMiOw0KCQkJaWYoRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAxKSl7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQl9DQoJCQ0KDQoJCQ0KCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFIGBmYl9zdHJpcGVfdHJhbnNhY3Rpb25zYCANCgkJCQkJQUREIENPTFVNTiBgbGluZV9pdGVtc2AgVEVYVCBBRlRFUiBgc2hpcHBpbmdfZGF0YWA7IjsNCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIkFMVEVSIFRBQkxFIGZiX3N0cmlwZV90cmFuc2FjdGlvbnMgDQoJCQkJCUFERCBsaW5lX2l0ZW1zIHRleHQ7IjsNCgkJfQ0KCQkNCgkJaWYoRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAxKSl7DQoJCQkNCgkJCQ0KCQkJaWYoaXNzZXQoJHNxbF8yKSAmJiBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWxfMiwgMSkpew0KCQkJCWVjaG8gJ0dvb2QgTmV3cyEgWW91ciBEYXRhYmFzZSBIYXMgQmVlbiBVcGRhdGVkIFRvIEJ1aWxkIDc2NyAtIFBsZWFzZSByZWZyZXNoIHRoaXMgcGFnZSB0byBzdGFydCB1c2luZyBSYWNrRm9ybXMgYWdhaW4uJzsNCgkJCQ0KCQkJfSBlbHNlIHsNCgkJCQkNCgkJCQlpZighaXNzZXQoJHNxbF8yKSl7DQoJCQkJCWVjaG8gJ0dvb2QgTmV3cyEgWW91ciBEYXRhYmFzZSBIYXMgQmVlbiBVcGRhdGVkIFRvIEJ1aWxkIDc2NyAtIFBsZWFzZSByZWZyZXNoIHRoaXMgcGFnZSB0byBzdGFydCB1c2luZyBSYWNrRm9ybXMgYWdhaW4uJzsNCgkJCQkJcmV0dXJuOw0KCQkJCX0gZWxzZSB7DQoNCgkJCQkJZWNobyAnRXJyb3IgVXBkYXRpbmcgRGF0YWJhc2UgVG8gQnVpbGQgNzY3LiBQbGVhc2UgQ29udGFjdCBzdXBwb3J0QHJhY2tmb3Jtcy5jb20gZm9yIG1vcmUgaGVscC48YnIvPg0KCQkJCQkJQmVmb3JlIHlvdSBkbyB0aG91Z2gsIHBsZWFzZSBvcGVuIHlvdXIgYXBwL2NvbmZpZy5waHAgZmlsZSBhbmQgdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBsaW5lOjxici8+DQoJCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzBcJyk7PGJyLz4NCgkJCQkJCXRvIGJlOjxici8+DQoJCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzFcJyk7PGJyLz4NCgkJCQkJCWFuZCBydW4gdGhpcyBwYWdlIGFnYWluLiBUaGVuIGNvcHkgYW55IG1lc3NhZ2VzIHlvdSBnZXQgaW50byB0aGUgZW1haWwgeW91IHNlbmQuJzsNCgkJCQkJcmV0dXJuOw0KCQkJCQkNCgkJCQl9DQoJCQkJCQ0KCQkJfQ0KDQoJCX0gZWxzZSB7DQoJCQllY2hvICdFcnJvciBVcGRhdGluZyBEYXRhYmFzZSBUbyBCdWlsZCA3NjcuIFBsZWFzZSBDb250YWN0IHN1cHBvcnRAcmFja2Zvcm1zLmNvbSBmb3IgbW9yZSBoZWxwLjxici8+DQoJCQkJCUJlZm9yZSB5b3UgZG8gdGhvdWdoLCBwbGVhc2Ugb3BlbiB5b3VyIGFwcC9jb25maWcucGhwIGZpbGUgYW5kIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgbGluZTo8YnIvPg0KCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzBcJyk7PGJyLz4NCgkJCQkJdG8gYmU6PGJyLz4NCgkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcxXCcpOzxici8+DQoJCQkJCWFuZCBydW4gdGhpcyBwYWdlIGFnYWluLiBUaGVuIGNvcHkgYW55IG1lc3NhZ2VzIHlvdSBnZXQgaW50byB0aGUgZW1haWwgeW91IHNlbmQuJzsNCgkJfQ0KDQoJfQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiB1cGRhdGVfNzY2KCl7DQoJCQ0KCQkNCgkJDQoJCQ0KCQkNCgkJJG5lZWRfdGFibGUgPSB0cnVlOw0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfc3RyaXBlX3RyYW5zYWN0aW9ucyciOw0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQlpZihjb3VudCgkcmVzdWx0KSAhPSAwKXsNCgkJCQkkbmVlZF90YWJsZSA9IGZhbHNlOw0KCQkJfQ0KCQl9IGVsc2UgeyANCgkJCSRzcWwgPSAiSUYgT0JKRUNUX0lEKCdbZGJvXS5bZmJfc3RyaXBlX3RyYW5zYWN0aW9uc10nKSBJUyBOT1QgTlVMTCBTRUxFQ1QgJ3RydWUnIEFTIHN0YXR1czsgRUxTRSBTRUxFQ1QgJ2ZhbHNlJyBBUyBzdGF0dXMgIjsNCgkJCQ0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQkNCgkJCWlmKCRyZXN1bHRbMF1bJ3N0YXR1cyddID09ICd0cnVlJyl7DQoJCQkJJG5lZWRfdGFibGUgPSBmYWxzZTsNCgkJCX0NCg0KCQl9DQoJCQ0KCQlpZigkbmVlZF90YWJsZSl7DQoJCQ0KCQkJDQoJCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJCQkJDQoJCQkJJHNxbCA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBmYl9zdHJpcGVfdHJhbnNhY3Rpb25zKA0KCQkJCQkJICBpZCBJTlQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCQkJICByZl9lbnRyeV9rZXkgVkFSQ0hBUig1MCkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBjaGFyZ2VfaWQgVkFSQ0hBUig1MCkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBhbW91bnQgSU5UKDExKSBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIGBkYXRlYCBUSU1FU1RBTVAgTlVMTCBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLA0KCQkJCQkJICBgZGF0YWAgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIHNoaXBwaW5nX2RhdGEgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIGxpbmVfaXRlbXMgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCQkgIHN1YnNjcmlwdGlvbl9kYXRhIFRFWFQgREVGQVVMVCBOVUxMLA0KCQkJCQkJICB0cmFpbF9kYXRhIFRFWFQgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBQUklNQVJZIEtFWSAoaWQpDQoJCQkJCQkpDQoJCQkJCQlFTkdJTkUgPSBJTk5PREINCgkJCQkJCUFVVE9fSU5DUkVNRU5UID0gMQ0KCQkJCQkJQVZHX1JPV19MRU5HVEggPSA4MTkyDQoJCQkJCQlDSEFSQUNURVIgU0VUIHV0ZjgNCgkJCQkJCUNPTExBVEUgdXRmOF9nZW5lcmFsX2NpOyI7DQoJCQkJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQ0KCQkJfSBlbHNlIHsgDQoJCQkNCgkJCSRjYXQgPSBEQl9DQVRBTE9HOw0KCQkJDQoJCQkkc3FsID0gPDw8RU9UDQpCRUdJTg0KVVNFIFt7JGNhdH1dOw0KRU5EDQoNCkJFR0lODQoNCkNSRUFURSBUQUJMRSBbZGJvXS5bZmJfc3RyaXBlX3RyYW5zYWN0aW9uc10oDQoJW2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCVtyZl9lbnRyeV9rZXldIFt2YXJjaGFyXSg1MCkgTlVMTCwNCglbY2hhcmdlX2lkXSBbdmFyY2hhcl0oNTApIE5VTEwsDQoJW2Ftb3VudF0gW2ludF0gTlVMTCwNCglbZGF0ZV0gW2RhdGV0aW1lXSBOVUxMLA0KCVtkYXRhXSBbdGV4dF0gTlVMTCwNCglbc2hpcHBpbmdfZGF0YV0gW3RleHRdIE5VTEwsDQoJW2xpbmVfaXRlbXNdIFt0ZXh0XSBOVUxMLA0KCVtzdWJzY3JpcHRpb25fZGF0YV0gW3RleHRdIE5VTEwsDQoJW3RyaWFsX2RhdGFdIFt0ZXh0XSBOVUxMDQopIE9OIFtQUklNQVJZXSBURVhUSU1BR0VfT04gW1BSSU1BUlldDQoNCkVORA0KRU9UOw0KDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkNCgkJCX0gDQoJCQ0KCQl9DQoJfQ0KCQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiB1cGRhdGVfNzYyKCl7DQoJCQ0KCQkNCgkJDQoJCQ0KCQkNCgkJJG5lZWRfdGFibGUgPSB0cnVlOw0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfam9iX2ZvbGRlcnMnIjsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJaWYoY291bnQoJHJlc3VsdCkgIT0gMCl7DQoJCQkJJG5lZWRfdGFibGUgPSBmYWxzZTsNCgkJCX0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIklGIE9CSkVDVF9JRCgnW2Rib10uW2ZiX2pvYl9mb2xkZXJzXScpIElTIE5PVCBOVUxMIFNFTEVDVCAndHJ1ZScgQVMgc3RhdHVzOyBFTFNFIFNFTEVDVCAnZmFsc2UnIEFTIHN0YXR1cyAiOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQ0KCQkJaWYoJHJlc3VsdFswXVsnc3RhdHVzJ10gPT0gJ3RydWUnKXsNCgkJCQkkbmVlZF90YWJsZSA9IGZhbHNlOw0KCQkJfQ0KDQoJCX0NCgkJDQoJCWlmKCRuZWVkX3RhYmxlKXsNCgkJDQoJCQkNCgkJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCQkNCgkJCQkkc3FsID0gIkNSRUFURSBUQUJMRSByYWNrZm9ybXMuZmJfam9iX2ZvbGRlcnMoDQoJCQkJCQkgIGZfaWQgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQkJCSAgbmFtZSBWQVJDSEFSKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCQkJICBQUklNQVJZIEtFWSAoZl9pZCkNCgkJCQkJCSkNCgkJCQkJCUVOR0lORSA9IElOTk9EQg0KCQkJCQkJQVVUT19JTkNSRU1FTlQgPSAxDQoJCQkJCQlDSEFSQUNURVIgU0VUIHV0ZjgNCgkJCQkJCUNPTExBVEUgdXRmOF9nZW5lcmFsX2NpOyI7DQoJCQkJDQoJCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQ0KCQkJfSBlbHNlIHsgDQoJCQkNCgkJCSRjYXQgPSBEQl9DQVRBTE9HOw0KCQkJDQoJCQkkc3FsID0gPDw8RU9UDQpCRUdJTg0KVVNFIFt7JGNhdH1dOw0KRU5EDQoNCkJFR0lODQoNCkNSRUFURSBUQUJMRSBbZGJvXS5bZmJfam9iX2ZvbGRlcnNdKA0KCVtmX2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCVtuYW1lXSBbdmFyY2hhcl0oMTAwKSBOVUxMDQopIE9OIFtQUklNQVJZXQ0KDQpFTkQNCkVPVDsNCg0KCQkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJDQoJCQl9IA0KCQkNCgkJfQ0KCQkNCgkJDQoJCQ0KCQkNCgkJDQoJCQ0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAnU0hPVyBDT0xVTU5TIEZST00gZmJfam9icyc7DQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCWZvcmVhY2goJHJlc3VsdCBhcyAkcil7DQoJCQkJaWYoc3Vic3RyX2NvdW50KCRyWydGaWVsZCddLCAnZm9sZGVyX2lkJykpew0KCQkJCQkNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIlNFTEVDVCBmb2xkZXJfaWQgRlJPTSBmYl9qb2JzIjsNCgkJCWlmKERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMSkpew0KCQkJCXJldHVybjsNCgkJCX0NCgkJfQ0KCQkNCg0KCQkNCgkJaWYoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpew0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBgZmJfam9ic2AgDQoJCQkJCUFERCBDT0xVTU4gYGZvbGRlcl9pZGAgSU5UKDExKSBERUZBVUxUIDAgQUZURVIgYGpvYl94bWxgOyI7DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBmYl9qb2JzIA0KCQkJCQlBREQgZm9sZGVyX2lkIElOVCgxMSk7IjsNCgkJCQ0KCQkJJHNxbF8yID0gIkFMVEVSIFRBQkxFIFtkYm9dLltmYl9qb2JzXSBBREQgIENPTlNUUkFJTlQgW0RGX2ZiX2pvYnNfZm9sZGVyX2lkXSAgREVGQVVMVCAoKDApKSBGT1IgW2ZvbGRlcl9pZF0iOw0KCQl9DQoJCQ0KCQlpZihEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDEpKXsNCgkJCQ0KCQkJDQoJCQlpZihpc3NldCgkc3FsXzIpICYmIERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbF8yLCAxKSl7DQoJCQkJZWNobyAnR29vZCBOZXdzISBZb3VyIERhdGFiYXNlIEhhcyBCZWVuIFVwZGF0ZWQgVG8gQnVpbGQgNzYyIC0gUGxlYXNlIHJlZnJlc2ggdGhpcyBwYWdlIHRvIHN0YXJ0IHVzaW5nIFJhY2tGb3JtcyBhZ2Fpbi4nOw0KCQkJDQoJCQl9IGVsc2Ugew0KCQkJCQ0KCQkJCWlmKCFpc3NldCgkc3FsXzIpKXsNCgkJCQkJZWNobyAnR29vZCBOZXdzISBZb3VyIERhdGFiYXNlIEhhcyBCZWVuIFVwZGF0ZWQgVG8gQnVpbGQgNzYyIC0gUGxlYXNlIHJlZnJlc2ggdGhpcyBwYWdlIHRvIHN0YXJ0IHVzaW5nIFJhY2tGb3JtcyBhZ2Fpbi4nOw0KCQkJCQlyZXR1cm47DQoJCQkJfSBlbHNlIHsNCg0KCQkJCQllY2hvICdFcnJvciBVcGRhdGluZyBEYXRhYmFzZSBUbyBCdWlsZCA3NjIuIFBsZWFzZSBDb250YWN0IHN1cHBvcnRAcmFja2Zvcm1zLmNvbSBmb3IgbW9yZSBoZWxwLjxici8+DQoJCQkJCQlCZWZvcmUgeW91IGRvIHRob3VnaCwgcGxlYXNlIG9wZW4geW91ciBhcHAvY29uZmlnLnBocCBmaWxlIGFuZCB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGxpbmU6PGJyLz4NCgkJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMFwnKTs8YnIvPg0KCQkJCQkJdG8gYmU6PGJyLz4NCgkJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMVwnKTs8YnIvPg0KCQkJCQkJYW5kIHJ1biB0aGlzIHBhZ2UgYWdhaW4uIFRoZW4gY29weSBhbnkgbWVzc2FnZXMgeW91IGdldCBpbnRvIHRoZSBlbWFpbCB5b3Ugc2VuZC4nOw0KCQkJCQlyZXR1cm47DQoJCQkJCQ0KCQkJCX0NCgkJCQkJDQoJCQl9DQoNCgkJfSBlbHNlIHsNCgkJCWVjaG8gJ0Vycm9yIFVwZGF0aW5nIERhdGFiYXNlIFRvIEJ1aWxkIDc2Mi4gUGxlYXNlIENvbnRhY3Qgc3VwcG9ydEByYWNrZm9ybXMuY29tIGZvciBtb3JlIGhlbHAuPGJyLz4NCgkJCQkJQmVmb3JlIHlvdSBkbyB0aG91Z2gsIHBsZWFzZSBvcGVuIHlvdXIgYXBwL2NvbmZpZy5waHAgZmlsZSBhbmQgdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBsaW5lOjxici8+DQoJCQkJCWRlZmluZShcJ0RFQlVHXCcsIFwnMFwnKTs8YnIvPg0KCQkJCQl0byBiZTo8YnIvPg0KCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzFcJyk7PGJyLz4NCgkJCQkJYW5kIHJ1biB0aGlzIHBhZ2UgYWdhaW4uIFRoZW4gY29weSBhbnkgbWVzc2FnZXMgeW91IGdldCBpbnRvIHRoZSBlbWFpbCB5b3Ugc2VuZC4nOw0KCQl9DQoNCgl9DQoJDQoJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZV83NTQoKXsNCgkJDQoJCQ0KCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJCQkkc3FsID0gIlNIT1cgVEFCTEVTIExJS0UgJ2ZiX2RpZ2l0YWxfc2lnbmF0dXJlcyciOw0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQlpZihjb3VudCgkcmVzdWx0KSAhPSAwKXsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJJRiBPQkpFQ1RfSUQoJ1tkYm9dLltmYl9kaWdpdGFsX3NpZ25hdHVyZXNdJykgSVMgTk9UIE5VTEwgU0VMRUNUICd0cnVlJyBBUyBzdGF0dXM7IEVMU0UgU0VMRUNUICdmYWxzZScgQVMgc3RhdHVzICI7DQoJCQkNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJDQoJCQlpZigkcmVzdWx0WzBdWydzdGF0dXMnXSA9PSAndHJ1ZScpew0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQl9DQoJCQ0KCQkNCgkJaWYoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpew0KCQkJDQoJCQkkc3FsID0gIkNSRUFURSBUQUJMRSBmYl9kaWdpdGFsX3NpZ25hdHVyZXMoDQoJCQkJCSAgaWQgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCQkJICBlbnRyeV9pZCBWQVJDSEFSKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCQkgIGZpZWxkX2lkIFZBUkNIQVIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJCSAgc2lnbmF0b3IgVkFSQ0hBUigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQkJICBzaWduYXR1cmUgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCSAgc2lnbmF0dXJlX2ltYWdlIExPTkdCTE9CIERFRkFVTFQgTlVMTCwNCgkJCQkJICBzaWdfaGFzaCBWQVJDSEFSKDEyOCkgREVGQVVMVCBOVUxMLA0KCQkJCQkgIGlwIFZBUkNIQVIoNDYpIERFRkFVTFQgTlVMTCwNCgkJCQkJICBjcmVhdGVkIElOVCgxMSkgREVGQVVMVCBOVUxMLA0KCQkJCQkgIFBSSU1BUlkgS0VZIChpZCkNCgkJCQkJKQ0KCQkJCQlFTkdJTkUgPSBJTk5PREINCgkJCQkJQVVUT19JTkNSRU1FTlQgPSAxDQoJCQkJCUNIQVJBQ1RFUiBTRVQgdXRmOA0KCQkJCQlDT0xMQVRFIHV0ZjhfZ2VuZXJhbF9jaTsiOw0KCQkJDQoJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJDQoJCX0gZWxzZSB7IA0KCQkJDQoJCQkkY2F0ID0gREJfQ0FUQUxPRzsNCgkJCQ0KCQkJJHNxbCA9IDw8PEVPVA0KQkVHSU4NClVTRSBbeyRjYXR9XTsNCkVORA0KDQpCRUdJTg0KDQpDUkVBVEUgVEFCTEUgW2Rib10uW2ZiX2RpZ2l0YWxfc2lnbmF0dXJlc10oDQoJW2lkXSBbaW50XSBJREVOVElUWSgxLDEpIE5PVCBOVUxMLA0KCVtlbnRyeV9pZF0gW3ZhcmNoYXJdKDI1NSkgTlVMTCwNCglbZmllbGRfaWRdIFt2YXJjaGFyXSgyNTUpIE5VTEwsDQoJW3NpZ25hdG9yXSBbdmFyY2hhcl0oMjU1KSBOVUxMLA0KCVtzaWduYXR1cmVdIFt0ZXh0XSBOVUxMLA0KCVtzaWduYXR1cmVfaW1hZ2VdIFtpbWFnZV0gTlVMTCwNCglbc2lnX2hhc2hdIFt2YXJjaGFyXSgxMjgpIE5VTEwsDQoJW2lwXSBbdmFyY2hhcl0oNDgpIE5VTEwsDQoJW2NyZWF0ZWRdIFtpbnRdIE5VTEwNCikgT04gW1BSSU1BUlldIFRFWFRJTUFHRV9PTiBbUFJJTUFSWV0NCg0KRU5EDQpFT1Q7DQoNCgkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoNCgkJfSANCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWWVsbG93OyBoZWlnaHQ6IDMwcHg7IHBhZGRpbmctdG9wOjEwcHgiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1lvdXIgRGF0YWJhc2UgSGFzIEJlZW4gVXBkYXRlZCBUbyBCdWlsZCA3NTQgLSBQbGVhc2UgUmVmcmVzaCBUaGUgUGFnZSBUbyBGaW5pc2ggVGhpcyBQcm9jZXNzLjwvZGl2Pic7DQoNCgkJDQoJfQ0KCQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiB1cGRhdGVfNzA3KCl7DQoJCQ0KCQkNCgkJJHNxbCA9ICJTRUxFQ1Qgb3B0aW9uX25hbWUgRlJPTSBmYl9vcHRpb25zIFdIRVJFIG9wdGlvbl9uYW1lID0gJ2xvYWRfYV9zYXZlZF9qb2Jfc29ydCciOw0KCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJaWYoY291bnQoJHJlc3VsdCkgIT0gMCl7DQoJCQlyZXR1cm47DQoJCX0JDQoJCQ0KCQkNCgkNCgkJJHNxbCA9ICJJTlNFUlQgSU5UTyBmYl9vcHRpb25zIChvcHRpb25fbmFtZSwgb3B0aW9uX3ZhbHVlLCBvcHRpb25fdmVyc2lvbikgVkFMVUVTICgnbG9hZF9hX3NhdmVkX2pvYl9zb3J0JywgJ2lkLERFU0MnLCAnNzA3Jyk7IjsNCgkJDQoJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoNCgkJDQoJCQ0KCQkNCgkJZWNobyAnUmFja0Zvcm1zIEZpcnN0IFJ1biBNZXNzYWdlOiAtIFlvdXIgUmFja0Zvcm1zIERhdGFiYXNlIEhhcyBCZWVuIFVwZGF0ZWQgV2l0aCBOZXcgU2V0dGluZ3MgLSBQbGVhc2UgUmVmcmVzaCBUaGlzIFBhZ2UgVG8gU3RhcnQgVXNpbmcgUmFja0Zvcm1zIEFnYWluLic7DQoJCQ0KCX0NCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzcwNSgpew0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfb3B0aW9ucyciOw0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQlpZihjb3VudCgkcmVzdWx0KSAhPSAwKXsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJJRiBPQkpFQ1RfSUQoJ1tkYm9dLltmYl9vcHRpb25zXScpIElTIE5PVCBOVUxMIFNFTEVDVCAndHJ1ZScgQVMgc3RhdHVzOyBFTFNFIFNFTEVDVCAnZmFsc2UnIEFTIHN0YXR1cyAiOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQ0KCQkJaWYoJHJlc3VsdFswXVsnc3RhdHVzJ10gPT0gJ3RydWUnKXsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJfQ0KCQkNCgkJDQoJCQ0KCQkNCgkJaWYoISR0aGlzLT5jaGVja0NvbmZpZ1dyaXRlKCkpew0KCQkJZGllKCdJbiBvcmRlciB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIFJhY2tGb3JtcyB5b3UgbXVzdCBtYWtlIHlvdXIgL1JhY2tGb3Jtcy9hcHAvY29uZmlnLnBocCBmaWxlIHdyaXRlYWJsZS48YnIvPg0KCQkJCU9uY2UgeW91IGRvIHRoaXMgYW4gYXV0b21hdGljIHVwZGF0ZSB3aWxsIGJlIHBlcmZvcm1lZCBhbmQgeW91IGNhbiB0aGVuIHVzZSBSYWNrRm9ybXMgYWdhaW4uJyk7DQoJCX0NCgkJDQoJCQ0KCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJCQkNCgkJCSRzcWwgPSAiQ1JFQVRFIFRBQkxFIGZiX29wdGlvbnMoDQoJCQkJCSAgb3B0aW9uX25hbWUgVkFSQ0hBUigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQkJICBvcHRpb25fdmFsdWUgVEVYVCBERUZBVUxUIE5VTEwsDQoJCQkJCSAgb3B0aW9uX3ZlcnNpb24gSU5UKDExKSBERUZBVUxUIE5VTEwNCgkJCQkJKQ0KCQkJCQlFTkdJTkUgPSBJTk5PREINCgkJCQkJQ0hBUkFDVEVSIFNFVCB1dGY4DQoJCQkJCUNPTExBVEUgdXRmOF9nZW5lcmFsX2NpOyI7DQoJCQkNCgkJCURhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQkNCgkJfSBlbHNlIHsgDQoJCQkNCgkJCSRjYXQgPSBEQl9DQVRBTE9HOw0KCQkJDQoJCQkkc3FsID0gPDw8RU9UDQpCRUdJTg0KVVNFIFt7JGNhdH1dOw0KRU5EDQoNCkJFR0lODQoNCkNSRUFURSBUQUJMRSBbZGJvXS5bZmJfb3B0aW9uc10oDQoJW29wdGlvbl9uYW1lXSBbdmFyY2hhcl0oMjU1KSBOVUxMLA0KCVtvcHRpb25fdmFsdWVdIFt0ZXh0XSBOVUxMLA0KCVtvcHRpb25fdmVyc2lvbl0gW2ludF0gTlVMTA0KKSBPTiBbUFJJTUFSWV0gVEVYVElNQUdFX09OIFtQUklNQVJZXQ0KDQpFTkQNCkVPVDsNCg0KCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCg0KCQl9IA0KCQkNCg0KDQoJCQkNCgkJCSRjb25maWdfZmlsZV9yYXcgPSBmaWxlX2dldF9jb250ZW50cygnY29uZmlnLnBocCcpOwkJCQ0KDQoJCQkNCgkJCSRuZXdmaWxlID0gJGNvbmZpZ19maWxlX3JhdzsNCgkJCQ0KCQkJDQoJCQkkZGF0ZXRpbWUgPSBkYXRlKCdZLW0tZCAgSDppOnMnLCB0aW1lKCkpOw0KCQkJJHJlcGxhY2UgPSAiLy8gVVBEQVRFIC0gNzA1IDo6IHskZGF0ZXRpbWV9XG4/PiI7DQoJCQkkbmV3ZmlsZSA9IHN0cl9yZXBsYWNlKCc/PicsICRyZXBsYWNlLCAkbmV3ZmlsZSk7DQoJCQkNCgkJCQ0KCQkJZmlsZV9wdXRfY29udGVudHMoJ2NvbmZpZy5waHAnLCAkbmV3ZmlsZSk7DQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCWVjaG8gJyAtIFlvdXIgRGF0YWJhc2UgYW5kIENvbmZpZyBGaWxlIEhhcyBCZWVuIFVwZGF0ZWQgVG8gQnVpbGQgNzA1IC0gUGxlYXNlIFJlZnJlc2ggVGhpcyBQYWdlIFRvIFN0YXJ0IFVzaW5nIFJhY2tGb3JtcyBBZ2Fpbi4nOw0KDQoJCQ0KCX0NCgkNCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gdXBkYXRlXzcwMCgpew0KCQkNCgkJDQoJCWlmKERCX1RZUEUgPT0gJ215c3FsJyB8fCBEQl9UWVBFID09ICdteXNxbGknKXsNCgkJCSRzcWwgPSAiU0hPVyBUQUJMRVMgTElLRSAnZmJfZm9ybWJsb2NrcyciOw0KCQkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCwgMCk7DQoJCQlpZihjb3VudCgkcmVzdWx0KSAhPSAwKXsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0gZWxzZSB7IA0KCQkJJHNxbCA9ICJJRiBPQkpFQ1RfSUQoJ1tkYm9dLltmYl9mb3JtYmxvY2tzXScpIElTIE5PVCBOVUxMIFNFTEVDVCAndHJ1ZScgQVMgc3RhdHVzOyBFTFNFIFNFTEVDVCAnZmFsc2UnIEFTIHN0YXR1cyAiOw0KCQkJDQoJCQkkcmVzdWx0ID0gRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCgkJCQ0KCQkJaWYoJHJlc3VsdFswXVsnc3RhdHVzJ10gPT0gJ3RydWUnKXsNCgkJCQlyZXR1cm47DQoJCQl9DQoNCgkJfQ0KCQkNCgkJDQoJCQ0KCQkNCgkJaWYoISR0aGlzLT5jaGVja0NvbmZpZ1dyaXRlKCkpew0KCQkJZGllKCdJbiBvcmRlciB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIFJhY2tGb3JtcyB5b3UgbXVzdCBtYWtlIHlvdXIgL1JhY2tGb3Jtcy9hcHAvY29uZmlnLnBocCBmaWxlIHdyaXRlYWJsZS48YnIvPg0KCQkJCU9uY2UgeW91IGRvIHRoaXMgYW4gYXV0b21hdGljIHVwZGF0ZSB3aWxsIGJlIHBlcmZvcm1lZCBhbmQgeW91IGNhbiB0aGVuIHVzZSBSYWNrRm9ybXMgYWdhaW4uJyk7DQoJCX0NCgkJDQoJCQ0KCQlpZihEQl9UWVBFID09ICdteXNxbCcgfHwgREJfVFlQRSA9PSAnbXlzcWxpJyl7DQoJCQkNCgkJCSRzcWwgPSAiQ1JFQVRFIFRBQkxFIGZiX2Zvcm1ibG9ja3MoDQoJCQkJCQlpZCBJTlQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULA0KCQkJCQkJdXNlcl9pZCBJTlQoMTEpIERFRkFVTFQgTlVMTCwNCgkJCQkJCW5hbWUgVkFSQ0hBUigyNTUpIERFRkFVTFQgTlVMTCwNCgkJCQkJCWNhdGVnb3J5IFZBUkNIQVIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJCQlkZXNjcmlwdGlvbiBWQVJDSEFSKDI1NSkgREVGQVVMVCBOVUxMLA0KCQkJCQkJbGF5b3V0IFZBUkNIQVIoMjU1KSBERUZBVUxUIE5VTEwsDQoJCQkJCQlwYWdldHlwZSBJTlQoMTEpIERFRkFVTFQgTlVMTCwNCgkJCQkJCWNvbnRlbnQgTE9OR1RFWFQgREVGQVVMVCBOVUxMLA0KCQkJCQkJUFJJTUFSWSBLRVkgKGlkKQ0KCQkJCQkpDQoJCQkJCUVOR0lORSA9IElOTk9EQg0KCQkJCQlBVVRPX0lOQ1JFTUVOVCA9IDENCgkJCQkJQVZHX1JPV19MRU5HVEggPSA2NTUzDQoJCQkJCUNIQVJBQ1RFUiBTRVQgdXRmOA0KCQkJCQlDT0xMQVRFIHV0ZjhfZ2VuZXJhbF9jaTsiOw0KCQkJDQoJCQlEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJDQoJCX0gZWxzZSB7IA0KCQkJDQoJCQkkY2F0ID0gREJfQ0FUQUxPRzsNCgkJCQ0KCQkJJHNxbCA9IDw8PEVPVA0KQkVHSU4NClVTRSBbeyRjYXR9XTsNCkVORA0KDQpCRUdJTg0KDQpDUkVBVEUgVEFCTEUgW2Rib10uW2ZiX2Zvcm1ibG9ja3NdKA0KCVtpZF0gW2ludF0gSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwNCglbdXNlcl9pZF0gW2ludF0gTlVMTCwNCglbbmFtZV0gW3ZhcmNoYXJdKDI1NSkgTlVMTCwNCglbY2F0ZWdvcnldIFt2YXJjaGFyXSgyNTUpIE5VTEwsDQoJW2Rlc2NyaXB0aW9uXSBbdmFyY2hhcl0oMjU1KSBOVUxMLA0KCVtsYXlvdXRdIFt2YXJjaGFyXSgyNTUpIE5VTEwsDQoJW3BhZ2V0eXBlXSBbaW50XSBOVUxMLA0KCVtjb250ZW50XSBbdGV4dF0gTlVMTA0KKSBPTiBbUFJJTUFSWV0gVEVYVElNQUdFX09OIFtQUklNQVJZXQ0KDQpFTkQNCkVPVDsNCg0KCQkJRGF0YWJhc2U6OnBkb19xdWVyeSgkc3FsLCAwKTsNCg0KCQl9IA0KCQkNCgkJDQoJCQkNCg0KCQkJDQoJCQkkY29uZmlnX2ZpbGVfcmF3ID0gZmlsZV9nZXRfY29udGVudHMoJ2NvbmZpZy5waHAnKTsJCQkNCgkJCQ0KCQkJJG5ld19jb25maWdfZGF0YSA9IDw8PEVPRg0KZGVmaW5lKCdFTkNPREVfUFcnLCAxKTsNCg0KLy8gQnVpbGQgNzAwIC0gQWRkIHRoZSB2YWx1ZXMgYmVsb3cgdG8gYmxvY2sgdGhhdCBtb2R1bGUgZnJvbSBsb2FkaW5nIGludG8gdGhlIGVkaXRvci4NClwkZXhjbHVkZWRfZm9ybV9tb2R1bGVzID0gYXJyYXkoJycpOyAvLyBVc2U6IGVjb21tIHRvIGJsb2NrIHRoZSBlY29tbSBtb2R1bGUgZnJvbSBsb2FkaW5nIGluIHRoZSBlZGl0b3IuDQpcJGV4Y2x1ZGVkX2NvbmZpcm1hdGlvbl9tb2R1bGVzID0gYXJyYXkoJycpOyAvLyBVc2U6IGNvbmZpcm0tZWNvbW0gdG8gYmxvY2sgdGhlIGVjb21tIGNvbmZpcm1hdGlvbiBtb2R1bGUuDQpFT0Y7DQoNCgkJCQ0KCQkJJG5ld2ZpbGUgPSAkY29uZmlnX2ZpbGVfcmF3Ow0KCQkJDQoJCQkNCgkJCSRuZXdmaWxlID0gc3RyX3JlcGxhY2UoImRlZmluZSgnRU5DT0RFX1BXJywgMSk7IiwgJG5ld19jb25maWdfZGF0YSwgJG5ld2ZpbGUpOw0KCQkJDQoJCQkNCgkJCSRkYXRldGltZSA9IGRhdGUoJ1ktbS1kICBIOmk6cycsIHRpbWUoKSk7DQoJCQkkcmVwbGFjZSA9ICIvLyBVUERBVEUgLSA3MDAgOjogeyRkYXRldGltZX1cbj8+IjsNCgkJCSRuZXdmaWxlID0gc3RyX3JlcGxhY2UoJz8+JywgJHJlcGxhY2UsICRuZXdmaWxlKTsNCgkJCQ0KCQkJDQoJCQlmaWxlX3B1dF9jb250ZW50cygnY29uZmlnLnBocCcsICRuZXdmaWxlKTsNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJZWNobyAnIC0gWW91ciBEYXRhYmFzZSBhbmQgQ29uZmlnIEZpbGUgSGFzIEJlZW4gVXBkYXRlZCBUbyBCdWlsZCA3MDAgLSBQbGVhc2UgUmVmcmVzaCBUaGlzIFBhZ2UgVG8gU3RhcnQgVXNpbmcgUmFja0Zvcm1zIEFnYWluLic7DQoNCgkJDQoJfQ0KCQ0KCQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiB1cGRhdGVfNjM4KCl7DQoJCQ0KCQkNCgkJaWYoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpew0KCQkJJHNxbCA9ICdTSE9XIENPTFVNTlMgRlJPTSBmYl9qb2JzJzsNCgkJCSRyZXN1bHQgPSBEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDApOw0KCQkJZm9yZWFjaCgkcmVzdWx0IGFzICRyKXsNCgkJCQlpZihzdWJzdHJfY291bnQoJHJbJ0ZpZWxkJ10sICdjcmVhdGVkX3RzJykpew0KCQkJCQkNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCX0NCgkJfSBlbHNlIHsgDQoJCQkkc3FsID0gIlNFTEVDVCBjcmVhdGVkX3RzIEZST00gZmJfam9icyI7DQoJCQlpZihEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDEpKXsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0NCgkJDQoJCQ0KCQlpZighJHRoaXMtPmNoZWNrQ29uZmlnV3JpdGUoKSl7DQoJCQlkaWUoJ0luIG9yZGVyIHRvIHVzZSB0aGlzIHZlcnNpb24gb2YgUmFja0Zvcm1zIHlvdSBtdXN0IG1ha2UgeW91ciAvUmFja0Zvcm1zL2FwcC9jb25maWcucGhwIGZpbGUgd3JpdGVhYmxlLjxici8+DQoJCQkJT25jZSB5b3UgZG8gdGhpcyBhbiBhdXRvbWF0aWMgdXBkYXRlIHdpbGwgYmUgcGVyZm9ybWVkIGFuZCB5b3UgY2FuIHRoZW4gdXNlIFJhY2tGb3JtcyBhZ2Fpbi4nKTsNCgkJfQ0KDQoJCQ0KCQkkY29uZmlnX2ZpbGVfcmF3ID0gZmlsZV9nZXRfY29udGVudHMoJ2NvbmZpZy5waHAnKTsNCg0KCQkNCgkJaWYoREJfVFlQRSA9PSAnbXlzcWwnIHx8IERCX1RZUEUgPT0gJ215c3FsaScpew0KCQkJJHNxbCA9ICJBTFRFUiBUQUJMRSBgZmJfam9ic2AgDQoJCQkJCUFERCBDT0xVTU4gYGNyZWF0ZWRfdHNgIERBVEVUSU1FIEFGVEVSIGBjcmVhdGVkYCwNCgkJCQkJQUREIENPTFVNTiBgbGFzdF9lZGl0X3RzYCBEQVRFVElNRSBBRlRFUiBgbGFzdF9lZGl0YDsiOw0KCQl9IGVsc2UgeyANCgkJCSRzcWwgPSAiQUxURVIgVEFCTEUgZmJfam9icyANCgkJCQkJQUREIGNyZWF0ZWRfdHMgREFURVRJTUUsIGxhc3RfZWRpdF90cyBEQVRFVElNRTsiOw0KCQl9DQoJCQ0KCQlpZihEYXRhYmFzZTo6cGRvX3F1ZXJ5KCRzcWwsIDEpKXsNCgkJCQ0KCQkJJG5ld2ZpbGUgPSAkY29uZmlnX2ZpbGVfcmF3Ow0KCQkJJGRhdGV0aW1lID0gZGF0ZSgnWS1tLWQgIEg6aTpzJywgdGltZSgpKTsNCgkJCSRyZXBsYWNlID0gIi8vIFVQREFURSAtIDYzOCA6OiB7JGRhdGV0aW1lfVxuPz4iOw0KCQkJJG5ld2ZpbGUgPSBzdHJfcmVwbGFjZSgnPz4nLCAkcmVwbGFjZSwgJG5ld2ZpbGUpOw0KCQkJZmlsZV9wdXRfY29udGVudHMoJ2NvbmZpZy5waHAnLCAkbmV3ZmlsZSk7DQoJCQllY2hvICdHb29kIE5ld3MhIFlvdXIgRGF0YWJhc2UgSGFzIEJlZW4gVXBkYXRlZCBUbyBCdWlsZCA2MzggLSBQbGVhc2UgcmVmcmVzaCB0aGlzIHBhZ2UgdG8gc3RhcnQgdXNpbmcgUmFja0Zvcm1zIGFnYWluLic7DQoJCX0gZWxzZSB7DQoJCQllY2hvICdFcnJvciBVcGRhdGluZyBEYXRhYmFzZSBUbyBCdWlsZCA2MzguIFBsZWFzZSBDb250YWN0IHN1cHBvcnRAcmFja2Zvcm1zLmNvbSBmb3IgbW9yZSBoZWxwLjxici8+DQoJCQkJCUJlZm9yZSB5b3UgZG8gdGhvdWdoLCBwbGVhc2Ugb3BlbiB5b3VyIGFwcC9jb25maWcucGhwIGZpbGUgYW5kIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgbGluZTo8YnIvPg0KCQkJCQlkZWZpbmUoXCdERUJVR1wnLCBcJzBcJyk7PGJyLz4NCgkJCQkJdG8gYmU6PGJyLz4NCgkJCQkJZGVmaW5lKFwnREVCVUdcJywgXCcxXCcpOzxici8+DQoJCQkJCWFuZCBydW4gdGhpcyBwYWdlIGFnYWluLiBUaGVuIGNvcHkgYW55IG1lc3NhZ2VzIHlvdSBnZXQgaW50byB0aGUgZW1haWwgeW91IHNlbmQuJzsNCgkJfQ0KDQoJfQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBjaGVja0NvbmZpZ1dyaXRlKCl7DQoJCXJldHVybiBpc193cml0YWJsZSgnY29uZmlnLnBocCcpOw0KCX0NCgkNCn0gDQo/Pg==')); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 c3fcb71d5dbb8be70cfaf17c49936cc5
Eval Count 1
Decode Time 225 ms