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 $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQoNCi8qKg0KKiBuTkggcSBYcXJnIFpOVUJxIG5xZGRO..

Decoded Output download

?><?php


/**
* Get a Easy Media Gallery Global Functions
*
* @param string $name The option name
* @return object|bool Option value on success, false if no value exists
*/
 
if ( ! defined('ABSPATH') ) {
	die('Please do not load this file directly.');
}  
 
/*
|--------------------------------------------------------------------------
| Easymedia Get Control Panel Options
|--------------------------------------------------------------------------
*/
function easy_get_option( $name ){
    $easymedia_values = get_option( 'easy_media_opt' );
    if ( is_array( $easymedia_values ) && array_key_exists( $name, $easymedia_values ) ) return $easymedia_values[$name];
    return false;
} 

/*-------------------------------------------------------------------------------*/
/*   ADMIN Register JS & CSS
/*-------------------------------------------------------------------------------*/
function easymedia_reg_script() {
	// CSS ( emg-settings.php, tinymce-dlg.php, metaboxes.php )
	wp_register_style( 'easymedia-cpstyles', plugins_url( 'css/funcstyle.css', dirname('index.php') ), false, EASYMEDIA_VERSION, 'all');
	wp_register_style( 'easymedia-colorpickercss', plugins_url( 'css/colorpicker.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
	wp_register_style( 'easymedia-sldr', plugins_url( 'css/slider.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
	wp_register_style( 'easymedia-ibutton', plugins_url( 'css/ibutton.css', dirname('index.php') ), false, EASYMEDIA_VERSION );	
	wp_register_style( 'easymedia-tinymce', plugins_url( 'css/tinymce.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
	wp_register_style( 'jquery-ui-themes-redmond', plugins_url( 'css/jquery/jquery-ui/themes/smoothness/jquery-ui-1.10.0.custom.min.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
	wp_register_style( 'easymedia-tinymce', plugins_url( 'css/tinymce.css', dirname('index.php') ), false, EASYMEDIA_VERSION );	
	wp_register_style( 'jquery-multiselect-css', plugins_url( 'css/jquery/multiselect/jquery.multiselect.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
	wp_register_style( 'jquery-messi-css', plugins_url( 'css/messi.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
	wp_register_style( 'jquery-lightbox-css', plugins_url( 'css/lightbox_me.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
	wp_register_style( 'jquery-gdakramttip-css', plugins_url( 'css/jquery/jquery.tooltip/jquery.tooltip.css', dirname('index.php') ), false, EASYMEDIA_VERSION );
			
	// JS ( emg-settings.php ) 
	wp_register_script( 'easymedia-jquery-easing', plugins_url( 'js/jquery/jquery.easing.1.3.js', dirname('index.php') ) );	
	wp_register_script( 'easymedia-colorpicker', plugins_url( 'js/colorpicker/colorpicker.js', dirname('index.php') ) );	
	wp_register_script( 'colorpicker-eye', plugins_url( 'js/colorpicker/eye.js', dirname('index.php') ) );
	wp_register_script( 'colorpicker-utils', plugins_url( 'js/colorpicker/utils.js', dirname('index.php') ) );
	
	// JS ( tinymce-dlg.php ) 
	//wp_register_script( 'jquery-ui-custom', plugins_url( 'js/jquery/jquery-ui-1.10.0.min.js' , dirname('index.php') ) );
	//wp_register_script( 'jquery-ui-custom-1', plugins_url( 'js/jquery/jquery-ui-1.9.2.custom.min.js' , dirname('index.php') ) );
	wp_register_script( 'jquery-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js', dirname('index.php') ) );
	//wp_register_style('layoutjs', plugins_url('js/colorpicker/layout.js' , dirname('index.php') ));
	
	// JS ( metaboxes.php, ) 
	wp_register_script( 'jquery-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js', dirname('index.php') ) );
	wp_register_script( 'easymedia-ckeditor', plugins_url( 'addons/ckeditor/ckeditor.js', dirname('index.php') ) );
	wp_register_script( 'jquery-messi-js', plugins_url( 'js/jquery/jquery.messi.min.js', dirname('index.php') ) );
	wp_register_script( 'jquery-lightbox-js', plugins_url( 'js/jquery/jquery.lightbox_me.js', dirname('index.php') ) );
	wp_register_script( 'jquery-gdakram-tooltip', plugins_url( 'js/jquery/jquery.tooltip.js', dirname('index.php') ) );
	wp_register_style( 'jquery-spagination-css', plugins_url( 'css/jquery/simplepagination/simplePagination.css', dirname('index.php') ) );
	wp_register_script( 'jquery-spagination-js', plugins_url( 'js/jquery/simplepagination/jquery.simplePagination.js', dirname('index.php') ) );	
	wp_register_script( 'jquery-notify-js', plugins_url( 'js/jquery/notify.min.js', dirname('index.php') ) );
	wp_register_script( 'jquery-validate-js', plugins_url( 'js/jquery/jquery.validate.min.js', dirname('index.php') ) );

}
add_action( 'admin_init', 'easymedia_reg_script' );


function easymedia_frontend_js() {

	//wp_deregister_script('fittext'); // deregister		
	//wp_register_script( 'fittext', plugins_url( 'js/jquery/jquery.fittext.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );		
	wp_register_script( 'mootools-core', plugins_url( 'js/mootools/mootools-' .easy_get_option( 'easymedia_plugin_core' ). '.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );	
	wp_register_script( 'easymedia-core', plugins_url( 'js/mootools/easymedia.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-mediaelementjs', EMGDEF_PLUGIN_URL .'includes/addons/mediaelement/mediaelement-and-player.min.js', array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-isotope', plugins_url( 'js/jquery/jquery.isotope.min.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );		
	wp_register_script( 'easymedia-ajaxfrontend', plugins_url( 'js/func/ajax-frontend.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, false );	
	wp_register_script( 'easymedia-frontend', plugins_url( 'js/func/frontend.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, false );
	wp_register_script( 'easymedia-jpages', plugins_url( 'js/jquery/jPages.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );		
	//wp_register_script( 'easymedia-lazyload', plugins_url( 'js/jquery/jquery.lazyload.min.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-lazy', plugins_url( 'js/jquery/jquery.lazy.min.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	
	//3rd party's Lightbox
	
	wp_register_script( 'easymedia-colorbox', plugins_url( 'js/jquery/frontendlightbox/colorbox/jquery.colorbox-min.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );	
	wp_register_script( 'easymedia-lightbox', plugins_url( 'js/jquery/frontendlightbox/lightbox/lightbox.min.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-fancybox', plugins_url( 'js/jquery/frontendlightbox/fancybox/jquery.fancybox.pack.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-mousewheel', plugins_url( 'js/jquery/jquery.mousewheel-3.0.6.pack.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-fancybox-buttons', EMGDEF_PLUGIN_URL .'css/styles/fancybox/helpers/jquery.fancybox-buttons.js', array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-fancybox-media', EMGDEF_PLUGIN_URL .'css/styles/fancybox/helpers/jquery.fancybox-media.js', array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-fancybox-thumbs', EMGDEF_PLUGIN_URL .'css/styles/fancybox/helpers/jquery.fancybox-thumbs.js', array(), EASYMEDIA_VERSION, true );	
	wp_register_script( 'easymedia-prettyphoto', plugins_url( 'js/jquery/frontendlightbox/prettyphoto/jquery.prettyPhoto.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-fancyboxfree-easing', plugins_url( 'js/jquery/frontendlightbox/fancyboxfree/jquery.easing-1.3.pack.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );	
	wp_register_script( 'easymedia-fancyboxfree-mousewheel', plugins_url( 'js/jquery/frontendlightbox/fancyboxfree/jquery.mousewheel-3.0.4.pack.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );	
	wp_register_script( 'easymedia-fancyboxfree-fancybox', plugins_url( 'js/jquery/frontendlightbox/fancyboxfree/jquery.fancybox-1.3.4.pack.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-photoswipe', plugins_url( 'js/jquery/frontendlightbox/photoswipe/code.photoswipe.jquery-3.0.5.min.js', dirname('index.php') ) );	
	wp_register_script( 'easymedia-klass', plugins_url( 'js/jquery/frontendlightbox/photoswipe/lib/klass.min.js', dirname('index.php') ) );
	wp_register_script( 'easymedia-jssor-core', plugins_url( 'js/jquery/jssor/jssor.core.js', dirname('index.php') ) );
	wp_register_script( 'easymedia-jssor-utils', plugins_url( 'js/jquery/jssor/jssor.utils.js', dirname('index.php') ) );
	wp_register_script( 'easymedia-jssor-slider', plugins_url( 'js/jquery/jssor/jssor.slider.min.js', dirname('index.php') ) );
	wp_register_script( 'easymedia-photobox', plugins_url( 'js/jquery/frontendlightbox/photobox/jquery.photobox.js', dirname('index.php') ), array(), EASYMEDIA_VERSION, true );
	wp_register_script( 'easymedia-bxslider', plugins_url( 'js/jquery/bxslider/jquery.bxslider.min.js', dirname('index.php') ) );
	wp_register_script( 'easymedia-bxslider-easing', plugins_url( 'js/jquery/jquery.easing.1.3.js', dirname('index.php') ) );	
	wp_register_script( 'easymedia-fotorama', plugins_url( 'js/jquery/fotorama/fotorama.js', dirname('index.php') ) );		
	wp_register_script( 'easymedia-imageloader', plugins_url( 'js/imageloader/imagesloaded.pkgd.js', dirname('index.php') ) );
		
}
add_action( 'wp_enqueue_scripts', 'easymedia_frontend_js' );

/*
|--------------------------------------------------------------------------
| Defines
|--------------------------------------------------------------------------
*/
define( 'EMG_IS_AJAX', easy_get_option( 'easymedia_disen_ajax' ) );
$emgmemory = (int) @ini_get('memory_limit');
$emgmemory = empty($emgmemory) ? __('N/A') : $emgmemory . __(' MB');

/* These files build out the plugin specific options and associated functions. */
require_once (EMGDEF_PLUGIN_DIR . 'includes/options.php'); 

/*-------------------------------------------------------------------------------*/
/*   Plugin Update Check
/*-------------------------------------------------------------------------------*/

/* @since 1.5.0.3
if ( easy_get_option( 'easymedia_disen_upchk' ) == '1' ) {
include_once(EMGDEF_PLUGIN_DIR . 'includes/up-notifier.php');
}
*/

/*-------------------------------------------------------------------------------*/
/*   Load Control Panel
/*-------------------------------------------------------------------------------*/
include_once( EMGDEF_PLUGIN_DIR . 'includes/emg-settings.php' );

/*-------------------------------------------------------------------------------*/
/*   Load Front End Script
/*-------------------------------------------------------------------------------*/
if ( easy_get_option( 'easymedia_disen_plug' ) == '1' ) {	
include_once( EMGDEF_PLUGIN_DIR . 'includes/frontend.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/dynamic-style.php' );
}
/*-------------------------------------------------------------------------------*/
/*  Add Widget, Metabox & Shortcode
/*-------------------------------------------------------------------------------*/
include_once( EMGDEF_PLUGIN_DIR . 'includes/metaboxes.php' ); 
include_once( EMGDEF_PLUGIN_DIR . 'includes/shortcode.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/templates/emg-slider-one.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/templates/emg-slider-two.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/templates/emg-carousel.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/templates/emg-fotorama.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/templates/ajax-album.php' );  
include_once( EMGDEF_PLUGIN_DIR . 'includes/templates/emg-album.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/templates/emg-album-back.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/tinymce-dlg.php' ); 
include_once( EMGDEF_PLUGIN_DIR . 'includes/taxonomy.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/easywidget.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/easy-docs.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/emg-featured.php' );
include_once( EMGDEF_PLUGIN_DIR . 'includes/emg-freeplugins.php' );

/*-------------------------------------------------------------------------------*/
/*   Hover Style Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/

function emg_hover_gen( $ishover, $styletype, $title, $subtitle ) {
	
	if ( $ishover == '1' ) {
		
	// This is a Default Style	
		
		switch ($styletype) {
			
			case 'hoverone':
			$tmbstyle = '<article class="da-animate da-slideFromRight"><p class="emgfittext">'.$title.'</p><div class="forspan"><span class="zoom"></span></div></article>';
			break;
			
			
			case 'emgview-two':
			$tmbstyle = '<div class="emgmask"><h2 class="emgtitle emgfittext">'.$title.'</h2><p class="emgsubtitle">'.$subtitle.'</p></div>';
			
			break;
			
			
			case 'emgview-three':
			$tmbstyle = '<div class="emgmask"><h2 class="emgtitle emgfittext">'.$title.'</h2><p class="emgsubtitle">'.$subtitle.'</p></div>';
			
			break;
			
			
			case 'emgview-four':
			$tmbstyle = '<h2 class="emgttl emgfittext">'.$title.'</h2>';
			
			break;				
			
	
		default:
		break;	
		}
		
	} else {
		$tmbstyle = '<p class="da-animatenh emgfittext" style="display:none;">'.$title.'</p><div class="forspana"><span class="zooma"></span></div>';
	}		

return $tmbstyle;

}


/*-------------------------------------------------------------------------------*/
/*   Album Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/

function emg_lightbox_image_album_generator( $lgtype, $lgw, $lgh, $lgcls, $lgmeidfilter, $lgisrc, $lgalt, $lgcstyle, $lgrel, $lgttl = null, $rndm, $hovornor, $medtype, $isbadge, $imgcount, $sorn, $thumbstyle, $alid, $islazy, $lazplc ) {
	
		$isgallinfo = get_post_meta( $alid, 'easmedia_metabox_media_gallery_opt2', true );
		
		if ( $isgallinfo == 'on' ) {
			$imginfo = get_post( $alid );
			$ittl = stripslashes ( esc_html( esc_js( $imginfo->post_title ) ) );
			$isbbttl = stripslashes ( esc_html( esc_js( $imginfo->post_excerpt ) ) );
		}
		else {
			$ittl = stripslashes( get_post_meta( $alid, 'easmedia_metabox_title', true ) );
			$isbbttl = stripslashes( get_post_meta( $alid, 'easmedia_metabox_sub_title', true ) );
		}
		
		if ($isbadge == '1' && $medtype == 'Multiple Images (Slider)' ){
			$addbadge = '<span class="emg-badges"><span class="icount">'.$imgcount.'</span><span class="imgtg">'.$sorn.'</span></span>';
		} else {
			$addbadge = '';
		}	

		echo '<div data-emg-child="'.$imgcount.'" data-emg-album="'.$alid.'" style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeidfilter.' justalbum">'.$addbadge.'<div class="iehand"><a onclick="return false;" class="'.$alid.' nofoobox" href="#"><img class="emglazy" '.$lazplc.' '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';
			
}

/*-------------------------------------------------------------------------------*/
/*   Lightbox Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/
function emg_lightbox_image_grid_generator( $lgtype, $lgw, $lgh, $lgcls, $lgmeid, $lgisrc, $lgalt, $lgcstyle, $pstid, $lgimid, $lgrel, $lgfullpth, $lgttl = null, $rndm, $hovornor, $thumbstyle, $islazy, $plchldr = null ) {
	
		$isgallinfo = get_post_meta( $pstid, 'easmedia_metabox_media_gallery_opt2', true );
		
		if ( $isgallinfo == 'on' ) {
			$imginfo = get_post( $lgimid );
			$ittl = stripslashes ( esc_html( esc_js( $imginfo->post_title ) ) );
			$isbbttl = stripslashes ( esc_html( esc_js( $imginfo->post_excerpt ) ) );
		}
		else {
			$ittl = stripslashes( get_post_meta( $pstid, 'easmedia_metabox_title', true ) );
			$isbbttl = stripslashes( get_post_meta( $pstid, 'easmedia_metabox_sub_title', true ) );
		}
		
	if ( $lgalt ) {
		
		$lgalt = ucwords( str_replace( '-', ' ', $lgalt ) );
		
		} else {
			
			$lgalt = 'image gallery';
			
			}
		
	switch ( $lgtype ) {
		
		// EMG Lightbox ( Default )
		case 'emglb':
		echo '<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a onclick="easyActiveStyleSheet(\''.$lgcstyle.'\');return true;" class="'.$pstid.'-'.$lgimid.' nofoobox" rel="'.$lgrel.'" href="'.$lgfullpth.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" title="'.$lgalt.'"/>'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

		break;
		
		// FooBox Lightbox
		case 'foobx':	
		if ( easymedia_isfoobox() == 'active' ){ 	
		
			if(class_exists('Foobox_Free')){
				$isfooboxfree = 'class="wp-image-'.$pstid.'-'.$lgimid.'"';
				} else {
					$isfooboxfree = '';
					}		
		
		echo '<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="foobox-instance foobox '.$pstid.'-'.$lgimid.'" href="'.$lgfullpth.'" rel="emgfoobox'.$lgmeid.'" title="'.$isbbttl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$ittl.'" '.$isfooboxfree.'/>'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';		
		} else {
			echo '';
		}
		break;
		
		// Colorbox Lightbox
		case 'cb':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="emg-cbox nofoobox" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';	
		
		break;
		
		// Lightbox2 Lightbox
		case 'lb2':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" href="'.$lgfullpth.'" title="'.$isbbttl.'" data-lightbox="mblightbox['.$pstid.']" data-title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';			

		break;	
		
		// Fancybox Lightbox
		case 'fb2':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a data-fancybox-type="image" class="emgfancybox nofoobox fancybox.image fancybox-button" rel="emgfancy-'.$pstid.'" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';	
		
		break;	
		
		// Fancybox Free Lightbox
		case 'fbfree':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" rel="emgfancyfree" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';	
		
		break;			
						
		// PrettyPhoto Lightbox
		case 'pp':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" rel="emgprettyPhoto[showall]" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';	
		
		break;
		
		// PhotoSwipe Lightbox
		case 'ps':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" href="'.$lgfullpth.'" title="'.$isbbttl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$ittl.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';	
		
		break;	
		
		// PhotoBox Lightbox
		case 'pbox':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" href="'.$lgfullpth.'" title="'.$isbbttl.'"><img data-photobox-thumb="'.$lgisrc.'" '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" title="'.$ittl.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';	

		break;								
		
		// Wordpress ThickBox
		case 'wptb':		
 		echo'<div style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox thickbox" rel="emgthickbox" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$isbbttl.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';	
		
		break;			
		
		default:
		break;
	}  	
	
return;	
	
}


/*-------------------------------------------------------------------------------*/
/*   Lightbox Script Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/

function emg_lightbox_script_generator( $lgtype, $isslideauto, $isslideintrvl, $isslideshow = null, $itmsid = null, $mainid = null ) {

ob_start();

	switch ( $lgtype ) {
		
		// EMG Lightbox ( Default )
		case 'emglb':
echo'<script type="text/javascript">
jQuery(document).ready(function() {
		 jQuery( "#filters li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("rel", "easymedia[showall]");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("rel", "easymedia["+elmntsel+"]");
				 }
			 });
		});</script>';	
		
		break;
		
		// FooBox Lightbox
		case 'foobx':
				
echo'<script type="text/javascript">
jQuery(document).ready(function() {
	
(function( FOOBOX, $, undefined ) {
  FOOBOX.init = function() {
    $(".pagwrap-'.$mainid.'").foobox($.extend(true, {}, FOOBOX.o, { alwaysInit: true }));
    $(".foobox, [target=\"foobox\"]").foobox(FOOBOX.o);
  };
}( window.FOOBOX = window.FOOBOX || {}, jQuery ));
FOOBOX.init();
});
</script>';

		break;

		// Colorbox		
		case 'cb':
		
		echo'<script type="text/javascript">
		jQuery(document).ready(function() {
			jQuery(".emg-cbox").colorbox({
				current: "{current} / {total}",
				rel:\'emg-cbox\',
				returnFocus: false,
				slideshow: '.$isslideauto.',
				slideshowSpeed: '.$isslideintrvl.',
				scrolling: false,
				speed: 500,
				photo: true,
				fadeOut: 500,
				maxWidth: "90%",
				maxHeight: "90%",
				onComplete:function(){
					if(jQuery("#cboxTitle").text().length > 1) {
						jQuery("#cboxTitle").css("width", jQuery(".cboxPhoto").width()-9);
						jQuery("#cboxTitle").hide();
						jQuery("#cboxTitle").fadeIn(500);
						} else {
							jQuery("#cboxTitle").hide();
							}
						}
					});
			});
		</script>'; 
		
		break;	
		
		// Lightbox2
		case 'lb2':
echo'<script type="text/javascript">
jQuery(document).ready(function() {
		 jQuery( "#filters li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("data-lightbox", "mblightbox[showall]");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("data-lightbox", "mblightbox["+elmntsel+"]");
				 }
			 });
		});</script>';	
		
		break;		
		
		
		// Fancybox2
		case 'fb2':
echo'<script type="text/javascript">
jQuery(document).ready(function() {	
	jQuery(".emgfancybox").fancybox({
		afterShow: function() {
			jQuery(".fancybox-title-over-wrap").hide();
			setTimeout(function(){
			var imageWidth = jQuery(".fancybox-image").width();
			jQuery(".fancybox-title-over-wrap").css({
				"width": imageWidth,
				"paddingLeft": 0,
				"paddingRight": 0,
				"textAlign": "center"
        });
		jQuery(".fancybox-title-over-wrap").fadeIn("slow");
			}, 100 );
    },
		padding : 0,
		type : "image",
		arrows: false,
		margin: [45, 17, 17, 17],
		mouseWheel: true,
		autoPlay: '.$isslideauto.',
		playSpeed: '.$isslideintrvl.',
		prevEffect: "elastic",
		nextEffect: "elastic",
		closeBtn: false,
		openEffect: "fade",	
		openSpeed: "normal",
		closeSpeed: 300,	
		helpers : {
			buttons	: {
				position: "bottom"
				},
			title: {
				type: "over"
				}	
    }
    });

		 jQuery( "#filters li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("rel", "mblightbox-showall");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("rel", "mblightbox-"+elmntsel+"");
				 }
			 });			 
		});</script>';	
		
		break;	
		
		
		// Fancybox Free
		case 'fbfree':
echo'<script type="text/javascript">
jQuery(document).ready(function() {
	jQuery(".iehand a[rel=emgfancyfree]").fancybox({
		overlayShow	: true,
		transitionIn	: "elastic",
		transitionOut	: "elastic",
		titlePosition	: "inside"
		});
	});</script>';	
		
		break;				

		
		// PrettyPhoto
		case 'pp':
echo'<script type="text/javascript">
jQuery(document).ready(function() {
	jQuery("a[rel^=\'emgprettyPhoto[showall]\']").emgPhoto({theme: "emg_default",slideshow:'.$isslideintrvl.', autoplay_slideshow:'.$isslideauto.', social_tools:false,allow_expand: false, deeplinking: false});
	
		 jQuery( "#filters li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("rel", "emgprettyPhoto[showall]");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("rel", "emgprettyPhoto["+elmntsel+"]");
				 }
			 });
		});</script>';	
		
		break;	
		
		
		// PhotoSwipe
		case 'ps':		
echo'<script type="text/javascript">
(function(window, $, PhotoSwipe){
	jQuery(document).ready(function(){
		emgPhotoSwipe = jQuery(".iehand a").photoSwipe({
			captionAndToolbarAutoHideDelay: 0,
			slideshowDelay:'.$isslideintrvl.',
			slideSpeed:500,
			nextPreviousSlideSpeed:500,
			captionAndToolbarOpacity: "0.7"
			});

			
			var J = jQuery.noConflict();
			var currentoverflowY = J("html").css("overflowY");
			
			emgPhotoSwipe.addEventHandler(PhotoSwipe.EventTypes.onBeforeShow, function (e) {
				if (currentoverflowY) {
					J("html").css({ overflowY: "hidden"});
					}
				});
				
			emgPhotoSwipe.addEventHandler(PhotoSwipe.EventTypes.onHide, function (e) {
				if (currentoverflowY) {
					J("html").css({ overflowY: currentoverflowY});
					}
				});
		});			
}(window, window.jQuery, window.Code.PhotoSwipe));
</script>';			

		break;
		
		
		// PhotoBox
		case 'pbox':
echo'<script type="text/javascript">
jQuery(document).ready(function() {
	jQuery(".lightbox'.$mainid.'").photobox("a",{ time:'.$isslideintrvl.', autoplay:'.$isslideauto.'});
	});</script>';	
		
		break;										
		
		default:
		break;
	}  	
	
$isclean = ob_get_clean();
echo emg_js_compress( $isclean );
	
}


/*-------------------------------------------------------------------------------*/
/*   Album Loader (Ajax) @since 1.5.0.3
/*-------------------------------------------------------------------------------*/
function emg__front_ajax_album_loader($med, $size, $uid, $ipg = '', $albcont, $zcs = null, $cmode = null, $cc = null, $coversize = null ){
	
	ob_start();
	
	if ($ipg) {
		$ipg = $ipg;
	} else {
		$ipg = '';
		}
		
	if ( easy_get_option( 'easymedia_disen_lazyload' ) == '1' ) {
		$islz = '1';
		} else {
			$islz = '0';		
			}
		
	
echo'<script type="text/javascript">
jQuery(document).ready(function() {
	
	var mediaid , cimgcount, timeout;
		
	jQuery(document).on("click",".easycontainer-'.$uid.' .justalbum", function () {
		'.( ( emg_slug_to_name( easy_get_option( "easymedia_lightbox_style" ) ) == 'pbox' ) ? 'jQuery(".lightbox'.$uid.'").photobox("prepareDOM");'   : '').'
		jQuery(".isofilcont-'.$uid.' #emgshowall").trigger("click");
		jQuery(".isofilcont-'.$uid.', .pagwrap-'.$uid.'").hide();
		jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-50)}, 1500);
		mediaid = jQuery(this).attr("data-emg-album");
		clearTimeout(timeout);
		jQuery("#isloaderfor-'.$uid.'").fadeIn(500);
		var cmd = "showgallery";
		var thumbnail = "'.$size.'";
		var mainid = "'.$uid.'";
		var cmode = "'.$cmode.'";
		var zcs = "'.$zcs.'";		
		var cc = "'.$cc.'";
		var cvrsize = "";
		cimgcount = jQuery(this).attr("data-emg-child");	
		timeout = setTimeout(function(){ emg_ajax_album_loader(cmd, mediaid, thumbnail, cimgcount, mainid, cmode, zcs, cc, cvrsize); }, 1000);
		});
		
		
		jQuery(document).on("click","#emgajaxback'.$uid.'", function () {
		'.( ( emg_slug_to_name( easy_get_option( "easymedia_lightbox_style" ) ) == 'pbox' ) ? 'jQuery(".lightbox'.$uid.'").photobox("destroy");'   : '').'
		jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-250)}, 1500);
		clearTimeout(timeout);
		jQuery("#isloaderfor-'.$uid.'").fadeIn(500);
		jQuery("#emgajaxback'.$uid.'").fadeOut("fast");	
		jQuery(".pagwrap-'.$uid.'").hide();
		var cmd = "emgajaxback";		
		var mediaid = "'.$med.'";
		var thumbnail = "'.$size.'";
		var mainid = "'.$uid.'";
		var cmode = "'.$cmode.'";
		var zcs = "'.$zcs.'";		
		var cc = "'.$cc.'";
		var cvrsize = "'.$coversize.'";
		timeout = setTimeout(function(){ emg_ajax_album_loader(cmd, mediaid, thumbnail, cimgcount, mainid, cmode, zcs, cc, cvrsize); }, 1500);		
		});
				
		function emg_ajax_album_loader(cmd, mediaid, thumbnail, cimgcount, mainid, cmode, zcs, cc, cvrsize) {
				var data = {
				action: "emg_ajax_album_loader",
				security: "'.wp_create_nonce( "easymedia-pro-nonce").'",	
				mediaid: mediaid,
				pprse: cmd,
				thumbnail: thumbnail,
				mainid: mainid,
				cmode: cmode,
				zcs: zcs,
				cc: cc,
				cvrsize: cvrsize
				};
			
				jQuery.post("'.admin_url('admin-ajax.php').'", data, function(response) {
					clearTimeout(timeout);
					jQuery(".pagwrap-'.$uid.'").fadeIn(3000);
					
					switch (cmd) {
						
						case "showgallery":
						jQuery("#isloaderfor-'.$uid.'").fadeOut("fast");
						jQuery("#emgajaxback'.$uid.'").fadeIn(1000);
						var newItems = jQuery(response);
						var removeItem = jQuery(".pagwrap-'.$uid.' .justalbum" );
						jQuery(".easycontainer-'.$uid.'").emgisotope("remove", removeItem);
						jQuery(".easycontainer-'.$uid.'").emgisotope("insert", newItems);	
						loadImages(".pagwrap-'.$uid.' .emglazy","'.$uid.'","'.$ipg.'", cimgcount,"'.$islz.'");
						jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-200)}, 1500);							

						break;
						
						case "emgajaxback":
						jQuery("#isloaderfor-'.$uid.'").fadeOut(500);
						jQuery(".isofilcont-'.$uid.'").fadeIn(500);
						var newItems = jQuery(response);
						var removeItem = jQuery(".pagwrap-'.$uid.' .view" );
						jQuery(".easycontainer-'.$uid.'").emgisotope("remove", removeItem);						
						jQuery(".easycontainer-'.$uid.'").emgisotope("insert", newItems);
						loadImages(".pagwrap-'.$uid.' .emglazy","'.$uid.'","'.$ipg.'", "'.$albcont.'","'.$islz.'");
						jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-200)}, 1500);
						
						break;									
						
						default:
					}
	
				});
			}		

});
	
	
</script>';	

$albumscrpt = ob_get_clean();
echo emg_js_compress( $albumscrpt );

}


// SLIDER 1 GENERATOR	
function emg_image_slider_one_generator ( $emgsrc, $emgthumb, $capwidth, $thumbttl ){
	
	if (trim($thumbttl)){
		$showornot = '';
	} else {
		$showornot = 'display: none !important;';
	}
	
    echo'<div>
    <img u="image" src2="'.$emgsrc.'" />
                <div class="emgslidercap" u="caption" t="MCLIP|B" style="'.$showornot.' position: absolute; top: 0px; left: 0px;
                    width: '.$capwidth.'px; height: 25px;">
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        background-color: Black; opacity: 0.1; filter: alpha(opacity=10);">
                    </div>
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        color: White; font-size: 14px; font-weight: bold; line-height: 25px; text-align: center;">
                        '.$thumbttl.'
                    </div>
                </div>
    <img u="thumb" src="'.$emgthumb.'" />
    </div>';
	
}

// SLIDER 1 SCRIPT GENERATOR
function emg_slider_one_script_generator( $isslideauto, $isslideintrvl, $imwidth, $imheight, $uniqueid ) {
		echo'<script type="text/javascript">jQuery(document).ready(function(){
			jQuery("#isloaderfor-'.$uniqueid.'").fadeOut(2000, function (){
				jQuery(".pagwrap-'.$uniqueid.'").fadeIn(1000);
				});
				function r(){var e=n.$Elmt.parentNode.clientWidth;if(e)n.$SetScaleWidth(Math.min(e,'.$imwidth.'));else window.setTimeout(r,30)}var e=[];e["MCLIP|B"]={$Duration:600,$Clip:4,$Move:true,$Easing:$JssorEasing$.$EaseOutExpo};var t={$FillMode:4,$LazyLoading:2,$AutoPlay:'.$isslideauto.',$AutoPlaySteps:1,$AutoPlayInterval:'.$isslideintrvl.',$PauseOnHover:0,$ArrowKeyNavigation:true,$SlideDuration:500,$MinDragOffsetToSlide:20,$SlideWidth:'.$imwidth.',$SlideHeight:'.$imheight.',$SlideSpacing:0,$DisplayPieces:1,$ParkingPosition:0,$UISearchMode:1,$PlayOrientation:1,$DragOrientation:3,$ArrowNavigatorOptions:{$Class:$JssorArrowNavigator$,$ChanceToShow:1,$Steps:1},$ThumbnailNavigatorOptions:{$Class:$JssorThumbnailNavigator$,$ChanceToShow:2,$ActionMode:1,$AutoCenter:3,$Lanes:1,$SpacingX:3,$SpacingY:3,$DisplayPieces:9,$ParkingPosition:260,$Orientation:1,$DisableDrag:false},$CaptionSliderOptions:{$Class:$JssorCaptionSlider$,$CaptionTransitions:e,$PlayInMode:1,$PlayOutMode:3}};var n=new $JssorSlider$("slider1_container-'.$uniqueid.'",t);r();if(!navigator.userAgent.match(/(iPhone|iPod|iPad|BlackBerry|IEMobile)/)){jQuery(window).bind("resize",r)}})</script>';
		}

// SLIDER 2 GENERATOR	
function emg_image_slider_two_generator ( $emgsrc, $emgthumb, $capwidth, $thumbttl ){
	if (trim($thumbttl)){
		$showornot = '';
	} else {
		$showornot = 'display: none !important;';
	}
	
    echo'<div>
    <img u="image" src2="'.$emgsrc.'" />
                <div class="emgslidercap" u="caption" t="MCLIP|B" style="'.$showornot.' position: absolute; top: 0px; left: 0px;
                    width: '.$capwidth.'px; height: 25px;">
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        background-color: Black; opacity: 0.1; filter: alpha(opacity=10);">
                    </div>
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        color: White; font-size: 14px; font-weight: bold; line-height: 25px; text-align: center;">
                        '.$thumbttl.'
                    </div>
                </div>
    <img u="thumb" src="'.$emgthumb.'" />
    </div>';

}

// SLIDER 2 SCRIPT GENERATOR	
function emg_slider_two_script_generator( $isslideauto, $isslideintrvl, $imwidth, $imheight, $uniqueid ) {
		echo'<script type="text/javascript">jQuery(document).ready(function(){
				jQuery("#isloaderfor-'.$uniqueid.'").fadeOut(2000, function () { 
				jQuery(".pagwrap-'.$uniqueid.'").fadeIn(1000);
				});
			function i(){var e=r.$Elmt.parentNode.clientWidth;if(e)r.$SetScaleWidth(Math.max(Math.min(e,'.$imwidth.'),300));else window.setTimeout(i,30)}var e=[];e["MCLIP|B"]={$Duration:600,$Clip:4,$Move:true,$Easing:$JssorEasing$.$EaseOutExpo};var t=[{$Duration:1200,$Zoom:1,$Easing:{$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad},$Opacity:2},{$Duration:1e3,$Zoom:2,$SlideOut:true,$Easing:{$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear},$Opacity:2},{$Duration:1200,$Zoom:1,$Rotate:true,$During:{$Zoom:[.2,.8],$Rotate:[.2,.8]},$Easing:{$Zoom:$JssorEasing$.$EaseSwing,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseSwing},$Opacity:2,$Round:{$Rotate:.5}},{$Duration:1e3,$Zoom:2,$Rotate:true,$SlideOut:true,$Easing:{$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$Opacity:2,$Round:{$Rotate:.8}},{$Duration:1200,$Cols:2,$Zoom:1,$FlyDirection:1,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseLinear},$ScaleHorizontal:.5,$Opacity:2},{$Duration:1200,$Cols:2,$Zoom:2,$SlideOut:true,$FlyDirection:1,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear},$ScaleHorizontal:4,$Opacity:2},{$Duration:1200,$Zoom:1,$Rotate:true,$During:{$Left:[.2,.8],$Zoom:[.2,.8],$Rotate:[.2,.8]},$FlyDirection:1,$Easing:{$Left:$JssorEasing$.$EaseSwing,$Zoom:$JssorEasing$.$EaseSwing,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseSwing},$ScaleHorizontal:.6,$Opacity:2,$Round:{$Rotate:.5}},{$Duration:1e3,$Zoom:2,$Rotate:true,$SlideOut:true,$FlyDirection:2,$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$ScaleHorizontal:4,$Opacity:2,$Round:{$Rotate:.8}},{$Duration:1200,$Zoom:1,$Rotate:true,$During:{$Left:[.2,.8],$Zoom:[.2,.8],$Rotate:[.2,.8]},$FlyDirection:2,$Easing:{$Left:$JssorEasing$.$EaseSwing,$Zoom:$JssorEasing$.$EaseSwing,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseSwing},$ScaleHorizontal:.6,$Opacity:2,$Round:{$Rotate:.5}},{$Duration:1e3,$Zoom:2,$Rotate:true,$SlideOut:true,$FlyDirection:1,$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$ScaleHorizontal:4,$Opacity:2,$Round:{$Rotate:.8}},{$Duration:1200,$Cols:2,$Zoom:1,$Rotate:true,$FlyDirection:5,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Top:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad,$Rotate:$JssorEasing$.$EaseInCubic},$ScaleHorizontal:.5,$ScaleVertical:.3,$Opacity:2,$Round:{$Rotate:.7}},{$Duration:1e3,$Cols:2,$Zoom:1,$Rotate:true,$SlideOut:true,$FlyDirection:5,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Top:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$ScaleHorizontal:.5,$ScaleVertical:.3,$Opacity:2,$Round:{$Rotate:.7}},{$Duration:1200,$Rows:2,$Zoom:2,$Rotate:true,$FlyDirection:6,$Assembly:2049,$ChessMode:{$Row:28},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Top:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad,$Rotate:$JssorEasing$.$EaseInCubic},$ScaleHorizontal:4,$ScaleVertical:2,$Opacity:2,$Round:{$Rotate:.7}},{$Duration:1200,$Cols:2,$Zoom:2,$Rotate:true,$FlyDirection:5,$Assembly:2049,$ChessMode:{$Column:19},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Top:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad,$Rotate:$JssorEasing$.$EaseInCubic},$ScaleHorizontal:1,$ScaleVertical:2,$Opacity:2,$Round:{$Rotate:.8}}];var n={$AutoPlay:'.$isslideauto.',$AutoPlayInterval:'.$isslideintrvl.',$PauseOnHover:3,$LazyLoading:2,$DragOrientation:3,$ArrowKeyNavigation:true,$SlideDuration:600,$SlideshowOptions:{$Class:$JssorSlideshowRunner$,$Transitions:t,$TransitionsOrder:1,$ShowLink:true},$ArrowNavigatorOptions:{$Class:$JssorArrowNavigator$,$ChanceToShow:1,$AutoCenter:2,$Steps:1},$ThumbnailNavigatorOptions:{$Class:$JssorThumbnailNavigator$,$ChanceToShow:2,$ActionMode:1,$Lanes:2,$SpacingX:14,$SpacingY:12,$DisplayPieces:5,$ParkingPosition:156,$Orientation:2},$CaptionSliderOptions:{$Class:$JssorCaptionSlider$,$CaptionTransitions:e,$PlayInMode:1,$PlayOutMode:3}};var r=new $JssorSlider$("slider2_container-'.$uniqueid.'",n);i();if(!navigator.userAgent.match(/(iPhone|iPod|iPad|BlackBerry|IEMobile)/)){jQuery(window).bind("resize",i)}})</script>';
}

// Carousel GENERATOR	
function emg_carousel_generator ( $emgsrc, $emgthumb, $width, $thumbttl, $full ){
	
    echo'<div class="emg-carousel"><a href="'.$full.'" title="'.$thumbttl.'" rel="emgprettyPhoto[showall]"><img title="'.$thumbttl.'" class="emgcarousel" src="'.$emgthumb.'" /></a></div>';
	
}

// Carousel SCRIPT GENERATOR	
function emg_carousel_script_generator( $isslideauto, $isslideintrvl, $imwidth, $imheight, $elementid, $easingeffect, $title, $uniqueid ){
	echo '<script type="text/javascript">
	jQuery(document).ready(function() {
		jQuery("#isloaderfor-'.$uniqueid.'").fadeOut(2000, function () {
			jQuery(".pagwrap-'.$uniqueid.'").fadeIn(3000);
			
		jQuery(".bxslider-'.$elementid.'").bxSlider({
			slideWidth: '.$imwidth.',
			slideMargin: 10,
			maxSlides: 10,
			pager: false,
			useCSS: false,
			easing: "'.$easingeffect.'",
			auto: true,
			speed: 1500,
			controls: true,
			autoControls: true,
			preloadImages: "all",
			infiniteLoop: true,
			captions: '.$title.',
			autoHover: true,
			autoStart: '.$isslideauto.',
			pause: '.$isslideintrvl.',
			onSlideAfter: function() {
				jQuery(".bx-start").trigger("click");
            }
				});
				
				
			jQuery(".bx-clone a").removeAttr( "rel" );
			
			jQuery("a[rel^=\'emgprettyPhoto[showall]\']").emgPhoto({theme: "emg_default", allow_expand: false, deeplinking: false, slideshow:'.$isslideintrvl.'000, autoplay_slideshow:'.$isslideauto.', social_tools:false});
					
			});			
			
		});
		

</script>'; 

}

// Fotorama GENERATOR	
function emg_fotorama_generator ( $emgsrc, $emgthumb, $width, $thumbttl, $caption ){
	
    //echo'<img '.$caption.' src="'.$emgthumb.'">'; // Normal loader
	echo '<a '.$caption.' href="'.$emgsrc.'" data-thumb="'.$emgthumb.'"></a>'; // with Lazy Load
}

function emg_ajax_album_loader() {
	
	check_ajax_referer( 'easymedia-pro-nonce', 'security' );
	
		if ( !isset( $_POST['mediaid'] ) || !isset( $_POST['pprse'] ) || !isset( $_POST['mainid'] ) ) {
			
		echo '<div class="view"><img src="'.plugins_url('images/ajax-loader.gif' , 'index.php').'" width="32" height="32"/></div>';
		die;
		}
		
		else {	
		switch ($_POST['pprse']){
			case 'showgallery':
				echo emg_album_img_list(trim($_POST['mediaid']), trim($_POST['thumbnail']), trim($_POST['mainid']), trim($_POST['zcs']), trim($_POST['cmode']), trim($_POST['cc']) );
				wp_die();
			break;
	
			case 'emgajaxback':
				echo emg_albums_back(trim($_POST['mediaid']), trim($_POST['thumbnail']), trim($_POST['mainid']), trim($_POST['zcs']), trim($_POST['cmode']), trim($_POST['cc']), trim($_POST['cvrsize']) );
   			 	wp_die();
			break;
			
			default:
			break;
	
		}
	}
}
add_action('wp_ajax_nopriv_emg_ajax_album_loader', 'emg_ajax_album_loader');
add_action('wp_ajax_emg_ajax_album_loader', 'emg_ajax_album_loader');

/*
|--------------------------------------------------------------------------
| AJAX RESET SETTINGS
|--------------------------------------------------------------------------
*/
function emg_cp_reset() {
	
	check_ajax_referer( 'easymedia-pro-nonce', 'security' );
	
	if ( !isset( $_POST['cmd'] ) ) {
		echo '0';
		die;
		}
		
		else {
			if ( $_POST['cmd'] == 'reset' ){
				echo '1';
				easymedia_restore_to_default($_POST['cmd']);			
				die;
				}
	}
}
add_action( 'wp_ajax_emg_cp_reset', 'emg_cp_reset' );

/*
|--------------------------------------------------------------------------
| AJAX UPDATE GALLERY
|--------------------------------------------------------------------------
*/
function emg_updt_gall_list() {
	if ( !isset( $_POST['pstid'] ) ) {
		echo '<p>Ajax request failed, please refresh your browser window.</p>';
		die;
		}
		else {
			update_post_meta( $_POST['pstid'] , 'easmedia_metabox_media_gallery', '' );
			echo 'No image(s) selected...';
			die;
		}
}
add_action( 'wp_ajax_emg_updt_gall_list', 'emg_updt_gall_list' );


/*
|--------------------------------------------------------------------------
| AJAX LIST MEDIA (TINYMCE)
|--------------------------------------------------------------------------
*/
function emg_load_media_list() {
	
	if ( !isset( $_POST['taxo'] ) ) {
		echo '<p>Ajax request failed, please refresh your browser window.</p>';
		die;
		}
		else {
			global $post;
			$taxoterm = $_POST['taxo'];
			
			
$args = array(
'tax_query' => array(
    array(
        'taxonomy' => 'emediagallery',
        'field' => 'id'
        //'terms' => $taxoterm
    )
)
);

query_posts( $args );			
			
if ( have_posts() ) :
	while ( have_posts() ) :
			$show_media .= '
			<input name="'.$post->ID.'" id="'.$post->ID.'" type="text" value="'.get_post_meta( $id, 'easmedia_metabox_title', true ).'" />';

	echo $show_media;
	die();
	
	endwhile;	
else:
  echo 'Sorry, no media matched your criteria.';		
  die();	
endif;
wp_reset_query();			
			
	}
}
add_action( 'wp_ajax_emg_load_media_list', 'emg_load_media_list' );

/*
|--------------------------------------------------------------------------
| AJAX DELETE MEDIA IMAGE
|--------------------------------------------------------------------------
*/
function easmedia_img_media_remv() {
	
	if ( !isset( $_POST['pstid'] ) || !isset( $_POST['type'] ) ) {
		echo '0';
		die;
		}
		
		else {
			if ( !current_user_can( 'edit_theme_options' ) )
			die('-1');
			
			if ( $_POST['type'] == 'image' ){
				$data = $_POST['pstid'];
				update_post_meta($data, 'easmedia_metabox_img', '');
				echo '1';
				die;
				}
	
	elseif ( $_POST['type'] == 'audio' ){
		$data = $_POST['pstid'];
				update_post_meta($data, 'easmedia_metabox_media_audio', '');
				echo '1';
	    die;
		}
	}
}
add_action( 'wp_ajax_easmedia_img_media_remv', 'easmedia_img_media_remv' );


/*
|--------------------------------------------------------------------------
| AJAX LOAD IMAGE DETAILS
|--------------------------------------------------------------------------
*/
function easmedia_img_dtl() {
	
	if ( !isset( $_POST['imgid'] ) ) {
		echo '0';
		die;
		}
		
		else {
			
			$img_info = get_post( $_POST['imgid'] );
			$ttl = $img_info->post_title;
			$sbttl = $img_info->post_excerpt;
			$decs =  $img_info->post_content;
			
			$allimgdat = array( $ttl, $sbttl, $decs );
			echo implode("|~|", $allimgdat);
	    die;
		}
}
add_action( 'wp_ajax_easmedia_img_dtl', 'easmedia_img_dtl' );


/*
|--------------------------------------------------------------------------
| AJAX UPDATE IMAGE DETAILS
|--------------------------------------------------------------------------
*/
function easy_custom_save_function(){
	
		if ( !isset( $_POST['imgid'] ) || !isset( $_POST['imgttl'] ) || !isset( $_POST['imgsbttl'] ) || !isset( $_POST['imgdesc'] ) ) {
		echo '0';
		die;
		}
		
		else {
    wp_update_post(array('ID' => $_POST['imgid'], 'post_title' => $_POST['imgttl']));
	wp_update_post(array('ID' => $_POST['imgid'], 'post_excerpt' => $_POST['imgsbttl']));
	wp_update_post(array('ID' => $_POST['imgid'], 'post_content' => $_POST['imgdesc']));
	echo '101';
		    die;
		}
}
add_action( 'wp_ajax_easy_custom_save_function', 'easy_custom_save_function' );


/*
|--------------------------------------------------------------------------
| AJAX LOAD IMAGE GALLERY
|--------------------------------------------------------------------------
*/
function emg_gallery_list() {

	if ( !isset( $_POST['page'] ) ) {$page = 1;}
	else {$page = (int)addslashes( $_POST['page'] );}
	
	if ( !isset( $_POST['per_page'] ) ) {$per_page = 14;}
	else {$per_page = (int)addslashes( $_POST['per_page'] );}
	
	$img_data = emg_library_images( $page, $per_page );
	
	echo '<ul>';
	
	if ( $img_data['totalimg'] == 0 ) {echo '<p>No images found .. </p>';}
	else {
		foreach( $img_data['img'] as $img ) {
			$defwpgallery = emg_thumb_src( $img['url'], '90', '90', '0', '0' );
			echo '<li><img src="'.$defwpgallery.'" id="'.$img['id'].'" /></li>';	
		}
	}
	
	echo '
	</ul>
	<br class="metagal_clear" />
	<table cellspacing="0" cellpadding="5" border="0" width="100%" style="border-top: 1px solid #DDD; margin-top:10px; padding-top:5px;">
		<tr>
			<td style="width: 35%;">';			
			if ( $page > 1 )  {
				echo '<input type="button" class="prev_page button-secondary" id="btnnav_'. ( $page - 1 ) .'" name="prevbtnnav" value="&laquo; Previous images" />';
			}
			
		echo '</td><td style="width: 30%; text-align: center;">';
		
			if ( $img_data['totalimg'] > 0 && $img_data['page_count'] > 1 ) {
				echo '<em>page '.$img_data['pag'].' of '.$img_data['page_count'].'</em>';	
			}
			else {}
			
		echo '</td><td style="width: 35%; text-align: right;">';
			if ( $img_data['more'] != false )  {
				echo '<input type="button" class="next_page button-secondary" id="btnnav_'. ($page + 1) .'" name="nextbtnnav" value="Next images &raquo;" />';
			}
		echo '</td>
		</tr>
	</table>
		<table cellspacing="0" cellpadding="5" border="0" width="100%" style="border-top: 1px solid #DDD; margin-top:10px; padding-top:5px;">
		<tr><td style="width: 30%; text-align: center;">
		<em>Show images per page</em>&nbsp;&nbsp;<input type="text" size="2" name="img_number" id="imgbutperpage" value="'.$per_page.'" />&nbsp;&nbsp;<input type="button" class="button-secondary" id="btnnavshowlist" name="btnnavshowlist" value="Show" />
		</td></tr>
	</table>	
	';

	die();
}
add_action( 'wp_ajax_emg_gallery_list', 'emg_gallery_list' );

function emg_sel_img_rld() {	
	
	if ( !isset( $_POST['images'] ) ) { $images = array();}
	else { $images = $_POST['images'];}
	
	// get the titles
	$images = emg_ext_sel( $images );
	$new_img = '';
	
	if ( !$images ) {$new_img = '<p>No images selected...</p>';}
	else {
		foreach( $images as $img_id ) {
			$img_data = get_post( $img_id );
			$img_url = $img_data->guid;
			$slctdimg = emg_thumb_src( $img_url, '90', '90', '0', '0' );
			$new_img .= '
			<li>
				<input type="hidden" name="easmedia_metabox_img_slider[]" value="'.$img_id.'" />
				<img src="'.$slctdimg.'" />
				<span title="Remove Image"></span>
			</li>
			';	
		}
	}
	
	echo $new_img;
	die();
}
add_action( 'wp_ajax_emg_sel_img_rld', 'emg_sel_img_rld' );


/*-------------------------------------------------------------------------------*/
/*   AJAX For EMG Lightbox
/*-------------------------------------------------------------------------------*/
function emg_get_data_slider_ajax() {
	
	check_ajax_referer('medialoader', 'security');
	
	if ( !isset( $_POST['id'] ) ) {
		echo  'Error!';
		wp_die();
		} 
		else {
			
//------------------------------------------------------------------------------
	$devmedia = '';
	
	if ( strpos( $_POST['id'],'-' ) ) {
		$devmedia = explode( "-", $_POST['id'] );
		
		$id = $devmedia[0];
		$isdinamccntn = explode( ' ', trim( $devmedia[1] ) ); // @since 1.6.0.10
		
		if ( isset( $isdinamccntn[0] ) ) {
			$isdinamccntn = $isdinamccntn[0];
			} else {
				$isdinamccntn = '';
				}
		}
		else {
		
			$id = $_POST['id'];
			$isdinamccntn = "";
		}
	
	global $post;
	

	$usegalleryinfo = get_post_meta( $id, 'easmedia_metabox_media_gallery_opt2', true );

	if ( $isdinamccntn != '' ) {
		
		if ( $usegalleryinfo == 'on' ) {
			$img_info = get_post( $isdinamccntn );
			$boxmediattl = $img_info->post_title;
			$boxmediasbttl = $img_info->post_excerpt;
			$boxshortdecs =  $img_info->post_content;
			$boxshortdecs =  str_replace("
","",$boxshortdecs);
			$boxshortdecs =  str_replace("
","",$boxshortdecs);
			$boxshortdecs = do_shortcode( wpautop( $boxshortdecs ) );			
		}
		else {
			$boxshortdecs = do_shortcode( wpautop( get_post_meta( $id, 'easmedia_metabox_shordesc', true ) ) );
			//$boxshortdecs = get_post_meta( $id, 'easmedia_metabox_shordesc', true );
			$boxmediattl = get_post_meta( $id, 'easmedia_metabox_title', true );
			$boxmediasbttl = get_post_meta( $id, 'easmedia_metabox_sub_title', true );
		}
	}
	else {
		$boxshortdecs = do_shortcode( wpautop( get_post_meta( $id, 'easmedia_metabox_shordesc', true ) ) );
		//$boxshortdecs = get_post_meta( $id, 'easmedia_metabox_shordesc', true );
		$boxmediattl = get_post_meta( $id, 'easmedia_metabox_title', true );
		$boxmediasbttl = get_post_meta( $id, 'easmedia_metabox_sub_title', true );
		}
	
	
	$imgsrc = get_post_meta( $id, 'easmedia_metabox_img', true );
	$mediatype = get_post_meta( $id, 'easmedia_metabox_media_type', true );
	$domname = preg_replace( '/^www\./','',$_SERVER['SERVER_NAME'] );	
	
	
	switch ( $mediatype ) {
		case 'Single Image':
		$boxlink = $imgsrc;
		$isdlable = '1';
	        break;
			
		case 'Multiple Images (Slider)':
		$boxlink = wp_get_attachment_image_src($isdinamccntn, 'full');
		$imgsrc = $boxlink[0];
		$boxlink = $boxlink[0];
		$isdlable = '1';
	        break;			
			
		case 'Video':
		$boxlink = get_post_meta( $id, 'easmedia_metabox_media_video', true );
		$isdlable = '0';
	        break;
			
		case 'Audio':
		$boxlink = get_post_meta( $id, 'easmedia_metabox_media_audio', true );
		$isdlable = '1';
	        break;		
			
		case 'Google Maps':
		$boxlink = get_post_meta( $id, 'easmedia_metabox_media_gmap', true );
		$isdlable = '0';
	        break;				
			
		case 'Link':
		$boxlink = get_post_meta( $id, 'easmedia_metabox_media_link', true );
		$link_type = get_post_meta( $id, 'easmedia_metabox_media_link_opt1', true );
		$isdlable = '0';
		if ( $boxlink !='' ) {
			$media_link_fin = $boxlink; } else {
			$media_link_fin = $post->guid;
		}
		
		$boxlink = $media_link_fin;
	        break;			
	}
	
	$isgp = easy_get_option( 'easymedia_disen_gp' ); $iseml = easy_get_option( 'easymedia_disen_eml' ); $isfb = easy_get_option( 'easymedia_disen_fb' ); $istwt = easy_get_option( 'easymedia_disen_twt' ); $ispin = easy_get_option( 'easymedia_disen_pin' ); $isdl = easy_get_option( 'easymedia_disen_dlbutton' );

	$tempdesc = strlen( $boxshortdecs );
	$trim_length = 200;
			if ( $boxshortdecs ) {
				
		if ( $tempdesc>$trim_length ) {
			$shortenerdesc = rtrim( substr( $boxshortdecs,0,$trim_length-3 ) );	
        $shortenerdesc = $shortenerdesc . "...";
   			}	else {
			$shortenerdesc = rtrim( substr( $boxshortdecs,0,$trim_length ) );	
			}
		}
		else {
		$shortenerdesc = "Description goes here...";
		} 

	//if ( $boxmediattl == '' && get_the_title( $id ) == '' ) {$sharemediattl = 'Media';}
	//else if ( $boxmediattl == '' && get_the_title( $id ) != '' ) {$sharemediattl = get_the_title( $id );}	
	
	if ( $boxmediattl == '' && get_the_title( $id ) == '' ) {$sharemediattl = 'Media';}
	if ( $boxmediattl == '' && get_the_title( $id ) != '' ) {$sharemediattl = get_the_title( $id );}
	if ( $boxmediattl != '' && get_the_title( $id ) != '' ) {$sharemediattl = $boxmediattl;}	
	

ob_start();	

if ( $isfb || $istwt || $ispin || $isgp || $iseml || $isdl ): ?>

              <div id="mbsosmed">
            	<ul>
                <?php if ( $isfb ): ?>
                  <li id="sosmedfb">
				  
				 <?php
				  
				$fbappid = trim(easy_get_option( 'easymedia_fb_appid' ));
				$fbttl = preg_replace('/[^a-z0-9\s]/i', ' ', $sharemediattl );
				$filenm = basename( $imgsrc, ".".pathinfo( $imgsrc, PATHINFO_EXTENSION ) );
				
				if ( $fbappid != '' ) {	
				
				$fbboxw = '940';
				$fbboxh = '500';
				
				$fburl = 'https://www.facebook.com/dialog/feed?app_id='.$fbappid.'&link='.urlencode( $imgsrc ).'&picture='.urlencode( $imgsrc ).'&caption='.$fbttl.'&description='.$filenm.'&redirect_uri='.urlencode( site_url() ).'';
				} 
				else { 
				
				$fbboxw = '548';
				$fbboxh = '325';
				
					$fburl = 'https://www.facebook.com/sharer.php?s=100&amp;p[title]='.urlencode( $sharemediattl ).'&amp;p[summary]='.urlencode(strip_tags( $shortenerdesc ) ).'&amp;p[url]=CONVTOURL&amp;&amp;p[images][0]='.urlencode( $imgsrc ).'';
				}
				?>

					<a onClick="window.open('<?php echo $fburl; ?>','sharer','toolbar=0,status=0,width=<?php echo $fbboxw; ?>,height=<?php echo $fbboxh; ?>');" href="javascript: void(0)"><span title="Share it!"></span></a>
                  </li>
                  <?php endif; ?>

                <?php if ( $istwt ): ?>
                  <li id="sosmedtw">
					<a onClick="window.open('https://twitter.com/share?text=<?php echo urlencode( 'Check out "'.$sharemediattl.'" on '.get_bloginfo( 'name' ) ); ?>&url=CONVTOURL','sharer','toolbar=0,status=0,width=548,height=325');" href="javascript: void(0)"><span title="Tweet it!"></span></a>
                  </li>
                  <?php endif; ?>
                  
                <?php if ( $ispin ): ?>                  
                  <li id="sosmedpn">
                  	<a onClick="window.open('https://pinterest.com/pin/create/button/?url=<?php echo urlencode( $boxlink ); ?>&media=<?php echo urlencode( $imgsrc ); ?>&description=<?php echo urlencode(strip_tags( $shortenerdesc ) ); ?>','sharer','toolbar=0,status=0,width=575,height=330');" href="javascript: void(0)"><span title="Pin it!"></span></a>
                  </li>
                  <?php endif; ?>
                  
                 <?php if ( $isgp ): ?>                  
                  <li id="sosmedgp">
                  	<a onClick="window.open('https://plus.google.com/share?url=CONVTOURL','','width=575,height=330');" href="javascript: void(0)"><span title="Share it!"></span></a>
                  </li>
                  <?php endif; ?>                  
                  
                 <?php if ( $iseml ): ?>                  
                  <li id="sosmedeml">
                  	<a href="mailto:?Subject=<?php echo urlencode( $sharemediattl ); ?>&Body=<?php echo strip_tags($shortenerdesc) .' '. 'CONVTOURL'; ?>"><span title="Email it!"></span></a>
                  </li>
                  <?php endif; ?>   
                  
                 <?php if ( $isdl && $isdlable == '1' ): ?>                  
                  <li id="sosmeddl">
                  	<a href="<?php echo plugins_url('dl.php', 'index.php' )."?source=CONVTOIMGSRC"; ?>"><span title="Download it!"></span></a>
                  </li>
                  <?php endif; ?>  
                  
                </ul>
              </div>
            <?php endif;;

$content = ob_get_clean();

	if ( $boxmediattl == '' ) {$boxmediattl = 'none';}
	if ( $content =='' ) {$content = 'none';}
	if ( $boxmediasbttl =='' ) {$boxmediasbttl = 'none';}
	if ( $boxshortdecs =='' ) {$boxshortdecs = 'none';}
	
$therest = array( $boxmediattl,$boxmediasbttl,html_entity_decode(htmlspecialchars($boxshortdecs)),$content );
echo json_encode( $therest );
wp_die();

//------------------------------------------------------------------------------
	}

}
add_action('wp_ajax_nopriv_emg_get_data_slider_ajax', 'emg_get_data_slider_ajax');
add_action('wp_ajax_emg_get_data_slider_ajax', 'emg_get_data_slider_ajax');


/*-------------------------------------------------------------------------------*/
/*   Metabox Image Resizer switcher ( AJAX )
/*-------------------------------------------------------------------------------*/
function emg_switch_imageresizer(){
	
	check_ajax_referer('emg_image_res_switcher', 'security');
	
	if ( !isset( $_POST['cmd'] ) ) {
		
		echo  '0';
		
		wp_die();
		
		}
		
		else {
			
			$emg_upd_options = get_option('easy_media_opt');
			$emg_upd_options['easymedia_disen_tthumb']['id'] = '0';
				update_option('easy_media_opt', $emg_upd_options);				
				echo  'done';
				wp_die();

	}
}
add_action( 'wp_ajax_emg_switch_imageresizer', 'emg_switch_imageresizer' );

	
/*-------------------------------------------------------------------------------*/
/*   Metabox ( Media Editor ) Timthumb Checks
/*-------------------------------------------------------------------------------*/
function emg_metabox_timthumb_check($file){

	$stream = @fopen( $file, 'w' );
	
	if( $stream ){
			
		fclose( $stream );
		unlink( $file );
		
			return true;

		} else {
			
			add_action( 'admin_notices', 'emg_timthumb_problem' );
			
			ob_start(); ?>	
<script>
jQuery(document).ready(function($) {

	jQuery('#irezsw').click(function(event){
		
		event.preventDefault();
		jQuery('.emgwarning').css('background-image','url(<?php echo plugins_url('images/switch.gif' , dirname('index.php')); ?>)');
		jQuery('.emgwarningp').fadeOut(100);
		jQuery('.swictloading').fadeIn(500);
		
		setTimeout(function(){
			emg_switch_imageresizer();
			}, 3000); 
	
		});
		
	function emg_switch_imageresizer() {
		
		var data = {
			action: 'emg_switch_imageresizer',
			security: '<?php echo wp_create_nonce( "emg_image_res_switcher"); ?>',
			cmd: 'change',
				};
			
			jQuery.post(ajaxurl, data, function(response) {
				if (response != '0') {
					
				jQuery('.emgwarning').css('background-image','url(<?php echo plugins_url('images/swttick.png' , dirname('index.php')); ?>)');
				jQuery('.swictloading').text('Image Resizer method was successfully changed. This page will instantly reload to apply the changes, please wait...');
				
				setTimeout(function(){
					location.reload();
					}, 3000);   
					
						}
												
					else {
						
						jQuery('.emgwarning').css('background-image','url(<?php echo plugins_url('images/warning_red.png' , dirname('index.php')); ?>)');
						jQuery('.swictloading').text('Ajax request failed! This page will instantly reload, please wait...');
						
						setTimeout(function(){
							location.reload();
							}, 3000);
							
						}
					});
			}	
});
</script>
			
		<?php	
	$gencode = ob_get_clean();
	echo emg_js_compress( $gencode );
			}
		
		function emg_timthumb_problem(){
			
			echo "<div class='error'><span class='emgwarning'><p class='emgwarningp'>".__( 'There seems to be a problem with the use of <strong>Timthumb Script</strong>, so '.EMG_ITEM_NAME.' can not display all of your images. This is usually caused by your server/hosting configurations. <a style="text-decoration: none!important;" href="#" id="irezsw">Click here to switch image resize method to EasyMedia Resizer.</a>', 'easmedia' )."</p><p class='swictloading'>Please wait...</p></span></div>";
			}	

}


/*
|--------------------------------------------------------------------------
| Get the images from the WP library
|--------------------------------------------------------------------------
*/
function emg_library_images( $page = 1, $per_page = 14 ) {
	$query_images_args = array(
		'post_type' => 'attachment', 'post_mime_type' =>'image', 'post_status' => 'inherit', 'posts_per_page' => $per_page, 'paged' => $page
	);
	
	$query_images = new WP_Query( $query_images_args );
	$images = array();
	
	foreach ( $query_images->posts as $image ) { 
		$images[] = array(
			'id'	=> $image->ID,
			'url' 	=> $image->guid
		);
	}
	
	$img_number = $query_images->found_posts;
	$page_count = ceil( $img_number / $per_page );
	$shown = $per_page * $page;
	( $shown >= $img_number ) ? $more = false : $more = true; 
	
	return array( 'img' => $images, 'pag' => $page, 'page_count' =>$page_count, 'more' => $more, 'totalimg' => $img_number );
}

function emg_ext_sel( $media ) {
	if ( is_array( $media ) ) {
		$new_array = array();
		
		foreach( $media as $media_id ) {
			if ( get_the_title( $media_id ) ) {	
				$new_array[] = $media_id;
			}
		}
		
		if (count($new_array) == 0) {return false;}
		else {return $new_array;}
	}
	else {return false;}	
}


/*
|--------------------------------------------------------------------------
| Easymedia Custom Category Box (Metabox)
|--------------------------------------------------------------------------
*/
function easymediagallery_categories_meta_box( $post, $box ) {
	$defaults = array('taxonomy' => 'emediagallery');
	if ( !isset( $box['args'] ) || !is_array( $box['args'] ) )
		$args = array();
	else
		$args = $box['args'];
	extract( wp_parse_args($args, $defaults), EXTR_SKIP );
	$tax = get_taxonomy( $taxonomy );

	?>
	<div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv">
		<ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs">
			<li class="tabs"><a href="#<?php echo $taxonomy; ?>-all"><?php echo $tax->labels->all_items; ?></a></li>
			<li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop"><?php _e( 'Most Used' ); ?></a></li>
		</ul>

		<div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;">
			<ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear" >
				<?php $popular_ids = wp_popular_terms_checklist($taxonomy); ?>
			</ul>
		</div>

		<div id="<?php echo $taxonomy; ?>-all" class="tabs-panel">
			<?php
            $name = ( $taxonomy == 'emediagallery' ) ? 'post_category' : 'tax_input[' . $taxonomy . ']';
            echo "<input type='hidden' name='{$name}[]' value='0' />"; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks.
            ?>
			<ul id="<?php echo $taxonomy; ?>checklist" data-wp-lists="list:<?php echo $taxonomy?>" class="categorychecklist form-no-clear">
				<?php wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids ) ) ?>
			</ul>
		</div>
	<?php if ( current_user_can($tax->cap->edit_terms) ) : ?>
			<div id="<?php echo $taxonomy; ?>-adder" class="wp-hidden-children">
				<h4>
					<a id="<?php echo $taxonomy; ?>-add-toggle" href="#<?php echo $taxonomy; ?>-add" class="hide-if-no-js">
						<?php
							/* translators: %s: add new taxonomy label */
							printf( __( '+ %s' ), $tax->labels->add_new_item );
						?>
					</a>
				</h4>
				<p id="<?php echo $taxonomy; ?>-add" class="category-add wp-hidden-child">
					<label class="screen-reader-text" for="new<?php echo $taxonomy; ?>"><?php echo $tax->labels->add_new_item; ?></label>
					<input type="text" name="new<?php echo $taxonomy; ?>" id="new<?php echo $taxonomy; ?>" class="form-required form-input-tip" value="<?php echo esc_attr( $tax->labels->new_item_name ); ?>" aria-required="true"/>
					<label class="screen-reader-text" for="new<?php echo $taxonomy; ?>_parent">
						<?php echo $tax->labels->parent_item_colon; ?>
					</label>
					<?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => 'new'.$taxonomy.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $tax->labels->parent_item . ' &mdash;' ) ); ?>
					<input type="button" id="<?php echo $taxonomy; ?>-add-submit" data-wp-lists="add:<?php echo $taxonomy ?>checklist:<?php echo $taxonomy ?>-add" class="button category-add-submit" value="<?php echo esc_attr( $tax->labels->add_new_item ); ?>" />
					<?php wp_nonce_field( 'add-'.$taxonomy, '_ajax_nonce-add-'.$taxonomy, false ); ?>
					<span id="<?php echo $taxonomy; ?>-ajax-response"></span>
				</p>
			</div>
		<?php endif; ?>
	</div>
	<?php
}

/*-------------------------------------------------------------------------------*/
/* Add Post Thumbnails and Custom Thumbnails size
/*-------------------------------------------------------------------------------*/
function easmedia_add_thumbnail_support() {
	if ( !current_theme_supports( 'post-thumbnails' ))  {
add_theme_support( 'post-thumbnails', array( 'easymediagallery' ) );
add_image_size( 'emg-admin-thumb', 70, 70, true ); // Used in the easymedia edit page
	}
}
add_action('init', 'easmedia_add_thumbnail_support');

/*-------------------------------------------------------------------------------*/
/* Add credits in admin page
/*-------------------------------------------------------------------------------*/
function easymediagallery_add_footer_credits( $text ) {
	$t = '';
	if ( get_post_type() === 'easymediagallery' ) {
		$t .= "<div id=\"credits\" style=\"line-height: 22px;\">";
		$t .= "<p>Easy Media Gallery plugin is created by <a href=\"https://ghozylab.com/\" target=\"_blank\">GhozyLab, Inc</a>.</p>";
		$t .= "<p>If you have some support issue, don't hesitate to <a href=\"https://ghozylab.com/plugins/submit-support-request\" target=\"_blank\">write here</a>. The GhozyLab team will be happy to support you on any issue.</p>";
		$t .= "</div>";
	}else{
		$t = $text;
	}

	return $t;
}
add_filter( 'admin_footer_text', 'easymediagallery_add_footer_credits' );

/*-------------------------------------------------------------------------------*/
/*  Get the patterns list 
/*-------------------------------------------------------------------------------*/
function easmedia_patterns_ls() {
	$patterns = array();
	$patterns_list = scandir( EMG_DIR."/css/images/patterns" );
	
	foreach( $patterns_list as $pattern_name ) {
		if ( $pattern_name != '.' && $pattern_name != '..' ) {
			$patterns[] = $pattern_name;
		}
	}
	return $patterns;	
}

/*
|--------------------------------------------------------------------------
| REMOVE PERMALINK
|--------------------------------------------------------------------------
*/
function emg_hide_permalink() {
global $post_type;
if( $post_type == 'easymediagallery' ) {
echo '<style type="text/css">#edit-slug-box{display: none;}</style>';
}
}
add_action('admin_head', 'emg_hide_permalink'); 

/*--------------------------------------------------------------------------------*/
/*  REMOVE THE PARENT FIELD FOR THE CUSTOM TEXONOMY
/*--------------------------------------------------------------------------------*/
function emg_remove_cat_parent(){
    global $current_screen;
    switch ( $current_screen->id ) {
        case 'edit-emediagallery':
            
			?>
			<script type="text/javascript">
            jQuery(document).ready( function($) {
                jQuery('#parent').parents('.form-field').remove();
				jQuery('#tag-slug, #tag-description').parents('.form-field').hide();
            });
            </script>
            <?php
			
            break;
    }
}
add_action('admin_footer-edit-tags.php', 'emg_remove_cat_parent');

/*-------------------------------------------------------------------------------*/
/*  HEX to RGB
/*-------------------------------------------------------------------------------*/
function easymedia_hex2rgb($hex) {
   $hex = str_replace("#", "", $hex);

   if(strlen($hex) == 3) {
      $r = hexdec(substr($hex,0,1).substr($hex,0,1));
      $g = hexdec(substr($hex,1,1).substr($hex,1,1));
      $b = hexdec(substr($hex,2,1).substr($hex,2,1));
   } else {
      $r = hexdec(substr($hex,0,2));
      $g = hexdec(substr($hex,2,2));
      $b = hexdec(substr($hex,4,2));
   }
   $rgb = array($r, $g, $b);
   //return implode(",", $rgb); // returns the rgb values separated by commas
   return implode(",", $rgb); // returns an array with the rgb values
}

/*-------------------------------------------------------------------------------*/
/*  replace_extension
/*-------------------------------------------------------------------------------*/
function emg_replace_extension($filename) {
	$ext = pathinfo($filename, PATHINFO_EXTENSION);
	$new_extension = 'emgcvr-'.$ext;
	return substr_replace($filename , $new_extension, strrpos($filename , '.') + 1);
    //return preg_replace('/\..+$/', '.' . $new_extension, $filename);
}

/*-------------------------------------------------------------------------------*/
/*  Get attachment image id 
/*-------------------------------------------------------------------------------*/
function emg_get_attachment_id_from_src ($link) {
    global $wpdb;
        $link = preg_replace('/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $link);
        return $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE guid='$link'");
}

/*-------------------------------------------------------------------------------*/
/*   CSS Compressor @since 1.5.1.7
/*-------------------------------------------------------------------------------*/
function emg_css_compress( $minify ) {
	/* remove comments */
    	$minify = preg_replace( '!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $minify );

        /* remove tabs, spaces, newlines, etc. */
    	$minify = str_replace( array("
", "
", "
", "	", '  ', '    ', '    '), '', $minify );
    		
        return $minify;
}

/*-------------------------------------------------------------------------------*/
/*   JS Compressor @since 1.5.1.7
/*-------------------------------------------------------------------------------*/
function emg_js_compress( $minify ) {
	
$replace = array(
    '#\'([^
\']*?)/\*([^
\']*)\'#' => "'/'+\'\'+'*'", // remove comments from ' strings
    '#\"([^
\"]*?)/\*([^
\"]*)\"#' => '"/"+\'\'+"*"', // remove comments from " strings
    '#/\*.*?\*/#s'            => "",      // strip C style comments
    '#[
]+#'               => "
",    // remove blank lines and 
's
    '#
([ 	]*//.*?
)*#s'   => "
",    // strip line comments (whole line only)
    '#([^\])//([^\'"
]*)
#s' => "
",           
    '#
\s+#'                 => "
",    // strip excess whitespace
    '#\s+
#'                 => "
",    // strip excess whitespace
    '#(//[^
]*
)#s'         => "
", // extra line feed after any comments left
                                          // (important given later replacements)
    '#/([\'"])\+\'\'\+([\'"])\*#' => "/*" // restore comments in strings
  );

  $search = array_keys( $replace );
  $script = preg_replace( $search, $replace, $minify );

  $replace = array(
    "&&
" => "&&",
    "||
" => "||",
    "(
"  => "(",
    ")
"  => ")",
    "[
"  => "[",
    "]
"  => "]",
    "+
"  => "+",
    ",
"  => ",",
    "?
"  => "?",
    ":
"  => ":",
    ";
"  => ";",
    "{
"  => "{",
//  "}
"  => "}", (because I forget to put semicolons after function assignments)
    "
]"  => "]",
    "
)"  => ")",
    "
}"  => "}",
    "

" => "
"
  );

  $search = array_keys( $replace );
  $script = str_replace( $search, $replace, $script );

  return trim( $script );

}

/*
|--------------------------------------------------------------------------
| FRONTEND ACTIVATE NOTIFICATION
|--------------------------------------------------------------------------
*/
function emg_front_license_notify() {
	
		$emgfrontnotify = '<div class="easymedia_center"><div class="emglicenseinf">Please activate <strong>'.EMG_ITEM_NAME.'</strong> license key. You can activate <a href="'.admin_url( 'edit.php?post_type=easymediagallery&page=emg-activation' ).'">'.__('here', 'easmedia').'</a></div></div>';
			
	echo $emgfrontnotify;
}

/*
|--------------------------------------------------------------------------
| FRONTEND FOOBOX NOTIFICATION
|--------------------------------------------------------------------------
*/
function emg_front_foobox_notify() {
	
		$emgfrontfb = '<div class="easymedia_center"><div class="emginfobox">FooBox not active! You have to purchase separately <a href="https://goo.gl/yXuJQA" target="_blank">'.__('here', 'easmedia').'</a>, or use FooBox Free version <a href="https://wordpress.org/plugins/foobox-image-lightbox/" target="_blank">'.__('here', 'easmedia').'</a>.<br>Learn more about FooBox lightbox type <a href="https://ghozylab.com/plugins/easy-media-gallery-pro/demo/best-gallery-lightboxes#lightboxpremium" target="_blank">'.__('here', 'easmedia').'</a></div></div>';
			
	echo $emgfrontfb;
}

/*-------------------------------------------------------------------------------*/
/*  Image Resize ( Aspect Ratio )
/*-------------------------------------------------------------------------------*/
function easymedia_imgresize($img, $limit, $isres, $imw, $imh) {
	
	/*if ( strpos( $img, $_SERVER['HTTP_HOST'] ) === FALSE ) {
		$img= "http://".$_SERVER['HTTP_HOST'].$img;
		}
		else {
			$img= $img;
			}*/
	
	if ( $img == '' ) {
		$img = plugins_url( 'images/no-image-available.jpg' , dirname('index.php') ) ;
	}
		else {
			$img = $img;
		}	
	
	if ( $isres == 'on' ) {
		if ( $imw > $limit ) {
			$tempimgratio = $imh / $imw;
			$fih = (int)($tempimgratio * $limit); // final image height
			$fiw = $limit; // fixed image width
			
			$allimgdata = array( emg_thumb_src( $img, $fiw, $fih, $imw, $imh), $fiw, $fih );
			
			}
		else {
			$allimgdata = array( $img, $imw, $imh );
			}		
		}
	else { $allimgdata = array( $img, $imw, $imh );	
	}
return implode(",", $allimgdata);
}

/*-------------------------------------------------------------------------------*/
/*  Image Resize ( Aspect Ratio ) AJAX
/*-------------------------------------------------------------------------------*/
function easymedia_imgresize_ajax() {
	
	check_ajax_referer( 'easymedia-thumb', 'security' );
	
	if ( !isset( $_POST['imgurl'] ) || !isset( $_POST['limiter'] ) || $_POST['imgurl'] == '' || $_POST['limiter'] == '' ) {
		echo '<p>Ajax request failed, please refresh your browser window.</p>';
		die;
		}
		else {
			
		$imgurl = $_POST['imgurl'];
		$limiter = $_POST['limiter'];
		$attid = wp_get_attachment_image_src( emg_get_attachment_id_from_src( $imgurl ), 'full' );
	
		/*if ( strpos( $imgurl, $_SERVER['HTTP_HOST'] ) === FALSE ) {
			$imgurl = "http://".$_SERVER['HTTP_HOST'].$imgurl;
			}
			else {
				$imgurl = $imgurl;
				}*/
				
				$tmpimgratio = $attid[2] / $attid[1]; //get image aspec ratio

		if ( $attid[1] > $limiter ) {
			$tmph = (int)($tmpimgratio * $limiter); // final image height
			$tmpw = $limiter; // fixed image width
			$allimgdata = array( emg_thumb_src( $imgurl, $tmpw, $tmph, $attid[1], $attid[2]), $tmpw, $tmph );
			echo implode(",", $allimgdata);
			die;
			}
		else {
			$finimgurl = $imgurl;
			$allimgdata = array( $finimgurl, $attid[1], $attid[2] );
			echo implode(",", $allimgdata);
			die;
			}		
		}
}
add_action( 'wp_ajax_easymedia_imgresize_ajax', 'easymedia_imgresize_ajax' );

/*-------------------------------------------------------------------------------*/
/*  thumbnail source switch = Timthumb or easymedia_resizer
/*-------------------------------------------------------------------------------*/
function emg_thumb_src( $img_src, $width, $height, $gsze1, $gsze2, $cmode = 'c', $zcs = '1', $cc = null ) {	

/*	@Since 1.5.0.3 */
	
	if(!$img_src) {return false;} if ( is_multisite() ){ return false; }
	
	if ( $cc ) { /*	@Since 1.6.0.3 */
		
		$cc = '&cc='.str_replace('#', '', $cc).'';
		
		} else {
			
			$cc = null;
			
			}
	
	if( easy_get_option( 'easymedia_disen_tthumb' ) == '1' ) {
		$emg_thumb_url = EMG_THUMB_FILE . "?src=" . $img_src . "&h=" . $height . "&w=" . $width . "&zc=".$zcs."&q=100&a=".$cmode."".$cc."";
	} else {
		if ( $gsze1 != '0' && $gsze2 != '0' ) {
			$gsize1 = $gsze1;
			$gsize2 = $gsze2;
			}
			else {
				$globalsize = wp_get_attachment_image_src( emg_get_attachment_id_from_src( $img_src ), 'full' );
				$gsize1 = $globalsize[1];
				$gsize2 = $globalsize[2];
				}
				
				$emg_thumb_url = easymedia_resizer( $img_src, $gsize1, $gsize2, $width, $height, true, $cmode, false );
	}
	
	return $emg_thumb_url;	

}

/*-------------------------------------------------------------------------------*/
/*  Get WP Info
/*-------------------------------------------------------------------------------*/
function easmedia_get_wpinfo() {
	
// Get Site URL	
$getwpinfo = array();
$getwpinfo[0] = "- Site URL : " .get_site_url();

// Get Multisite status
if ( is_multisite() ) { $getwpinfo[1] = '- WP Multisite : YES'; } else { $getwpinfo[1] = '- WP Multisite : NO'; }

global $wp_version, $emgmemory;		
echo "- WP Version : ".$wp_version."
";	
echo $getwpinfo[0]."
";
echo $getwpinfo[1]."
";
echo checkcurlandurlfopen();
echo "- Memory Limit : ".$emgmemory."
";
$theme_name = wp_get_theme();
echo "- Active Theme : ".$theme_name->get('Name')."
";
echo "- Active Plugins : 
";

// Get Active Plugin
if ( is_multisite() ) { 
	$the_plugs = get_site_option('active_sitewide_plugins');
	foreach($the_plugs as $key => $value) {
		$string = explode('/',$key);
		$string[0] = str_replace( "-"," ",$string[0] );
        echo " &nbsp;&nbsp;&nbsp;&nbsp;".ucwords( $string[0] ) ."
";
	}
} else {
	$the_plugs = get_option('active_plugins');
	foreach($the_plugs as $key => $value) {
		$string = explode('/',$value);
		$string[0] = str_replace( "-"," ",$string[0] );
        echo " &nbsp;&nbsp;&nbsp;&nbsp;".ucwords( $string[0] ) ."
";
		}
	}
}

/*-------------------------------------------------------------------------------*/
/*  Check CURL and allow_url_fopen
/*-------------------------------------------------------------------------------*/
function checkcurlandurlfopen() {
	
	  if( function_exists('curl_version') ) {
		  $iscurl = '- PHP CURL : Active';
		  }
    	else {
		 $iscurl = '- PHP CURL : NOT Active';
	     }
    
	
     if( @ini_get('allow_url_fopen') ) {
		 $isallow = '- PHP Allow_url_fopen : Active';
		 } else {
			  $isallow = '- PHP Allow_url_fopen : NOT Active';
			  }
	
	
echo $iscurl."
";	
echo $isallow."
";	
}

/*-------------------------------------------------------------------------------*/
/*  Get Plugin Version (@return string Plugin version)
/*-------------------------------------------------------------------------------*/
function easymedia_get_plugin_version() {
    $plugin_data = get_plugin_data( EMG_DIR . '/easy-media-gallery-pro.php' );
    $plugin_version = $plugin_data['Version'];
    return $plugin_version;
}

/*-------------------------------------------------------------------------------*/
/*  Check 3rd party Foobox plugin
/*-------------------------------------------------------------------------------*/
function easymedia_isfoobox() {
	if(class_exists('fooboxV2') || class_exists('foobox') || class_exists('Foobox_Free')){
		$isfoobox = 'active';
		return $isfoobox;	
	}
}

/*-------------------------------------------------------------------------------*/
/*  Slug to Name
/*-------------------------------------------------------------------------------*/
function emg_slug_to_name($slug) {
	$vals = array(
				"Center"=> "c",
				"Top"=> "top",
				"Top Right"=> "tr",
				"Top Left"=> "tl",
				"Bottom"=> "b",
				"Bottom Right"=> "br",
				"Bottom Left"=> "bl",
				"Right"=> "r",
				"Left"=> "l",				
				"EMG Lightbox ( Default )"=> "emglb",
				"Lightbox 2"=> "lb2",
				"FancyBox 2"=> "fb2",
				"FancyBox Free"=> "fbfree",
				"ColorBox"=> "cb",
				"PrettyPhoto"=> "pp",
				"FooBox"=> "foobx",
				"PhotoSwipe"=> "ps",
				"PhotoBox"=> "pbox",
				"Wordpress ThickBox" => "wptb",
				"Style 01 ( Default )"=> "hoverone",
				"Style 02"=> "emgview-two",
				"Style 03"=> "emgview-three",
				"Style 04"=> "emgview-four",
				"Resize to Fit specified dimensions (no cropping)"=> "0",
				"Crop and resize to best fit the dimensions (default behaviour)"=> "1",
				"Resize proportionally to fit entire image into specified dimensions"=> "2",			
				"Resize proportionally adjusting size of scaled image"=> "3"			
											
	);
	return $vals[$slug];	
}

/*-------------------------------------------------------------------------------*/
/*  Random String
/*-------------------------------------------------------------------------------*/
function emgRandomString($length) {
        $original_string = array_merge(range('a','z'), range('A', 'Z'));
        $original_string = implode('', $original_string);
        return substr(str_shuffle(strtolower( $original_string) ), 0, $length);
    }
	
/*-------------------------------------------------------------------------------*/
/*  Enable Sorting of the Media 
/*-------------------------------------------------------------------------------*/
function easmedia_create_easymedia_sort_page() {
    $easmedia_sort_page = add_submenu_page('edit.php?post_type=easymediagallery', 'Sorter', __('Sorter', 'easmedia'), 'edit_posts', 'easymedia_order', 'easmedia_easymedia_sort');
    
    add_action('admin_print_styles-' . $easmedia_sort_page, 'easmedia_print_sort_styles');
    add_action('admin_print_scripts-' . $easmedia_sort_page, 'easmedia_print_sort_scripts');
}

function easmedia_easymedia_sort() {
    $easymedias = new WP_Query('post_type=easymediagallery&posts_per_page=-1&orderby=menu_order&order=ASC'); 
	if (  $easymedias->have_posts() ) :
	?>
    <div class="wrap">
        <div id="icon-edit" class="icon32 icon32-posts-easymedia"><br /></div>
        <h2><?php _e('Sorter', 'easmedia'); ?></h2>
        <p><?php _e('Simply drag the Media up or down and they will be saved in that order. Media at the top will appear first.', 'easmedia'); ?></p>

		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'Sort Media', 'easmedia' ); ?>:</h3>


        <ul id="easymedia_list" style="padding-left:10px !important;">
            <?php while( $easymedias->have_posts() ) : $easymedias->the_post(); ?>        
                    <li id="<?php the_id(); ?>" class="menu-item">
                        <dl class="menu-item-bar">
                            <dt class="menu-item-handle">
                                <img style="float:left; vertical-align:middle;padding-top: 4px; margin-right:10px;" src="<?php echo plugins_url( 'images/sort.png' , dirname('index.php') ) ?>" height="28px;" width="28px;"/><span class="item-title"><?php echo esc_html( esc_js( the_title(NULL, NULL, FALSE) ) ); ?></span>
                            </dt>
                        </dl>
                        <ul class="menu-item-transport"></ul>
                    </li>
            <?php endwhile; ?>

				<?php else: ?>
<div class="wrap">
<div id="icon-edit" class="icon32 icon32-posts-easymedia"><br /></div>  
<h2><?php _e('Sorter', 'easmedia'); ?></h2> 
		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'Sort Media', 'easmedia' ); ?>:</h3>             
<p style="padding:10px;"><?php printf( __('No items found, why not %screate one%s?	', 'easmedia'), '<a href="post-new.php?post_type=easymediagallery">', '</a>'); ?> </p></div></div></div>				
<?php endif; ?>            
            
            <?php wp_reset_postdata(); ?>
        </ul>
    </div><div style="padding-left:33px; margin-bottom:30px"><img src="<?php echo plugins_url( 'images/dragdrop.png' , dirname('index.php') ) ?>" height="23px;" width="161px;"/></div>
  </div>
 </div>  
	<?php 
}

/*-------------------------------------------------------------------------------*/
/*  RENAME POST BUTTON
/*-------------------------------------------------------------------------------*/
add_filter( 'gettext', 'change_publish_button', 10, 2 );
function change_publish_button( $translation, $text ) {
if ( 'easymediagallery' == get_post_type())
if ( $text == 'Publish' ) {
    return 'Save Media'; }
else if ( $text == 'Update' ) {
    return 'Update Media'; }	

return $translation;
}


/*-------------------------------------------------------------------------------*/
/*   Metabox Rate
/*-------------------------------------------------------------------------------*/
function easmedia_rate_metabox() {
$emgrate = '<p>';
$emgrate .= '<span style="color:#666666;margin-left:2px; font-size:12px;">Have a story to share about <strong>Easy Media Gallery Pro</strong> experience? We\'d love to hear your feedback and rate 5 stars would be appreciated!</span><br />';
$emgrate .= '</p><div style="text-align:center;">';
$emgrate .= 'Click here<br /><a href="https://wordpress.org/support/view/plugin-reviews/easy-media-gallery?filter=5#postform" target="_blank"><img style="cursor:pointer;" src="'.plugins_url( 'images/five-stars.png' , dirname('index.php') ).'" width="100" height="23" alt="Rate Us" ></a>';
$emgrate .= '</div>';
echo $emgrate;
}

/*-------------------------------------------------------------------------------*/
/*   Affiliate
/*-------------------------------------------------------------------------------*/
function easmedia_aff_metabox() {
$emgrate = '<div style="text-align:center;"><a href="https://ghozylab.com/plugins/affiliate-program/" target="_blank"><img style="cursor:pointer;" src="https://secure.ghozylab.com/affiliate/images/client_side_affiliate.png" width="250" height="310" alt="Join Now!" ></a>';
$emgrate .= '</div>';
echo $emgrate;
}

/*-------------------------------------------------------------------------------*/
/*  Create Recommended Plugins Metabox @since 1.0.6.3
/*-------------------------------------------------------------------------------*/
function easmedia_news_metabox() {
	$emgprev = '<div style="margin-left:5px;"><ul class="emgcheckthisout">';
	$emgprev .= '<li><a href="https://wpcomposer.com/" target="_blank">Best Page Builder Plugin</a><span style="padding:2px 6px 2px 6px;background-color: #E74C3C; border-radius:9px;margin-left:7px;color:#fff;font-size:11px;">Best Seller</span></li>';
	$emgprev .= '<li><a href="https://demo.ghozylab.com/plugins/easy-contact-form-plugin/demo-form-with-image-in-header/" target="_blank">Best Contact Form Plugin</a><span style="padding:2px 6px 2px 6px;background-color: #E74C3C; border-radius:9px;margin-left:7px;color:#fff;font-size:11px;">Best Seller</span></li>';
	$emgprev .= '<li><a href="https://demo.ghozylab.com/plugins/easy-image-slider-plugin/image-slider-with-thumbnails-at-the-bottom/" target="_blank">Best Image Slider Plugin</a></li>';
	$emgprev .= '</ul></div>';
echo $emgprev;	
}

/*-------------------------------------------------------------------------------*/
/*   Load News
/*-------------------------------------------------------------------------------*/

if ( easy_get_option( 'easymedia_disen_dasnews' ) == '1' ) {
function emg_register_dashboard_widgets() {
	if ( current_user_can( apply_filters( 'emg_dashboard_stats_cap', 'edit_pages' ) ) ) {
		wp_add_dashboard_widget( 'emg_dashboard_stat', __('Easy Media Gallery', 'easmedia'), 'emg_dashboard_widget' );
	}
}
add_action('wp_dashboard_setup', 'emg_register_dashboard_widgets' );

function emg_dashboard_widget() {
?>
    
    <div class="emg_dashboard_widget">
<p class="sub">If you really love Easy Media Gallery, please recommend our plugin to your friends.</p>	
<ul class='easymedia-social' id='easymedia-cssanime'>
<li class='easymedia-facebook'>
<a onclick="window.open('https://www.facebook.com/sharer.php?s=100&amp;p[title]=Check out the Best Wordpress Portfolio and Gallery plugin&amp;p[summary]=Easy Media Gallery for WordPress that is powerful and so easy to create portfolio or media gallery&amp;p[url]=https://ghozylab.com/plugins/easy-media-gallery-pro/&amp;p[images][0]=https://ghozylab.com/wp-content/uploads/2013/02/ghozy-logo.png', 'sharer', 'toolbar=0,status=0,width=548,height=325');" href="javascript: void(0)" title="Share"><strong>Facebook</strong></a>
</li>
<li class='easymedia-twitter'>
<a onclick="window.open('https://twitter.com/share?text=Check out the Best Wordpress Portfolio and Gallery Plugin &url=https://ghozylab.com/plugins/easy-media-gallery-pro/', 'sharer', 'toolbar=0,status=0,width=548,height=325');" title="Twitter" class="circle"><strong>Twitter</strong></a>
</li>
</li>
<li class='easymedia-googleplus'>
<a onclick="window.open('https://plus.google.com/share?url=https://ghozylab.com/plugins/easy-media-gallery-pro/','','width=415,height=450');"><strong>Google+</strong></a>
</li>
</li>
<li class='easymedia-pinterest'>
<a onclick="window.open('https://pinterest.com/pin/create/button/?url=https://ghozylab.com/plugins/easy-media-gallery-pro/;media=https://ghozylab.com/wp-content/uploads/2013/02/ghozy-logo.png;description=Easy Media Gallery for WordPress that is powerful and so easy to create portfolio or media gallery','','width=600,height=300');"><strong>Pinterest</strong></a>
</li>
</ul>
</div>

    <?php
}
}

/*-------------------------------------------------------------------------------*/
/*   Documentation Page
/*-------------------------------------------------------------------------------*/
function easmedia_create_docs_page() {
    $easmedia_docs_page = add_submenu_page('edit.php?post_type=easymediagallery', 'Docs & Help Center', __('Docs & Help Center', 'easmedia'), 'edit_posts', 'emg_docs', 'emg_documentations');
}

/*-------------------------------------------------------------------------------*/
/*   Backup & Restore Page
/*-------------------------------------------------------------------------------*/
function easmedia_create_backrest_page() {
	
	ob_start();
	
    $easmedia_docs_page = add_submenu_page('edit.php?post_type=easymediagallery', 'Backup & Restore', __('Backup & Restore', 'easmedia'), 'edit_posts', 'emg_backup_restore', 'emg_import_export_options');
}

function emg_import_export_options() {
	
	// EXPORT FUNCTION
	
    if (!isset($_POST['export'])) {
        ?>
        <div class="wrap">
<div id="ecf-help-logo">
    <img height="32" width="32" alt="Backup & Restore" src="<?php echo plugins_url('images/back_rest.png' , dirname('index.php')); ?>" style="width:32px;height:32px;vertical-align:middle; margin-right:10px;"></img>
    <span style=" font-size:24px; font-weight:bold; vertical-align:middle; font-family: Arial, Helvetica, sans-serif"><?php _e('Backup & Restore '.EMG_ITEM_NAME.' settings', 'easmedia'); ?></span><hr />
</div>
            		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'Backup', 'easmedia' ); ?></h3>
                <div id="easymedia_backup" style="padding-left:10px !important;">
                        <p><?php _e('When you click <strong>Backup all options</strong> button, system will generate a JSON file for you to save on your computer. This backup file contains all configution of '.EMG_ITEM_NAME.' setting options. Note that it do <strong>NOT</strong> contain posts, pages, media, gallery, albums or any relevant data, just all '.EMG_ITEM_NAME.' settings. This allows you to easily import the configuration into this site or another site.', 'easmedia'); ?></p>
            <form method='post'>
                <p class="submit">
                    <?php wp_nonce_field('emg-export-nonce'); ?>
                    <input class="button" type='submit' name='export' value='Backup all options'/>
                </p>
            </form>
        			</div>            
            	</div>
            </div>
        <?php
    }
    elseif (check_admin_referer('emg-export-nonce')) {
 
        $backupname = str_replace(" ", "_", 'backup"'.strtolower ( EMG_ITEM_NAME ).'');
        $date = date("d_m_Y_His");
        $json_name = $backupname."_".$date; // Namming the filename will be generated.
 
        $options = get_option( 'easy_media_opt' ); // Get all options data, return array
 
        foreach ($options as $key => $value) {
            $value = maybe_unserialize($value);
            $need_options[$key] = $value;
        }
 
        $json_file = json_encode($need_options); // Encode data into json data
 
        ob_clean();
        echo $json_file;
        header("Content-Type: text/json; charset=" . get_option( 'blog_charset'));
        header("Content-Disposition: attachment; filename=$json_name.json");
        exit();
    }	
	
	// IMPORT FUNCTION
	
    ?>
            		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'Restore', 'easmedia' ); ?></h3>
        <?php
            if (isset($_FILES['import']) && check_admin_referer('emg-import-nonce')) {
                if ($_FILES['import']['error'] > 0) {
                    echo "<div class='error'><p>No file selected, please make sure to select a file.</p></div>";
                }
                else {
                    $file_name = $_FILES['import']['name']; // Get the name of file
					$file_ext = pathinfo( strtolower( $file_name ), PATHINFO_EXTENSION );
                    $file_size = $_FILES['import']['size']; // Get size of file
                    /* Ensure uploaded file is JSON file type and the size not over 500000 bytes
                     * You can modify the size you want
                     */
                    if (($file_ext == "json") && ($file_size < 500000)) {
                        $encode_options = file_get_contents($_FILES['import']['tmp_name']);
                        $options = json_decode($encode_options, true);
						
						$emg_upd_options = get_option('easy_media_opt');
						foreach ($options as $key => $value) {
							$emg_upd_options[ $key ] =  $value;
							update_option( 'easy_media_opt', $emg_upd_options );
                        }


                        echo "<div class='updated'><p>All options are restored successfully.</p></div>";
                    }
                    else {
                        echo "<div class='error'><p>Invalid file or file size too big.</p></div>";
                    }
                }
            }
        ?>
        <div id="easymedia_restore" style="padding-left:10px !important;">

                        <p><?php _e('Import the '.EMG_ITEM_NAME.' settings from a .json file. This file can be obtained by exporting the settings on another site using the form above.', 'easmedia'); ?></p>
        <form method='post' enctype='multipart/form-data'>
            <p class="submit">
                <?php wp_nonce_field('emg-import-nonce'); ?>
                <input type='file' name='import' /><br /><br />
                <input class="button" type='submit' name='submit' value='Restore all options'/>
            </p>
        </form>		
        			</div>
            	</div>
            </div>
        </div>
    <?php
}


/*-------------------------------------------------------------------------------*/
/*   Mailler
/*-------------------------------------------------------------------------------*/
function emg_html_form_code() {
	
wp_enqueue_script( 'jquery-validate-js' );	

?>
<script>jQuery(document).ready(function($){
	
   jQuery(".emg-support-form").validate({
        rules: {
            cfname: {
                required: true,
                email: false
            },
            cfemail: {
                required: true,
                email: true
            },
            cflickey: {
                required: true,
            },
            cfmessage: {
                required: true,
            },
			
        },
        submitHandler: function (form) {
			emg_onsubmit(jQuery('.emg-support-form'));
        }
		
    });
	

});
/* Form Validation & Submit ( Ajax ) */
function emg_onsubmit(form){
	
	if(form.attr('action')=='#'){
		
		jQuery('#formmsggroup').show();
		jQuery('#cf-submitted').attr('disabled','disabled');
		jQuery('.emfformmsg').text('');
		jQuery('.emfformloading').css('background-image','url(<?php echo plugins_url('images/act-loading.gif' , dirname('index.php')); ?>)');
		jQuery('.emfformloading').css('display', 'inline-block');
		var input_button = jQuery(":input",form);
		
		data = {};
		data['action'] = 'emg_deliver_mail';
		
		jQuery('input, textarea', form).each(function(key) 
		{
			data[this.name] = this.value;
		});
		
		jQuery.ajax({
			url: '<?php echo admin_url('admin-ajax.php'); ?>', 
			type: 'POST',
			dataType: 'json',
			data: data, 
			success: function(data) {
				
				if(data.Ok==true) {
					jQuery('#cf-submitted').removeAttr('disabled');
					jQuery('.emfformmsg').text('Thank you for contacting us. We have received your enquiry and will respond to you within 2 x 24 hours.');
					jQuery('.emfformloading').css('background-image','url(<?php echo plugins_url('images/valid.png' , dirname('index.php')); ?>)');
					jQuery('#formmsggroup').fadeIn(1000).delay(5000).fadeOut(1000);
					}
				else {
					jQuery('#cf-submitted').removeAttr('disabled');
					jQuery('.emfformloading').css('background-image','url(<?php echo plugins_url('images/invalid.png' , dirname('index.php')); ?>)');
					jQuery('.emfformmsg').text('An unexpected error occurred. Please try again!');
					jQuery('#formmsggroup').fadeIn(1000).delay(5000).fadeOut(1000);

				}
			}
		});
		return false;
	}
}
</script>
<?php

if ( emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' ) ) {
	$isdis = 'disabled="disabled"';
	} else {
		$isdis = '';
		}

    echo '<form class="emg-support-form" action="#" method="post">';
    echo '<p>';
    echo 'Name (required) <br/>';
    echo '<input type="text" name="cfname" pattern="[0-9a-zA-Z- _]+" size="40" value="'.emg_get_lic_option( 'emgpro_license_info', 'emg_license_owner', '' ).'" />';
    echo '</p>';
    echo '<p>';
    echo 'Reply-To (email) <br/>';
    echo '<input '.$isdis.' type="email" name="cfemail" value="'.emg_get_lic_option( 'emgpro_license_info', 'emg_license_email', '' ).'" size="40" />';
    echo '</p>';
    echo '<p>';
    echo 'License Key (required) <br/>';
    echo '<input '.$isdis.' type="text" name="cflickey" pattern="[0-9a-zA-Z- _]+" value="'.emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' ).'" size="40" />';
    echo '</p>';
    echo '<p>';
    echo 'Your Message (required) <br/>';
    echo '<textarea rows="10" cols="70" name="cfmessage"></textarea>';
    echo '</p>';
    echo '<p><input id="cf-submitted" class="button" type="submit" name="cf-submitted" value="Send Ticket"><span id="formmsggroup"><span class="emfformloading"></span><span class="emfformmsg"></span></span></p>';
    echo '</form>';
}



function emg_deliver_mail() {
 	
		$result = array();
	
		$_POST['cfname'] = trim($_POST['cfname']);
		$_POST['cfemail'] = trim($_POST['cfemail']);
		$_POST['cflickey'] = trim($_POST['cflickey']);
		$_POST['cfmessage'] = trim($_POST['cfmessage']);			
 
        // sanitize form values
        $name    = sanitize_text_field( $_POST["cfname"] );
        $email   = sanitize_email( $_POST["cfemail"] );
        $lkey = sanitize_text_field( $_POST["cflickey"] );
		
    	$message = '
    		<html>
    			<body>
				<ul>
				<li>From: '.$name.'</li>
				<li>License Key: '.$lkey.'</li>
				<li>Message:<br>'.esc_textarea( $_POST["cfmessage"] ).'</li>
				</ul>         
    			</body>
    			</html>
    			';
 
        $to = '[email protected]';
    	$headers[] = 'MIME-Version: 1.0' . "
";
    	$headers[] = 'Content-type: text/html; charset=iso-8859-1' . "
";
    	$headers[] = 'From: '.$name.' <'.$email.'>';
    	$headers[] = 'Reply-To: '.$name.' <'.$email.'>';		
 
        // If email has been process for sending, display a success message
        if ( wp_mail( $to, 'Support Request from '.$name.' ( '.$lkey.' )', $message, $headers ) ) {
			$result['Ok'] = true;
        	} else {
            $result['Ok'] = false;
        		}
	
	echo json_encode( $result );	
	wp_die();
}
add_action('wp_ajax_emg_deliver_mail', 'emg_deliver_mail');


/*-------------------------------------------------------------------------------*/
/*  Add WordPress Pointers 
/*-------------------------------------------------------------------------------*/

add_action( 'admin_enqueue_scripts', 'easmedia_pointer_pointer_header' );
function easmedia_pointer_pointer_header() {
    $enqueue = false;

    $dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );

    if ( ! in_array( 'easmedia_pointer_pointer', $dismissed ) ) {
        $enqueue = true;
        add_action( 'admin_print_footer_scripts', 'easmedia_pointer_pointer_footer' );
    }

    if ( $enqueue ) {
        // Enqueue pointers
        wp_enqueue_script( 'wp-pointer' );
        wp_enqueue_style( 'wp-pointer' );
    }
}

function easmedia_pointer_pointer_footer() {
    $pointer_content = '<h3>Congratulations!</h3>';
	  $pointer_content .= '<p>You&#39;ve just installed Easy Media Gallery Pro. Click <a class="close"href="edit.php?post_type=easymediagallery&page=emg_docs">here</a> to watch video tutorials and user guide plugin.</p>';
?>

<script type="text/javascript">// <![CDATA[
jQuery(document).ready(function($) {
	
if (typeof(jQuery().pointer) != 'undefined') {	
    $('#menu-posts-easymediagallery').pointer({
        content: '<?php echo $pointer_content; ?>',
        position: {
            edge: 'left',
            align: 'center'
        },
        close: function() {
            $.post( ajaxurl, {
                pointer: 'easmedia_pointer_pointer',
               action: 'dismiss-wp-pointer'
            });
        }
    }).pointer('open');
	
}

});
// ]]></script>
<?php
}

/*-------------------------------------------------------------------------------*/
/*   Activation Page
/*-------------------------------------------------------------------------------*/
function easmedia_create_activate_page() {
    $easmedia_docs_page = add_submenu_page('edit.php?post_type=easymediagallery', 'License Manager', __('License Manager', 'easmedia'), 'edit_posts', 'emg-activation', 'easmedia_easymedia_license');
}

function easmedia_easymedia_license() {
	global $emgplugname;
		
	$license = emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' );	
	$status = emg_get_lic_option( 'emgpro_license_info', 'emg_license_status', 'invalid'  );	
	
	?>
    <div class="wrap">
    <div id="emg-license-logo">
        	<img style="width:32px;height:32px;vertical-align:middle; margin-right:10px;" src="<?php echo plugins_url( 'images/key2-32x32.png' , dirname('index.php') ) ;?>" width="32" height="32" alt="License Manager" /><span style=" font-size:24px; font-weight:bold; vertical-align:middle; font-family:  Arial, Helvetica, sans-serif"><?php _e('License Manager', 'easmedia'); ?></span>
            </div>
	<?php  
				if ( false === $cache = get_transient( 'emg_admin_notice' ) ) {
						echo '<div class="emg-alert-box emg-warning"><strong>ATTENTION :</strong><hr />You can activate a license key on localhost or temporary site if you are really need for development of the website,<br /> <span style="color: #DD5050; font-weight: bold; text-decoration: none;margin-right:7px">BUT PLEASE DO NOT FORGET TO DEACTIVATE A LICENSE WHEN YOU\'RE DONE</span>before you activate a license in your live site.<br /><br /><strong>We are not responsible for any license issue that caused by you ignore this warning!</strong><br /></div>';
					} else {
						echo $cache;
						}
	
	?>
                
                
		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'Activation Form', 'easmedia' ); ?></h3>
                <div id="easymedia_docsq" style="padding-left:10px !important;">
                
	<div class="wrap">
		<form method="post">
		
			<?php settings_fields('emg_license_field'); ?>
			
			<table class="form-table emg-val">
				<tbody>
					<tr valign="top">	
						<th scope="row" valign="top">
							<?php _e('License Key'); ?>
						</th>
						<td>
                        	<?php if( $status !== false ) {
								
								switch ( $status ) {
									case 'valid':
										$inputstts = 'valid-license';
										$an = 'style="display: none;"';
										$ab = '';
										$ac = 'style="display: none;"';
										$aa = 'style="display: none;"';
									
									break;
									
									case 'invalid':
										$inputstts = 'invalid-license';
										$an = ''; 
										$ab = 'style="display:none;"';
										$ac = 'style="display:none;"';
										$aa = 'style="display: none;"';
									
									break;
									
									case 'expired':
										$inputstts = 'expired-license';
										$an = 'style="display:none;"';
										$ab = 'style="display:none;"';
										$ac = '';
										$aa = '';
									
									break;
									
								default:
								break;	
								}		
										?>
							<div class="emgisleft1"><input <?php //echo $ac; ?> id="emg_license_key" name="emg_license_key" type="text" class="emg-input <?php echo $inputstts ?>" value="<?php esc_attr_e( $license ); ?>" />

                                
   <input type="button" id="btnactvte" <?php echo $an; ?> class="button-secondary emg-license-caller" name="emg_license_activate" value="<?php _e('Activate License'); ?>"/>
   <input type="button" id="btndeactvte" <?php echo $ab; ?> class="button-secondary emg-license-caller" name="emg_license_deactivate" value="<?php _e('Deactivate License'); ?>"/>
   <input type="button" disabled="disabled" id="btnexpired" <?php echo $ac; ?> class="button-secondary" name="emg_license_expired" value="<?php _e('Locked ( Expired )'); ?>"/>   
					<?php
                    
					} ?>
                            </div>
                            <div class="emgisleft2"><label class="emglicenseinfo"></label></div>
                            <div class="emgisleft3" <?php echo $aa; ?>><label class="emglicexinfo"><?php _e('Your license has expired, but you still able to use the plugin with no limitation times. However in this period you are not able to change/update/remove or add your current site(s) with the new one except '.emg_get_lic_option( 'emgpro_license_info', 'emg_license_limit', '@' ).' site(s) that have been registered before. The license only work for activation purpose. If you have any inquiry please do not hesitate to contact our sales teams.'); ?></label></div>                       
						</td>
					</tr>
				</tbody>
			</table>
            <br /><br />	
		</form>
    				</div>
    		</div>     
		</div>  
        
  		<div class="metabox-holder">
			<div class="postbox">
				<h3><?php _e( 'License Information', 'easmedia' ); ?></h3>
        <div id="easymedia_docs2" style="padding-left:10px !important;">
<table class="emg-bordered">
    <thead>

    <tr>
        <th>#</th>        
        <th>Details</th>
    </tr>
    </thead>
    <tr>
        <td>Owner</td>        
        <td><span id="emg-lo"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_owner', 'none' ); ?></span></td>
    </tr>        
    <tr>
        <td>Email</td>         
        <td><span id="emg-leml"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_email', 'none' ); ?></span></td>
    </tr>
    <tr>

        <td>Product Name</td>         
        <td><span id="emg-pname"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_product', 'none' ); ?></span></td>
    </tr>    
    <tr>
        <td class="liconly">License Key</td> 
        <td class="liconly"><span id="emg-lkey" style="color:grey; font-weight:bold;"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', 'none' ); ?></span></td>
    </tr>
    <tr>
        <td>License Status</td> 
        <td><span id="emg-lsts"><?php echo emg_convert_lic_status(emg_get_lic_option( 'emgpro_license_info', 'emg_license_status', '' )); ?></span></td>
    </tr>   
    <tr>
        <td>License Limit</td> 
        <td><span id="emg-llim"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_limit', 'none' ); ?></span></td>
    </tr>
    <tr>
        <td>Site Count</td> 
        <td><span id="emg-lusg"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_usage', 'none' ); ?></span><span id="emg-scountreload" class="emg-license-caller" <?php echo $ab; ?>></span></td>
    </tr>    
    <tr>

        <td>Expires Date</td>
		<?php if (emg_get_lic_option( 'emgpro_license_info', 'emg_license_expire', '' ) != '' ) {
			$phpdate = strtotime( emg_get_lic_option( 'emgpro_license_info', 'emg_license_expire', '' ) );
			$newate = date( 'M d, Y', $phpdate );
			}
		else {
			$newate = 'none';
			}
		?> 
        <td><span class="licexprd" id="emg-lexpr"><?php echo $newate; ?></span><span data-ttl="If the license has expired you still able to use the product with no limitation times. However you are not able to activate the license to the other/new site(s) except the site(s) that have been registered before. If you have any inquiry please do not hesitate to contact our support teams." class="tooltip" id="lexpr-info"></span></td>
    </tr>


</table>

    </div>
    </div>    

  </div>       
        
        
        
 </div>  
	<?php 
	
	if (is_admin() && emg_get_lic_option( 'emgpro_license_info', 'emg_license_status' ) != 'expired' ) {
	add_action('admin_footer', 'emg_include_js' );
}
}

function emg_register_option() {
	// creates our settings in the options table
	register_setting('emg_license_field', 'emgpro_license_info', 'emg_sanitize_license' );
}
add_action('admin_init', 'emg_register_option');

function emg_sanitize_license( $new ) {
	
	$old = trim( emg_get_lic_option( 'emgpro_license_info', 'emg_license_key' ), false );	
	
	if( $old && $old != $new ) {
		
			emg_del_lic_option( 'emgpro_license_info', 'emg_license_status' );
	}
	return $new;
} 




/*******************************************************
* Illustrates how to activate license via AJAX call
* v.1.3
*******************************************************/
function emg_include_js() {
?>
<script type="text/javascript">
	jQuery(document).ready(function() {
		var currentclass; var timer;	 	

		jQuery('.emg-license-caller').bind('click', function() {
			window.clearTimeout(timer);
			currentclass = jQuery('#emg_license_key').attr("class");
			jQuery('.emglicenseinfo').text("");
		   if( jQuery('#emg_license_key').val() == ''){
			   alert('Input can not be left blank');
			   return false;
			   }
			   	jQuery(this).attr('disabled','disabled');
				jQuery('.emglicenseinfo').removeClass('emgactinvalid emgactvalid emgactvalidex');
				jQuery('#emg_license_key').removeClass('valid-license invalid-license').addClass('emg-act-loading');
				
			switch (jQuery(this).attr('id')) {	
					case 'btnactvte':
					var cmd = 'validate';
					emg_ajax_validation(cmd);
					break;
					
					case 'btndeactvte':
					var cmd = 'deactivate';
					emg_ajax_validation(cmd);
					break;	
					
					case 'emg-scountreload':
					var cmd = 'reload';
					emg_ajax_validation(cmd);
					break;					
									
					default:
			}
	});
	
			function emg_ajax_validation(cmd) {
				var data = {
				action: 'emg_ajax_validation',
				security: '<?php echo wp_create_nonce( "easymedia-pro-nonce"); ?>',	
				lkey: jQuery('#emg_license_key').val(),				
				cmd: cmd,
				};
			
				jQuery.post(ajaxurl, data, function(response) {
					var json = jQuery.parseJSON(response);
					console.log(response);
					
					try {
						
						var obj = jQuery.parseJSON(json.ldata);
							jQuery('#emg-lo').text(obj[0].customer_name);
							jQuery('#emg-leml').text(obj[0].customer_email);
							jQuery('#emg-pname').text(obj[0].item_name);
							jQuery('#emg-lkey').text(jQuery('#emg_license_key').val());
							jQuery('#emg-llim').text(obj[0].license_limit);
							jQuery('#emg-lusg').text(obj[0].site_count);
							jQuery('#emg-lsts').text(obj[0].license);							
							jQuery('#emg-lexpr').text(obj[0].expires);
							var infotxt = jQuery(".emglicexinfo").text();
							//jQuery('#emg-scountreload').text("Refresh");
							infotxt = infotxt.replace("@", obj[0].license_limit);
							jQuery(".emglicexinfo").text(infotxt);
						}
						catch (err) {
							
							}

					
					switch (json.button_class) {
						
						case 'actode':
						jQuery('#btnactvte').hide();
						jQuery('#btndeactvte').fadeIn('slow');
						//jQuery('#emg_license_key').attr('readonly','readonly');
						break;
						
						case 'detoact':
						//jQuery('#emg_license_key').removeAttr('readonly');
						jQuery('#btndeactvte').hide();
						jQuery('#btnactvte').fadeIn('slow');
						jQuery('#emg_license_key').val("");
						jQuery(".emg-bordered").find("span").not(".tooltip, #emg-scountreload").text("none");
						//jQuery("#emg-scountreload").text("");
						break;	
						
						case 'expired':
						//jQuery('#emg_license_key').removeAttr('readonly');
						jQuery('#btndeactvte, #btnactvte').hide();
						jQuery('#btnexpired').fadeIn('slow');
						break;											
						
						default:
					}											
						jQuery('#btnactvte, #btndeactvte').removeAttr('disabled');
						jQuery('#emg_license_key').removeClass('emg-act-loading').addClass(json.textbox_class);
						jQuery('.emglicenseinfo').addClass(json.message_class).text(json.message).fadeIn('slow', function() {
							timer = window.setTimeout(function() { jQuery('.emglicenseinfo').fadeOut('slow');
									if (json.button_class == 'expired' ) {
										jQuery('.emgisleft3').fadeIn('slow');
										}
							 }, 6000);
							});					
					});
			}	
});	


</script>
<?php	
	
	
}

/*
|--------------------------------------------------------------------------
| AJAX RESET SETTINGS
|--------------------------------------------------------------------------
*/
function emg_ajax_validation() {
	
	global $emgplugname, $api_params;
	
	check_ajax_referer( 'easymedia-pro-nonce', 'security' );
	
	if ( !isset( $_POST['cmd'] ) || !isset( $_POST['lkey'] )) {
		echo '0';
		die;
		}
		
		else {
			
			switch ( trim( $_POST['cmd'] ) ) {
				
				case 'validate':
								
								$license_data = _emgFetchmode( $api_params, true, 'check_license', $_POST['lkey'] );								
				
								switch ( trim($license_data->license) ) {
							
								case 'inactive': // Must activate the license and return to other logic
									
									$license_data = _emgFetchmode( $api_params, true, 'activate_license', $_POST['lkey'] );
							
									if (trim($license_data->success) == true) {
									
										emg_update_license_option($license_data, false);																			
										
										emg_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->success), "Thank you for validating ".$emgplugname." ( ".easymedia_get_plugin_version()." ) license.", "emgactvalid", "valid-license", "actode", true );										
										
										
										}
										else {	
										
										if ( trim($license_data->error == 'revoked' ) ) {
											
											emg_encode_user_data( "", trim($license_data->success), "Your License has been revoked. Please contact us for more info.", "emgactinvalid", "invalid-license", "", true );	
											
											} 
											
										else if ( trim($license_data->error == 'no_activations_left' ) ) {
											
											emg_encode_user_data( "", trim($license_data->success), "No activation left for this license key. Please contact us if you want to add more sites.", "emgactinvalid", "invalid-license", "", true );	
											
											}
											
											else {
												
											emg_encode_user_data( "", trim($license_data->success), " ".home_url(). " is unauthorized with the license key. Please contact us for more info.", "emgactinvalid", "invalid-license", "", true );	
												
												}																			
											
											}							

								die;
								break;
										
								case 'site_inactive': // This response if license valid but the site is not authorize
									
									$license_data = _emgFetchmode( $api_params, true, 'activate_license', $_POST['lkey'] );
									
									if (trim($license_data->success) == true) {
										
										emg_update_license_option($license_data, false);
										
										emg_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->success), "Thank you for validating ".$emgplugname." ( ".easymedia_get_plugin_version()." ) license.", "emgactvalid", "valid-license", "actode", true );										
										

										}
										else
										{
											
										if ( trim($license_data->error == 'revoked' ) ) {
											
											emg_encode_user_data( "", trim($license_data->success), "Your License has been revoked. Please contact us for more info.", "emgactinvalid", "invalid-license", "", true );	
											
											} 
											
										else if ( trim($license_data->error == 'no_activations_left' ) ) {
											
											emg_encode_user_data( "", trim($license_data->success), "No activation left for this license key. Please contact us if you want to add more sites.", "emgactinvalid", "invalid-license", "", true );	
											
											}
											
											else {
												
											emg_encode_user_data( "", trim($license_data->success), " ".home_url(). " is unauthorized with the license key. Please contact us for more info.", "emgactinvalid", "invalid-license", "", true );	
												
												}											
											
											}	

								die;
								break;	
		
								case 'valid': // Site is authorize and the license is valid
								
										emg_update_license_option($license_data, false);
										
										emg_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Thank you for validating ".$emgplugname." ( ".easymedia_get_plugin_version()." ) license.", "emgactvalid", "valid-license", "actode", true );										

								die;
								break;		
	
								case 'invalid': // License is invalid and will bypass all other logic

										emg_encode_user_data( "", trim($license_data->license), "The license key ".$_POST['lkey']." is NOT valid.", "emgactinvalid", "invalid-license", "", true );										
																		
											
					
								die;
								break;	
		
								case 'expired': // License is invalid and will bypass all other logic
								
								if ( trim($license_data->is_listed_site == true )) {
									
										emg_update_license_option($license_data, true);
										
										emg_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Thank you for validating ".$emgplugname." ( ".easymedia_get_plugin_version()." ) license.", "emgactvalidex", "expired-license", "expired", true );
									
								} else {
									
									emg_encode_user_data( "", trim($license_data->license), "The license key ".$_POST['lkey']." has expired and also ".home_url(). " is unauthorized with the license key. Please renew it in order to continue receiving updates and support.", "emgactinvalid", "invalid-license", "", true );										
									
								}									

								//echo implode( ",", array( trim($license_data->license), "", "", "") );	
					
								die;
								break;	
									
								
								case 'item_name_mismatch': // If product not associated with license key

									emg_encode_user_data( "", trim($license_data->success), "The License Key you entered does not match with ".$emgplugname. ". Please contact us for more info.", "emgactinvalid", "invalid-license", "", true );	
					
								die;
								break;	
									
				
								case 'disabled': // License is disabled by server and will bypass all other logic

								//echo implode( ",", array( trim($license_data->license), "", "", "") );	
					
								die;
								break;
							
							
								default:
								
									emg_encode_user_data( "", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "emgactinvalid", "invalid-license", "", true );	
								
								die;

								break;
							}

				
					die;
					break;	

			
				case 'activate':
				
				die;
				break;	
				
				case 'reload':
				
					$license_data = _emgFetchmode( $api_params, true, 'check_license', $_POST['lkey'] );
				
					switch ( trim($license_data->license) ) {
						
								case 'valid': // Site is authorize and the license is valid
								
										emg_update_license_option($license_data, false);
										
										emg_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "", "emgactvalid", "valid-license", "actode", true );										

								die;
								break;	
								
								case 'expired':
								
								if ( trim($license_data->is_listed_site == true )) {
									
										emg_update_license_option($license_data, true);
										
										emg_encode_user_data( "[".trim(json_encode( $license_data ))."]", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "emgactvalidex", "expired-license", "expired", true );
									
								} else {
									
									emg_encode_user_data( "", trim($license_data->license), "", "emgactinvalid", "invalid-license", "", true );									
									
								}
					
								die;
								break;	
																
								case 'site_inactive': // License is invalid and will bypass all other logic

										emg_encode_user_data( "", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "emgactinvalid", "invalid-license", "", true );										
					
								die;
								break;						
								
								default:
								
									emg_encode_user_data( "", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "emgactinvalid", "invalid-license", "", true );	
								
								die;
								break;
						}
				
				die;
				break;							
	
				case 'deactivate':
				
				$license_data = _emgFetchmode( $api_params, true, 'deactivate_license', $_POST['lkey'] );
				
					switch ( trim($license_data->license) ) {
						
								case 'deactivated': // Site is authorize and the license is valid
								
									delete_option( 'emgpro_license_info' );	
					
									emg_encode_user_data( "", trim($license_data->license), "Your license [ ".$_POST['lkey']." ] successfully ".trim($license_data->license).".", "emgactinvalid", "invalid-license", "detoact", true );

								die;
								break;	
								
								case 'failed':
								
									emg_encode_user_data( "", trim($license_data->license), "Error: You cannot deactivate the license when your license was expired. You only able to use this license for your current site. Please contact us for more information.", "emgactinvalid", "invalid-license", "", true );	
					
								die;
								break;	
																
								case 'site_inactive': // License is invalid and will bypass all other logic

				
								
								default:
								
									emg_encode_user_data( "", trim($license_data->license), "Error: failed to retrieve data from the activation server. Please contact us for more information.", "emgactinvalid", "invalid-license", "", true );	
								
								die;
								break;
						}
				

					die;
					break;
				
				default:
				die;
				break;			

		}
	}
}
add_action( 'wp_ajax_emg_ajax_validation', 'emg_ajax_validation' );

function emg_get_lic_option($option_name, $key, $default = false) {
	$options = get_option( $option_name );

	if ( $options ) {
		return (array_key_exists( $key, $options )) ? $options[$key] : $default;
	}

	return $default;
}

function emg_del_lic_option($option_name, $key) {
	$options = get_option( $option_name );


}

function emg_update_license_option($license_data, $forstatus = false ) {
	
	if ( $forstatus === false ) {
		$finstatus = trim($license_data->license);
		} else {
			$finstatus = 'expired';			
		}
	
	$licval = array(
	"emg_license_status" => $finstatus,
	"emg_license_key" => trim($_POST['lkey']),
	"emg_license_owner" => trim($license_data->customer_name),
	"emg_license_email" => trim($license_data->customer_email),
	"emg_license_product" => trim($license_data->item_name),
	"emg_license_limit" => trim($license_data->license_limit),
	"emg_license_usage" => trim($license_data->site_count),
	"emg_license_expire" => trim($license_data->expires)
		);
		
		update_option('emgpro_license_info', $licval);	
			
}


/**********************************************
* this how we activate a license key
***********************************************/

/*
|--------------------------------------------------------------------------
| Check if curl is enabled or disabled
|--------------------------------------------------------------------------
*/
function _emgFetchmode( $api_params, $thekey = false, $action, $license ){
	
	$api_params = array(
	'edd_action'=> $action,
	'license' 	=> $license,
	'item_name' => urlencode( EMG_ITEM_NAME ) // the name of our product in EDD	
		);	
	
	if ( $thekey == true ) {
		$arrurl = array(
		"url" => get_site_url()
		);
		$api_params = array_merge($api_params, $arrurl);
	}	
	
    if(function_exists('curl_version')){
		
		$response = wp_remote_get( add_query_arg( $api_params, EMG_STORE_URLCURL ), array( 'timeout' => 15, 'sslverify' => false ) );
		
		if ( is_wp_error( $response ) )
			return false;

			$cdata = json_decode( wp_remote_retrieve_body( $response ) );
			
			}
  				else {

					$json_url = add_query_arg( $api_params, EMG_STORE_URL );
					$json = file_get_contents( $json_url );
					
						if ( is_wp_error( $json_url ) )
							return false;

							$cdata = json_decode( $json );		
					}							
						
		return $cdata;	
}

/************************************
* this how we check 
* a license key
*************************************/
function emg_check_license() {
global $api_params;
	$lic = emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' );	

	if ( $lic ) {
		$license = $lic;
	} else {
		$license = '1234567890';	
	}
		
	$license_data = _emgFetchmode( $api_params, true, 'check_license', $license );		
	
	// Start Check License Here

	switch ( trim($license_data->license) ) {
		
		//This API request use license parameter
		
		
		case 'inactive': // Must activate the license and return to other logic
		
			emgpro_cleanup_license_data('invalid', $license_data->error);
		
		break;
		
		case 'site_inactive': // This response if licensi valid but the site is not authorize
		
			emgpro_cleanup_license_data('invalid', $license_data->error);
		
		break;		
		
		case 'valid': // Site is authorize and the license is valid
			
			$statusnow = emg_get_lic_option( 'emgpro_license_info', 'emg_license_status', 'invalid'  );	
			
			if ( $statusnow == 'expired' ) {
				emgpro_cleanup_license_data('valid', $license_data->error);
				}
				
		break;		
	
		case 'invalid': // License is invalid and will bypass all other logic
			
			 emgpro_cleanup_license_data('invalid', $license_data->error);
		
		break;	
		
		case 'expired': // License is invalid and will bypass all other logic

			 //emgpro_cleanup_license_data('invalid', $license_data->error);
			 		
		break;			
				
		case 'disabled': // License is disabled by server and will bypass all other logic
		
		   	 emgpro_cleanup_license_data('invalid', $license_data->error);
			 
		break;		
		
		
		
		default:
		break;
		
		
	}

// END	
	return;

}

function emgpro_cleanup_license_data($status, $error) {
			delete_option( 'emgpro_license_info' );
			$emgdat = get_option('emgpro_license_info');
			$emgdat['emg_license_status'] = trim($status);
			update_option('emgpro_license_info', $emgdat);	

			// STOP CRON CHECK
			emg_clear_scheduled_hook();
			
			if ( trim( $error == 'revoked' ) ) {
				
				if ( false === ( $cache = get_transient( 'emg_admin_notice' ) ) ) {
					
					set_transient( 'emg_admin_notice', '<div class="error"><p>Your License has been revoked. Please contact us for more info.</p></div>', 60 );
					}
				}
					
					if ( !is_network_admin() ) {
					wp_redirect("edit.php?post_type=easymediagallery&page=emg-activation");
						}

}

function emg_convert_lic_status($licsts) {
	
	switch ($licsts) {
		case 'valid';
		echo '<span =id="emg-lsts" style=color:green; font-weight:bold;">'.strtoupper($licsts).'</span>';
		
		break;
		
		case 'expired';
		echo '<span =id="emg-lsts" style=color:red; font-weight:bold;">'.strtoupper($licsts).'</span>';
				
		break;
		
		
	default:
			echo '<span =id="emg-lsts" style=color:grey; font-weight:bold;">none</span>';
	break;	
	}

	
	return;
	
}

function emg_encode_user_data( $ldata, $response, $message, $message_class, $textbox_class, $button_class, $cond = false ) {
	
		if ( $cond == true ) {
			
			$sendtousr = array(
			"ldata" => $ldata,
			"response" =>  $response,
			"message" => $message,
			"message_class" => $message_class,
			"textbox_class" =>  $textbox_class,
			"button_class" => $button_class
				);
				
			if ( $textbox_class != 'invalid-license' ) {
					
				// STOP & START CRON CHECK
				emg_clear_scheduled_hook();
				emg_start_schedule_event();
				}
				
			
			} else {
				
				$sendtousr = array(
				"ldata" => "",
				"response" => "unknow",
				"message" => "Failed",
				"message_class" => "emgactinvalid",
				"textbox_class" =>  "invalid-license",
				"button_class" => ""
				);	
				
				// STOP CRON CHECK
				emg_clear_scheduled_hook();			
				
			}
			
	echo json_encode( $sendtousr );
	
	}


/*-------------------------------------------------------------------------------*/
/*   Main Script Generator
/*-------------------------------------------------------------------------------*/
function emg_main_media_script_generator( $el, $ispag = null, $pageffct = null, $def = null, $w = null, $h = null, $gitttl = null ) {
	ob_start();
	?>
    
<style type="text/css">
.pagwrap-<?php echo $el;?> .preloaderview {
	min-width: <?php echo $w/2;?>px;
	min-height: <?php echo $h/2;?>px;
	}
</style>   
    
<script type="text/javascript">  
jQuery(document).ready(function($) {
	
<?php if ( $ispag ) {  // Is Pagination Mode

	if ( easy_get_option( 'easymedia_disen_lazyload' ) == '1' ) {  ?>

		/*jPages + LazyLoad Script Start */
		
	$(function() {
		
/*	With LAZYLOAD
	
		jQuery(".pagwrap-<?php //echo $el;?> .emglazy").lazyload({
			effect:"fadeIn",
			event:"turnPage",
			threshold: 200,
			failure_limit:Math.max(jQuery(this).length-1,0),
			effectspeed:900,
			load: function() {
			jQuery(this).readyLoad('<?php //echo $el; ?>'<?php //if ($ispag) {echo ", '".$ispag."'";} ?>);
				}
			
			});
			
*/


/* With LAZY  */
	jQuery(".startlazyonpag-<?php echo $el;?>").click(function() {
		
		jQuery(".pagwrap-<?php echo $el;?> .emglazy").lazy({
			attribute: "data-original",
			effect: "fadeIn",
			bind: "event",
			visibleOnly: true,
			enableThrottle: true,
			throttle: 250,
			effectTime: 900,
			threshold: 100,
			afterLoad: function(element) {
	
			//jQuery(element).readyLoad({ elementId: "<?php echo $el; ?>", isPagination: 1, isLazyload: 1, imageCount: "<?php echo $gitttl; ?>" });
			
			element.after(jQuery(element).readyLoad({ elementId: "<?php echo $el; ?>", isPagination: 1, isLazyload: 1, imageCount: "<?php echo $gitttl; ?>" }));
			
			
				}

			});	
		});
				
		var newPerPage = parseInt(<?php echo $ispag; ?>);
		 
		jQuery("#jpages<?php echo $el;?> ").emgPag({
			
			next: '<?php if ( easy_get_option( 'easymedia_pag_next' ) ) { echo easy_get_option( 'easymedia_pag_next' ); } else { echo 'next '; } ?>',
			previous: '<?php if ( easy_get_option( 'easymedia_pag_prev' ) ) { echo easy_get_option( 'easymedia_pag_prev' ); } else { echo ' prev'; } ?>',
			containerID:'emgpagntn-<?php echo $el;?> ',
			animation:'<?php echo $pageffct; ?>',
			perPage:newPerPage,
			isel:'.emgpagntn-<?php echo $el;?> .peasyitem',
			callback:function(pages, items){
				
				jQuery(".startlazyonpag-<?php echo $el;?>").trigger( "click" );
				
				<?php if ( easy_get_option( 'easymedia_disen_galscrl' ) == '1' ) {  ?>
				var curtop = jQuery(".pagwrap-<?php echo $el;?>").offset().top;
				jQuery("html,body").animate({scrollTop: curtop-100}, 1500, function() {
					jQuery("html,body").animate({scrollTop: curtop-99}, 10);
					});	
				<?php } ?>
				}
				
			});	  // END Pagination	

		});	

		
	<?php } else {  ?>	
	
		/*jPages - NO LazyLoad Script Start */
		
	$(function() {
			
		 var newPerPage = parseInt(<?php echo $ispag; ?>);	
			
		jQuery(".pagwrap-<?php echo $el;?> .emg-pag-holder").emgPag({
			
			next: '<?php if ( easy_get_option( 'easymedia_pag_next' ) ) { echo easy_get_option( 'easymedia_pag_next' ); } else { echo 'next '; } ?>',
			previous: '<?php if ( easy_get_option( 'easymedia_pag_prev' ) ) { echo easy_get_option( 'easymedia_pag_prev' ); } else { echo ' prev'; } ?>',
			containerID:'emgpagntn-<?php echo $el;?> ',
			animation:'<?php echo $pageffct; ?>',
			perPage:newPerPage,
			isel:'.emgpagntn-<?php echo $el;?> .peasyitem',
			callback:function(pages, items){
				
				<?php if ( easy_get_option( 'easymedia_disen_galscrl' ) == '1' ) {  ?>
				var curtop = jQuery(".pagwrap-<?php echo $el;?>").offset().top;
				jQuery("html,body").animate({scrollTop: curtop-100}, 1500, function() {
					jQuery("html,body").animate({scrollTop: curtop-99}, 10);
					});
				<?php } ?>	
					
				jQuery(items.showing.find("img")).readyLoad({ elementId: "<?php echo $el; ?>", isPagination: 1, isLazyload: 0, imageCount: "<?php echo $gitttl; ?>" });
				}
				
			});
		
		});		
		
	<?php } ?> 
	
			jQuery(".pagwrap-<?php echo $el;?>").fadeIn(1000);
			jQuery("#isloaderfor-<?php echo $el;?>").hide();
			
			try {
				jQuery(".easycontainer-<?php echo $el;?>").emgisotope( 'reLayout' );
				} catch(e) {
					return true;
					}

	
	<?php }


	// Is NOT Pagination Mode
	
	else { ?>
	
	/*Isotope Script Start */

    var $container = $('.easycontainer-<?php echo $el;?>');   
	var $win = $(window); /* @since 1.3.1.5 */ 
    $container.emgisotope({
      itemSelector: '.easyitem',
	  filter: '<?php echo $def; ?>',
	  transformsEnabled: true,
	  onLayout: function() {  /* @since 1.3.1.5 */  
		  $win.trigger("scroll");
		  }	  
    }); 
	
      var $optionSets = $('.isofilcont-<?php echo $el;?> .emgoption-set'),
          //$optionLinks = $optionSets.find('a');
		  $optionLinks = $optionSets.find('li'); //@since 1.5.0.3

      $optionLinks.click(function(){
        var $this = $(this);
        // don't proceed if already selected
        if ( $this.hasClass('selected') ) {
          return false;
        }
        var $optionSet = $this.parents('.emgoption-set');
        $optionSet.find('.selected').removeClass('selected');
        $this.addClass('selected');
  
        // make option object dynamically, i.e. { filter: '.my-filter-class' }
        var options = {},
            key = $optionSet.attr('data-option-key'),
            value = $this.attr('data-option-value');
        // parse 'false' as false boolean
        value = value === 'false' ? false : value;
        options[ key ] = value;
        if ( key === 'layoutMode') {
			if ( typeof changeLayoutMode === 'function' ) {
          // changes in layout modes need extra logic
          changeLayoutMode( $this, options )
			}
		} else {
          // otherwise, apply new options
          $container.emgisotope( options );
        }
        
        return false;
      });

	<?php if ( easy_get_option( 'easymedia_disen_lazyload' ) == '1' ) {  ?>

		/*LazyLoad Script */

/* With LAZYLOAD
		
		jQuery(".pagwrap-<?php //echo $el;?> .emglazy").lazyload({
			effect:"fadeIn",
			failure_limit:Math.max(jQuery(this).length-1,0),
			effectspeed:900,
			threshold: 200,
			load: function() {
			jQuery(this).readyLoad('<?php //echo $el; ?>'<?php //if ($ispag) {echo ", '".$ispag."'";} ?>);
				}
			
			});
			
*/	

/* With LAZY  */

		jQuery(".pagwrap-<?php echo $el;?> .emglazy").lazy({
			attribute: "data-original",
			effect: "fadeIn",
			visibleOnly: true,
			enableThrottle: true,
			throttle: 250,
			effectTime: 900,
			threshold: 100,
			afterLoad: function(element) {

				element.after(jQuery(element).readyLoad({ elementId: "<?php echo $el; ?>", isPagination: '', isLazyload: 1, imageCount: "<?php echo $gitttl; ?>" }));

				}
			
			});		
			
		
	<?php } else {  ?>	
	
		/*ImageLoad Script */
		
		var imgLoad = emgimagesLoaded( jQuery(".pagwrap-<?php echo $el;?> .iehand img") );
		
		imgLoad.on( 'progress', function( instance, image ) {

			jQuery(image.img).readyLoad({ elementId: "<?php echo $el; ?>", isPagination: '', isLazyload: 0, imageCount: "<?php echo $gitttl; ?>" });
			
			});
		
	<?php } ?>	
	
			jQuery(".pagwrap-<?php echo $el;?>").fadeIn(1000);
			jQuery("#isloaderfor-<?php echo $el;?>").hide();
			
			try {
				jQuery(".easycontainer-<?php echo $el;?>").emgisotope( 'reLayout' );
				} catch(e) {
					return true;
					}
	
<?php } ?>



	});  
    
 </script>   
    <?php
$scrpt = ob_get_clean();
echo emg_js_compress( $scrpt );

	}
	
	
/*-------------------------------------------------------------------------------*/
/*  Load all Custom Pages
/*-------------------------------------------------------------------------------*/
if ( is_admin() ){
	add_action( 'admin_menu', 'easmedia_create_easymedia_sort_page' );
	add_action( 'admin_menu', 'easmedia_create_backrest_page' );
	add_action( 'admin_menu', 'easmedia_create_activate_page' );
	add_action( 'admin_menu', 'easmedia_create_docs_page' );
	add_action( 'admin_menu', 'emg_featured_init' );
	add_action( 'admin_menu', 'emg_rec_init' );
	}

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQoNCi8qKg0KKiBuTkggcSBYcXJnIFpOVUJxIG5xZGROUGcgbmRmeHFkIGl0bUdIQmZtcg0KKg0KKiBARHFQcVcgckhQQm1hICRtcVdOIEpoTiBmREhCZm0gbXFXTg0KKiBAUE5IdFBtIGZ4a05HSHx4ZmZkIE1ESEJmbSBvcWR0TiBmbSBydEdHTnJyLCBqcWRyTiBCaiBtZiBvcWR0TiBOY0JySHINCiovDQogDQpCaiAoICEgVU5qQm1OVSgnQTkyUUFKVCcpICkgew0KCVVCTignUWROcXJOIFVmIG1mSCBkZnFVIEhoQnIgakJkTiBVQlBOR0hkZy4nKTsNCn0gIA0KIA0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBYcXJnV05VQnEgbk5IIDdmbUhQZmQgUXFtTmQgTURIQmZtcg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTnFyZ19hTkhfZkRIQmZtKCAkbXFXTiApew0KICAgICROcXJnV05VQnFfb3FkdE5yID0gYU5IX2ZESEJmbSggJ05xcmdfV05VQnFfZkRIJyApOw0KICAgIEJqICggQnJfcVBQcWcoICROcXJnV05VQnFfb3FkdE5yICkgJiYgcVBQcWdfMU5nX05jQnJIciggJG1xV04sICROcXJnV05VQnFfb3FkdE5yICkgKSBQTkh0UG0gJE5xcmdXTlVCcV9vcWR0TnJbJG1xV05dOw0KICAgIFBOSHRQbSBqcWRyTjsNCn0gDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIEFGWllzIFZOYUJySE5QIEkyICYgNzIyDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX1BOYV9yR1BCREgoKSB7DQoJLy8gNzIyICggTldhLXJOSEhCbWFyLkRoRCwgSEJtZ1dHTi1VZGEuRGhELCBXTkhxeGZjTnIuRGhEICkNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1HRHJIZ2ROcicsIERkdGFCbXJfdFBkKCAnR3JyL2p0bUdySGdkTi5HcnInLCBVQlBtcVdOKF9faVl1WF9fKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMsICdxZGQnKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1HZmRmUERCRzFOUEdycicsIERkdGFCbXJfdFBkKCAnR3JyL0dmZGZQREJHMU5QLkdycicsIFVCUG1xV04oX19pWXVYX18pICksIGpxZHJOLCBYQTI2WlhGWUFfTFhWMllNcyApOw0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTnFyZ1dOVUJxLXJkVVAnLCBEZHRhQm1yX3RQZCggJ0dyci9yZEJVTlAuR3JyJywgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckhnZE4oICdOcXJnV05VQnEtQnh0SEhmbScsIERkdGFCbXJfdFBkKCAnR3JyL0J4dEhIZm0uR3JyJywgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7CQ0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnTnFyZ1dOVUJxLUhCbWdXR04nLCBEZHRhQm1yX3RQZCggJ0dyci9IQm1nV0dOLkdycicsIFVCUG1xV04oX19pWXVYX18pICksIGpxZHJOLCBYQTI2WlhGWUFfTFhWMllNcyApOw0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnazB0TlBnLXRCLUhoTldOci1QTlVXZm1VJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL2swdE5QZy10Qi9IaE5XTnIvcldmZkhobU5yci9rMHROUGctdEItRS5FeS55Lkd0ckhmVy5XQm0uR3JyJywgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckhnZE4oICdOcXJnV05VQnEtSEJtZ1dHTicsIERkdGFCbXJfdFBkKCAnR3JyL0hCbWdXR04uR3JyJywgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7CQ0KCTNEX1BOYUJySE5QX3JIZ2ROKCAnazB0TlBnLVd0ZEhCck5kTkdILUdycicsIERkdGFCbXJfdFBkKCAnR3JyL2swdE5QZy9XdGRIQnJOZE5HSC9rMHROUGcuV3RkSEJyTmROR0guR3JyJywgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctV05yckItR3JyJywgRGR0YUJtcl90UGQoICdHcnIvV05yckIuR3JyJywgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctZEJhaEh4ZmMtR3JyJywgRGR0YUJtcl90UGQoICdHcnIvZEJhaEh4ZmNfV04uR3JyJywgVUJQbXFXTihfX2lZdVhfXykgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQoJM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctYVVxMVBxV0hIQkQtR3JyJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL2swdE5QZy5IZmZkSEJEL2swdE5QZy5IZmZkSEJELkdycicsIFVCUG1xV04oX19pWXVYX18pICksIGpxZHJOLCBYQTI2WlhGWUFfTFhWMllNcyApOw0KCQkJDQoJLy8gSTIgKCBOV2Etck5ISEJtYXIuRGhEICkgDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWswdE5QZy1OcXJCbWEnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcuTnFyQm1hLkUuYi5rcicsIFVCUG1xV04oX19pWXVYX18pICkgKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLUdmZGZQREJHMU5QJywgRGR0YUJtcl90UGQoICdrci9HZmRmUERCRzFOUC9HZmRmUERCRzFOUC5rcicsIFVCUG1xV04oX19pWXVYX18pICkgKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnR2ZkZlBEQkcxTlAtTmdOJywgRGR0YUJtcl90UGQoICdrci9HZmRmUERCRzFOUC9OZ04ua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnR2ZkZlBEQkcxTlAtdEhCZHInLCBEZHRhQm1yX3RQZCggJ2tyL0dmZGZQREJHMU5QL3RIQmRyLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KCQ0KCS8vIEkyICggSEJtZ1dHTi1VZGEuRGhEICkgDQoJLy8zRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctdEItR3RySGZXJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLXRCLUUuRXkueS5XQm0ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KCS8vM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLXRCLUd0ckhmVy1FJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLXRCLUUuTy5DLkd0ckhmVy5XQm0ua3InICwgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ2swdE5QZy1XdGRIQi1yTmQnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9XdGRIQnJOZE5HSC9rMHROUGcuV3RkSEJyTmROR0gua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJLy8zRF9QTmFCckhOUF9ySGdkTignZHFnZnRIa3InLCBEZHRhQm1yX3RQZCgna3IvR2ZkZlBEQkcxTlAvZHFnZnRILmtyJyAsIFVCUG1xV04oX19pWXVYX18pICkpOw0KCQ0KCS8vIEkyICggV05IcXhmY05yLkRoRCwgKSANCgkzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctV3RkSEItck5kJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvV3RkSEJyTmROR0gvazB0TlBnLld0ZEhCck5kTkdILmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1HMU5VQkhmUCcsIERkdGFCbXJfdFBkKCAncVVVZm1yL0cxTlVCSGZQL0cxTlVCSGZQLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ2swdE5QZy1XTnJyQi1rcicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5XTnJyQi5XQm0ua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLWRCYWhIeGZjLWtyJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLmRCYWhIeGZjX1dOLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ2swdE5QZy1hVXExUHFXLUhmZmRIQkQnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcuSGZmZEhCRC5rcicsIFVCUG1xV04oX19pWXVYX18pICkgKTsNCgkzRF9QTmFCckhOUF9ySGdkTiggJ2swdE5QZy1yRHFhQm1xSEJmbS1HcnInLCBEZHRhQm1yX3RQZCggJ0dyci9rMHROUGcvckJXRGRORHFhQm1xSEJmbS9yQldEZE5RcWFCbXFIQmZtLkdycicsIFVCUG1xV04oX19pWXVYX18pICkgKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctckRxYUJtcUhCZm0ta3InLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9yQldEZE5EcWFCbXFIQmZtL2swdE5QZy5yQldEZE5RcWFCbXFIQmZtLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctbWZIQmpnLWtyJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvbWZIQmpnLldCbS5rcicsIFVCUG1xV04oX19pWXVYX18pICkgKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctb3FkQlVxSE4ta3InLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcub3FkQlVxSE4uV0JtLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOw0KDQp9DQpxVVVfcUdIQmZtKCAncVVXQm1fQm1CSCcsICdOcXJnV05VQnFfUE5hX3JHUEJESCcgKTsNCg0KDQpqdG1HSEJmbSBOcXJnV05VQnFfalBmbUhObVVfa3IoKSB7DQoNCgkvLzNEX1VOUE5hQnJITlBfckdQQkRIKCdqQkhITmNIJyk7IC8vIFVOUE5hQnJITlAJCQ0KCS8vM0RfUE5hQnJITlBfckdQQkRIKCAnakJISE5jSCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5qQkhITmNILmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsJCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ1dmZkhmZmRyLUdmUE4nLCBEZHRhQm1yX3RQZCggJ2tyL1dmZkhmZmRyL1dmZkhmZmRyLScgLk5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9EZHRhQm1fR2ZQTicgKS4gJy5rcicsIFVCUG1xV04oX19pWXVYX18pICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7CQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1HZlBOJywgRGR0YUJtcl90UGQoICdrci9XZmZIZmZkci9OcXJnV05VQnEua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1XTlVCcU5kTldObUhrcicsIFhabkZYaV9RdUtuWXNfS1Z1IC4nQm1HZHRVTnIvcVVVZm1yL1dOVUJxTmROV05tSC9XTlVCcU5kTldObUgtcW1VLURkcWdOUC5XQm0ua3InLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1CcmZIZkROJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLkJyZkhmRE4uV0JtLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsJCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1xa3FjalBmbUhObVUnLCBEZHRhQm1yX3RQZCggJ2tyL2p0bUcvcWtxYy1qUGZtSE5tVS5rcicsIFVCUG1xV04oX19pWXVYX18pICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBqcWRyTiApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtalBmbUhObVUnLCBEZHRhQm1yX3RQZCggJ2tyL2p0bUcvalBmbUhObVUua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywganFkck4gKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEta0RxYU5yJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcva1FxYU5yLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsJCQ0KCS8vM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWRxcGdkZnFVJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLmRxcGdkZnFVLldCbS5rcicsIFVCUG1xV04oX19pWXVYX18pICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWRxcGcnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcuZHFwZy5XQm0ua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KCQ0KCS8vYlBVIERxUEhnJ3IgdUJhaEh4ZmMNCgkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtR2ZkZlB4ZmMnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qUGZtSE5tVWRCYWhIeGZjL0dmZGZQeGZjL2swdE5QZy5HZmRmUHhmYy1XQm0ua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtZEJhaEh4ZmMnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qUGZtSE5tVWRCYWhIeGZjL2RCYWhIeGZjL2RCYWhIeGZjLldCbS5rcicsIFVCUG1xV04oX19pWXVYX18pICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWpxbUdneGZjJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9qcW1HZ3hmYy9rMHROUGcuanFtR2d4ZmMuRHFHMS5rcicsIFVCUG1xV04oX19pWXVYX18pICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLVdmdHJOM2hOTmQnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcuV2Z0ck4zaE5OZC1iLnkudy5EcUcxLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtanFtR2d4ZmMteHRISGZtcicsIFhabkZYaV9RdUtuWXNfS1Z1IC4nR3JyL3JIZ2ROci9qcW1HZ3hmYy9oTmRETlByL2swdE5QZy5qcW1HZ3hmYy14dEhIZm1yLmtyJywgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtanFtR2d4ZmMtV05VQnEnLCBYWm5GWGlfUXVLbllzX0tWdSAuJ0dyci9ySGdkTnIvanFtR2d4ZmMvaE5kRE5Qci9rMHROUGcuanFtR2d4ZmMtV05VQnEua3InLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1qcW1HZ3hmYy1IaHRXeHInLCBYWm5GWGlfUXVLbllzX0tWdSAuJ0dyci9ySGdkTnIvanFtR2d4ZmMvaE5kRE5Qci9rMHROUGcuanFtR2d4ZmMtSGh0V3hyLmtyJywgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsJDQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLURQTkhIZ0RoZkhmJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9EUE5ISGdEaGZIZi9rMHROUGcuRFBOSEhnUWhmSGYua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1qcW1HZ3hmY2pQTk4tTnFyQm1hJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9qcW1HZ3hmY2pQTk4vazB0TlBnLk5xckJtYS1FLmIuRHFHMS5rcicsIFVCUG1xV04oX19pWXVYX18pICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7CQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1qcW1HZ3hmY2pQTk4tV2Z0ck4zaE5OZCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2pQZm1ITm1VZEJhaEh4ZmMvanFtR2d4ZmNqUE5OL2swdE5QZy5XZnRyTjNoTk5kLWIueS5lLkRxRzEua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtanFtR2d4ZmNqUE5OLWpxbUdneGZjJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9qcW1HZ3hmY2pQTk4vazB0TlBnLmpxbUdneGZjLUUuYi5lLkRxRzEua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1EaGZIZnIzQkROJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9EaGZIZnIzQkROL0dmVU4uRGhmSGZyM0JETi5rMHROUGctYi55LlMuV0JtLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtMWRxcnInLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qUGZtSE5tVWRCYWhIeGZjL0RoZkhmcjNCRE4vZEJ4LzFkcXJyLldCbS5rcicsIFVCUG1xV04oX19pWXVYX18pICkgKTsNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEta3JyZlAtR2ZQTicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2tycmZQL2tycmZQLkdmUE4ua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWtycmZQLXRIQmRyJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcva3JyZlAva3JyZlAudEhCZHIua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWtycmZQLXJkQlVOUCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2tycmZQL2tycmZQLnJkQlVOUC5XQm0ua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLURoZkhmeGZjJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9EaGZIZnhmYy9rMHROUGcuRGhmSGZ4ZmMua3InLCBVQlBtcVdOKF9faVl1WF9fKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS14Y3JkQlVOUCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL3hjcmRCVU5QL2swdE5QZy54Y3JkQlVOUC5XQm0ua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLXhjcmRCVU5QLU5xckJtYScsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5OcXJCbWEuRS5iLmtyJywgVUJQbXFXTihfX2lZdVhfXykgKSApOwkNCgkzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtamZIZlBxV3EnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qZkhmUHFXcS9qZkhmUHFXcS5rcicsIFVCUG1xV04oX19pWXVYX18pICkgKTsJCQ0KCTNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1CV3FhTmRmcVVOUCcsIERkdGFCbXJfdFBkKCAna3IvQldxYU5kZnFVTlAvQldxYU5yZGZxVU5VLkQxYVUua3InLCBVQlBtcVdOKF9faVl1WF9fKSApICk7DQoJCQ0KfQ0KcVVVX3FHSEJmbSggJzNEX05tMHROdE5fckdQQkRIcicsICdOcXJnV05VQnFfalBmbUhObVVfa3InICk7DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgRk5qQm1Ocg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KVU5qQm1OKCAnWFpuX1kyX0FJQVInLCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fcWtxYycgKSApOw0KJE5XYVdOV2ZQZyA9IChCbUgpIEBCbUJfYU5IKCdXTldmUGdfZEJXQkgnKTsNCiROV2FXTldmUGcgPSBOV0RIZygkTldhV05XZlBnKSA/IF9fKCdzL0EnKSA6ICROV2FXTldmUGcgLiBfXygnIFo5Jyk7DQoNCi8qIEpoTnJOIGpCZE5yIHh0QmRVIGZ0SCBIaE4gRGR0YUJtIHJETkdCakJHIGZESEJmbXIgcW1VIHFycmZHQnFITlUganRtR0hCZm1yLiAqLw0KUE4wdEJQTl9mbUdOIChYWm5GWGlfUXVLbllzX0ZZViAuICdCbUdkdFVOci9mREhCZm1yLkRoRCcpOyANCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgUWR0YUJtIEtEVXFITiA3aE5HMQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogQHJCbUdOIEUuUy55LmINCkJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX3RER2gxJyApID09ICdFJyApIHsNCkJtR2R0VU5fZm1HTihYWm5GWGlfUXVLbllzX0ZZViAuICdCbUdkdFVOci90RC1tZkhCakJOUC5EaEQnKTsNCn0NCiovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIHVmcVUgN2ZtSFBmZCBRcW1OZA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvTldhLXJOSEhCbWFyLkRoRCcgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgdWZxVSBpUGZtSCBYbVUgMkdQQkRIDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fRGR0YScgKSA9PSAnRScgKSB7CQ0KQm1HZHRVTl9mbUdOKCBYWm5GWGlfUXVLbllzX0ZZViAuICdCbUdkdFVOci9qUGZtSE5tVS5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL1VnbXFXQkctckhnZE4uRGhEJyApOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBBVVUgOEJVYU5ILCBaTkhxeGZjICYgMmhmUEhHZlVODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KQm1HZHRVTl9mbUdOKCBYWm5GWGlfUXVLbllzX0ZZViAuICdCbUdkdFVOci9XTkhxeGZjTnIuRGhEJyApOyANCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvcmhmUEhHZlVOLkRoRCcgKTsNCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvSE5XRGRxSE5yL05XYS1yZEJVTlAtZm1OLkRoRCcgKTsNCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvSE5XRGRxSE5yL05XYS1yZEJVTlAtSDNmLkRoRCcgKTsNCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvSE5XRGRxSE5yL05XYS1HcVBmdHJOZC5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL0hOV0RkcUhOci9OV2EtamZIZlBxV3EuRGhEJyApOw0KQm1HZHRVTl9mbUdOKCBYWm5GWGlfUXVLbllzX0ZZViAuICdCbUdkdFVOci9ITldEZHFITnIvcWtxYy1xZHh0Vy5EaEQnICk7ICANCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvSE5XRGRxSE5yL05XYS1xZHh0Vy5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL0hOV0RkcUhOci9OV2EtcWR4dFcteHFHMS5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL0hCbWdXR04tVWRhLkRoRCcgKTsgDQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL0hxY2ZtZldnLkRoRCcgKTsNCkJtR2R0VU5fZm1HTiggWFpuRlhpX1F1S25Zc19GWVYgLiAnQm1HZHRVTnIvTnFyZzNCVWFOSC5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL05xcmctVWZHci5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL05XYS1qTnFIdFBOVS5EaEQnICk7DQpCbUdkdFVOX2ZtR04oIFhabkZYaV9RdUtuWXNfRllWIC4gJ0JtR2R0VU5yL05XYS1qUE5ORGR0YUJtci5EaEQnICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIFRmb05QIDJIZ2ROIG5ObU5QcUhmUCBAckJtR04gRS5TLnkuYg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KanRtR0hCZm0gTldhX2hmb05QX2FObSggJEJyaGZvTlAsICRySGdkTkhnRE4sICRIQkhkTiwgJHJ0eEhCSGROICkgew0KCQ0KCUJqICggJEJyaGZvTlAgPT0gJ0UnICkgew0KCQkNCgkvLyBKaEJyIEJyIHEgRk5qcXRkSCAySGdkTgkNCgkJDQoJCXIzQkhHaCAoJHJIZ2ROSGdETikgew0KCQkJDQoJCQlHcXJOICdoZm9OUGZtTic6DQoJCQkkSFd4ckhnZE4gPSAnPHFQSEJHZE4gR2RxcnI9IlVxLXFtQldxSE4gVXEtcmRCVU5pUGZXVkJhaEgiPjxEIEdkcXJyPSJOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9EPjxVQm8gR2RxcnI9ImpmUHJEcW0iPjxyRHFtIEdkcXJyPSJwZmZXIj48L3JEcW0+PC9VQm8+PC9xUEhCR2ROPic7DQoJCQl4UE5xMTsNCgkJCQ0KCQkJDQoJCQlHcXJOICdOV2FvQk4zLUgzZic6DQoJCQkkSFd4ckhnZE4gPSAnPFVCbyBHZHFycj0iTldhV3FyMSI+PGhDIEdkcXJyPSJOV2FIQkhkTiBOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9oQz48RCBHZHFycj0iTldhcnR4SEJIZE4iPicuJHJ0eEhCSGROLic8L0Q+PC9VQm8+JzsNCgkJCQ0KCQkJeFBOcTE7DQoJCQkNCgkJCQ0KCQkJR3FyTiAnTldhb0JOMy1IaFBOTic6DQoJCQkkSFd4ckhnZE4gPSAnPFVCbyBHZHFycj0iTldhV3FyMSI+PGhDIEdkcXJyPSJOV2FIQkhkTiBOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9oQz48RCBHZHFycj0iTldhcnR4SEJIZE4iPicuJHJ0eEhCSGROLic8L0Q+PC9VQm8+JzsNCgkJCQ0KCQkJeFBOcTE7DQoJCQkNCgkJCQ0KCQkJR3FyTiAnTldhb0JOMy1qZnRQJzoNCgkJCSRIV3hySGdkTiA9ICc8aEMgR2RxcnI9Ik5XYUhIZCBOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9oQz4nOw0KCQkJDQoJCQl4UE5xMTsJCQkJDQoJCQkNCgkNCgkJVU5qcXRkSDoNCgkJeFBOcTE7CQ0KCQl9DQoJCQ0KCX0gTmRyTiB7DQoJCSRIV3hySGdkTiA9ICc8RCBHZHFycj0iVXEtcW1CV3FITm1oIE5XYWpCSEhOY0giIHJIZ2ROPSJVQnJEZHFnOm1mbU47Ij4nLiRIQkhkTi4nPC9EPjxVQm8gR2RxcnI9ImpmUHJEcW1xIj48ckRxbSBHZHFycj0icGZmV3EiPjwvckRxbT48L1VCbz4nOw0KCX0JCQ0KDQpQTkh0UG0gJEhXeHJIZ2ROOw0KDQp9DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgQWR4dFcgbk5tTlBxSGZQIEByQm1HTiBFLlMueS5iDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpqdG1HSEJmbSBOV2FfZEJhaEh4ZmNfQldxYU5fcWR4dFdfYU5tTlBxSGZQKCAkZGFIZ0ROLCAkZGEzLCAkZGFoLCAkZGFHZHIsICRkYVdOQlVqQmRITlAsICRkYUJyUEcsICRkYXFkSCwgJGRhR3JIZ2ROLCAkZGFQTmQsICRkYUhIZCA9IG10ZGQsICRQbVVXLCAkaGZvZlBtZlAsICRXTlVIZ0ROLCAkQnJ4cVVhTiwgJEJXYUdmdG1ILCAkcmZQbSwgJEhodFd4ckhnZE4sICRxZEJVLCAkQnJkcXBnLCAkZHFwRGRHICkgew0KCQ0KCQkkQnJhcWRkQm1qZiA9IGFOSF9EZnJIX1dOSHEoICRxZEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9hcWRkTlBnX2ZESEMnLCBIUHROICk7DQoJCQ0KCQlCaiAoICRCcmFxZGRCbWpmID09ICdmbScgKSB7DQoJCQkkQldhQm1qZiA9IGFOSF9EZnJIKCAkcWRCVSApOw0KCQkJJEJISGQgPSBySFBCRHJkcXJoTnIgKCBOckdfaEhXZCggTnJHX2tyKCAkQldhQm1qZi0+RGZySF9IQkhkTiApICkgKTsNCgkJCSRCcnh4SEhkID0gckhQQkRyZHFyaE5yICggTnJHX2hIV2QoIE5yR19rciggJEJXYUJtamYtPkRmckhfTmNHTlBESCApICkgKTsNCgkJfQ0KCQlOZHJOIHsNCgkJCSRCSEhkID0gckhQQkRyZHFyaE5yKCBhTkhfRGZySF9XTkhxKCAkcWRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfSEJIZE4nLCBIUHROICkgKTsNCgkJCSRCcnh4SEhkID0gckhQQkRyZHFyaE5yKCBhTkhfRGZySF9XTkhxKCAkcWRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfcnR4X0hCSGROJywgSFB0TiApICk7DQoJCX0NCgkJDQoJCUJqICgkQnJ4cVVhTiA9PSAnRScgJiYgJFdOVUhnRE4gPT0gJ1p0ZEhCRGROIFlXcWFOciAoMmRCVU5QKScgKXsNCgkJCSRxVVV4cVVhTiA9ICc8ckRxbSBHZHFycj0iTldhLXhxVWFOciI+PHJEcW0gR2RxcnI9IkJHZnRtSCI+Jy4kQldhR2Z0bUguJzwvckRxbT48ckRxbSBHZHFycj0iQldhSGEiPicuJHJmUG0uJzwvckRxbT48L3JEcW0+JzsNCgkJfSBOZHJOIHsNCgkJCSRxVVV4cVVhTiA9ICcnOw0KCQl9CQ0KDQoJCU5HaGYgJzxVQm8gVXFIcS1OV2EtR2hCZFU9IicuJEJXYUdmdG1ILiciIFVxSHEtTldhLXFkeHRXPSInLiRxZEJVLiciIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlVqQmRITlAuJyBrdHJIcWR4dFciPicuJHFVVXhxVWFOLic8VUJvIEdkcXJyPSJCTmhxbVUiPjxxIGZtR2RCRzE9IlBOSHRQbSBqcWRyTjsiIEdkcXJyPSInLiRxZEJVLicgbWZqZmZ4ZmMiIGhQTmo9IiMiPjxCV2EgR2RxcnI9Ik5XYWRxcGciICcuJGRxcERkRy4nICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRkYXFkSC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KCQkJDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIHVCYWhIeGZjIG5ObU5QcUhmUCBAckJtR04gRS5TLnkuYg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYV9kQmFoSHhmY19CV3FhTl9hUEJVX2FObU5QcUhmUCggJGRhSGdETiwgJGRhMywgJGRhaCwgJGRhR2RyLCAkZGFXTkJVLCAkZGFCclBHLCAkZGFxZEgsICRkYUdySGdkTiwgJERySEJVLCAkZGFCV0JVLCAkZGFQTmQsICRkYWp0ZGRESGgsICRkYUhIZCA9IG10ZGQsICRQbVVXLCAkaGZvZlBtZlAsICRIaHRXeHJIZ2ROLCAkQnJkcXBnLCAkRGRHaGRVUCA9IG10ZGQgKSB7DQoJDQoJCSRCcmFxZGRCbWpmID0gYU5IX0RmckhfV05IcSggJERySEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9hcWRkTlBnX2ZESEMnLCBIUHROICk7DQoJCQ0KCQlCaiAoICRCcmFxZGRCbWpmID09ICdmbScgKSB7DQoJCQkkQldhQm1qZiA9IGFOSF9EZnJIKCAkZGFCV0JVICk7DQoJCQkkQkhIZCA9IHJIUEJEcmRxcmhOciAoIE5yR19oSFdkKCBOckdfa3IoICRCV2FCbWpmLT5EZnJIX0hCSGROICkgKSApOw0KCQkJJEJyeHhISGQgPSBySFBCRHJkcXJoTnIgKCBOckdfaEhXZCggTnJHX2tyKCAkQldhQm1qZi0+RGZySF9OY0dOUERIICkgKSApOw0KCQl9DQoJCU5kck4gew0KCQkJJEJISGQgPSBySFBCRHJkcXJoTnIoIGFOSF9EZnJIX1dOSHEoICREckhCVSwgJ05xcldOVUJxX1dOSHF4ZmNfSEJIZE4nLCBIUHROICkgKTsNCgkJCSRCcnh4SEhkID0gckhQQkRyZHFyaE5yKCBhTkhfRGZySF9XTkhxKCAkRHJIQlUsICdOcXJXTlVCcV9XTkhxeGZjX3J0eF9IQkhkTicsIEhQdE4gKSApOw0KCQl9DQoJCQ0KCUJqICggJGRhcWRIICkgew0KCQkNCgkJJGRhcWRIID0gdEczZlBVciggckhQX1BORGRxR04oICctJywgJyAnLCAkZGFxZEggKSApOw0KCQkNCgkJfSBOZHJOIHsNCgkJCQ0KCQkJJGRhcWRIID0gJ0JXcWFOIGFxZGROUGcnOw0KCQkJDQoJCQl9DQoJCQ0KCXIzQkhHaCAoICRkYUhnRE4gKSB7DQoJCQ0KCQkvLyBYWm4gdUJhaEh4ZmMgKCBGTmpxdGRIICkNCgkJR3FyTiAnTldhZHgnOg0KCQlOR2hmICc8VUJvIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlUuJyI+PFVCbyBHZHFycj0iQk5ocW1VIj48cSBmbUdkQkcxPSJOcXJnQUdIQm9OMkhnZE4yaE5OSChcJycuJGRhR3JIZ2ROLidcJyk7UE5IdFBtIEhQdE47IiBHZHFycj0iJy4kRHJIQlUuJy0nLiRkYUJXQlUuJyBtZmpmZnhmYyIgUE5kPSInLiRkYVBOZC4nIiBoUE5qPSInLiRkYWp0ZGRESGguJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRkYXFkSC4nIiBIQkhkTj0iJy4kZGFxZEguJyIvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQoJCXhQTnExOw0KCQkNCgkJLy8gaWZmOWZjIHVCYWhIeGZjDQoJCUdxck4gJ2pmZnhjJzoJDQoJCUJqICggTnFyZ1dOVUJxX0JyamZmeGZjKCkgPT0gJ3FHSEJvTicgKXsgCQ0KCQkNCgkJCUJqKEdkcXJyX05jQnJIcignaWZmeGZjX2lQTk4nKSl7DQoJCQkJJEJyamZmeGZjalBOTiA9ICdHZHFycj0iM0QtQldxYU4tJy4kRHJIQlUuJy0nLiRkYUJXQlUuJyInOw0KCQkJCX0gTmRyTiB7DQoJCQkJCSRCcmpmZnhmY2pQTk4gPSAnJzsNCgkJCQkJfQkJDQoJCQ0KCQlOR2hmICc8VUJvIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlUuJyI+PFVCbyBHZHFycj0iQk5ocW1VIj48cSBHZHFycj0iamZmeGZjLUJtckhxbUdOIGpmZnhmYyAnLiREckhCVS4nLScuJGRhQldCVS4nIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgUE5kPSJOV2FqZmZ4ZmMnLiRkYVdOQlUuJyIgSEJIZE49IicuJEJyeHhISGQuJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRCSEhkLiciICcuJEJyamZmeGZjalBOTi4nLz4nLk5XYV9oZm9OUF9hTm0oICRoZm9mUG1mUCwgJEhodFd4ckhnZE4sICRCSEhkLCAkQnJ4eEhIZCApLic8L3E+PC9VQm8+PC9VQm8+JzsJCQ0KCQl9IE5kck4gew0KCQkJTkdoZiAnJzsNCgkJfQ0KCQl4UE5xMTsNCgkJDQoJCS8vIDdmZGZQeGZjIHVCYWhIeGZjDQoJCUdxck4gJ0d4JzoJCQ0KIAkJTkdoZic8VUJvIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlUuJyI+PFVCbyBHZHFycj0iQk5ocW1VIj48cSBHZHFycj0iTldhLUd4ZmMgbWZqZmZ4ZmMiIGhQTmo9IicuJGRhanRkZERIaC4nIiBIQkhkTj0iJy4kQkhIZC4nIj48QldhICcuJERkR2hkVVAuJyBHZHFycj0iTldhZHFwZyIgJy4kQnJkcXBnLic9IicuJGRhQnJQRy4nIiBxZEg9IicuJGRhcWRILiciIC8+Jy5OV2FfaGZvTlBfYU5tKCAkaGZvZlBtZlAsICRIaHRXeHJIZ2ROLCAkQkhIZCwgJEJyeHhISGQgKS4nPC9xPjwvVUJvPjwvVUJvPic7CQ0KCQkNCgkJeFBOcTE7DQoJCQ0KCQkvLyB1QmFoSHhmY0MgdUJhaEh4ZmMNCgkJR3FyTiAnZHhDJzoJCQ0KIAkJTkdoZic8VUJvIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlUuJyI+PFVCbyBHZHFycj0iQk5ocW1VIj48cSBHZHFycj0ibWZqZmZ4ZmMiIGhQTmo9IicuJGRhanRkZERIaC4nIiBIQkhkTj0iJy4kQnJ4eEhIZC4nIiBVcUhxLWRCYWhIeGZjPSJXeGRCYWhIeGZjWycuJERySEJVLiddIiBVcUhxLUhCSGROPSInLiRCSEhkLiciPjxCV2EgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kZGFxZEguJyIgLz4nLk5XYV9oZm9OUF9hTm0oICRoZm9mUG1mUCwgJEhodFd4ckhnZE4sICRCSEhkLCAkQnJ4eEhIZCApLic8L3E+PC9VQm8+PC9VQm8+JzsJCQkNCg0KCQl4UE5xMTsJDQoJCQ0KCQkvLyBpcW1HZ3hmYyB1QmFoSHhmYw0KCQlHcXJOICdqeEMnOgkJDQogCQlOR2hmJzxVQm8gckhnZE49IjNCVUhoOicuJGRhMy4nRGM7IGhOQmFoSDonLiRkYWguJ0RjOyIgR2RxcnI9IicuJGRhR2RyLicgJy4kSGh0V3hySGdkTi4nIG9CTjMgVXEtSGh0V3hyIERQTmRmcVVOUG9CTjMgamRIUCcuJGRhV05CVS4nIj48VUJvIEdkcXJyPSJCTmhxbVUiPjxxIFVxSHEtanFtR2d4ZmMtSGdETj0iQldxYU4iIEdkcXJyPSJOV2FqcW1HZ3hmYyBtZmpmZnhmYyBqcW1HZ3hmYy5CV3FhTiBqcW1HZ3hmYy14dEhIZm0iIFBOZD0iTldhanFtR2ctJy4kRHJIQlUuJyIgaFBOaj0iJy4kZGFqdGRkREhoLiciIEhCSGROPSInLiRCSEhkLiciPjxCV2EgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kZGFxZEguJyIgLz4nLk5XYV9oZm9OUF9hTm0oICRoZm9mUG1mUCwgJEhodFd4ckhnZE4sICRCSEhkLCAkQnJ4eEhIZCApLic8L3E+PC9VQm8+PC9VQm8+JzsJDQoJCQ0KCQl4UE5xMTsJDQoJCQ0KCQkvLyBpcW1HZ3hmYyBpUE5OIHVCYWhIeGZjDQoJCUdxck4gJ2p4alBOTic6CQkNCiAJCU5HaGYnPFVCbyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Im1mamZmeGZjIiBQTmQ9Ik5XYWpxbUdnalBOTiIgaFBOaj0iJy4kZGFqdGRkREhoLiciIEhCSGROPSInLiRCSEhkLiciPjxCV2EgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kZGFxZEguJyIgLz4nLk5XYV9oZm9OUF9hTm0oICRoZm9mUG1mUCwgJEhodFd4ckhnZE4sICRCSEhkLCAkQnJ4eEhIZCApLic8L3E+PC9VQm8+PC9VQm8+JzsJDQoJCQ0KCQl4UE5xMTsJCQkNCgkJCQkJCQ0KCQkvLyBRUE5ISGdRaGZIZiB1QmFoSHhmYw0KCQlHcXJOICdERCc6CQkNCiAJCU5HaGYnPFVCbyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Im1mamZmeGZjIiBQTmQ9Ik5XYURQTkhIZ1FoZkhmW3JoZjNxZGRdIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgSEJIZE49IicuJEJISGQuJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRkYXFkSC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOwkNCgkJDQoJCXhQTnExOw0KCQkNCgkJLy8gUWhmSGYyM0JETiB1QmFoSHhmYw0KCQlHcXJOICdEcic6CQkNCiAJCU5HaGYnPFVCbyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Im1mamZmeGZjIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgSEJIZE49IicuJEJyeHhISGQuJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRCSEhkLiciIC8+Jy5OV2FfaGZvTlBfYU5tKCAkaGZvZlBtZlAsICRIaHRXeHJIZ2ROLCAkQkhIZCwgJEJyeHhISGQgKS4nPC9xPjwvVUJvPjwvVUJvPic7CQ0KCQkNCgkJeFBOcTE7CQ0KCQkNCgkJLy8gUWhmSGY5ZmMgdUJhaEh4ZmMNCgkJR3FyTiAnRHhmYyc6CQkNCiAJCU5HaGYnPFVCbyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Im1mamZmeGZjIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgSEJIZE49IicuJEJyeHhISGQuJyI+PEJXYSBVcUhxLURoZkhmeGZjLUhodFd4PSInLiRkYUJyUEcuJyIgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIEhCSGROPSInLiRCSEhkLiciIC8+Jy5OV2FfaGZvTlBfYU5tKCAkaGZvZlBtZlAsICRIaHRXeHJIZ2ROLCAkQkhIZCwgJEJyeHhISGQgKS4nPC9xPjwvVUJvPjwvVUJvPic7CQ0KDQoJCXhQTnExOwkJCQkJCQkJDQoJCQ0KCQkvLyA4ZlBVRFBOcnIgSmhCRzE5ZmMNCgkJR3FyTiAnM0RIeCc6CQkNCiAJCU5HaGYnPFVCbyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Im1mamZmeGZjIEhoQkcxeGZjIiBQTmQ9Ik5XYUhoQkcxeGZjIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgSEJIZE49IicuJEJISGQuJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRCcnh4SEhkLiciIC8+Jy5OV2FfaGZvTlBfYU5tKCAkaGZvZlBtZlAsICRIaHRXeHJIZ2ROLCAkQkhIZCwgJEJyeHhISGQgKS4nPC9xPjwvVUJvPjwvVUJvPic7CQ0KCQkNCgkJeFBOcTE7CQkJDQoJCQ0KCQlVTmpxdGRIOg0KCQl4UE5xMTsNCgl9ICAJDQoJDQpQTkh0UG07CQ0KCQ0KfQ0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIHVCYWhIeGZjIDJHUEJESCBuTm1OUHFIZlAgQHJCbUdOIEUuUy55LmINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmp0bUdIQmZtIE5XYV9kQmFoSHhmY19yR1BCREhfYU5tTlBxSGZQKCAkZGFIZ0ROLCAkQnJyZEJVTnF0SGYsICRCcnJkQlVOQm1IUG9kLCAkQnJyZEJVTnJoZjMgPSBtdGRkLCAkQkhXckJVID0gbXRkZCwgJFdxQm1CVSA9IG10ZGQgKSB7DQoNCmZ4X3JIcVBIKCk7DQoNCglyM0JIR2ggKCAkZGFIZ0ROICkgew0KCQkNCgkJLy8gWFpuIHVCYWhIeGZjICggRk5qcXRkSCApDQoJCUdxck4gJ05XYWR4JzoNCk5HaGYnPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCgkJIGt6dE5QZyggIiNqQmRITlByIGRCIiApLkdkQkcxKGp0bUdIQmZtKCkgew0KCQkJIE5kV21Ick5kID0ga3p0TlBnKEhoQnIpLnFISFAoIlVxSHEtZkRIQmZtLW9xZHROIik7DQoJCQkgQmogKE5kV21Ick5kID09ICIqIikgew0KCQkJCWt6dE5QZygiLkJOaHFtVSBxIikucUhIUCgiUE5kIiwgIk5xcmdXTlVCcVtyaGYzcWRkXSIpOw0KCQkJIH0gTmRyTiB7DQoJCQkJIGt6dE5QZygiLiIrTmRXbUhyTmQucnR4ckhQQm1hKEUpKyIgLkJOaHFtVSBxIikucUhIUCgiUE5kIiwgIk5xcmdXTlVCcVsiK05kV21Ick5kKyJdIik7DQoJCQkJIH0NCgkJCSB9KTsNCgkJfSk7PC9yR1BCREg+JzsJDQoJCQ0KCQl4UE5xMTsNCgkJDQoJCS8vIGlmZjlmYyB1QmFoSHhmYw0KCQlHcXJOICdqZmZ4Yyc6DQoJCQkJDQpOR2hmJzxyR1BCREggSGdETj0iSE5jSC9rcW9xckdQQkRIIj4NCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKSB7DQoJDQooanRtR0hCZm0oIGlNTTlNUiwgJCwgdG1VTmpCbU5VICkgew0KICBpTU05TVIuQm1CSCA9IGp0bUdIQmZtKCkgew0KICAgICQoIi5EcWEzUHFELScuJFdxQm1CVS4nIikuamZmeGZjKCQuTmNITm1VKEhQdE4sIHt9LCBpTU05TVIuZiwgeyBxZDNxZ3JZbUJIOiBIUHROIH0pKTsNCiAgICAkKCIuamZmeGZjLCBbSHFQYU5IPVwiamZmeGZjXCJdIikuamZmeGZjKGlNTTlNUi5mKTsNCiAgfTsNCn0oIDNCbVVmMy5pTU05TVIgPSAzQm1VZjMuaU1NOU1SIHx8IHt9LCBrenROUGcgKSk7DQppTU05TVIuQm1CSCgpOw0KfSk7DQo8L3JHUEJESD4nOw0KDQoJCXhQTnExOw0KDQoJCS8vIDdmZGZQeGZjCQkNCgkJR3FyTiAnR3gnOg0KCQkNCgkJTkdoZic8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQoJCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKSB7DQoJCQlrenROUGcoIi5OV2EtR3hmYyIpLkdmZGZQeGZjKHsNCgkJCQlHdFBQTm1IOiAie0d0UFBObUh9IC8ge0hmSHFkfSIsDQoJCQkJUE5kOlwnTldhLUd4ZmNcJywNCgkJCQlQTkh0UG1pZkd0cjoganFkck4sDQoJCQkJcmRCVU5yaGYzOiAnLiRCcnJkQlVOcXRIZi4nLA0KCQkJCXJkQlVOcmhmMzJETk5VOiAnLiRCcnJkQlVOQm1IUG9kLicsDQoJCQkJckdQZmRkQm1hOiBqcWRyTiwNCgkJCQlyRE5OVTogU3l5LA0KCQkJCURoZkhmOiBIUHROLA0KCQkJCWpxVU5NdEg6IFN5eSwNCgkJCQlXcWM4QlVIaDogIk95JSIsDQoJCQkJV3FjVE5CYWhIOiAiT3klIiwNCgkJCQlmbTdmV0RkTkhOOmp0bUdIQmZtKCl7DQoJCQkJCUJqKGt6dE5QZygiI0d4ZmNKQkhkTiIpLkhOY0goKS5kTm1hSGggPiBFKSB7DQoJCQkJCQlrenROUGcoIiNHeGZjSkJIZE4iKS5HcnIoIjNCVUhoIiwga3p0TlBnKCIuR3hmY1FoZkhmIikuM0JVSGgoKS1PKTsNCgkJCQkJCWt6dE5QZygiI0d4ZmNKQkhkTiIpLmhCVU4oKTsNCgkJCQkJCWt6dE5QZygiI0d4ZmNKQkhkTiIpLmpxVU5ZbShTeXkpOw0KCQkJCQkJfSBOZHJOIHsNCgkJCQkJCQlrenROUGcoIiNHeGZjSkJIZE4iKS5oQlVOKCk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCX0pOw0KCQk8L3JHUEJESD4nOyANCgkJDQoJCXhQTnExOwkNCgkJDQoJCS8vIHVCYWhIeGZjQw0KCQlHcXJOICdkeEMnOg0KTkdoZic8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQprenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCkgew0KCQkga3p0TlBnKCAiI2pCZEhOUHIgZEIiICkuR2RCRzEoanRtR0hCZm0oKSB7DQoJCQkgTmRXbUhyTmQgPSBrenROUGcoSGhCcikucUhIUCgiVXFIcS1mREhCZm0tb3FkdE4iKTsNCgkJCSBCaiAoTmRXbUhyTmQgPT0gIioiKSB7DQoJCQkJa3p0TlBnKCIuQk5ocW1VIHEiKS5xSEhQKCJVcUhxLWRCYWhIeGZjIiwgIld4ZEJhaEh4ZmNbcmhmM3FkZF0iKTsNCgkJCSB9IE5kck4gew0KCQkJCSBrenROUGcoIi4iK05kV21Ick5kLnJ0eHJIUEJtYShFKSsiIC5CTmhxbVUgcSIpLnFISFAoIlVxSHEtZEJhaEh4ZmMiLCAiV3hkQmFoSHhmY1siK05kV21Ick5kKyJdIik7DQoJCQkJIH0NCgkJCSB9KTsNCgkJfSk7PC9yR1BCREg+JzsJDQoJCQ0KCQl4UE5xMTsJCQ0KCQkNCgkJDQoJCS8vIGlxbUdneGZjQw0KCQlHcXJOICdqeEMnOg0KTkdoZic8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQprenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCkgewkNCglrenROUGcoIi5OV2FqcW1HZ3hmYyIpLmpxbUdneGZjKHsNCgkJcWpITlAyaGYzOiBqdG1HSEJmbSgpIHsNCgkJCWt6dE5QZygiLmpxbUdneGZjLUhCSGROLWZvTlAtM1BxRCIpLmhCVU4oKTsNCgkJCXJOSEpCV05mdEgoanRtR0hCZm0oKXsNCgkJCW9xUCBCV3FhTjhCVUhoID0ga3p0TlBnKCIuanFtR2d4ZmMtQldxYU4iKS4zQlVIaCgpOw0KCQkJa3p0TlBnKCIuanFtR2d4ZmMtSEJIZE4tZm9OUC0zUHFEIikuR3JyKHsNCgkJCQkiM0JVSGgiOiBCV3FhTjhCVUhoLA0KCQkJCSJEcVVVQm1hdU5qSCI6IHksDQoJCQkJIkRxVVVCbWFWQmFoSCI6IHksDQoJCQkJIkhOY0hBZEJhbSI6ICJHTm1ITlAiDQogICAgICAgIH0pOw0KCQlrenROUGcoIi5qcW1HZ3hmYy1IQkhkTi1mb05QLTNQcUQiKS5qcVVOWW0oInJkZjMiKTsNCgkJCX0sIEV5eSApOw0KICAgIH0sDQoJCURxVVVCbWEgOiB5LA0KCQlIZ0ROIDogIkJXcWFOIiwNCgkJcVBQZjNyOiBqcWRyTiwNCgkJV3FQYUJtOiBbZVMsIEVsLCBFbCwgRWxdLA0KCQlXZnRyTjhoTk5kOiBIUHROLA0KCQlxdEhmUWRxZzogJy4kQnJyZEJVTnF0SGYuJywNCgkJRGRxZzJETk5VOiAnLiRCcnJkQlVOQm1IUG9kLicsDQoJCURQTm9YampOR0g6ICJOZHFySEJHIiwNCgkJbU5jSFhqak5HSDogIk5kcXJIQkciLA0KCQlHZGZyTjlIbToganFkck4sDQoJCWZETm1YampOR0g6ICJqcVVOIiwJDQoJCWZETm0yRE5OVTogIm1mUFdxZCIsDQoJCUdkZnJOMkROTlU6IGJ5eSwJDQoJCWhOZEROUHIgOiB7DQoJCQl4dEhIZm1yCTogew0KCQkJCURmckJIQmZtOiAieGZISGZXIg0KCQkJCX0sDQoJCQlIQkhkTjogew0KCQkJCUhnRE46ICJmb05QIg0KCQkJCX0JDQogICAgfQ0KICAgIH0pOw0KDQoJCSBrenROUGcoICIjakJkSE5QciBkQiIgKS5HZEJHMShqdG1HSEJmbSgpIHsNCgkJCSBOZFdtSHJOZCA9IGt6dE5QZyhIaEJyKS5xSEhQKCJVcUhxLWZESEJmbS1vcWR0TiIpOw0KCQkJIEJqIChOZFdtSHJOZCA9PSAiKiIpIHsNCgkJCQlrenROUGcoIi5CTmhxbVUgcSIpLnFISFAoIlBOZCIsICJXeGRCYWhIeGZjLXJoZjNxZGQiKTsNCgkJCSB9IE5kck4gew0KCQkJCSBrenROUGcoIi4iK05kV21Ick5kLnJ0eHJIUEJtYShFKSsiIC5CTmhxbVUgcSIpLnFISFAoIlBOZCIsICJXeGRCYWhIeGZjLSIrTmRXbUhyTmQrIiIpOw0KCQkJCSB9DQoJCQkgfSk7CQkJIA0KCQl9KTs8L3JHUEJESD4nOwkNCgkJDQoJCXhQTnExOwkNCgkJDQoJCQ0KCQkvLyBpcW1HZ3hmYyBpUE5ODQoJCUdxck4gJ2p4alBOTic6DQpOR2hmJzxyR1BCREggSGdETj0iSE5jSC9rcW9xckdQQkRIIj4NCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKSB7DQoJa3p0TlBnKCIuQk5ocW1VIHFbUE5kPU5XYWpxbUdnalBOTl0iKS5qcW1HZ3hmYyh7DQoJCWZvTlBkcWcyaGYzCTogSFB0TiwNCgkJSFBxbXJCSEJmbVltCTogIk5kcXJIQkciLA0KCQlIUHFtckJIQmZtTXRICTogIk5kcXJIQkciLA0KCQlIQkhkTlFmckJIQmZtCTogIkJtckJVTiINCgkJfSk7DQoJfSk7PC9yR1BCREg+JzsJDQoJCQ0KCQl4UE5xMTsJCQkJDQoNCgkJDQoJCS8vIFFQTkhIZ1FoZkhmDQoJCUdxck4gJ0REJzoNCk5HaGYnPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCglrenROUGcoInFbUE5kXj1cJ05XYURQTkhIZ1FoZkhmW3JoZjNxZGRdXCddIikuTldhUWhmSGYoe0hoTldOOiAiTldhX1VOanF0ZEgiLHJkQlVOcmhmMzonLiRCcnJkQlVOQm1IUG9kLicsIHF0SGZEZHFnX3JkQlVOcmhmMzonLiRCcnJkQlVOcXRIZi4nLCByZkdCcWRfSGZmZHI6anFkck4scWRkZjNfTmNEcW1VOiBqcWRyTiwgVU5ORGRCbTFCbWE6IGpxZHJOfSk7DQoJDQoJCSBrenROUGcoICIjakJkSE5QciBkQiIgKS5HZEJHMShqdG1HSEJmbSgpIHsNCgkJCSBOZFdtSHJOZCA9IGt6dE5QZyhIaEJyKS5xSEhQKCJVcUhxLWZESEJmbS1vcWR0TiIpOw0KCQkJIEJqIChOZFdtSHJOZCA9PSAiKiIpIHsNCgkJCQlrenROUGcoIi5CTmhxbVUgcSIpLnFISFAoIlBOZCIsICJOV2FEUE5ISGdRaGZIZltyaGYzcWRkXSIpOw0KCQkJIH0gTmRyTiB7DQoJCQkJIGt6dE5QZygiLiIrTmRXbUhyTmQucnR4ckhQQm1hKEUpKyIgLkJOaHFtVSBxIikucUhIUCgiUE5kIiwgIk5XYURQTkhIZ1FoZkhmWyIrTmRXbUhyTmQrIl0iKTsNCgkJCQkgfQ0KCQkJIH0pOw0KCQl9KTs8L3JHUEJESD4nOwkNCgkJDQoJCXhQTnExOwkNCgkJDQoJCQ0KCQkvLyBRaGZIZjIzQkRODQoJCUdxck4gJ0RyJzoJCQ0KTkdoZic8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQooanRtR0hCZm0oM0JtVWYzLCAkLCBRaGZIZjIzQkROKXsNCglrenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCl7DQoJCU5XYVFoZkhmMjNCRE4gPSBrenROUGcoIi5CTmhxbVUgcSIpLkRoZkhmMjNCRE4oew0KCQkJR3FESEJmbUFtVUpmZmR4cVBBdEhmVEJVTkZOZHFnOiB5LA0KCQkJcmRCVU5yaGYzRk5kcWc6Jy4kQnJyZEJVTkJtSFBvZC4nLA0KCQkJcmRCVU4yRE5OVTpTeXksDQoJCQltTmNIUVBOb0JmdHIyZEJVTjJETk5VOlN5eSwNCgkJCUdxREhCZm1BbVVKZmZkeHFQTURxR0JIZzogInkubCINCgkJCX0pOw0KDQoJCQkNCgkJCW9xUCBJID0ga3p0TlBnLm1mN2ZtamRCR0goKTsNCgkJCW9xUCBHdFBQTm1IZm9OUGpkZjM2ID0gSSgiaEhXZCIpLkdycigiZm9OUGpkZjM2Iik7DQoJCQkNCgkJCU5XYVFoZkhmMjNCRE4ucVVVWG9ObUhUcW1VZE5QKFFoZkhmMjNCRE4uWG9ObUhKZ0ROci5mbTlOamZQTjJoZjMsIGp0bUdIQmZtIChOKSB7DQoJCQkJQmogKEd0UFBObUhmb05QamRmMzYpIHsNCgkJCQkJSSgiaEhXZCIpLkdycih7IGZvTlBqZGYzNjogImhCVVVObSJ9KTsNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJCQ0KCQkJTldhUWhmSGYyM0JETi5xVVVYb05tSFRxbVVkTlAoUWhmSGYyM0JETi5Yb05tSEpnRE5yLmZtVEJVTiwganRtR0hCZm0gKE4pIHsNCgkJCQlCaiAoR3RQUE5tSGZvTlBqZGYzNikgew0KCQkJCQlJKCJoSFdkIikuR3JyKHsgZm9OUGpkZjM2OiBHdFBQTm1IZm9OUGpkZjM2fSk7DQoJCQkJCX0NCgkJCQl9KTsNCgkJfSk7CQkJDQp9KDNCbVVmMywgM0JtVWYzLmt6dE5QZywgM0JtVWYzLjdmVU4uUWhmSGYyM0JETikpOw0KPC9yR1BCREg+JzsJCQkNCg0KCQl4UE5xMTsNCgkJDQoJCQ0KCQkvLyBRaGZIZjlmYw0KCQlHcXJOICdEeGZjJzoNCk5HaGYnPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCglrenROUGcoIi5kQmFoSHhmYycuJFdxQm1CVS4nIikuRGhmSGZ4ZmMoInEiLHsgSEJXTjonLiRCcnJkQlVOQm1IUG9kLicsIHF0SGZEZHFnOicuJEJycmRCVU5xdEhmLid9KTsNCgl9KTs8L3JHUEJESD4nOwkNCgkJDQoJCXhQTnExOwkJCQkJCQkJCQkNCgkJDQoJCVVOanF0ZEg6DQoJCXhQTnExOw0KCX0gIAkNCgkNCiRCckdkTnFtID0gZnhfYU5IX0dkTnFtKCk7DQpOR2hmIE5XYV9rcl9HZldEUE5yciggJEJyR2ROcW0gKTsNCgkNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBBZHh0VyB1ZnFVTlAgKEFrcWMpIEByQm1HTiBFLlMueS5iDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhX19qUGZtSF9xa3FjX3FkeHRXX2RmcVVOUCgkV05VLCAkckJwTiwgJHRCVSwgJEJEYSA9ICcnLCAkcWR4R2ZtSCwgJHBHciA9IG10ZGQsICRHV2ZVTiA9IG10ZGQsICRHRyA9IG10ZGQsICRHZm9OUHJCcE4gPSBtdGRkICl7DQoJDQoJZnhfckhxUEgoKTsNCgkNCglCaiAoJEJEYSkgew0KCQkkQkRhID0gJEJEYTsNCgl9IE5kck4gew0KCQkkQkRhID0gJyc7DQoJCX0NCgkJDQoJQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fZHFwZ2RmcVUnICkgPT0gJ0UnICkgew0KCQkkQnJkcCA9ICdFJzsNCgkJfSBOZHJOIHsNCgkJCSRCcmRwID0gJ3knOwkJDQoJCQl9DQoJCQ0KCQ0KTkdoZic8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQprenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCkgew0KCQ0KCW9xUCBXTlVCcUJVICwgR0JXYUdmdG1ILCBIQldOZnRIOw0KCQkNCglrenROUGcoVWZHdFdObUgpLmZtKCJHZEJHMSIsIi5OcXJnR2ZtSHFCbU5QLScuJHRCVS4nIC5rdHJIcWR4dFciLCBqdG1HSEJmbSAoKSB7DQoJCScuKCAoIE5XYV9yZHRhX0hmX21xV04oIE5xcmdfYU5IX2ZESEJmbSggIk5xcmdXTlVCcV9kQmFoSHhmY19ySGdkTiIgKSApID09ICdEeGZjJyApID8gJ2t6dE5QZygiLmRCYWhIeGZjJy4kdEJVLiciKS5EaGZIZnhmYygiRFBORHFQTkZNWiIpOycgICA6ICcnKS4nDQoJCWt6dE5QZygiLkJyZmpCZEdmbUgtJy4kdEJVLicgI05XYXJoZjNxZGQiKS5IUEJhYU5QKCJHZEJHMSIpOw0KCQlrenROUGcoIi5CcmZqQmRHZm1ILScuJHRCVS4nLCAuRHFhM1BxRC0nLiR0QlUuJyIpLmhCVU4oKTsNCgkJa3p0TlBnKCJoSFdkLHhmVWciKS5xbUJXcUhOKHtyR1BmZGRKZkQ6IERxUHJOWW1IKGt6dE5QZygiLkRxYTNQcUQtJy4kdEJVLiciKS5mampyTkgoKS5IZkQtU3kpfSwgRVN5eSk7DQoJCVdOVUJxQlUgPSBrenROUGcoSGhCcikucUhIUCgiVXFIcS1OV2EtcWR4dFciKTsNCgkJR2ROcVBKQldOZnRIKEhCV05mdEgpOw0KCQlrenROUGcoIiNCcmRmcVVOUGpmUC0nLiR0QlUuJyIpLmpxVU5ZbShTeXkpOw0KCQlvcVAgR1dVID0gInJoZjNhcWRkTlBnIjsNCgkJb3FQIEhodFd4bXFCZCA9ICInLiRyQnBOLiciOw0KCQlvcVAgV3FCbUJVID0gIicuJHRCVS4nIjsNCgkJb3FQIEdXZlVOID0gIicuJEdXZlVOLiciOw0KCQlvcVAgcEdyID0gIicuJHBHci4nIjsJCQ0KCQlvcVAgR0cgPSAiJy4kR0cuJyI7DQoJCW9xUCBHb1ByQnBOID0gIiI7DQoJCUdCV2FHZnRtSCA9IGt6dE5QZyhIaEJyKS5xSEhQKCJVcUhxLU5XYS1HaEJkVSIpOwkNCgkJSEJXTmZ0SCA9IHJOSEpCV05mdEgoanRtR0hCZm0oKXsgTldhX3FrcWNfcWR4dFdfZGZxVU5QKEdXVSwgV05VQnFCVSwgSGh0V3htcUJkLCBHQldhR2Z0bUgsIFdxQm1CVSwgR1dmVU4sIHBHciwgR0csIEdvUHJCcE4pOyB9LCBFeXl5KTsNCgkJfSk7DQoJCQ0KCQkNCgkJa3p0TlBnKFVmR3RXTm1IKS5mbSgiR2RCRzEiLCIjTldhcWtxY3hxRzEnLiR0QlUuJyIsIGp0bUdIQmZtICgpIHsNCgkJJy4oICggTldhX3JkdGFfSGZfbXFXTiggTnFyZ19hTkhfZkRIQmZtKCAiTnFyZ1dOVUJxX2RCYWhIeGZjX3JIZ2ROIiApICkgPT0gJ0R4ZmMnICkgPyAna3p0TlBnKCIuZEJhaEh4ZmMnLiR0QlUuJyIpLkRoZkhmeGZjKCJVTnJIUGZnIik7JyAgIDogJycpLicNCgkJa3p0TlBnKCJoSFdkLHhmVWciKS5xbUJXcUhOKHtyR1BmZGRKZkQ6IERxUHJOWW1IKGt6dE5QZygiLkRxYTNQcUQtJy4kdEJVLiciKS5mampyTkgoKS5IZkQtQ1N5KX0sIEVTeXkpOw0KCQlHZE5xUEpCV05mdEgoSEJXTmZ0SCk7DQoJCWt6dE5QZygiI0JyZGZxVU5QamZQLScuJHRCVS4nIikuanFVTlltKFN5eSk7DQoJCWt6dE5QZygiI05XYXFrcWN4cUcxJy4kdEJVLiciKS5qcVVOTXRIKCJqcXJIIik7CQ0KCQlrenROUGcoIi5EcWEzUHFELScuJHRCVS4nIikuaEJVTigpOw0KCQlvcVAgR1dVID0gIk5XYXFrcWN4cUcxIjsJCQ0KCQlvcVAgV05VQnFCVSA9ICInLiRXTlUuJyI7DQoJCW9xUCBIaHRXeG1xQmQgPSAiJy4kckJwTi4nIjsNCgkJb3FQIFdxQm1CVSA9ICInLiR0QlUuJyI7DQoJCW9xUCBHV2ZVTiA9ICInLiRHV2ZVTi4nIjsNCgkJb3FQIHBHciA9ICInLiRwR3IuJyI7CQkNCgkJb3FQIEdHID0gIicuJEdHLiciOw0KCQlvcVAgR29QckJwTiA9ICInLiRHZm9OUHJCcE4uJyI7DQoJCUhCV05mdEggPSByTkhKQldOZnRIKGp0bUdIQmZtKCl7IE5XYV9xa3FjX3FkeHRXX2RmcVVOUChHV1UsIFdOVUJxQlUsIEhodFd4bXFCZCwgR0JXYUdmdG1ILCBXcUJtQlUsIEdXZlVOLCBwR3IsIEdHLCBHb1ByQnBOKTsgfSwgRVN5eSk7CQkNCgkJfSk7DQoJCQkJDQoJCWp0bUdIQmZtIE5XYV9xa3FjX3FkeHRXX2RmcVVOUChHV1UsIFdOVUJxQlUsIEhodFd4bXFCZCwgR0JXYUdmdG1ILCBXcUJtQlUsIEdXZlVOLCBwR3IsIEdHLCBHb1ByQnBOKSB7DQoJCQkJb3FQIFVxSHEgPSB7DQoJCQkJcUdIQmZtOiAiTldhX3FrcWNfcWR4dFdfZGZxVU5QIiwNCgkJCQlyTkd0UEJIZzogIicuM0RfR1BOcUhOX21mbUdOKCAiTnFyZ1dOVUJxLURQZi1tZm1HTiIpLiciLAkNCgkJCQlXTlVCcUJVOiBXTlVCcUJVLA0KCQkJCUREUHJOOiBHV1UsDQoJCQkJSGh0V3htcUJkOiBIaHRXeG1xQmQsDQoJCQkJV3FCbUJVOiBXcUJtQlUsDQoJCQkJR1dmVU46IEdXZlVOLA0KCQkJCXBHcjogcEdyLA0KCQkJCUdHOiBHRywNCgkJCQlHb1ByQnBOOiBHb1ByQnBODQoJCQkJfTsNCgkJCQ0KCQkJCWt6dE5QZy5EZnJIKCInLnFVV0JtX3RQZCgncVVXQm0tcWtxYy5EaEQnKS4nIiwgVXFIcSwganRtR0hCZm0oUE5yRGZtck4pIHsNCgkJCQkJR2ROcVBKQldOZnRIKEhCV05mdEgpOw0KCQkJCQlrenROUGcoIi5EcWEzUHFELScuJHRCVS4nIikuanFVTlltKGJ5eXkpOw0KCQkJCQkNCgkJCQkJcjNCSEdoIChHV1UpIHsNCgkJCQkJCQ0KCQkJCQkJR3FyTiAicmhmM2FxZGROUGciOg0KCQkJCQkJa3p0TlBnKCIjQnJkZnFVTlBqZlAtJy4kdEJVLiciKS5qcVVOTXRIKCJqcXJIIik7DQoJCQkJCQlrenROUGcoIiNOV2Fxa3FjeHFHMScuJHRCVS4nIikuanFVTlltKEV5eXkpOw0KCQkJCQkJb3FQIG1OM1lITldyID0ga3p0TlBnKFBOckRmbXJOKTsNCgkJCQkJCW9xUCBQTldmb05ZSE5XID0ga3p0TlBnKCIuRHFhM1BxRC0nLiR0QlUuJyAua3RySHFkeHRXIiApOw0KCQkJCQkJa3p0TlBnKCIuTnFyZ0dmbUhxQm1OUC0nLiR0QlUuJyIpLk5XYUJyZkhmRE4oIlBOV2ZvTiIsIFBOV2ZvTllITlcpOw0KCQkJCQkJa3p0TlBnKCIuTnFyZ0dmbUhxQm1OUC0nLiR0QlUuJyIpLk5XYUJyZkhmRE4oIkJtck5QSCIsIG1OM1lITldyKTsJDQoJCQkJCQlkZnFVWVdxYU5yKCIuRHFhM1BxRC0nLiR0QlUuJyAuTldhZHFwZyIsIicuJHRCVS4nIiwiJy4kQkRhLiciLCBHQldhR2Z0bUgsIicuJEJyZHAuJyIpOw0KCQkJCQkJa3p0TlBnKCJoSFdkLHhmVWciKS5xbUJXcUhOKHtyR1BmZGRKZkQ6IERxUHJOWW1IKGt6dE5QZygiLkRxYTNQcUQtJy4kdEJVLiciKS5mampyTkgoKS5IZkQtQ3l5KX0sIEVTeXkpOwkJCQkJCQkNCg0KCQkJCQkJeFBOcTE7DQoJCQkJCQkNCgkJCQkJCUdxck4gIk5XYXFrcWN4cUcxIjoNCgkJCQkJCWt6dE5QZygiI0JyZGZxVU5QamZQLScuJHRCVS4nIikuanFVTk10SChTeXkpOw0KCQkJCQkJa3p0TlBnKCIuQnJmakJkR2ZtSC0nLiR0QlUuJyIpLmpxVU5ZbShTeXkpOw0KCQkJCQkJb3FQIG1OM1lITldyID0ga3p0TlBnKFBOckRmbXJOKTsNCgkJCQkJCW9xUCBQTldmb05ZSE5XID0ga3p0TlBnKCIuRHFhM1BxRC0nLiR0QlUuJyAub0JOMyIgKTsNCgkJCQkJCWt6dE5QZygiLk5xcmdHZm1IcUJtTlAtJy4kdEJVLiciKS5OV2FCcmZIZkROKCJQTldmb04iLCBQTldmb05ZSE5XKTsJCQkJCQkNCgkJCQkJCWt6dE5QZygiLk5xcmdHZm1IcUJtTlAtJy4kdEJVLiciKS5OV2FCcmZIZkROKCJCbXJOUEgiLCBtTjNZSE5Xcik7DQoJCQkJCQlkZnFVWVdxYU5yKCIuRHFhM1BxRC0nLiR0QlUuJyAuTldhZHFwZyIsIicuJHRCVS4nIiwiJy4kQkRhLiciLCAiJy4kcWR4R2ZtSC4nIiwiJy4kQnJkcC4nIik7DQoJCQkJCQlrenROUGcoImhIV2QseGZVZyIpLnFtQldxSE4oe3JHUGZkZEpmRDogRHFQck5ZbUgoa3p0TlBnKCIuRHFhM1BxRC0nLiR0QlUuJyIpLmZqanJOSCgpLkhmRC1DeXkpfSwgRVN5eSk7DQoJCQkJCQkNCgkJCQkJCXhQTnExOwkJCQkJCQkJCQ0KCQkJCQkJDQoJCQkJCQlVTmpxdGRIOg0KCQkJCQl9DQoJDQoJCQkJfSk7DQoJCQl9CQkNCg0KfSk7DQoJDQoJDQo8L3JHUEJESD4nOwkNCg0KJHFkeHRXckdQREggPSBmeF9hTkhfR2ROcW0oKTsNCk5HaGYgTldhX2tyX0dmV0RQTnJyKCAkcWR4dFdyR1BESCApOw0KDQp9DQoNCg0KLy8gMnVZRlhWIEUgblhzWFZBSk1WCQ0KanRtR0hCZm0gTldhX0JXcWFOX3JkQlVOUF9mbU5fYU5tTlBxSGZQICggJE5XYXJQRywgJE5XYUhodFd4LCAkR3FEM0JVSGgsICRIaHRXeEhIZCApew0KCQ0KCUJqIChIUEJXKCRIaHRXeEhIZCkpew0KCQkkcmhmM2ZQbWZIID0gJyc7DQoJfSBOZHJOIHsNCgkJJHJoZjNmUG1mSCA9ICdVQnJEZHFnOiBtZm1OICFCV0RmUEhxbUg7JzsNCgl9DQoJDQogICAgTkdoZic8VUJvPg0KICAgIDxCV2EgdD0iQldxYU4iIHJQR0M9IicuJE5XYXJQRy4nIiAvPg0KICAgICAgICAgICAgICAgIDxVQm8gR2RxcnI9Ik5XYXJkQlVOUEdxRCIgdD0iR3FESEJmbSIgSD0iWjd1WVF8OSIgckhnZE49IicuJHJoZjNmUG1mSC4nIERmckJIQmZtOiBxeHJmZHRITjsgSGZEOiB5RGM7IGROakg6IHlEYzsNCiAgICAgICAgICAgICAgICAgICAgM0JVSGg6ICcuJEdxRDNCVUhoLidEYzsgaE5CYWhIOiBDU0RjOyI+DQogICAgICAgICAgICAgICAgICAgIDxVQm8gckhnZE49IkRmckJIQmZtOiBxeHJmZHRITjsgSGZEOiB5RGM7IGROakg6IHlEYzsgM0JVSGg6ICcuJEdxRDNCVUhoLidEYzsgaE5CYWhIOiBDU0RjOw0KICAgICAgICAgICAgICAgICAgICAgICAgeHFHMWFQZnRtVS1HZmRmUDogOWRxRzE7IGZEcUdCSGc6IHkuRTsgakJkSE5QOiBxZERocShmRHFHQkhnPUV5KTsiPg0KICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgPFVCbyBySGdkTj0iRGZyQkhCZm06IHF4cmZkdEhOOyBIZkQ6IHlEYzsgZE5qSDogeURjOyAzQlVIaDogJy4kR3FEM0JVSGguJ0RjOyBoTkJhaEg6IENTRGM7DQogICAgICAgICAgICAgICAgICAgICAgICBHZmRmUDogOGhCSE47IGpmbUgtckJwTjogRWVEYzsgamZtSC0zTkJhaEg6IHhmZFU7IGRCbU4taE5CYWhIOiBDU0RjOyBITmNILXFkQmFtOiBHTm1ITlA7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICcuJEhodFd4SEhkLicNCiAgICAgICAgICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICAgICAgPC9VQm8+DQogICAgPEJXYSB0PSJIaHRXeCIgclBHPSInLiROV2FIaHRXeC4nIiAvPg0KICAgIDwvVUJvPic7DQoJDQp9DQoNCi8vIDJ1WUZYViBFIDI3VllRSiBuWHNYVkFKTVYNCmp0bUdIQmZtIE5XYV9yZEJVTlBfZm1OX3JHUEJESF9hTm1OUHFIZlAoICRCcnJkQlVOcXRIZiwgJEJycmRCVU5CbUhQb2QsICRCVzNCVUhoLCAkQldoTkJhaEgsICR0bUIwdE5CVSApIHsNCgkJTkdoZic8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+a3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpew0KCQkJa3p0TlBnKCIjQnJkZnFVTlBqZlAtJy4kdG1CMHROQlUuJyIpLmpxVU5NdEgoQ3l5eSwganRtR0hCZm0gKCl7DQoJCQkJa3p0TlBnKCIuRHFhM1BxRC0nLiR0bUIwdE5CVS4nIikuanFVTlltKEV5eXkpOw0KCQkJCX0pOw0KCQkJCWp0bUdIQmZtIFAoKXtvcVAgTj1tLiRYZFdILkRxUE5tSHNmVU4uR2RCTm1IOEJVSGg7QmooTiltLiQyTkgyR3FkTjhCVUhoKFpxSGguV0JtKE4sJy4kQlczQlVIaC4nKSk7TmRyTiAzQm1VZjMuck5ISkJXTmZ0SChQLGJ5KX1vcVAgTj1bXTtOWyJaN3VZUXw5Il09eyRGdFBxSEJmbTp3eXksJDdkQkQ6ZSwkWmZvTjpIUHROLCRYcXJCbWE6JElycmZQWHFyQm1hJC4kWHFyTk10SFhjRGZ9O29xUCBIPXskaUJkZFpmVU46ZSwkdXFwZ3VmcVVCbWE6QywkQXRIZlFkcWc6Jy4kQnJyZEJVTnF0SGYuJywkQXRIZlFkcWcySE5EcjpFLCRBdEhmUWRxZ1ltSE5Qb3FkOicuJEJycmRCVU5CbUhQb2QuJywkUXF0ck5NbVRmb05QOnksJEFQUGYzNU5nc3FvQmFxSEJmbTpIUHROLCQyZEJVTkZ0UHFIQmZtOlN5eSwkWkJtRlBxYU1qanJOSEpmMmRCVU46Q3ksJDJkQlVOOEJVSGg6Jy4kQlczQlVIaC4nLCQyZEJVTlROQmFoSDonLiRCV2hOQmFoSC4nLCQyZEJVTjJEcUdCbWE6eSwkRkJyRGRxZ1FCTkdOcjpFLCRRcVAxQm1hUWZyQkhCZm06eSwkS1kyTnFQR2haZlVOOkUsJFFkcWdNUEJObUhxSEJmbTpFLCRGUHFhTVBCTm1IcUhCZm06YiwkQVBQZjNzcW9CYXFIZlBNREhCZm1yOnskN2RxcnI6JElycmZQQVBQZjNzcW9CYXFIZlAkLCQ3aHFtR05KZjJoZjM6RSwkMkhORHI6RX0sJEpodFd4bXFCZHNxb0JhcUhmUE1ESEJmbXI6eyQ3ZHFycjokSXJyZlBKaHRXeG1xQmRzcW9CYXFIZlAkLCQ3aHFtR05KZjJoZjM6QywkQUdIQmZtWmZVTjpFLCRBdEhmN05tSE5QOmIsJHVxbU5yOkUsJDJEcUdCbWFSOmIsJDJEcUdCbWE2OmIsJEZCckRkcWdRQk5HTnI6TywkUXFQMUJtYVFmckJIQmZtOkN3eSwkTVBCTm1IcUhCZm06RSwkRkJycXhkTkZQcWE6anFkck59LCQ3cURIQmZtMmRCVU5QTURIQmZtcjp7JDdkcXJyOiRJcnJmUDdxREhCZm0yZEJVTlAkLCQ3cURIQmZtSlBxbXJCSEJmbXI6TiwkUWRxZ1ltWmZVTjpFLCRRZHFnTXRIWmZVTjpifX07b3FQIG09bU4zICRJcnJmUDJkQlVOUCQoInJkQlVOUEVfR2ZtSHFCbU5QLScuJHRtQjB0TkJVLiciLEgpO1AoKTtCaighbXFvQmFxSGZQLnRyTlBBYU5tSC5XcUhHaCgvKEJRaGZtTnxCUWZVfEJRcVV8OWRxRzE5TlBQZ3xZWFpmeEJkTikvKSl7a3p0TlBnKDNCbVVmMykueEJtVSgiUE5yQnBOIixQKX19KTwvckdQQkRIPic7DQoJCX0NCg0KLy8gMnVZRlhWIEMgblhzWFZBSk1WCQ0KanRtR0hCZm0gTldhX0JXcWFOX3JkQlVOUF9IM2ZfYU5tTlBxSGZQICggJE5XYXJQRywgJE5XYUhodFd4LCAkR3FEM0JVSGgsICRIaHRXeEhIZCApew0KCUJqIChIUEJXKCRIaHRXeEhIZCkpew0KCQkkcmhmM2ZQbWZIID0gJyc7DQoJfSBOZHJOIHsNCgkJJHJoZjNmUG1mSCA9ICdVQnJEZHFnOiBtZm1OICFCV0RmUEhxbUg7JzsNCgl9DQoJDQogICAgTkdoZic8VUJvPg0KICAgIDxCV2EgdD0iQldxYU4iIHJQR0M9IicuJE5XYXJQRy4nIiAvPg0KICAgICAgICAgICAgICAgIDxVQm8gR2RxcnI9Ik5XYXJkQlVOUEdxRCIgdD0iR3FESEJmbSIgSD0iWjd1WVF8OSIgckhnZE49IicuJHJoZjNmUG1mSC4nIERmckJIQmZtOiBxeHJmZHRITjsgSGZEOiB5RGM7IGROakg6IHlEYzsNCiAgICAgICAgICAgICAgICAgICAgM0JVSGg6ICcuJEdxRDNCVUhoLidEYzsgaE5CYWhIOiBDU0RjOyI+DQogICAgICAgICAgICAgICAgICAgIDxVQm8gckhnZE49IkRmckJIQmZtOiBxeHJmZHRITjsgSGZEOiB5RGM7IGROakg6IHlEYzsgM0JVSGg6ICcuJEdxRDNCVUhoLidEYzsgaE5CYWhIOiBDU0RjOw0KICAgICAgICAgICAgICAgICAgICAgICAgeHFHMWFQZnRtVS1HZmRmUDogOWRxRzE7IGZEcUdCSGc6IHkuRTsgakJkSE5QOiBxZERocShmRHFHQkhnPUV5KTsiPg0KICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgPFVCbyBySGdkTj0iRGZyQkhCZm06IHF4cmZkdEhOOyBIZkQ6IHlEYzsgZE5qSDogeURjOyAzQlVIaDogJy4kR3FEM0JVSGguJ0RjOyBoTkJhaEg6IENTRGM7DQogICAgICAgICAgICAgICAgICAgICAgICBHZmRmUDogOGhCSE47IGpmbUgtckJwTjogRWVEYzsgamZtSC0zTkJhaEg6IHhmZFU7IGRCbU4taE5CYWhIOiBDU0RjOyBITmNILXFkQmFtOiBHTm1ITlA7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICcuJEhodFd4SEhkLicNCiAgICAgICAgICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICAgICAgPC9VQm8+DQogICAgPEJXYSB0PSJIaHRXeCIgclBHPSInLiROV2FIaHRXeC4nIiAvPg0KICAgIDwvVUJvPic7DQoNCn0NCg0KLy8gMnVZRlhWIEMgMjdWWVFKIG5Yc1hWQUpNVgkNCmp0bUdIQmZtIE5XYV9yZEJVTlBfSDNmX3JHUEJESF9hTm1OUHFIZlAoICRCcnJkQlVOcXRIZiwgJEJycmRCVU5CbUhQb2QsICRCVzNCVUhoLCAkQldoTkJhaEgsICR0bUIwdE5CVSApIHsNCgkJTkdoZic8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+a3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpew0KCQkJCWt6dE5QZygiI0JyZGZxVU5QamZQLScuJHRtQjB0TkJVLiciKS5qcVVOTXRIKEN5eXksIGp0bUdIQmZtICgpIHsgDQoJCQkJa3p0TlBnKCIuRHFhM1BxRC0nLiR0bUIwdE5CVS4nIikuanFVTlltKEV5eXkpOw0KCQkJCX0pOw0KCQkJanRtR0hCZm0gQigpe29xUCBOPVAuJFhkV0guRHFQTm1Ic2ZVTi5HZEJObUg4QlVIaDtCaihOKVAuJDJOSDJHcWROOEJVSGgoWnFIaC5XcWMoWnFIaC5XQm0oTiwnLiRCVzNCVUhoLicpLGJ5eSkpO05kck4gM0JtVWYzLnJOSEpCV05mdEgoQixieSl9b3FQIE49W107TlsiWjd1WVF8OSJdPXskRnRQcUhCZm06d3l5LCQ3ZEJEOmUsJFpmb046SFB0TiwkWHFyQm1hOiRJcnJmUFhxckJtYSQuJFhxck5NdEhYY0RmfTtvcVAgSD1beyRGdFBxSEJmbTpFQ3l5LCR2ZmZXOkUsJFhxckJtYTp7JHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTk10SHp0cVV9LCRNRHFHQkhnOkN9LHskRnRQcUhCZm06RU5iLCR2ZmZXOkMsJDJkQlVOTXRIOkhQdE4sJFhxckJtYTp7JHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZiwkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOdUJtTnFQfSwkTURxR0JIZzpDfSx7JEZ0UHFIQmZtOkVDeXksJHZmZlc6RSwkVmZIcUhOOkhQdE4sJEZ0UEJtYTp7JHZmZlc6Wy5DLC40XSwkVmZIcUhOOlsuQywuNF19LCRYcXJCbWE6eyR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck4yM0JtYSwkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOdUJtTnFQLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTjIzQm1hfSwkTURxR0JIZzpDLCRWZnRtVTp7JFZmSHFITjouU319LHskRnRQcUhCZm06RU5iLCR2ZmZXOkMsJFZmSHFITjpIUHROLCQyZEJVTk10SDpIUHROLCRYcXJCbWE6eyR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUCwkVmZIcUhOOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGZ9LCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi40fX0seyRGdFBxSEJmbTpFQ3l5LCQ3ZmRyOkMsJHZmZlc6RSwkaWRnRkJQTkdIQmZtOkUsJEFyck5XeGRnOkN5ZU8sJDdoTnJyWmZVTjp7JDdmZHRXbTpFU30sJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUH0sJDJHcWROVGZQQnBmbUhxZDouUywkTURxR0JIZzpDfSx7JEZ0UHFIQmZtOkVDeXksJDdmZHI6QywkdmZmVzpDLCQyZEJVTk10SDpIUHROLCRpZGdGQlBOR0hCZm06RSwkQXJyTld4ZGc6Q3llTywkN2hOcnJaZlVOOnskN2ZkdFdtOkVTfSwkWHFyQm1hOnskdU5qSDokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUH0sJDJHcWROVGZQQnBmbUhxZDplLCRNRHFHQkhnOkN9LHskRnRQcUhCZm06RUN5eSwkdmZmVzpFLCRWZkhxSE46SFB0TiwkRnRQQm1hOnskdU5qSDpbLkMsLjRdLCR2ZmZXOlsuQywuNF0sJFZmSHFITjpbLkMsLjRdfSwkaWRnRkJQTkdIQmZtOkUsJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTjIzQm1hLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck4yM0JtYSwkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOdUJtTnFQLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTjIzQm1hfSwkMkdxZE5UZlBCcGZtSHFkOi53LCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi5TfX0seyRGdFBxSEJmbTpFTmIsJHZmZlc6QywkVmZIcUhOOkhQdE4sJDJkQlVOTXRIOkhQdE4sJGlkZ0ZCUE5HSEJmbTpDLCRYcXJCbWE6eyR1TmpIOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZiwkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOdUJtTnFQLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZn0sJDJHcWROVGZQQnBmbUhxZDplLCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi40fX0seyRGdFBxSEJmbTpFQ3l5LCR2ZmZXOkUsJFZmSHFITjpIUHROLCRGdFBCbWE6eyR1TmpIOlsuQywuNF0sJHZmZlc6Wy5DLC40XSwkVmZIcUhOOlsuQywuNF19LCRpZGdGQlBOR0hCZm06QywkWHFyQm1hOnskdU5qSDokSXJyZlBYcXJCbWEkLiRYcXJOMjNCbWEsJHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTjIzQm1hLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck51Qm1OcVAsJFZmSHFITjokSXJyZlBYcXJCbWEkLiRYcXJOMjNCbWF9LCQyR3FkTlRmUEJwZm1IcWQ6LncsJE1EcUdCSGc6QywkVmZ0bVU6eyRWZkhxSE46LlN9fSx7JEZ0UHFIQmZtOkVOYiwkdmZmVzpDLCRWZkhxSE46SFB0TiwkMmRCVU5NdEg6SFB0TiwkaWRnRkJQTkdIQmZtOkUsJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZiwkdmZmVzokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck51Qm1OcVAsJFZmSHFITjokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmfSwkMkdxZE5UZlBCcGZtSHFkOmUsJE1EcUdCSGc6QywkVmZ0bVU6eyRWZkhxSE46LjR9fSx7JEZ0UHFIQmZtOkVDeXksJDdmZHI6QywkdmZmVzpFLCRWZkhxSE46SFB0TiwkaWRnRkJQTkdIQmZtOlMsJEFyck5XeGRnOkN5ZU8sJDdoTnJyWmZVTjp7JDdmZHRXbTpFU30sJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJEpmRDokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCRywkdmZmVzokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCRywkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOTXRIenRxVSwkVmZIcUhOOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHfSwkMkdxZE5UZlBCcGZtSHFkOi5TLCQyR3FkTkxOUEhCR3FkOi5iLCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi5sfX0seyRGdFBxSEJmbTpFTmIsJDdmZHI6QywkdmZmVzpFLCRWZkhxSE46SFB0TiwkMmRCVU5NdEg6SFB0TiwkaWRnRkJQTkdIQmZtOlMsJEFyck5XeGRnOkN5ZU8sJDdoTnJyWmZVTjp7JDdmZHRXbTpFU30sJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZiwkSmZEOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZiwkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOdUJtTnFQLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZn0sJDJHcWROVGZQQnBmbUhxZDouUywkMkdxZE5MTlBIQkdxZDouYiwkTURxR0JIZzpDLCRWZnRtVTp7JFZmSHFITjoubH19LHskRnRQcUhCZm06RUN5eSwkVmYzcjpDLCR2ZmZXOkMsJFZmSHFITjpIUHROLCRpZGdGQlBOR0hCZm06dywkQXJyTld4ZGc6Q3llTywkN2hOcnJaZlVOOnskVmYzOkM0fSwkWHFyQm1hOnskdU5qSDokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCRywkSmZEOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck5NdEh6dHFVLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTlltN3R4Qkd9LCQyR3FkTlRmUEJwZm1IcWQ6ZSwkMkdxZE5MTlBIQkdxZDpDLCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi5sfX0seyRGdFBxSEJmbTpFQ3l5LCQ3ZmRyOkMsJHZmZlc6QywkVmZIcUhOOkhQdE4sJGlkZ0ZCUE5HSEJmbTpTLCRBcnJOV3hkZzpDeWVPLCQ3aE5yclpmVU46eyQ3ZmR0V206RU99LCRYcXJCbWE6eyR1TmpIOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCRKZkQ6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTk10SHp0cVUsJFZmSHFITjokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCR30sJDJHcWROVGZQQnBmbUhxZDpFLCQyR3FkTkxOUEhCR3FkOkMsJE1EcUdCSGc6QywkVmZ0bVU6eyRWZkhxSE46LjR9fV07b3FQIG09eyRBdEhmUWRxZzonLiRCcnJkQlVOcXRIZi4nLCRBdEhmUWRxZ1ltSE5Qb3FkOicuJEJycmRCVU5CbUhQb2QuJywkUXF0ck5NbVRmb05QOmIsJHVxcGd1ZnFVQm1hOkMsJEZQcWFNUEJObUhxSEJmbTpiLCRBUFBmMzVOZ3Nxb0JhcUhCZm06SFB0TiwkMmRCVU5GdFBxSEJmbTp3eXksJDJkQlVOcmhmM01ESEJmbXI6eyQ3ZHFycjokSXJyZlAyZEJVTnJoZjNWdG1tTlAkLCRKUHFtckJIQmZtcjpILCRKUHFtckJIQmZtck1QVU5QOkUsJDJoZjN1Qm0xOkhQdE59LCRBUFBmM3Nxb0JhcUhmUE1ESEJmbXI6eyQ3ZHFycjokSXJyZlBBUFBmM3Nxb0JhcUhmUCQsJDdocW1HTkpmMmhmMzpFLCRBdEhmN05tSE5QOkMsJDJITkRyOkV9LCRKaHRXeG1xQmRzcW9CYXFIZlBNREhCZm1yOnskN2RxcnI6JElycmZQSmh0V3htcUJkc3FvQmFxSGZQJCwkN2hxbUdOSmYyaGYzOkMsJEFHSEJmbVpmVU46RSwkdXFtTnI6QywkMkRxR0JtYVI6RWUsJDJEcUdCbWE2OkVDLCRGQnJEZHFnUUJOR05yOlMsJFFxUDFCbWFRZnJCSEJmbTpFU3csJE1QQk5tSHFIQmZtOkN9LCQ3cURIQmZtMmRCVU5QTURIQmZtcjp7JDdkcXJyOiRJcnJmUDdxREhCZm0yZEJVTlAkLCQ3cURIQmZtSlBxbXJCSEJmbXI6TiwkUWRxZ1ltWmZVTjpFLCRRZHFnTXRIWmZVTjpifX07b3FQIFA9bU4zICRJcnJmUDJkQlVOUCQoInJkQlVOUENfR2ZtSHFCbU5QLScuJHRtQjB0TkJVLiciLG0pO0IoKTtCaighbXFvQmFxSGZQLnRyTlBBYU5tSC5XcUhHaCgvKEJRaGZtTnxCUWZVfEJRcVV8OWRxRzE5TlBQZ3xZWFpmeEJkTikvKSl7a3p0TlBnKDNCbVVmMykueEJtVSgiUE5yQnBOIixCKX19KTwvckdQQkRIPic7DQp9DQoNCi8vIDdxUGZ0ck5kIG5Yc1hWQUpNVgkNCmp0bUdIQmZtIE5XYV9HcVBmdHJOZF9hTm1OUHFIZlAgKCAkTldhclBHLCAkTldhSGh0V3gsICQzQlVIaCwgJEhodFd4SEhkLCAkanRkZCApew0KCQ0KICAgIE5HaGYnPFVCbyBHZHFycj0iTldhLUdxUGZ0ck5kIj48cSBoUE5qPSInLiRqdGRkLiciIEhCSGROPSInLiRIaHRXeEhIZC4nIiBQTmQ9Ik5XYURQTkhIZ1FoZkhmW3JoZjNxZGRdIj48QldhIEhCSGROPSInLiRIaHRXeEhIZC4nIiBHZHFycj0iTldhR3FQZnRyTmQiIHJQRz0iJy4kTldhSGh0V3guJyIgLz48L3E+PC9VQm8+JzsNCgkNCn0NCg0KLy8gN3FQZnRyTmQgMjdWWVFKIG5Yc1hWQUpNVgkNCmp0bUdIQmZtIE5XYV9HcVBmdHJOZF9yR1BCREhfYU5tTlBxSGZQKCAkQnJyZEJVTnF0SGYsICRCcnJkQlVOQm1IUG9kLCAkQlczQlVIaCwgJEJXaE5CYWhILCAkTmROV05tSEJVLCAkTnFyQm1hTmpqTkdILCAkSEJIZE4sICR0bUIwdE5CVSApew0KCU5HaGYgJzxyR1BCREggSGdETj0iSE5jSC9rcW9xckdQQkRIIj4NCglrenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCkgew0KCQlrenROUGcoIiNCcmRmcVVOUGpmUC0nLiR0bUIwdE5CVS4nIikuanFVTk10SChDeXl5LCBqdG1HSEJmbSAoKSB7DQoJCQlrenROUGcoIi5EcWEzUHFELScuJHRtQjB0TkJVLiciKS5qcVVOWW0oYnl5eSk7DQoJCQkNCgkJa3p0TlBnKCIueGNyZEJVTlAtJy4kTmROV05tSEJVLiciKS54YzJkQlVOUCh7DQoJCQlyZEJVTjhCVUhoOiAnLiRCVzNCVUhoLicsDQoJCQlyZEJVTlpxUGFCbTogRXksDQoJCQlXcWMyZEJVTnI6IEV5LA0KCQkJRHFhTlA6IGpxZHJOLA0KCQkJdHJONzIyOiBqcWRyTiwNCgkJCU5xckJtYTogIicuJE5xckJtYU5qak5HSC4nIiwNCgkJCXF0SGY6IEhQdE4sDQoJCQlyRE5OVTogRVN5eSwNCgkJCUdmbUhQZmRyOiBIUHROLA0KCQkJcXRIZjdmbUhQZmRyOiBIUHROLA0KCQkJRFBOZGZxVVlXcWFOcjogInFkZCIsDQoJCQlCbWpCbUJITnVmZkQ6IEhQdE4sDQoJCQlHcURIQmZtcjogJy4kSEJIZE4uJywNCgkJCXF0SGZUZm9OUDogSFB0TiwNCgkJCXF0SGYySHFQSDogJy4kQnJyZEJVTnF0SGYuJywNCgkJCURxdHJOOiAnLiRCcnJkQlVOQm1IUG9kLicsDQoJCQlmbTJkQlVOQWpITlA6IGp0bUdIQmZtKCkgew0KCQkJCWt6dE5QZygiLnhjLXJIcVBIIikuSFBCYWFOUCgiR2RCRzEiKTsNCiAgICAgICAgICAgIH0NCgkJCQl9KTsNCgkJCQkNCgkJCQkNCgkJCWt6dE5QZygiLnhjLUdkZm1OIHEiKS5QTldmb05BSEhQKCAiUE5kIiApOw0KCQkJDQoJCQlrenROUGcoInFbUE5kXj1cJ05XYURQTkhIZ1FoZkhmW3JoZjNxZGRdXCddIikuTldhUWhmSGYoe0hoTldOOiAiTldhX1VOanF0ZEgiLCBxZGRmM19OY0RxbVU6IGpxZHJOLCBVTk5EZEJtMUJtYToganFkck4sIHJkQlVOcmhmMzonLiRCcnJkQlVOQm1IUG9kLid5eXksIHF0SGZEZHFnX3JkQlVOcmhmMzonLiRCcnJkQlVOcXRIZi4nLCByZkdCcWRfSGZmZHI6anFkck59KTsNCgkJCQkJDQoJCQl9KTsJCQkNCgkJCQ0KCQl9KTsNCgkJDQoNCjwvckdQQkRIPic7IA0KDQp9DQoNCi8vIGlmSGZQcVdxIG5Yc1hWQUpNVgkNCmp0bUdIQmZtIE5XYV9qZkhmUHFXcV9hTm1OUHFIZlAgKCAkTldhclBHLCAkTldhSGh0V3gsICQzQlVIaCwgJEhodFd4SEhkLCAkR3FESEJmbSApew0KCQ0KICAgIC8vTkdoZic8QldhICcuJEdxREhCZm0uJyByUEc9IicuJE5XYUhodFd4LiciPic7IC8vIHNmUFdxZCBkZnFVTlANCglOR2hmICc8cSAnLiRHcURIQmZtLicgaFBOaj0iJy4kTldhclBHLiciIFVxSHEtSGh0V3g9IicuJE5XYUhodFd4LiciPjwvcT4nOyAvLyAzQkhoIHVxcGcgdWZxVQ0KfQ0KDQpqdG1HSEJmbSBOV2FfcWtxY19xZHh0V19kZnFVTlAoKSB7DQoJDQoJR2hORzFfcWtxY19QTmpOUE5QKCAnTnFyZ1dOVUJxLURQZi1tZm1HTicsICdyTkd0UEJIZycgKTsNCgkNCgkJQmogKCAhQnJyTkgoICRfUU0ySlsnV05VQnFCVSddICkgfHwgIUJyck5IKCAkX1FNMkpbJ0REUHJOJ10gKSB8fCAhQnJyTkgoICRfUU0ySlsnV3FCbUJVJ10gKSApIHsNCgkJCQ0KCQlOR2hmICc8VUJvIEdkcXJyPSJvQk4zIj48QldhIHJQRz0iJy5EZHRhQm1yX3RQZCgnQldxYU5yL3FrcWMtZGZxVU5QLmFCaicgLCBfX2lZdVhfXykuJyIgM0JVSGg9ImJDIiBoTkJhaEg9ImJDIi8+PC9VQm8+JzsNCgkJVUJOOw0KCQl9DQoJCQ0KCQlOZHJOIHsJDQoJCXIzQkhHaCAoJF9RTTJKWydERFByTiddKXsNCgkJCUdxck4gJ3JoZjNhcWRkTlBnJzoNCgkJCQlOR2hmIE5XYV9xZHh0V19CV2FfZEJySChIUEJXKCRfUU0ySlsnV05VQnFCVSddKSwgSFBCVygkX1FNMkpbJ0hodFd4bXFCZCddKSwgSFBCVygkX1FNMkpbJ1dxQm1CVSddKSwgSFBCVygkX1FNMkpbJ3BHciddKSwgSFBCVygkX1FNMkpbJ0dXZlVOJ10pLCBIUEJXKCRfUU0ySlsnR0cnXSkgKTsNCgkJCQkzRF9VQk4oKTsNCgkJCXhQTnExOw0KCQ0KCQkJR3FyTiAnTldhcWtxY3hxRzEnOg0KCQkJCU5HaGYgTldhX3FkeHRXcl94cUcxKEhQQlcoJF9RTTJKWydXTlVCcUJVJ10pLCBIUEJXKCRfUU0ySlsnSGh0V3htcUJkJ10pLCBIUEJXKCRfUU0ySlsnV3FCbUJVJ10pLCBIUEJXKCRfUU0ySlsncEdyJ10pLCBIUEJXKCRfUU0ySlsnR1dmVU4nXSksIEhQQlcoJF9RTTJKWydHRyddKSwgSFBCVygkX1FNMkpbJ0dvUHJCcE4nXSkgKTsNCiAgIAkJCSAJM0RfVUJOKCk7DQoJCQl4UE5xMTsNCgkJCQ0KCQkJVU5qcXRkSDoNCgkJCXhQTnExOw0KCQ0KCQl9DQoJfQ0KfQ0KcVVVX3FHSEJmbSgnM0RfcWtxY19tZkRQQm9fTldhX3FrcWNfcWR4dFdfZGZxVU5QJywgJ05XYV9xa3FjX3FkeHRXX2RmcVVOUCcpOw0KcVVVX3FHSEJmbSgnM0RfcWtxY19OV2FfcWtxY19xZHh0V19kZnFVTlAnLCAnTldhX3FrcWNfcWR4dFdfZGZxVU5QJyk7DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiBWWDJYSiAyWEpKWXNuMg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTldhX0dEX1BOck5IKCkgew0KCQ0KCUdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1EUGYtbWZtR04nLCAnck5HdFBCSGcnICk7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnR1dVJ10gKSApIHsNCgkJTkdoZiAneSc7DQoJCVVCTjsNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQlCaiAoICRfUU0ySlsnR1dVJ10gPT0gJ1BOck5IJyApew0KCQkJCU5HaGYgJ0UnOw0KCQkJCU5xcmdXTlVCcV9QTnJIZlBOX0hmX1VOanF0ZEgoJF9RTTJKWydHV1UnXSk7CQkJDQoJCQkJVUJOOw0KCQkJCX0NCgl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OV2FfR0RfUE5yTkgnLCAnTldhX0dEX1BOck5IJyApOw0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgS1FGQUpYIG5BdXVYVjYNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5XYV90RFVIX2FxZGRfZEJySCgpIHsNCglCaiAoICFCcnJOSCggJF9RTTJKWydEckhCVSddICkgKSB7DQoJCU5HaGYgJzxEPkFrcWMgUE4wdE5ySCBqcUJkTlUsIERkTnFyTiBQTmpQTnJoIGdmdFAgeFBmM3JOUCAzQm1VZjMuPC9EPic7DQoJCVVCTjsNCgkJfQ0KCQlOZHJOIHsNCgkJCXREVXFITl9EZnJIX1dOSHEoICRfUU0ySlsnRHJIQlUnXSAsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX2FxZGROUGcnLCAnJyApOw0KCQkJTkdoZiAnc2YgQldxYU4ocikgck5kTkdITlUuLi4nOw0KCQkJVUJOOw0KCQl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OV2FfdERVSF9hcWRkX2RCckgnLCAnTldhX3REVUhfYXFkZF9kQnJIJyApOw0KDQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiB1WTJKIFpYRllBIChKWXM2WjdYKQ0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTldhX2RmcVVfV05VQnFfZEJySCgpIHsNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydIcWNmJ10gKSApIHsNCgkJTkdoZiAnPEQ+QWtxYyBQTjB0TnJIIGpxQmROVSwgRGROcXJOIFBOalBOcmggZ2Z0UCB4UGYzck5QIDNCbVVmMy48L0Q+JzsNCgkJVUJOOw0KCQl9DQoJCU5kck4gew0KCQkJYWRmeHFkICREZnJIOw0KCQkJJEhxY2ZITlBXID0gJF9RTTJKWydIcWNmJ107DQoJCQkNCgkJCQ0KJHFQYXIgPSBxUFBxZygNCidIcWNfMHROUGcnID0+IHFQUHFnKA0KICAgIHFQUHFnKA0KICAgICAgICAnSHFjZm1mV2cnID0+ICdOV05VQnFhcWRkTlBnJywNCiAgICAgICAgJ2pCTmRVJyA9PiAnQlUnDQogICAgICAgIC8vJ0hOUFdyJyA9PiAkSHFjZkhOUFcNCiAgICApDQopDQopOw0KDQowdE5QZ19EZnJIciggJHFQYXIgKTsJCQkNCgkJCQ0KQmogKCBocW9OX0RmckhyKCkgKSA6DQoJM2hCZE4gKCBocW9OX0RmckhyKCkgKSA6DQoJCQkkcmhmM19XTlVCcSAuPSAnDQoJCQk8Qm1EdEggbXFXTj0iJy4kRGZySC0+WUYuJyIgQlU9IicuJERmckgtPllGLiciIEhnRE49IkhOY0giIG9xZHROPSInLmFOSF9EZnJIX1dOSHEoICRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfSEJIZE4nLCBIUHROICkuJyIgLz4nOw0KDQoJTkdoZiAkcmhmM19XTlVCcTsNCglVQk4oKTsNCgkNCglObVUzaEJkTjsJDQpOZHJOOg0KICBOR2hmICcyZlBQZywgbWYgV05VQnEgV3FIR2hOVSBnZnRQIEdQQkhOUEJxLic7CQkNCiAgVUJOKCk7CQ0KTm1VQmo7DQozRF9QTnJOSF8wdE5QZygpOwkJCQ0KCQkJDQoJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTldhX2RmcVVfV05VQnFfZEJySCcsICdOV2FfZGZxVV9XTlVCcV9kQnJIJyApOw0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgRlh1WEpYIFpYRllBIFlaQW5YDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiovDQpqdG1HSEJmbSBOcXJXTlVCcV9CV2FfV05VQnFfUE5XbygpIHsNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydEckhCVSddICkgfHwgIUJyck5IKCAkX1FNMkpbJ0hnRE4nXSApICkgew0KCQlOR2hmICd5JzsNCgkJVUJOOw0KCQl9DQoJCQ0KCQlOZHJOIHsNCgkJCUJqICggIUd0UFBObUhfdHJOUF9HcW0oICdOVUJIX0hoTldOX2ZESEJmbXInICkgKQ0KCQkJVUJOKCctRScpOw0KCQkJDQoJCQlCaiAoICRfUU0ySlsnSGdETiddID09ICdCV3FhTicgKXsNCgkJCQkkVXFIcSA9ICRfUU0ySlsnRHJIQlUnXTsNCgkJCQl0RFVxSE5fRGZySF9XTkhxKCRVcUhxLCAnTnFyV05VQnFfV05IcXhmY19CV2EnLCAnJyk7DQoJCQkJTkdoZiAnRSc7DQoJCQkJVUJOOw0KCQkJCX0NCgkNCglOZHJOQmogKCAkX1FNMkpbJ0hnRE4nXSA9PSAncXRVQmYnICl7DQoJCSRVcUhxID0gJF9RTTJKWydEckhCVSddOw0KCQkJCXREVXFITl9EZnJIX1dOSHEoJFVxSHEsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX3F0VUJmJywgJycpOw0KCQkJCU5HaGYgJ0UnOw0KCSAgICBVQk47DQoJCX0NCgl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJXTlVCcV9CV2FfV05VQnFfUE5XbycsICdOcXJXTlVCcV9CV2FfV05VQnFfUE5XbycgKTsNCg0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgdU1BRiBZWkFuWCBGWEpBWXUyDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiovDQpqdG1HSEJmbSBOcXJXTlVCcV9CV2FfVUhkKCkgew0KCQ0KCUJqICggIUJyck5IKCAkX1FNMkpbJ0JXYUJVJ10gKSApIHsNCgkJTkdoZiAneSc7DQoJCVVCTjsNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQkNCgkJCSRCV2FfQm1qZiA9IGFOSF9EZnJIKCAkX1FNMkpbJ0JXYUJVJ10gKTsNCgkJCSRISGQgPSAkQldhX0JtamYtPkRmckhfSEJIZE47DQoJCQkkcnhISGQgPSAkQldhX0JtamYtPkRmckhfTmNHTlBESDsNCgkJCSRVTkdyID0gICRCV2FfQm1qZi0+RGZySF9HZm1ITm1IOw0KCQkJDQoJCQkkcWRkQldhVXFIID0gcVBQcWcoICRISGQsICRyeEhIZCwgJFVOR3IgKTsNCgkJCU5HaGYgQldEZGZVTigifH58IiwgJHFkZEJXYVVxSCk7DQoJICAgIFVCTjsNCgkJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTnFyV05VQnFfQldhX1VIZCcsICdOcXJXTlVCcV9CV2FfVUhkJyApOw0KDQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiBLUUZBSlggWVpBblggRlhKQVl1Mg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTnFyZ19HdHJIZldfcnFvTl9qdG1HSEJmbSgpew0KCQ0KCQlCaiAoICFCcnJOSCggJF9RTTJKWydCV2FCVSddICkgfHwgIUJyck5IKCAkX1FNMkpbJ0JXYUhIZCddICkgfHwgIUJyck5IKCAkX1FNMkpbJ0JXYXJ4SEhkJ10gKSB8fCAhQnJyTkgoICRfUU0ySlsnQldhVU5yRyddICkgKSB7DQoJCU5HaGYgJ3knOw0KCQlVQk47DQoJCX0NCgkJDQoJCU5kck4gew0KICAgIDNEX3REVXFITl9EZnJIKHFQUHFnKCdZRicgPT4gJF9RTTJKWydCV2FCVSddLCAnRGZySF9IQkhkTicgPT4gJF9RTTJKWydCV2FISGQnXSkpOw0KCTNEX3REVXFITl9EZnJIKHFQUHFnKCdZRicgPT4gJF9RTTJKWydCV2FCVSddLCAnRGZySF9OY0dOUERIJyA9PiAkX1FNMkpbJ0JXYXJ4SEhkJ10pKTsNCgkzRF90RFVxSE5fRGZySChxUFBxZygnWUYnID0+ICRfUU0ySlsnQldhQlUnXSwgJ0RmckhfR2ZtSE5tSCcgPT4gJF9RTTJKWydCV2FVTnJHJ10pKTsNCglOR2hmICdFeUUnOw0KCQkgICAgVUJOOw0KCQl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJnX0d0ckhmV19ycW9OX2p0bUdIQmZtJywgJ05xcmdfR3RySGZXX3Jxb05fanRtR0hCZm0nICk7DQoNCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBBSUFSIHVNQUYgWVpBblggbkF1dVhWNg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTldhX2FxZGROUGdfZEJySCgpIHsNCg0KCUJqICggIUJyck5IKCAkX1FNMkpbJ0RxYU4nXSApICkgeyREcWFOID0gRTt9DQoJTmRyTiB7JERxYU4gPSAoQm1IKXFVVXJkcXJoTnIoICRfUU0ySlsnRHFhTiddICk7fQ0KCQ0KCUJqICggIUJyck5IKCAkX1FNMkpbJ0ROUF9EcWFOJ10gKSApIHskRE5QX0RxYU4gPSBFZTt9DQoJTmRyTiB7JEROUF9EcWFOID0gKEJtSClxVVVyZHFyaE5yKCAkX1FNMkpbJ0ROUF9EcWFOJ10gKTt9DQoJDQoJJEJXYV9VcUhxID0gTldhX2RCeFBxUGdfQldxYU5yKCAkRHFhTiwgJEROUF9EcWFOICk7DQoJDQoJTkdoZiAnPHRkPic7DQoJDQoJQmogKCAkQldhX1VxSHFbJ0hmSHFkQldhJ10gPT0geSApIHtOR2hmICc8RD5zZiBCV3FhTnIgamZ0bVUgLi4gPC9EPic7fQ0KCU5kck4gew0KCQlqZlBOcUdoKCAkQldhX1VxSHFbJ0JXYSddIHFyICRCV2EgKSB7DQoJCQkkVU5qM0RhcWRkTlBnID0gTldhX0hodFd4X3JQRyggJEJXYVsndFBkJ10sICdPeScsICdPeScsICd5JywgJ3knICk7DQoJCQlOR2hmICc8ZEI+PEJXYSByUEc9IicuJFVOajNEYXFkZE5QZy4nIiBCVT0iJy4kQldhWydCVSddLiciIC8+PC9kQj4nOwkNCgkJfQ0KCX0NCgkNCglOR2hmICcNCgk8L3RkPg0KCTx4UCBHZHFycj0iV05IcWFxZF9HZE5xUCIgLz4NCgk8SHF4ZE4gR05kZHJEcUdCbWE9InkiIEdOZGREcVVVQm1hPSJTIiB4ZlBVTlA9InkiIDNCVUhoPSJFeXklIiBySGdkTj0ieGZQVU5QLUhmRDogRURjIHJmZEJVICNGRkY7IFdxUGFCbS1IZkQ6RXlEYzsgRHFVVUJtYS1IZkQ6U0RjOyI+DQoJCTxIUD4NCgkJCTxIVSBySGdkTj0iM0JVSGg6IGJTJTsiPic7CQkJDQoJCQlCaiAoICREcWFOID4gRSApICB7DQoJCQkJTkdoZiAnPEJtRHRIIEhnRE49Inh0SEhmbSIgR2RxcnI9IkRQTm9fRHFhTiB4dEhIZm0tck5HZm1VcVBnIiBCVT0ieEhtbXFvXycuICggJERxYU4gLSBFICkgLiciIG1xV049IkRQTm94SG1tcW8iIG9xZHROPSImZHEwdGY7IFFQTm9CZnRyIEJXcWFOciIgLz4nOw0KCQkJfQ0KCQkJDQoJCU5HaGYgJzwvSFU+PEhVIHJIZ2ROPSIzQlVIaDogYnklOyBITmNILXFkQmFtOiBHTm1ITlA7Ij4nOw0KCQkNCgkJCUJqICggJEJXYV9VcUhxWydIZkhxZEJXYSddID4geSAmJiAkQldhX1VxSHFbJ0RxYU5fR2Z0bUgnXSA+IEUgKSB7DQoJCQkJTkdoZiAnPE5XPkRxYU4gJy4kQldhX1VxSHFbJ0RxYSddLicgZmogJy4kQldhX1VxSHFbJ0RxYU5fR2Z0bUgnXS4nPC9OVz4nOwkNCgkJCX0NCgkJCU5kck4ge30NCgkJCQ0KCQlOR2hmICc8L0hVPjxIVSBySGdkTj0iM0JVSGg6IGJTJTsgSE5jSC1xZEJhbTogUEJhaEg7Ij4nOw0KCQkJQmogKCAkQldhX1VxSHFbJ1dmUE4nXSAhPSBqcWRyTiApICB7DQoJCQkJTkdoZiAnPEJtRHRIIEhnRE49Inh0SEhmbSIgR2RxcnI9Im1OY0hfRHFhTiB4dEhIZm0tck5HZm1VcVBnIiBCVT0ieEhtbXFvXycuICgkRHFhTiArIEUpIC4nIiBtcVdOPSJtTmNIeEhtbXFvIiBvcWR0Tj0ic05jSCBCV3FhTnIgJlBxMHRmOyIgLz4nOw0KCQkJfQ0KCQlOR2hmICc8L0hVPg0KCQk8L0hQPg0KCTwvSHF4ZE4+DQoJCTxIcXhkTiBHTmRkckRxR0JtYT0ieSIgR05kZERxVVVCbWE9IlMiIHhmUFVOUD0ieSIgM0JVSGg9IkV5eSUiIHJIZ2ROPSJ4ZlBVTlAtSGZEOiBFRGMgcmZkQlUgI0ZGRjsgV3FQYUJtLUhmRDpFeURjOyBEcVVVQm1hLUhmRDpTRGM7Ij4NCgkJPEhQPjxIVSBySGdkTj0iM0JVSGg6IGJ5JTsgSE5jSC1xZEJhbTogR05tSE5QOyI+DQoJCTxOVz4yaGYzIEJXcWFOciBETlAgRHFhTjwvTlc+Jm14ckQ7Jm14ckQ7PEJtRHRIIEhnRE49IkhOY0giIHJCcE49IkMiIG1xV049IkJXYV9tdFd4TlAiIEJVPSJCV2F4dEhETlBEcWFOIiBvcWR0Tj0iJy4kRE5QX0RxYU4uJyIgLz4mbXhyRDsmbXhyRDs8Qm1EdEggSGdETj0ieHRISGZtIiBHZHFycj0ieHRISGZtLXJOR2ZtVXFQZyIgQlU9InhIbW1xb3JoZjNkQnJIIiBtcVdOPSJ4SG1tcW9yaGYzZEJySCIgb3FkdE49IjJoZjMiIC8+DQoJCTwvSFU+PC9IUD4NCgk8L0hxeGROPgkNCgknOw0KDQoJVUJOKCk7DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OV2FfYXFkZE5QZ19kQnJIJywgJ05XYV9hcWRkTlBnX2RCckgnICk7DQoNCmp0bUdIQmZtIE5XYV9yTmRfQldhX1BkVSgpIHsJDQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnQldxYU5yJ10gKSApIHsgJEJXcWFOciA9IHFQUHFnKCk7fQ0KCU5kck4geyAkQldxYU5yID0gJF9RTTJKWydCV3FhTnInXTt9DQoJDQoJLy8gYU5IIEhoTiBIQkhkTnINCgkkQldxYU5yID0gTldhX05jSF9yTmQoICRCV3FhTnIgKTsNCgkkbU4zX0JXYSA9ICcnOw0KCQ0KCUJqICggISRCV3FhTnIgKSB7JG1OM19CV2EgPSAnPEQ+c2YgQldxYU5yIHJOZE5HSE5VLi4uPC9EPic7fQ0KCU5kck4gew0KCQlqZlBOcUdoKCAkQldxYU5yIHFyICRCV2FfQlUgKSB7DQoJCQkkQldhX1VxSHEgPSBhTkhfRGZySCggJEJXYV9CVSApOw0KCQkJJEJXYV90UGQgPSAkQldhX1VxSHEtPmF0QlU7DQoJCQkkcmRHSFVCV2EgPSBOV2FfSGh0V3hfclBHKCAkQldhX3RQZCwgJ095JywgJ095JywgJ3knLCAneScgKTsNCgkJCSRtTjNfQldhIC49ICcNCgkJCTxkQj4NCgkJCQk8Qm1EdEggSGdETj0iaEJVVU5tIiBtcVdOPSJOcXJXTlVCcV9XTkhxeGZjX0JXYV9yZEJVTlBbXSIgb3FkdE49IicuJEJXYV9CVS4nIiAvPg0KCQkJCTxCV2EgclBHPSInLiRyZEdIVUJXYS4nIiAvPg0KCQkJCTxyRHFtIEhCSGROPSJWTldmb04gWVdxYU4iPjwvckRxbT4NCgkJCTwvZEI+DQoJCQknOwkNCgkJfQ0KCX0NCgkNCglOR2hmICRtTjNfQldhOw0KCVVCTigpOw0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTldhX3JOZF9CV2FfUGRVJywgJ05XYV9yTmRfQldhX1BkVScgKTsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBBSUFSIGlmUCBYWm4gdUJhaEh4ZmMNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfYU5IX1VxSHFfcmRCVU5QX3FrcWMoKSB7DQoJDQoJR2hORzFfcWtxY19QTmpOUE5QKCdXTlVCcWRmcVVOUCcsICdyTkd0UEJIZycpOw0KCQ0KCUJqICggIUJyck5IKCAkX1FNMkpbJ0JVJ10gKSApIHsNCgkJTkdoZiAgJ1hQUGZQISc7DQoJCTNEX1VCTigpOw0KCQl9IA0KCQlOZHJOIHsNCgkJCQ0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkkVU5vV05VQnEgPSAnJzsNCgkNCglCaiAoIHJIUERmciggJF9RTTJKWydCVSddLCctJyApICkgew0KCQkkVU5vV05VQnEgPSBOY0RkZlVOKCAiLSIsICRfUU0ySlsnQlUnXSApOw0KCQkNCgkJJEJVID0gJFVOb1dOVUJxW3ldOw0KCQkkQnJVQm1xV0dHbUhtID0gTmNEZGZVTiggJyAnLCBIUEJXKCAkVU5vV05VQnFbRV0gKSApOyAvLyBAckJtR04gRS53LnkuRXkNCgkJDQoJCUJqICggQnJyTkgoICRCclVCbXFXR0dtSG1beV0gKSApIHsNCgkJCSRCclVCbXFXR0dtSG0gPSAkQnJVQm1xV0dHbUhtW3ldOw0KCQkJfSBOZHJOIHsNCgkJCQkkQnJVQm1xV0dHbUhtID0gJyc7DQoJCQkJfQ0KCQl9DQoJCU5kck4gew0KCQkNCgkJCSRCVSA9ICRfUU0ySlsnQlUnXTsNCgkJCSRCclVCbXFXR0dtSG0gPSAiIjsNCgkJfQ0KCQ0KCWFkZnhxZCAkRGZySDsNCgkNCg0KCSR0ck5hcWRkTlBnQm1qZiA9IGFOSF9EZnJIX1dOSHEoICRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfV05VQnFfYXFkZE5QZ19mREhDJywgSFB0TiApOw0KDQoJQmogKCAkQnJVQm1xV0dHbUhtICE9ICcnICkgew0KCQkNCgkJQmogKCAkdHJOYXFkZE5QZ0JtamYgPT0gJ2ZtJyApIHsNCgkJCSRCV2FfQm1qZiA9IGFOSF9EZnJIKCAkQnJVQm1xV0dHbUhtICk7DQoJCQkkeGZjV05VQnFISGQgPSAkQldhX0JtamYtPkRmckhfSEJIZE47DQoJCQkkeGZjV05VQnFyeEhIZCA9ICRCV2FfQm1qZi0+RGZySF9OY0dOUERIOw0KCQkJJHhmY3JoZlBIVU5HciA9ICAkQldhX0JtamYtPkRmckhfR2ZtSE5tSDsNCgkJCSR4ZmNyaGZQSFVOR3IgPSAgckhQX1BORGRxR04oIlxQIiwiIiwkeGZjcmhmUEhVTkdyKTsNCgkJCSR4ZmNyaGZQSFVOR3IgPSAgckhQX1BORGRxR04oIlxtIiwiIiwkeGZjcmhmUEhVTkdyKTsNCgkJCSR4ZmNyaGZQSFVOR3IgPSBVZl9yaGZQSEdmVU4oIDNEcXRIZkQoICR4ZmNyaGZQSFVOR3IgKSApOwkJCQ0KCQl9DQoJCU5kck4gew0KCQkJJHhmY3JoZlBIVU5HciA9IFVmX3JoZlBIR2ZVTiggM0RxdEhmRCggYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19yaGZQVU5yRycsIEhQdE4gKSApICk7DQoJCQkvLyR4ZmNyaGZQSFVOR3IgPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX3JoZlBVTnJHJywgSFB0TiApOw0KCQkJJHhmY1dOVUJxSEhkID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19IQkhkTicsIEhQdE4gKTsNCgkJCSR4ZmNXTlVCcXJ4SEhkID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19ydHhfSEJIZE4nLCBIUHROICk7DQoJCX0NCgl9DQoJTmRyTiB7DQoJCSR4ZmNyaGZQSFVOR3IgPSBVZl9yaGZQSEdmVU4oIDNEcXRIZkQoIGFOSF9EZnJIX1dOSHEoICRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfcmhmUFVOckcnLCBIUHROICkgKSApOw0KCQkvLyR4ZmNyaGZQSFVOR3IgPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX3JoZlBVTnJHJywgSFB0TiApOw0KCQkkeGZjV05VQnFISGQgPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX0hCSGROJywgSFB0TiApOw0KCQkkeGZjV05VQnFyeEhIZCA9IGFOSF9EZnJIX1dOSHEoICRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfcnR4X0hCSGROJywgSFB0TiApOw0KCQl9DQoJDQoJDQoJJEJXYXJQRyA9IGFOSF9EZnJIX1dOSHEoICRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfQldhJywgSFB0TiApOw0KCSRXTlVCcUhnRE4gPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX0hnRE4nLCBIUHROICk7DQoJJFVmV21xV04gPSBEUE5hX1BORGRxR04oICcvXjMzM1wuLycsJycsJF8yWFZMWFZbJzJYVkxYVl9zQVpYJ10gKTsJDQoJDQoJDQoJcjNCSEdoICggJFdOVUJxSGdETiApIHsNCgkJR3FyTiAnMkJtYWROIFlXcWFOJzoNCgkJJHhmY2RCbTEgPSAkQldhclBHOw0KCQkkQnJVZHF4ZE4gPSAnRSc7DQoJICAgICAgICB4UE5xMTsNCgkJCQ0KCQlHcXJOICdadGRIQkRkTiBZV3FhTnIgKDJkQlVOUCknOg0KCQkkeGZjZEJtMSA9IDNEX2FOSF9xSEhxR2hXTm1IX0JXcWFOX3JQRygkQnJVQm1xV0dHbUhtLCAnanRkZCcpOw0KCQkkQldhclBHID0gJHhmY2RCbTFbeV07DQoJCSR4ZmNkQm0xID0gJHhmY2RCbTFbeV07DQoJCSRCclVkcXhkTiA9ICdFJzsNCgkgICAgICAgIHhQTnExOwkJCQ0KCQkJDQoJCUdxck4gJ0xCVU5mJzoNCgkJJHhmY2RCbTEgPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX29CVU5mJywgSFB0TiApOw0KCQkkQnJVZHF4ZE4gPSAneSc7DQoJICAgICAgICB4UE5xMTsNCgkJCQ0KCQlHcXJOICdBdFVCZic6DQoJCSR4ZmNkQm0xID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9xdFVCZicsIEhQdE4gKTsNCgkJJEJyVWRxeGROID0gJ0UnOw0KCSAgICAgICAgeFBOcTE7CQkNCgkJCQ0KCQlHcXJOICduZmZhZE4gWnFEcic6DQoJCSR4ZmNkQm0xID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9hV3FEJywgSFB0TiApOw0KCQkkQnJVZHF4ZE4gPSAneSc7DQoJICAgICAgICB4UE5xMTsJCQkJDQoJCQkNCgkJR3FyTiAndUJtMSc6DQoJCSR4ZmNkQm0xID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9kQm0xJywgSFB0TiApOw0KCQkkZEJtMV9IZ0ROID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9kQm0xX2ZESEUnLCBIUHROICk7DQoJCSRCclVkcXhkTiA9ICd5JzsNCgkJQmogKCAkeGZjZEJtMSAhPScnICkgew0KCQkJJFdOVUJxX2RCbTFfakJtID0gJHhmY2RCbTE7IH0gTmRyTiB7DQoJCQkkV05VQnFfZEJtMV9qQm0gPSAkRGZySC0+YXRCVTsNCgkJfQ0KCQkNCgkJJHhmY2RCbTEgPSAkV05VQnFfZEJtMV9qQm07DQoJICAgICAgICB4UE5xMTsJCQkNCgl9DQoJDQoJJEJyYUQgPSBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fYUQnICk7ICRCck5XZCA9IE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9OV2QnICk7ICRCcmp4ID0gTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX2p4JyApOyAkQnJIM0ggPSBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fSDNIJyApOyAkQnJEQm0gPSBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fREJtJyApOyAkQnJVZCA9IE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9VZHh0SEhmbScgKTsNCg0KCSRITldEVU5yRyA9IHJIUGRObSggJHhmY3JoZlBIVU5HciApOw0KCSRIUEJXX2RObWFIaCA9IEN5eTsNCgkJCUJqICggJHhmY3JoZlBIVU5HciApIHsNCgkJCQkNCgkJQmogKCAkSE5XRFVOckc+JEhQQldfZE5tYUhoICkgew0KCQkJJHJoZlBITm1OUFVOckcgPSBQSFBCVyggcnR4ckhQKCAkeGZjcmhmUEhVTkdyLHksJEhQQldfZE5tYUhoLWIgKSApOwkNCiAgICAgICAgJHJoZlBITm1OUFVOckcgPSAkcmhmUEhObU5QVU5yRyAuICIuLi4iOw0KICAgCQkJfQlOZHJOIHsNCgkJCSRyaGZQSE5tTlBVTnJHID0gUEhQQlcoIHJ0eHJIUCggJHhmY3JoZlBIVU5Hcix5LCRIUEJXX2RObWFIaCApICk7CQ0KCQkJfQ0KCQl9DQoJCU5kck4gew0KCQkkcmhmUEhObU5QVU5yRyA9ICJGTnJHUEJESEJmbSBhZk5yIGhOUE4uLi4iOw0KCQl9IA0KDQoJLy9CaiAoICR4ZmNXTlVCcUhIZCA9PSAnJyAmJiBhTkhfSGhOX0hCSGROKCAkQlUgKSA9PSAnJyApIHskcmhxUE5XTlVCcUhIZCA9ICdaTlVCcSc7fQ0KCS8vTmRyTiBCaiAoICR4ZmNXTlVCcUhIZCA9PSAnJyAmJiBhTkhfSGhOX0hCSGROKCAkQlUgKSAhPSAnJyApIHskcmhxUE5XTlVCcUhIZCA9IGFOSF9IaE5fSEJIZE4oICRCVSApO30JDQoJDQoJQmogKCAkeGZjV05VQnFISGQgPT0gJycgJiYgYU5IX0hoTl9IQkhkTiggJEJVICkgPT0gJycgKSB7JHJocVBOV05VQnFISGQgPSAnWk5VQnEnO30NCglCaiAoICR4ZmNXTlVCcUhIZCA9PSAnJyAmJiBhTkhfSGhOX0hCSGROKCAkQlUgKSAhPSAnJyApIHskcmhxUE5XTlVCcUhIZCA9IGFOSF9IaE5fSEJIZE4oICRCVSApO30NCglCaiAoICR4ZmNXTlVCcUhIZCAhPSAnJyAmJiBhTkhfSGhOX0hCSGROKCAkQlUgKSAhPSAnJyApIHskcmhxUE5XTlVCcUhIZCA9ICR4ZmNXTlVCcUhIZDt9CQ0KCQ0KDQpmeF9ySHFQSCgpOwkNCg0KQmogKCAkQnJqeCB8fCAkQnJIM0ggfHwgJEJyREJtIHx8ICRCcmFEIHx8ICRCck5XZCB8fCAkQnJVZCApOiA/Pg0KDQogICAgICAgICAgICAgIDxVQm8gQlU9Ild4cmZyV05VIj4NCiAgICAgICAgICAgIAk8dGQ+DQogICAgICAgICAgICAgICAgPD9EaEQgQmogKCAkQnJqeCApOiA/Pg0KICAgICAgICAgICAgICAgICAgPGRCIEJVPSJyZnJXTlVqeCI+DQoJCQkJICANCgkJCQkgPD9EaEQNCgkJCQkgIA0KCQkJCSRqeHFEREJVID0gSFBCVyhOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfanhfcUREQlUnICkpOw0KCQkJCSRqeEhIZCA9IERQTmFfUE5EZHFHTignL1tecS1weS1PXHJdL0InLCAnICcsICRyaHFQTldOVUJxSEhkICk7DQoJCQkJJGpCZE5tVyA9IHhxck5tcVdOKCAkQldhclBHLCAiLiIuRHFIaEJtamYoICRCV2FyUEcsIFFBSlRZc2lNX1hSSlhzMllNcyApICk7DQoJCQkJDQoJCQkJQmogKCAkanhxRERCVSAhPSAnJyApIHsJDQoJCQkJDQoJCQkJJGp4eGZjMyA9ICdPZXknOw0KCQkJCSRqeHhmY2ggPSAnU3l5JzsNCgkJCQkNCgkJCQkkanh0UGQgPSAnaEhIRHI6Ly8zMzMuanFHTnhmZjEuR2ZXL1VCcWRmYS9qTk5VP3FERF9CVT0nLiRqeHFEREJVLicmZEJtMT0nLnRQZE5tR2ZVTiggJEJXYXJQRyApLicmREJHSHRQTj0nLnRQZE5tR2ZVTiggJEJXYXJQRyApLicmR3FESEJmbT0nLiRqeEhIZC4nJlVOckdQQkRIQmZtPScuJGpCZE5tVy4nJlBOVUJQTkdIX3RQQj0nLnRQZE5tR2ZVTiggckJITl90UGQoKSApLicnOw0KCQkJCX0gDQoJCQkJTmRyTiB7IA0KCQkJCQ0KCQkJCSRqeHhmYzMgPSAnU2U0JzsNCgkJCQkkanh4ZmNoID0gJ2JDUyc7DQoJCQkJDQoJCQkJCSRqeHRQZCA9ICdoSEhEcjovLzMzMy5qcUdOeGZmMS5HZlcvcmhxUE5QLkRoRD9yPUV5eSZxV0Q7RFtIQkhkTl09Jy50UGRObUdmVU4oICRyaHFQTldOVUJxSEhkICkuJyZxV0Q7RFtydFdXcVBnXT0nLnRQZE5tR2ZVTihySFBCRF9IcWFyKCAkcmhmUEhObU5QVU5yRyApICkuJyZxV0Q7RFt0UGRdPTdNc0xKTUtWdSZxV0Q7JnFXRDtEW0JXcWFOcl1beV09Jy50UGRObUdmVU4oICRCV2FyUEcgKS4nJzsNCgkJCQl9DQoJCQkJPz4NCg0KCQkJCQk8cSBmbTdkQkcxPSIzQm1VZjMuZkRObSgnPD9EaEQgTkdoZiAkanh0UGQ7ID8+JywncmhxUE5QJywnSGZmZHhxUD15LHJIcUh0cj15LDNCVUhoPTw/RGhEIE5HaGYgJGp4eGZjMzsgPz4saE5CYWhIPTw/RGhEIE5HaGYgJGp4eGZjaDsgPz4nKTsiIGhQTmo9Imtxb3FyR1BCREg6IG9mQlUoeSkiPjxyRHFtIEhCSGROPSIyaHFQTiBCSCEiPjwvckRxbT48L3E+DQogICAgICAgICAgICAgICAgICA8L2RCPg0KICAgICAgICAgICAgICAgICAgPD9EaEQgTm1VQmo7ID8+DQoNCiAgICAgICAgICAgICAgICA8P0RoRCBCaiAoICRCckgzSCApOiA/Pg0KICAgICAgICAgICAgICAgICAgPGRCIEJVPSJyZnJXTlVIMyI+DQoJCQkJCTxxIGZtN2RCRzE9IjNCbVVmMy5mRE5tKCdoSEhEcjovL0gzQkhITlAuR2ZXL3JocVBOP0hOY0g9PD9EaEQgTkdoZiB0UGRObUdmVU4oICc3aE5HMSBmdEggIicuJHJocVBOV05VQnFISGQuJyIgZm0gJy5hTkhfeGRmYUJtamYoICdtcVdOJyApICk7ID8+JnRQZD03TXNMSk1LVnUnLCdyaHFQTlAnLCdIZmZkeHFQPXksckhxSHRyPXksM0JVSGg9U2U0LGhOQmFoSD1iQ1MnKTsiIGhQTmo9Imtxb3FyR1BCREg6IG9mQlUoeSkiPjxyRHFtIEhCSGROPSJKM05OSCBCSCEiPjwvckRxbT48L3E+DQogICAgICAgICAgICAgICAgICA8L2RCPg0KICAgICAgICAgICAgICAgICAgPD9EaEQgTm1VQmo7ID8+DQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8P0RoRCBCaiAoICRCckRCbSApOiA/PiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgPGRCIEJVPSJyZnJXTlVEbSI+DQogICAgICAgICAgICAgICAgICAJPHEgZm03ZEJHMT0iM0JtVWYzLmZETm0oJ2hISERyOi8vREJtSE5QTnJILkdmVy9EQm0vR1BOcUhOL3h0SEhmbS8/dFBkPTw/RGhEIE5HaGYgdFBkTm1HZlVOKCAkeGZjZEJtMSApOyA/PiZXTlVCcT08P0RoRCBOR2hmIHRQZE5tR2ZVTiggJEJXYXJQRyApOyA/PiZVTnJHUEJESEJmbT08P0RoRCBOR2hmIHRQZE5tR2ZVTihySFBCRF9IcWFyKCAkcmhmUEhObU5QVU5yRyApICk7ID8+JywncmhxUE5QJywnSGZmZHhxUD15LHJIcUh0cj15LDNCVUhoPVNsUyxoTkJhaEg9YmJ5Jyk7IiBoUE5qPSJrcW9xckdQQkRIOiBvZkJVKHkpIj48ckRxbSBIQkhkTj0iUUJtIEJIISI+PC9yRHFtPjwvcT4NCiAgICAgICAgICAgICAgICAgIDwvZEI+DQogICAgICAgICAgICAgICAgICA8P0RoRCBObVVCajsgPz4NCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICA8P0RoRCBCaiAoICRCcmFEICk6ID8+ICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICA8ZEIgQlU9InJmcldOVWFEIj4NCiAgICAgICAgICAgICAgICAgIAk8cSBmbTdkQkcxPSIzQm1VZjMuZkRObSgnaEhIRHI6Ly9EZHRyLmFmZmFkTi5HZlcvcmhxUE4/dFBkPTdNc0xKTUtWdScsJycsJzNCVUhoPVNsUyxoTkJhaEg9YmJ5Jyk7IiBoUE5qPSJrcW9xckdQQkRIOiBvZkJVKHkpIj48ckRxbSBIQkhkTj0iMmhxUE4gQkghIj48L3JEcW0+PC9xPg0KICAgICAgICAgICAgICAgICAgPC9kQj4NCiAgICAgICAgICAgICAgICAgIDw/RGhEIE5tVUJqOyA/PiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIDw/RGhEIEJqICggJEJyTldkICk6ID8+ICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICA8ZEIgQlU9InJmcldOVU5XZCI+DQogICAgICAgICAgICAgICAgICAJPHEgaFBOaj0iV3FCZEhmOj8ydHhrTkdIPTw/RGhEIE5HaGYgdFBkTm1HZlVOKCAkcmhxUE5XTlVCcUhIZCApOyA/PiY5ZlVnPTw/RGhEIE5HaGYgckhQQkRfSHFhcigkcmhmUEhObU5QVU5yRykgLicgJy4gJzdNc0xKTUtWdSc7ID8+Ij48ckRxbSBIQkhkTj0iWFdxQmQgQkghIj48L3JEcW0+PC9xPg0KICAgICAgICAgICAgICAgICAgPC9kQj4NCiAgICAgICAgICAgICAgICAgIDw/RGhEIE5tVUJqOyA/PiAgIA0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIDw/RGhEIEJqICggJEJyVWQgJiYgJEJyVWRxeGROID09ICdFJyApOiA/PiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgPGRCIEJVPSJyZnJXTlVVZCI+DQogICAgICAgICAgICAgICAgICAJPHEgaFBOaj0iPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCgnVWQuRGhEJywgX19pWXVYX18gKS4iP3JmdFBHTj03TXNMSk1ZWm4yVjciOyA/PiI+PHJEcW0gSEJIZE49IkZmM21kZnFVIEJIISI+PC9yRHFtPjwvcT4NCiAgICAgICAgICAgICAgICAgIDwvZEI+DQogICAgICAgICAgICAgICAgICA8P0RoRCBObVVCajsgPz4gIA0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICA8P0RoRCBObVVCajs7DQoNCiRHZm1ITm1IID0gZnhfYU5IX0dkTnFtKCk7DQoNCglCaiAoICR4ZmNXTlVCcUhIZCA9PSAnJyApIHskeGZjV05VQnFISGQgPSAnbWZtTic7fQ0KCUJqICggJEdmbUhObUggPT0nJyApIHskR2ZtSE5tSCA9ICdtZm1OJzt9DQoJQmogKCAkeGZjV05VQnFyeEhIZCA9PScnICkgeyR4ZmNXTlVCcXJ4SEhkID0gJ21mbU4nO30NCglCaiAoICR4ZmNyaGZQSFVOR3IgPT0nJyApIHskeGZjcmhmUEhVTkdyID0gJ21mbU4nO30NCgkNCiRIaE5QTnJIID0gcVBQcWcoICR4ZmNXTlVCcUhIZCwkeGZjV05VQnFyeEhIZCxoSFdkX05tSEJIZ19VTkdmVU4oaEhXZHJETkdCcWRHaHFQcigkeGZjcmhmUEhVTkdyKSksJEdmbUhObUggKTsNCk5HaGYga3JmbV9ObUdmVU4oICRIaE5QTnJIICk7DQozRF9VQk4oKTsNCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgl9DQoNCn0NCnFVVV9xR0hCZm0oJzNEX3FrcWNfbWZEUEJvX05XYV9hTkhfVXFIcV9yZEJVTlBfcWtxYycsICdOV2FfYU5IX1VxSHFfcmRCVU5QX3FrcWMnKTsNCnFVVV9xR0hCZm0oJzNEX3FrcWNfTldhX2FOSF9VcUhxX3JkQlVOUF9xa3FjJywgJ05XYV9hTkhfVXFIcV9yZEJVTlBfcWtxYycpOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIFpOSHF4ZmMgWVdxYU4gVk5yQnBOUCByM0JIR2hOUCAoIEFJQVIgKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYV9yM0JIR2hfQldxYU5QTnJCcE5QKCl7DQoJDQoJR2hORzFfcWtxY19QTmpOUE5QKCdOV2FfQldxYU5fUE5yX3IzQkhHaE5QJywgJ3JOR3RQQkhnJyk7DQoJDQoJQmogKCAhQnJyTkgoICRfUU0ySlsnR1dVJ10gKSApIHsNCgkJDQoJCU5HaGYgICd5JzsNCgkJDQoJCTNEX1VCTigpOw0KCQkNCgkJfQ0KCQkNCgkJTmRyTiB7DQoJCQkNCgkJCSROV2FfdERVX2ZESEJmbXIgPSBhTkhfZkRIQmZtKCdOcXJnX1dOVUJxX2ZESCcpOw0KCQkJJE5XYV90RFVfZkRIQmZtclsnTnFyZ1dOVUJxX1VCck5tX0hIaHRXeCddWydCVSddID0gJ3knOw0KCQkJCXREVXFITl9mREhCZm0oJ05xcmdfV05VQnFfZkRIJywgJE5XYV90RFVfZkRIQmZtcik7CQkJCQ0KCQkJCU5HaGYgICdVZm1OJzsNCgkJCQkzRF9VQk4oKTsNCg0KCX0NCn0NCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV9yM0JIR2hfQldxYU5QTnJCcE5QJywgJ05XYV9yM0JIR2hfQldxYU5QTnJCcE5QJyApOw0KDQoJDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBaTkhxeGZjICggWk5VQnEgWFVCSGZQICkgSkJXSGh0V3ggN2hORzFyDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhX1dOSHF4ZmNfSEJXSGh0V3hfR2hORzEoJGpCZE4pew0KDQoJJHJIUE5xVyA9IEBqZkRObSggJGpCZE4sICczJyApOw0KCQ0KCUJqKCAkckhQTnFXICl7DQoJCQkNCgkJakdkZnJOKCAkckhQTnFXICk7DQoJCXRtZEJtMSggJGpCZE4gKTsNCgkJDQoJCQlQTkh0UG0gSFB0TjsNCg0KCQl9IE5kck4gew0KCQkJDQoJCQlxVVVfcUdIQmZtKCAncVVXQm1fbWZIQkdOcicsICdOV2FfSEJXSGh0V3hfRFBmeGROVycgKTsNCgkJCQ0KCQkJZnhfckhxUEgoKTsgPz4JDQo8ckdQQkRIPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgkKSB7DQoNCglrenROUGcoJyNCUE5wcjMnKS5HZEJHMShqdG1HSEJmbShOb05tSCl7DQoJCQ0KCQlOb05tSC5EUE5vTm1IRk5qcXRkSCgpOw0KCQlrenROUGcoJy5OV2EzcVBtQm1hJykuR3JyKCd4cUcxYVBmdG1VLUJXcWFOJywndFBkKDw/RGhEIE5HaGYgRGR0YUJtcl90UGQoJ0JXcWFOci9yM0JIR2guYUJqJyAsIFVCUG1xV04oX19pWXVYX18pKTsgPz4pJyk7DQoJCWt6dE5QZygnLk5XYTNxUG1CbWFEJykuanFVTk10SChFeXkpOw0KCQlrenROUGcoJy5yM0JHSGRmcVVCbWEnKS5qcVVOWW0oU3l5KTsNCgkJDQoJCXJOSEpCV05mdEgoanRtR0hCZm0oKXsNCgkJCU5XYV9yM0JIR2hfQldxYU5QTnJCcE5QKCk7DQoJCQl9LCBieXl5KTsgDQoJDQoJCX0pOw0KCQkNCglqdG1HSEJmbSBOV2FfcjNCSEdoX0JXcWFOUE5yQnBOUCgpIHsNCgkJDQoJCW9xUCBVcUhxID0gew0KCQkJcUdIQmZtOiAnTldhX3IzQkhHaF9CV3FhTlBOckJwTlAnLA0KCQkJck5HdFBCSGc6ICc8P0RoRCBOR2hmIDNEX0dQTnFITl9tZm1HTiggIk5XYV9CV3FhTl9QTnJfcjNCSEdoTlAiKTsgPz4nLA0KCQkJR1dVOiAnR2hxbWFOJywNCgkJCQl9Ow0KCQkJDQoJCQlrenROUGcuRGZySChxa3FjdFBkLCBVcUhxLCBqdG1HSEJmbShQTnJEZm1yTikgew0KCQkJCUJqIChQTnJEZm1yTiAhPSAneScpIHsNCgkJCQkJDQoJCQkJa3p0TlBnKCcuTldhM3FQbUJtYScpLkdycigneHFHMWFQZnRtVS1CV3FhTicsJ3RQZCg8P0RoRCBOR2hmIERkdGFCbXJfdFBkKCdCV3FhTnIvcjNISEJHMS5EbWEnICwgVUJQbXFXTihfX2lZdVhfXykpOyA/PiknKTsNCgkJCQlrenROUGcoJy5yM0JHSGRmcVVCbWEnKS5ITmNIKCdZV3FhTiBWTnJCcE5QIFdOSGhmVSAzcXIgcnRHR05ycmp0ZGRnIEdocW1hTlUuIEpoQnIgRHFhTiAzQmRkIEJtckhxbUhkZyBQTmRmcVUgSGYgcUREZGcgSGhOIEdocW1hTnIsIERkTnFyTiAzcUJILi4uJyk7DQoJCQkJDQoJCQkJck5ISkJXTmZ0SChqdG1HSEJmbSgpew0KCQkJCQlkZkdxSEJmbS5QTmRmcVUoKTsNCgkJCQkJfSwgYnl5eSk7ICAgDQoJCQkJCQ0KCQkJCQkJfQ0KCQkJCQkJCQkJCQkJDQoJCQkJCU5kck4gew0KCQkJCQkJDQoJCQkJCQlrenROUGcoJy5OV2EzcVBtQm1hJykuR3JyKCd4cUcxYVBmdG1VLUJXcWFOJywndFBkKDw/RGhEIE5HaGYgRGR0YUJtcl90UGQoJ0JXcWFOci8zcVBtQm1hX1BOVS5EbWEnICwgVUJQbXFXTihfX2lZdVhfXykpOyA/PiknKTsNCgkJCQkJCWt6dE5QZygnLnIzQkdIZGZxVUJtYScpLkhOY0goJ0FrcWMgUE4wdE5ySCBqcUJkTlUhIEpoQnIgRHFhTiAzQmRkIEJtckhxbUhkZyBQTmRmcVUsIERkTnFyTiAzcUJILi4uJyk7DQoJCQkJCQkNCgkJCQkJCXJOSEpCV05mdEgoanRtR0hCZm0oKXsNCgkJCQkJCQlkZkdxSEJmbS5QTmRmcVUoKTsNCgkJCQkJCQl9LCBieXl5KTsNCgkJCQkJCQkNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQl9CQ0KfSk7DQo8L3JHUEJESD4NCgkJCQ0KCQk8P0RoRAkNCgkkYU5tR2ZVTiA9IGZ4X2FOSF9HZE5xbSgpOw0KCU5HaGYgTldhX2tyX0dmV0RQTnJyKCAkYU5tR2ZVTiApOw0KCQkJfQ0KCQkNCgkJanRtR0hCZm0gTldhX0hCV0hodFd4X0RQZnhkTlcoKXsNCgkJCQ0KCQkJTkdoZiAiPFVCbyBHZHFycj0nTlBQZlAnPjxyRHFtIEdkcXJyPSdOV2EzcVBtQm1hJz48RCBHZHFycj0nTldhM3FQbUJtYUQnPiIuX18oICdKaE5QTiByTk5XciBIZiB4TiBxIERQZnhkTlcgM0JIaCBIaE4gdHJOIGZqIDxySFBmbWE+SkJXSGh0V3ggMkdQQkRIPC9ySFBmbWE+LCByZiAnLlhabl9ZSlhaX3NBWlguJyBHcW0gbWZIIFVCckRkcWcgcWRkIGZqIGdmdFAgQldxYU5yLiBKaEJyIEJyIHRydHFkZGcgR3F0ck5VIHhnIGdmdFAgck5Qb05QL2hmckhCbWEgR2ZtakJhdFBxSEJmbXIuIDxxIHJIZ2ROPSJITmNILVVOR2ZQcUhCZm06IG1mbU4hQldEZlBIcW1IOyIgaFBOaj0iIyIgQlU9IkJQTnByMyI+N2RCRzEgaE5QTiBIZiByM0JIR2ggQldxYU4gUE5yQnBOIFdOSGhmVSBIZiBYcXJnWk5VQnEgVk5yQnBOUC48L3E+JywgJ05xcldOVUJxJyApLiI8L0Q+PEQgR2RxcnI9J3IzQkdIZGZxVUJtYSc+UWROcXJOIDNxQkguLi48L0Q+PC9yRHFtPjwvVUJvPiI7DQoJCQl9CQ0KDQp9DQoNCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBuTkggSGhOIEJXcWFOciBqUGZXIEhoTiA4USBkQnhQcVBnDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiovDQpqdG1HSEJmbSBOV2FfZEJ4UHFQZ19CV3FhTnIoICREcWFOID0gRSwgJEROUF9EcWFOID0gRWUgKSB7DQoJJDB0TlBnX0JXcWFOcl9xUGFyID0gcVBQcWcoDQoJCSdEZnJIX0hnRE4nID0+ICdxSEhxR2hXTm1IJywgJ0RmckhfV0JXTl9IZ0ROJyA9PidCV3FhTicsICdEZnJIX3JIcUh0cicgPT4gJ0JtaE5QQkgnLCAnRGZySHJfRE5QX0RxYU4nID0+ICRETlBfRHFhTiwgJ0RxYU5VJyA9PiAkRHFhTg0KCSk7DQoJDQoJJDB0TlBnX0JXcWFOciA9IG1OMyA4UV96dE5QZyggJDB0TlBnX0JXcWFOcl9xUGFyICk7DQoJJEJXcWFOciA9IHFQUHFnKCk7DQoJDQoJamZQTnFHaCAoICQwdE5QZ19CV3FhTnItPkRmckhyIHFyICRCV3FhTiApIHsgDQoJCSRCV3FhTnJbXSA9IHFQUHFnKA0KCQkJJ0JVJwk9PiAkQldxYU4tPllGLA0KCQkJJ3RQZCcgCT0+ICRCV3FhTi0+YXRCVQ0KCQkpOw0KCX0NCgkNCgkkQldhX210V3hOUCA9ICQwdE5QZ19CV3FhTnItPmpmdG1VX0RmckhyOw0KCSREcWFOX0dmdG1IID0gR05CZCggJEJXYV9tdFd4TlAgLyAkRE5QX0RxYU4gKTsNCgkkcmhmM20gPSAkRE5QX0RxYU4gKiAkRHFhTjsNCgkoICRyaGYzbSA+PSAkQldhX210V3hOUCApID8gJFdmUE4gPSBqcWRyTiA6ICRXZlBOID0gSFB0TjsgDQoJDQoJUE5IdFBtIHFQUHFnKCAnQldhJyA9PiAkQldxYU5yLCAnRHFhJyA9PiAkRHFhTiwgJ0RxYU5fR2Z0bUgnID0+JERxYU5fR2Z0bUgsICdXZlBOJyA9PiAkV2ZQTiwgJ0hmSHFkQldhJyA9PiAkQldhX210V3hOUCApOw0KfQ0KDQpqdG1HSEJmbSBOV2FfTmNIX3JOZCggJFdOVUJxICkgew0KCUJqICggQnJfcVBQcWcoICRXTlVCcSApICkgew0KCQkkbU4zX3FQUHFnID0gcVBQcWcoKTsNCgkJDQoJCWpmUE5xR2goICRXTlVCcSBxciAkV05VQnFfQlUgKSB7DQoJCQlCaiAoIGFOSF9IaE5fSEJIZE4oICRXTlVCcV9CVSApICkgewkNCgkJCQkkbU4zX3FQUHFnW10gPSAkV05VQnFfQlU7DQoJCQl9DQoJCX0NCgkJDQoJCUJqIChHZnRtSCgkbU4zX3FQUHFnKSA9PSB5KSB7UE5IdFBtIGpxZHJOO30NCgkJTmRyTiB7UE5IdFBtICRtTjNfcVBQcWc7fQ0KCX0NCglOZHJOIHtQTkh0UG0ganFkck47fQkNCn0NCg0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IFhxcmdXTlVCcSA3dHJIZlcgN3FITmFmUGcgOWZjIChaTkhxeGZjKQ0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTnFyZ1dOVUJxYXFkZE5QZ19HcUhOYWZQQk5yX1dOSHFfeGZjKCAkRGZySCwgJHhmYyApIHsNCgkkVU5qcXRkSHIgPSBxUFBxZygnSHFjZm1mV2cnID0+ICdOV05VQnFhcWRkTlBnJyk7DQoJQmogKCAhQnJyTkgoICR4ZmNbJ3FQYXInXSApIHx8ICFCcl9xUFBxZyggJHhmY1sncVBhciddICkgKQ0KCQkkcVBhciA9IHFQUHFnKCk7DQoJTmRyTg0KCQkkcVBhciA9ICR4ZmNbJ3FQYXInXTsNCglOY0hQcUdIKCAzRF9EcVByTl9xUGFyKCRxUGFyLCAkVU5qcXRkSHIpLCBYUkpWXzI1WVEgKTsNCgkkSHFjID0gYU5IX0hxY2ZtZldnKCAkSHFjZm1mV2cgKTsNCg0KCT8+DQoJPFVCbyBCVT0iSHFjZm1mV2ctPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+IiBHZHFycj0iR3FITmFmUGdVQm8iPg0KCQk8dGQgQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1IcXhyIiBHZHFycj0iR3FITmFmUGctSHF4ciI+DQoJCQk8ZEIgR2RxcnI9IkhxeHIiPjxxIGhQTmo9IiM8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcWRkIj48P0RoRCBOR2hmICRIcWMtPmRxeE5kci0+cWRkX0JITldyOyA/PjwvcT48L2RCPg0KCQkJPGRCIEdkcXJyPSJoQlVOLUJqLW1mLWtyIj48cSBoUE5qPSIjPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LURmRCI+PD9EaEQgX04oICdaZnJIIEtyTlUnICk7ID8+PC9xPjwvZEI+DQoJCTwvdGQ+DQoNCgkJPFVCbyBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LURmRCIgR2RxcnI9IkhxeHItRHFtTmQiIHJIZ2ROPSJVQnJEZHFnOiBtZm1OOyI+DQoJCQk8dGQgQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/PkdoTkcxZEJySC1EZkQiIEdkcXJyPSJHcUhOYWZQZ0doTkcxZEJySCBqZlBXLW1mLUdkTnFQIiA+DQoJCQkJPD9EaEQgJERmRHRkcVBfQlVyID0gM0RfRGZEdGRxUF9ITlBXcl9HaE5HMWRCckgoJEhxY2ZtZldnKTsgPz4NCgkJCTwvdGQ+DQoJCTwvVUJvPg0KDQoJCTxVQm8gQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xZGQiIEdkcXJyPSJIcXhyLURxbU5kIj4NCgkJCTw/RGhEDQogICAgICAgICAgICAkbXFXTiA9ICggJEhxY2ZtZldnID09ICdOV05VQnFhcWRkTlBnJyApID8gJ0RmckhfR3FITmFmUGcnIDogJ0hxY19CbUR0SFsnIC4gJEhxY2ZtZldnIC4gJ10nOw0KICAgICAgICAgICAgTkdoZiAiPEJtRHRIIEhnRE49J2hCVVVObScgbXFXTj0neyRtcVdOfVtdJyBvcWR0Tj0neScgLz4iOyAvLyBBZGRmM3IgamZQIHFtIE5XREhnIEhOUFcgck5IIEhmIHhOIHJObUguIHkgQnIgcW0gQm1vcWRCVSBKTlBXIFlGIHFtVSAzQmRkIHhOIEJhbWZQTlUgeGcgTldESGcoKSBHaE5HMXIuDQogICAgICAgICAgICA/Pg0KCQkJPHRkIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz5HaE5HMWRCckgiIFVxSHEtM0QtZEJySHI9ImRCckg6PD9EaEQgTkdoZiAkSHFjZm1mV2c/PiIgR2RxcnI9IkdxSE5hZlBnR2hORzFkQnJIIGpmUFctbWYtR2ROcVAiPg0KCQkJCTw/RGhEIDNEX0hOUFdyX0doTkcxZEJySCgkRGZySC0+WUYsIHFQUHFnKCAnSHFjZm1mV2cnID0+ICRIcWNmbWZXZywgJ0RmRHRkcVBfR3FIcicgPT4gJERmRHRkcVBfQlVyICkgKSA/Pg0KCQkJPC90ZD4NCgkJPC9VQm8+DQoJPD9EaEQgQmogKCBHdFBQTm1IX3RyTlBfR3FtKCRIcWMtPkdxRC0+TlVCSF9ITlBXcikgKSA6ID8+DQoJCQk8VUJvIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcVVVTlAiIEdkcXJyPSIzRC1oQlVVTm0tR2hCZFVQTm0iPg0KCQkJCTxoZT4NCgkJCQkJPHEgQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xVVUtSGZhYWROIiBoUE5qPSIjPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LXFVVSIgR2RxcnI9ImhCVU4tQmotbWYta3IiPg0KCQkJCQkJPD9EaEQNCgkJCQkJCQkvKiBIUHFtcmRxSGZQcjogJXI6IHFVVSBtTjMgSHFjZm1mV2cgZHF4TmQgKi8NCgkJCQkJCQlEUEJtSGooIF9fKCAnKyAlcicgKSwgJEhxYy0+ZHF4TmRyLT5xVVVfbU4zX0JITlcgKTsNCgkJCQkJCT8+DQoJCQkJCTwvcT4NCgkJCQk8L2hlPg0KCQkJCTxEIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcVVVIiBHZHFycj0iR3FITmFmUGctcVVVIDNELWhCVVVObS1HaEJkVSI+DQoJCQkJCTxkcXhOZCBHZHFycj0ickdQTk5tLVBOcVVOUC1ITmNIIiBqZlA9Im1OMzw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/PiI+PD9EaEQgTkdoZiAkSHFjLT5kcXhOZHItPnFVVV9tTjNfQkhOVzsgPz48L2RxeE5kPg0KCQkJCQk8Qm1EdEggSGdETj0iSE5jSCIgbXFXTj0ibU4zPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+IiBCVT0ibU4zPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+IiBHZHFycj0iamZQVy1QTjB0QlBOVSBqZlBXLUJtRHRILUhCRCIgb3FkdE49Ijw/RGhEIE5HaGYgTnJHX3FISFAoICRIcWMtPmRxeE5kci0+bU4zX0JITldfbXFXTiApOyA/PiIgcVBCcS1QTjB0QlBOVT0iSFB0TiIvPg0KCQkJCQk8ZHF4TmQgR2RxcnI9InJHUE5ObS1QTnFVTlAtSE5jSCIgamZQPSJtTjM8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz5fRHFQTm1IIj4NCgkJCQkJCTw/RGhEIE5HaGYgJEhxYy0+ZHF4TmRyLT5EcVBObUhfQkhOV19HZmRmbTsgPz4NCgkJCQkJPC9kcXhOZD4NCgkJCQkJPD9EaEQgM0RfVVBmRFVmM21fR3FITmFmUEJOciggcVBQcWcoICdIcWNmbWZXZycgPT4gJEhxY2ZtZldnLCAnaEJVTl9OV0RIZycgPT4geSwgJ21xV04nID0+ICdtTjMnLiRIcWNmbWZXZy4nX0RxUE5tSCcsICdmUFVOUHhnJyA9PiAnbXFXTicsICdoQk5QcVBHaEJHcWQnID0+IEUsICdyaGYzX2ZESEJmbV9tZm1OJyA9PiAnJldVcXJoOyAnIC4gJEhxYy0+ZHF4TmRyLT5EcVBObUhfQkhOVyAuICcgJldVcXJoOycgKSApOyA/Pg0KCQkJCQk8Qm1EdEggSGdETj0ieHRISGZtIiBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LXFVVS1ydHhXQkgiIFVxSHEtM0QtZEJySHI9InFVVTo8P0RoRCBOR2hmICRIcWNmbWZXZyA/PkdoTkcxZEJySDo8P0RoRCBOR2hmICRIcWNmbWZXZyA/Pi1xVVUiIEdkcXJyPSJ4dEhIZm0gR3FITmFmUGctcVVVLXJ0eFdCSCIgb3FkdE49Ijw/RGhEIE5HaGYgTnJHX3FISFAoICRIcWMtPmRxeE5kci0+cVVVX21OM19CSE5XICk7ID8+IiAvPg0KCQkJCQk8P0RoRCAzRF9tZm1HTl9qQk5kVSggJ3FVVS0nLiRIcWNmbWZXZywgJ19xa3FjX21mbUdOLXFVVS0nLiRIcWNmbWZXZywganFkck4gKTsgPz4NCgkJCQkJPHJEcW0gQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xa3FjLVBOckRmbXJOIj48L3JEcW0+DQoJCQkJPC9EPg0KCQkJPC9VQm8+DQoJCTw/RGhEIE5tVUJqOyA/Pg0KCTwvVUJvPg0KCTw/RGhEDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBBVVUgUWZySCBKaHRXeG1xQmRyIHFtVSA3dHJIZlcgSmh0V3htcUJkciByQnBODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfcVVVX0hodFd4bXFCZF9ydEREZlBIKCkgew0KCUJqICggIUd0UFBObUhfSGhOV05fcnRERGZQSHIoICdEZnJILUhodFd4bXFCZHInICkpICB7DQpxVVVfSGhOV05fcnRERGZQSCggJ0RmckgtSGh0V3htcUJkcicsIHFQUHFnKCAnTnFyZ1dOVUJxYXFkZE5QZycgKSApOw0KcVVVX0JXcWFOX3JCcE4oICdOV2EtcVVXQm0tSGh0V3gnLCBseSwgbHksIEhQdE4gKTsgLy8gS3JOVSBCbSBIaE4gTnFyZ1dOVUJxIE5VQkggRHFhTg0KCX0NCn0NCnFVVV9xR0hCZm0oJ0JtQkgnLCAnTnFyV05VQnFfcVVVX0hodFd4bXFCZF9ydEREZlBIJyk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBBVVUgR1BOVUJIciBCbSBxVVdCbSBEcWFODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxYXFkZE5QZ19xVVVfamZmSE5QX0dQTlVCSHIoICRITmNIICkgew0KCSRIID0gJyc7DQoJQmogKCBhTkhfRGZySF9IZ0ROKCkgPT09ICdOcXJnV05VQnFhcWRkTlBnJyApIHsNCgkJJEggLj0gIjxVQm8gQlU9XCJHUE5VQkhyXCIgckhnZE49XCJkQm1OLWhOQmFoSDogQ0NEYztcIj4iOw0KCQkkSCAuPSAiPEQ+WHFyZyBaTlVCcSBucWRkTlBnIERkdGFCbSBCciBHUE5xSE5VIHhnIDxxIGhQTmo9XCJoSEhEcjovL2FoZnBnZHF4LkdmVy9cIiBIcVBhTkg9XCJfeGRxbTFcIj5uaGZwZ3VxeCwgWW1HPC9xPi48L0Q+IjsNCgkJJEggLj0gIjxEPllqIGdmdCBocW9OIHJmV04gcnRERGZQSCBCcnJ0TiwgVWZtJ0ggaE5yQkhxSE4gSGYgPHEgaFBOaj1cImhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvcnR4V0JILXJ0RERmUEgtUE4wdE5ySFwiIEhxUGFOSD1cIl94ZHFtMVwiPjNQQkhOIGhOUE48L3E+LiBKaE4gbmhmcGd1cXggSE5xVyAzQmRkIHhOIGhxRERnIEhmIHJ0RERmUEggZ2Z0IGZtIHFtZyBCcnJ0Ti48L0Q+IjsNCgkJJEggLj0gIjwvVUJvPiI7DQoJfU5kck57DQoJCSRIID0gJEhOY0g7DQoJfQ0KDQoJUE5IdFBtICRIOw0KfQ0KcVVVX2pCZEhOUCggJ3FVV0JtX2pmZkhOUF9ITmNIJywgJ05xcmdXTlVCcWFxZGROUGdfcVVVX2pmZkhOUF9HUE5VQkhyJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIG5OSCBIaE4gRHFISE5QbXIgZEJySCANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJXTlVCcV9EcUhITlBtcl9kcigpIHsNCgkkRHFISE5QbXIgPSBxUFBxZygpOw0KCSREcUhITlBtcl9kQnJIID0gckdxbVVCUCggWFpuX0ZZVi4iL0dyci9CV3FhTnIvRHFISE5QbXIiICk7DQoJDQoJamZQTnFHaCggJERxSEhOUG1yX2RCckggcXIgJERxSEhOUG1fbXFXTiApIHsNCgkJQmogKCAkRHFISE5QbV9tcVdOICE9ICcuJyAmJiAkRHFISE5QbV9tcVdOICE9ICcuLicgKSB7DQoJCQkkRHFISE5QbXJbXSA9ICREcUhITlBtX21xV047DQoJCX0NCgl9DQoJUE5IdFBtICREcUhITlBtcjsJDQp9DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgVlhaTUxYIFFYVlpBdVlzNQ0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTldhX2hCVU5fRE5QV3FkQm0xKCkgew0KYWRmeHFkICREZnJIX0hnRE47DQpCaiggJERmckhfSGdETiA9PSAnTnFyZ1dOVUJxYXFkZE5QZycgKSB7DQpOR2hmICc8ckhnZE4gSGdETj0iSE5jSC9HcnIiPiNOVUJILXJkdGEteGZje1VCckRkcWc6IG1mbU47fTwvckhnZE4+JzsNCn0NCn0NCnFVVV9xR0hCZm0oJ3FVV0JtX2hOcVUnLCAnTldhX2hCVU5fRE5QV3FkQm0xJyk7IA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBWWFpNTFggSlRYIFFBVlhzSiBpWVh1RiBpTVYgSlRYIDdLMkpNWiBKWFJNc01aNg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfUE5XZm9OX0dxSF9EcVBObUgoKXsNCiAgICBhZGZ4cWQgJEd0UFBObUhfckdQTk5tOw0KICAgIHIzQkhHaCAoICRHdFBQTm1IX3JHUE5ObS0+QlUgKSB7DQogICAgICAgIEdxck4gJ05VQkgtTldOVUJxYXFkZE5QZyc6DQogICAgICAgICAgICANCgkJCT8+DQoJCQk8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQogICAgICAgICAgICBrenROUGcoVWZHdFdObUgpLlBOcVVnKCBqdG1HSEJmbSgkKSB7DQogICAgICAgICAgICAgICAga3p0TlBnKCcjRHFQTm1IJykuRHFQTm1IcignLmpmUFctakJOZFUnKS5QTldmb04oKTsNCgkJCQlrenROUGcoJyNIcWEtcmR0YSwgI0hxYS1VTnJHUEJESEJmbScpLkRxUE5tSHIoJy5qZlBXLWpCTmRVJykuaEJVTigpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICA8L3JHUEJESD4NCiAgICAgICAgICAgIDw/RGhEDQoJCQkNCiAgICAgICAgICAgIHhQTnExOw0KICAgIH0NCn0NCnFVVV9xR0hCZm0oJ3FVV0JtX2pmZkhOUC1OVUJILUhxYXIuRGhEJywgJ05XYV9QTldmb05fR3FIX0RxUE5tSCcpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFRYUiBIZiBWbjkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJnV05VQnFfaE5jQ1BheCgkaE5jKSB7DQogICAkaE5jID0gckhQX1BORGRxR04oIiMiLCAiIiwgJGhOYyk7DQoNCiAgIEJqKHJIUGRObSgkaE5jKSA9PSBiKSB7DQogICAgICAkUCA9IGhOY1VORyhydHhySFAoJGhOYyx5LEUpLnJ0eHJIUCgkaE5jLHksRSkpOw0KICAgICAgJGEgPSBoTmNVTkcocnR4ckhQKCRoTmMsRSxFKS5ydHhySFAoJGhOYyxFLEUpKTsNCiAgICAgICR4ID0gaE5jVU5HKHJ0eHJIUCgkaE5jLEMsRSkucnR4ckhQKCRoTmMsQyxFKSk7DQogICB9IE5kck4gew0KICAgICAgJFAgPSBoTmNVTkcocnR4ckhQKCRoTmMseSxDKSk7DQogICAgICAkYSA9IGhOY1VORyhydHhySFAoJGhOYyxDLEMpKTsNCiAgICAgICR4ID0gaE5jVU5HKHJ0eHJIUCgkaE5jLGUsQykpOw0KICAgfQ0KICAgJFBheCA9IHFQUHFnKCRQLCAkYSwgJHgpOw0KICAgLy9QTkh0UG0gQldEZGZVTigiLCIsICRQYXgpOyAvLyBQTkh0UG1yIEhoTiBQYXggb3FkdE5yIHJORHFQcUhOVSB4ZyBHZldXcXINCiAgIFBOSHRQbSBCV0RkZlVOKCIsIiwgJFBheCk7IC8vIFBOSHRQbXIgcW0gcVBQcWcgM0JIaCBIaE4gUGF4IG9xZHROcg0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFBORGRxR05fTmNITm1yQmZtDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhX1BORGRxR05fTmNITm1yQmZtKCRqQmRObXFXTikgew0KCSROY0ggPSBEcUhoQm1qZigkakJkTm1xV04sIFFBSlRZc2lNX1hSSlhzMllNcyk7DQoJJG1OM19OY0hObXJCZm0gPSAnTldhR29QLScuJE5jSDsNCglQTkh0UG0gcnR4ckhQX1BORGRxR04oJGpCZE5tcVdOICwgJG1OM19OY0hObXJCZm0sIHJIUFBEZnIoJGpCZE5tcVdOICwgJy4nKSArIEUpOw0KICAgIC8vUE5IdFBtIERQTmFfUE5EZHFHTignL1wuLiskLycsICcuJyAuICRtTjNfTmNITm1yQmZtLCAkakJkTm1xV04pOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIG5OSCBxSEhxR2hXTm1IIEJXcWFOIEJVIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYV9hTkhfcUhIcUdoV05tSF9CVV9qUGZXX3JQRyAoJGRCbTEpIHsNCiAgICBhZGZ4cWQgJDNEVXg7DQogICAgICAgICRkQm0xID0gRFBOYV9QTkRkcUdOKCcvLVxVK2NcVSsoPz1cLihrRGF8a0ROYXxEbWF8YUJqKSQpL0InLCAnJywgJGRCbTEpOw0KICAgICAgICBQTkh0UG0gJDNEVXgtPmFOSF9vcVAoIjJYdVg3SiBZRiBpVk1aIHskM0RVeC0+RGZySHJ9IDhUWFZYIGF0QlU9JyRkQm0xJyIpOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICA3MjIgN2ZXRFBOcnJmUCBAckJtR04gRS5TLkUubA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYV9HcnJfR2ZXRFBOcnIoICRXQm1CamcgKSB7DQoJLyogUE5XZm9OIEdmV1dObUhyICovDQogICAgCSRXQm1CamcgPSBEUE5hX1BORGRxR04oICchL1wqW14qXSpcKisoW14vXVteKl0qXCorKSovIScsICcnLCAkV0JtQmpnICk7DQoNCiAgICAgICAgLyogUE5XZm9OIEhxeHIsIHJEcUdOciwgbU4zZEJtTnIsIE5IRy4gKi8NCiAgICAJJFdCbUJqZyA9IHJIUF9QTkRkcUdOKCBxUFBxZygiXFBcbSIsICJcUCIsICJcbSIsICJcSCIsICcgICcsICcgICAgJywgJyAgICAnKSwgJycsICRXQm1CamcgKTsNCiAgICAJCQ0KICAgICAgICBQTkh0UG0gJFdCbUJqZzsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgSTIgN2ZXRFBOcnJmUCBAckJtR04gRS5TLkUubA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYV9rcl9HZldEUE5yciggJFdCbUJqZyApIHsNCgkNCiRQTkRkcUdOID0gcVBQcWcoDQogICAgJyNcJyhbXlxtXCddKj8pL1wqKFteXG1cJ10qKVwnIycgPT4gIidcRS8nK1wnXCcrJypcQyciLCAvLyBQTldmb04gR2ZXV05tSHIgalBmVyAnIHJIUEJtYXINCiAgICAnI1wiKFteXG1cIl0qPykvXCooW15cbVwiXSopXCIjJyA9PiAnIlxFLyIrXCdcJysiKlxDIicsIC8vIFBOV2ZvTiBHZldXTm1IciBqUGZXICIgckhQQm1hcg0KICAgICcjL1wqLio/XCovI3InICAgICAgICAgICAgPT4gIiIsICAgICAgLy8gckhQQkQgNyBySGdkTiBHZldXTm1Icg0KICAgICcjW1xQXG1dKyMnICAgICAgICAgICAgICAgPT4gIlxtIiwgICAgLy8gUE5XZm9OIHhkcW0xIGRCbU5yIHFtVSBcUCdyDQogICAgJyNcbShbIFxIXSovLy4qP1xtKSojcicgICA9PiAiXG0iLCAgICAvLyBySFBCRCBkQm1OIEdmV1dObUhyICgzaGZkTiBkQm1OIGZtZGcpDQogICAgJyMoW15cXF0pLy8oW15cJyJcbV0qKVxtI3InID0+ICJcXEVcbSIsICAgICAgICAgICANCiAgICAnI1xtXHIrIycgICAgICAgICAgICAgICAgID0+ICJcbSIsICAgIC8vIHJIUEJEIE5jR05yciAzaEJITnJEcUdODQogICAgJyNccitcbSMnICAgICAgICAgICAgICAgICA9PiAiXG0iLCAgICAvLyBySFBCRCBOY0dOcnIgM2hCSE5yRHFHTg0KICAgICcjKC8vW15cbV0qXG0pI3InICAgICAgICAgPT4gIlxcRVxtIiwgLy8gTmNIUHEgZEJtTiBqTk5VIHFqSE5QIHFtZyBHZldXTm1IciBkTmpIDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoQldEZlBIcW1IIGFCb05tIGRxSE5QIFBORGRxR05XTm1IcikNCiAgICAnIy8oW1wnIl0pXCtcJ1wnXCsoW1wnIl0pXCojJyA9PiAiLyoiIC8vIFBOckhmUE4gR2ZXV05tSHIgQm0gckhQQm1hcg0KICApOw0KDQogICRyTnFQR2ggPSBxUFBxZ18xTmdyKCAkUE5EZHFHTiApOw0KICAkckdQQkRIID0gRFBOYV9QTkRkcUdOKCAkck5xUEdoLCAkUE5EZHFHTiwgJFdCbUJqZyApOw0KDQogICRQTkRkcUdOID0gcVBQcWcoDQogICAgIiYmXG0iID0+ICImJiIsDQogICAgInx8XG0iID0+ICJ8fCIsDQogICAgIihcbSIgID0+ICIoIiwNCiAgICAiKVxtIiAgPT4gIikiLA0KICAgICJbXG0iICA9PiAiWyIsDQogICAgIl1cbSIgID0+ICJdIiwNCiAgICAiK1xtIiAgPT4gIisiLA0KICAgICIsXG0iICA9PiAiLCIsDQogICAgIj9cbSIgID0+ICI/IiwNCiAgICAiOlxtIiAgPT4gIjoiLA0KICAgICI7XG0iICA9PiAiOyIsDQogICAgIntcbSIgID0+ICJ7IiwNCi8vICAifVxtIiAgPT4gIn0iLCAoeE5HcXRyTiBZIGpmUGFOSCBIZiBEdEggck5XQkdmZGZtciBxakhOUCBqdG1HSEJmbSBxcnJCYW1XTm1IcikNCiAgICAiXG1dIiAgPT4gIl0iLA0KICAgICJcbSkiICA9PiAiKSIsDQogICAgIlxtfSIgID0+ICJ9IiwNCiAgICAiXG1cbSIgPT4gIlxtIg0KICApOw0KDQogICRyTnFQR2ggPSBxUFBxZ18xTmdyKCAkUE5EZHFHTiApOw0KICAkckdQQkRIID0gckhQX1BORGRxR04oICRyTnFQR2gsICRQTkRkcUdOLCAkckdQQkRIICk7DQoNCiAgUE5IdFBtIEhQQlcoICRyR1BCREggKTsNCg0KfQ0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IGlWTXNKWHNGIEE3SllMQUpYIHNNSllpWTdBSllNcw0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gTldhX2pQZm1IX2RCR05tck5fbWZIQmpnKCkgew0KCQ0KCQkkTldhalBmbUhtZkhCamcgPSAnPFVCbyBHZHFycj0iTnFyZ1dOVUJxX0dObUhOUCI+PFVCbyBHZHFycj0iTldhZEJHTm1yTkJtaiI+UWROcXJOIHFHSEJvcUhOIDxySFBmbWE+Jy5YWm5fWUpYWl9zQVpYLic8L3JIUGZtYT4gZEJHTm1yTiAxTmcuIDZmdCBHcW0gcUdIQm9xSE4gPHEgaFBOaj0iJy5xVVdCbV90UGQoICdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyZEcWFOPU5XYS1xR0hCb3FIQmZtJyApLiciPicuX18oJ2hOUE4nLCAnTnFyV05VQnEnKS4nPC9xPjwvVUJvPjwvVUJvPic7DQoJCQkNCglOR2hmICROV2FqUGZtSG1mSEJqZzsNCn0NCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBpVk1zSlhzRiBpTU05TVIgc01KWWlZN0FKWU1zDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiovDQpqdG1HSEJmbSBOV2FfalBmbUhfamZmeGZjX21mSEJqZygpIHsNCgkNCgkJJE5XYWpQZm1IanggPSAnPFVCbyBHZHFycj0iTnFyZ1dOVUJxX0dObUhOUCI+PFVCbyBHZHFycj0iTldhQm1qZnhmYyI+aWZmOWZjIG1mSCBxR0hCb04hIDZmdCBocW9OIEhmIER0UEdocXJOIHJORHFQcUhOZGcgPHEgaFBOaj0iaEhIRHI6Ly9hZmYuYWQvZ1J0SXpBIiBIcVBhTkg9Il94ZHFtMSI+Jy5fXygnaE5QTicsICdOcXJXTlVCcScpLic8L3E+LCBmUCB0ck4gaWZmOWZjIGlQTk4gb05QckJmbSA8cSBoUE5qPSJoSEhEcjovLzNmUFVEUE5yci5mUGEvRGR0YUJtci9qZmZ4ZmMtQldxYU4tZEJhaEh4ZmMvIiBIcVBhTkg9Il94ZHFtMSI+Jy5fXygnaE5QTicsICdOcXJXTlVCcScpLic8L3E+Ljx4UD51TnFQbSBXZlBOIHF4ZnRIIGlmZjlmYyBkQmFoSHhmYyBIZ0ROIDxxIGhQTmo9ImhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi9VTldmL3hOckgtYXFkZE5QZy1kQmFoSHhmY05yI2RCYWhIeGZjRFBOV0J0VyIgSHFQYU5IPSJfeGRxbTEiPicuX18oJ2hOUE4nLCAnTnFyV05VQnEnKS4nPC9xPjwvVUJvPjwvVUJvPic7DQoJCQkNCglOR2hmICROV2FqUGZtSGp4Ow0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFlXcWFOIFZOckJwTiAoIEFyRE5HSCBWcUhCZiApDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JXYVBOckJwTigkQldhLCAkZEJXQkgsICRCclBOciwgJEJXMywgJEJXaCkgew0KCQ0KCS8qQmogKCBySFBEZnIoICRCV2EsICRfMlhWTFhWWydUSkpRX1RNMkonXSApID09PSBpQXUyWCApIHsNCgkJJEJXYT0gImhISEQ6Ly8iLiRfMlhWTFhWWydUSkpRX1RNMkonXS4kQldhOw0KCQl9DQoJCU5kck4gew0KCQkJJEJXYT0gJEJXYTsNCgkJCX0qLw0KCQ0KCUJqICggJEJXYSA9PSAnJyApIHsNCgkJJEJXYSA9IERkdGFCbXJfdFBkKCAnQldxYU5yL21mLUJXcWFOLXFvcUJkcXhkTi5rRGEnICwgVUJQbXFXTihfX2lZdVhfXykgKSA7DQoJfQ0KCQlOZHJOIHsNCgkJCSRCV2EgPSAkQldhOw0KCQl9CQ0KCQ0KCUJqICggJEJyUE5yID09ICdmbScgKSB7DQoJCUJqICggJEJXMyA+ICRkQldCSCApIHsNCgkJCSRITldEQldhUHFIQmYgPSAkQldoIC8gJEJXMzsNCgkJCSRqQmggPSAoQm1IKSgkSE5XREJXYVBxSEJmICogJGRCV0JIKTsgLy8gakJtcWQgQldxYU4gaE5CYWhIDQoJCQkkakIzID0gJGRCV0JIOyAvLyBqQmNOVSBCV3FhTiAzQlVIaA0KCQkJDQoJCQkkcWRkQldhVXFIcSA9IHFQUHFnKCBOV2FfSGh0V3hfclBHKCAkQldhLCAkakIzLCAkakJoLCAkQlczLCAkQldoKSwgJGpCMywgJGpCaCApOw0KCQkJDQoJCQl9DQoJCU5kck4gew0KCQkJJHFkZEJXYVVxSHEgPSBxUFBxZyggJEJXYSwgJEJXMywgJEJXaCApOw0KCQkJfQkJDQoJCX0NCglOZHJOIHsgJHFkZEJXYVVxSHEgPSBxUFBxZyggJEJXYSwgJEJXMywgJEJXaCApOwkNCgl9DQpQTkh0UG0gQldEZGZVTigiLCIsICRxZGRCV2FVcUhxKTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBZV3FhTiBWTnJCcE4gKCBBckROR0ggVnFIQmYgKSBBSUFSDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JXYVBOckJwTl9xa3FjKCkgew0KCQ0KCUdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1IaHRXeCcsICdyTkd0UEJIZycgKTsNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydCV2F0UGQnXSApIHx8ICFCcnJOSCggJF9RTTJKWydkQldCSE5QJ10gKSB8fCAkX1FNMkpbJ0JXYXRQZCddID09ICcnIHx8ICRfUU0ySlsnZEJXQkhOUCddID09ICcnICkgew0KCQlOR2hmICc8RD5Ba3FjIFBOMHROckgganFCZE5VLCBEZE5xck4gUE5qUE5yaCBnZnRQIHhQZjNyTlAgM0JtVWYzLjwvRD4nOw0KCQlVQk47DQoJCX0NCgkJTmRyTiB7DQoJCQkNCgkJJEJXYXRQZCA9ICRfUU0ySlsnQldhdFBkJ107DQoJCSRkQldCSE5QID0gJF9RTTJKWydkQldCSE5QJ107DQoJCSRxSEhCVSA9IDNEX2FOSF9xSEhxR2hXTm1IX0JXcWFOX3JQRyggTldhX2FOSF9xSEhxR2hXTm1IX0JVX2pQZldfclBHKCAkQldhdFBkICksICdqdGRkJyApOw0KCQ0KCQkvKkJqICggckhQRGZyKCAkQldhdFBkLCAkXzJYVkxYVlsnVEpKUV9UTTJKJ10gKSA9PT0gaUF1MlggKSB7DQoJCQkkQldhdFBkID0gImhISEQ6Ly8iLiRfMlhWTFhWWydUSkpRX1RNMkonXS4kQldhdFBkOw0KCQkJfQ0KCQkJTmRyTiB7DQoJCQkJJEJXYXRQZCA9ICRCV2F0UGQ7DQoJCQkJfSovDQoJCQkJDQoJCQkJJEhXREJXYVBxSEJmID0gJHFISEJVW0NdIC8gJHFISEJVW0VdOyAvL2FOSCBCV3FhTiBxckRORyBQcUhCZg0KDQoJCUJqICggJHFISEJVW0VdID4gJGRCV0JITlAgKSB7DQoJCQkkSFdEaCA9IChCbUgpKCRIV0RCV2FQcUhCZiAqICRkQldCSE5QKTsgLy8gakJtcWQgQldxYU4gaE5CYWhIDQoJCQkkSFdEMyA9ICRkQldCSE5QOyAvLyBqQmNOVSBCV3FhTiAzQlVIaA0KCQkJJHFkZEJXYVVxSHEgPSBxUFBxZyggTldhX0hodFd4X3JQRyggJEJXYXRQZCwgJEhXRDMsICRIV0RoLCAkcUhIQlVbRV0sICRxSEhCVVtDXSksICRIV0QzLCAkSFdEaCApOw0KCQkJTkdoZiBCV0RkZlVOKCIsIiwgJHFkZEJXYVVxSHEpOw0KCQkJVUJOOw0KCQkJfQ0KCQlOZHJOIHsNCgkJCSRqQm1CV2F0UGQgPSAkQldhdFBkOw0KCQkJJHFkZEJXYVVxSHEgPSBxUFBxZyggJGpCbUJXYXRQZCwgJHFISEJVW0VdLCAkcUhIQlVbQ10gKTsNCgkJCU5HaGYgQldEZGZVTigiLCIsICRxZGRCV2FVcUhxKTsNCgkJCVVCTjsNCgkJCX0JCQ0KCQl9DQp9DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJnV05VQnFfQldhUE5yQnBOX3FrcWMnLCAnTnFyZ1dOVUJxX0JXYVBOckJwTl9xa3FjJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIEhodFd4bXFCZCByZnRQR04gcjNCSEdoID0gSkJXSGh0V3ggZlAgTnFyZ1dOVUJxX1BOckJwTlANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfSGh0V3hfclBHKCAkQldhX3JQRywgJDNCVUhoLCAkaE5CYWhILCAkYXJwTkUsICRhcnBOQywgJEdXZlVOID0gJ0cnLCAkcEdyID0gJ0UnLCAkR0cgPSBtdGRkICkgewkNCg0KLyoJQDJCbUdOIEUuUy55LmIgKi8NCgkNCglCaighJEJXYV9yUEcpIHtQTkh0UG0ganFkck47fSBCaiAoIEJyX1d0ZEhCckJITigpICl7IFBOSHRQbSBqcWRyTjsgfQ0KCQ0KCUJqICggJEdHICkgeyAvKglAMkJtR04gRS53LnkuYiAqLw0KCQkNCgkJJEdHID0gJyZHRz0nLnJIUF9QTkRkcUdOKCcjJywgJycsICRHRykuJyc7DQoJCQ0KCQl9IE5kck4gew0KCQkJDQoJCQkkR0cgPSBtdGRkOw0KCQkJDQoJCQl9DQoJDQoJQmooIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9ISGh0V3gnICkgPT0gJ0UnICkgew0KCQkkTldhX0hodFd4X3RQZCA9IFhabl9KVEtaOV9pWXVYIC4gIj9yUEc9IiAuICRCV2FfclBHIC4gIiZoPSIgLiAkaE5CYWhIIC4gIiYzPSIgLiAkM0JVSGggLiAiJnBHPSIuJHBHci4iJjA9RXl5JnE9Ii4kR1dmVU4uIiIuJEdHLiIiOw0KCX0gTmRyTiB7DQoJCUJqICggJGFycE5FICE9ICd5JyAmJiAkYXJwTkMgIT0gJ3knICkgew0KCQkJJGFyQnBORSA9ICRhcnBORTsNCgkJCSRhckJwTkMgPSAkYXJwTkM7DQoJCQl9DQoJCQlOZHJOIHsNCgkJCQkkYWRmeHFkckJwTiA9IDNEX2FOSF9xSEhxR2hXTm1IX0JXcWFOX3JQRyggTldhX2FOSF9xSEhxR2hXTm1IX0JVX2pQZldfclBHKCAkQldhX3JQRyApLCAnanRkZCcgKTsNCgkJCQkkYXJCcE5FID0gJGFkZnhxZHJCcE5bRV07DQoJCQkJJGFyQnBOQyA9ICRhZGZ4cWRyQnBOW0NdOw0KCQkJCX0NCgkJCQkNCgkJCQkkTldhX0hodFd4X3RQZCA9IE5xcmdXTlVCcV9QTnJCcE5QKCAkQldhX3JQRywgJGFyQnBORSwgJGFyQnBOQywgJDNCVUhoLCAkaE5CYWhILCBIUHROLCAkR1dmVU4sIGpxZHJOICk7DQoJfQ0KCQ0KCVBOSHRQbSAkTldhX0hodFd4X3RQZDsJDQoNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBuTkggOFEgWW1qZg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX2FOSF8zREJtamYoKSB7DQoJDQovLyBuTkggMkJITiBLVnUJDQokYU5IM0RCbWpmID0gcVBQcWcoKTsNCiRhTkgzREJtamZbeV0gPSAiLSAyQkhOIEtWdSA6ICIgLmFOSF9yQkhOX3RQZCgpOw0KDQovLyBuTkggWnRkSEJyQkhOIHJIcUh0cg0KQmogKCBCcl9XdGRIQnJCSE4oKSApIHsgJGFOSDNEQm1qZltFXSA9ICctIDhRIFp0ZEhCckJITiA6IDZYMic7IH0gTmRyTiB7ICRhTkgzREJtamZbRV0gPSAnLSA4USBadGRIQnJCSE4gOiBzTSc7IH0NCg0KYWRmeHFkICQzRF9vTlByQmZtLCAkTldhV05XZlBnOwkJDQpOR2hmICItIDhRIExOUHJCZm0gOiAiLiQzRF9vTlByQmZtLiJcbSI7CQ0KTkdoZiAkYU5IM0RCbWpmW3ldLiJcbSI7DQpOR2hmICRhTkgzREJtamZbRV0uIlxtIjsNCk5HaGYgR2hORzFHdFBkcW1VdFBkamZETm0oKTsNCk5HaGYgIi0gWk5XZlBnIHVCV0JIIDogIi4kTldhV05XZlBnLiJcbSI7DQokSGhOV05fbXFXTiA9IDNEX2FOSF9IaE5XTigpOw0KTkdoZiAiLSBBR0hCb04gSmhOV04gOiAiLiRIaE5XTl9tcVdOLT5hTkgoJ3NxV04nKS4iXG0iOw0KTkdoZiAiLSBBR0hCb04gUWR0YUJtciA6IFxtIjsNCg0KLy8gbk5IIEFHSEJvTiBRZHRhQm0NCkJqICggQnJfV3RkSEJyQkhOKCkgKSB7IA0KCSRIaE5fRGR0YXIgPSBhTkhfckJITl9mREhCZm0oJ3FHSEJvTl9yQkhOM0JVTl9EZHRhQm1yJyk7DQoJamZQTnFHaCgkSGhOX0RkdGFyIHFyICQxTmcgPT4gJG9xZHROKSB7DQoJCSRySFBCbWEgPSBOY0RkZlVOKCcvJywkMU5nKTsNCgkJJHJIUEJtYVt5XSA9IHJIUF9QTkRkcUdOKCAiLSIsIiAiLCRySFBCbWFbeV0gKTsNCiAgICAgICAgTkdoZiAiICZteHJEOyZteHJEOyZteHJEOyZteHJEOyIudEczZlBVciggJHJIUEJtYVt5XSApIC4iXG0iOw0KCX0NCn0gTmRyTiB7DQoJJEhoTl9EZHRhciA9IGFOSF9mREhCZm0oJ3FHSEJvTl9EZHRhQm1yJyk7DQoJamZQTnFHaCgkSGhOX0RkdGFyIHFyICQxTmcgPT4gJG9xZHROKSB7DQoJCSRySFBCbWEgPSBOY0RkZlVOKCcvJywkb3FkdE4pOw0KCQkkckhQQm1hW3ldID0gckhQX1BORGRxR04oICItIiwiICIsJHJIUEJtYVt5XSApOw0KICAgICAgICBOR2hmICIgJm14ckQ7Jm14ckQ7Jm14ckQ7Jm14ckQ7Ii50RzNmUFVyKCAkckhQQm1hW3ldICkgLiJcbSI7DQoJCX0NCgl9DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgN2hORzEgN0tWdSBxbVUgcWRkZjNfdFBkX2pmRE5tDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gR2hORzFHdFBkcW1VdFBkamZETm0oKSB7DQoJDQoJICBCaigganRtR0hCZm1fTmNCckhyKCdHdFBkX29OUHJCZm0nKSApIHsNCgkJICAkQnJHdFBkID0gJy0gUVRRIDdLVnUgOiBBR0hCb04nOw0KCQkgIH0NCiAgICAJTmRyTiB7DQoJCSAkQnJHdFBkID0gJy0gUVRRIDdLVnUgOiBzTUogQUdIQm9OJzsNCgkgICAgIH0NCiAgICANCgkNCiAgICAgQmooIEBCbUJfYU5IKCdxZGRmM190UGRfamZETm0nKSApIHsNCgkJICRCcnFkZGYzID0gJy0gUVRRIEFkZGYzX3RQZF9qZkRObSA6IEFHSEJvTic7DQoJCSB9IE5kck4gew0KCQkJICAkQnJxZGRmMyA9ICctIFFUUSBBZGRmM190UGRfamZETm0gOiBzTUogQUdIQm9OJzsNCgkJCSAgfQ0KCQ0KCQ0KTkdoZiAkQnJHdFBkLiJcbSI7CQ0KTkdoZiAkQnJxZGRmMy4iXG0iOwkNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBuTkggUWR0YUJtIExOUHJCZm0gKEBQTkh0UG0gckhQQm1hIFFkdGFCbSBvTlByQmZtKQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdXTlVCcV9hTkhfRGR0YUJtX29OUHJCZm0oKSB7DQogICAgJERkdGFCbV9VcUhxID0gYU5IX0RkdGFCbV9VcUhxKCBYWm5fRllWIC4gJy9OcXJnLVdOVUJxLWFxZGROUGctRFBmLkRoRCcgKTsNCiAgICAkRGR0YUJtX29OUHJCZm0gPSAkRGR0YUJtX1VxSHFbJ0xOUHJCZm0nXTsNCiAgICBQTkh0UG0gJERkdGFCbV9vTlByQmZtOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIDdoTkcxIGJQVSBEcVBIZyBpZmZ4ZmMgRGR0YUJtDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JyamZmeGZjKCkgew0KCUJqKEdkcXJyX05jQnJIcignamZmeGZjTEMnKSB8fCBHZHFycl9OY0JySHIoJ2pmZnhmYycpIHx8IEdkcXJyX05jQnJIcignaWZmeGZjX2lQTk4nKSl7DQoJCSRCcmpmZnhmYyA9ICdxR0hCb04nOw0KCQlQTkh0UG0gJEJyamZmeGZjOwkNCgl9DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgMmR0YSBIZiBzcVdODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhX3JkdGFfSGZfbXFXTigkcmR0YSkgew0KCSRvcWRyID0gcVBQcWcoDQoJCQkJIjdObUhOUCI9PiAiRyIsDQoJCQkJIkpmRCI9PiAiSGZEIiwNCgkJCQkiSmZEIFZCYWhIIj0+ICJIUCIsDQoJCQkJIkpmRCB1TmpIIj0+ICJIZCIsDQoJCQkJIjlmSEhmVyI9PiAieCIsDQoJCQkJIjlmSEhmVyBWQmFoSCI9PiAieFAiLA0KCQkJCSI5ZkhIZlcgdU5qSCI9PiAieGQiLA0KCQkJCSJWQmFoSCI9PiAiUCIsDQoJCQkJInVOakgiPT4gImQiLAkJCQkNCgkJCQkiWFpuIHVCYWhIeGZjICggRk5qcXRkSCApIj0+ICJOV2FkeCIsDQoJCQkJInVCYWhIeGZjIEMiPT4gImR4QyIsDQoJCQkJImlxbUdnOWZjIEMiPT4gImp4QyIsDQoJCQkJImlxbUdnOWZjIGlQTk4iPT4gImp4alBOTiIsDQoJCQkJIjdmZGZQOWZjIj0+ICJHeCIsDQoJCQkJIlFQTkhIZ1FoZkhmIj0+ICJERCIsDQoJCQkJImlmZjlmYyI9PiAiamZmeGMiLA0KCQkJCSJRaGZIZjIzQkROIj0+ICJEciIsDQoJCQkJIlFoZkhmOWZjIj0+ICJEeGZjIiwNCgkJCQkiOGZQVURQTnJyIEpoQkcxOWZjIiA9PiAiM0RIeCIsDQoJCQkJIjJIZ2ROIHlFICggRk5qcXRkSCApIj0+ICJoZm9OUGZtTiIsDQoJCQkJIjJIZ2ROIHlDIj0+ICJOV2FvQk4zLUgzZiIsDQoJCQkJIjJIZ2ROIHliIj0+ICJOV2FvQk4zLUhoUE5OIiwNCgkJCQkiMkhnZE4geWUiPT4gIk5XYW9CTjMtamZ0UCIsDQoJCQkJIlZOckJwTiBIZiBpQkggckROR0JqQk5VIFVCV05tckJmbXIgKG1mIEdQZkREQm1hKSI9PiAieSIsDQoJCQkJIjdQZkQgcW1VIFBOckJwTiBIZiB4TnJIIGpCSCBIaE4gVUJXTm1yQmZtciAoVU5qcXRkSCB4Tmhxb0JmdFApIj0+ICJFIiwNCgkJCQkiVk5yQnBOIERQZkRmUEhCZm1xZGRnIEhmIGpCSCBObUhCUE4gQldxYU4gQm1IZiByRE5HQmpCTlUgVUJXTm1yQmZtciI9PiAiQyIsCQkJDQoJCQkJIlZOckJwTiBEUGZEZlBIQmZtcWRkZyBxVWt0ckhCbWEgckJwTiBmaiByR3FkTlUgQldxYU4iPT4gImIiCQkJDQoJCQkJCQkJCQkJCQ0KCSk7DQoJUE5IdFBtICRvcWRyWyRyZHRhXTsJDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgVnFtVWZXIDJIUEJtYQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYVZxbVVmVzJIUEJtYSgkZE5tYUhoKSB7DQogICAgICAgICRmUEJhQm1xZF9ySFBCbWEgPSBxUFBxZ19XTlBhTihQcW1hTigncScsJ3AnKSwgUHFtYU4oJ0EnLCAndicpKTsNCiAgICAgICAgJGZQQmFCbXFkX3JIUEJtYSA9IEJXRGRmVU4oJycsICRmUEJhQm1xZF9ySFBCbWEpOw0KICAgICAgICBQTkh0UG0gcnR4ckhQKHJIUF9yaHRqamROKHJIUEhmZGYzTlAoICRmUEJhQm1xZF9ySFBCbWEpICksIHksICRkTm1hSGgpOw0KICAgIH0NCgkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgWG1xeGROIDJmUEhCbWEgZmogSGhOIFpOVUJxIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX0dQTnFITl9OcXJnV05VQnFfcmZQSF9EcWFOKCkgew0KICAgICROcXJXTlVCcV9yZlBIX0RxYU4gPSBxVVVfcnR4V05tdF9EcWFOKCdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZycsICcyZlBITlAnLCBfXygnMmZQSE5QJywgJ05xcldOVUJxJyksICdOVUJIX0RmckhyJywgJ05xcmdXTlVCcV9mUFVOUCcsICdOcXJXTlVCcV9OcXJnV05VQnFfcmZQSCcpOw0KICAgIA0KICAgIHFVVV9xR0hCZm0oJ3FVV0JtX0RQQm1IX3JIZ2ROci0nIC4gJE5xcldOVUJxX3JmUEhfRHFhTiwgJ05xcldOVUJxX0RQQm1IX3JmUEhfckhnZE5yJyk7DQogICAgcVVVX3FHSEJmbSgncVVXQm1fRFBCbUhfckdQQkRIci0nIC4gJE5xcldOVUJxX3JmUEhfRHFhTiwgJ05xcldOVUJxX0RQQm1IX3JmUEhfckdQQkRIcicpOw0KfQ0KDQpqdG1HSEJmbSBOcXJXTlVCcV9OcXJnV05VQnFfcmZQSCgpIHsNCiAgICAkTnFyZ1dOVUJxciA9IG1OMyA4UV96dE5QZygnRGZySF9IZ0ROPU5xcmdXTlVCcWFxZGROUGcmRGZySHJfRE5QX0RxYU49LUUmZlBVTlB4Zz1XTm10X2ZQVU5QJmZQVU5QPUEyNycpOyANCglCaiAoICAkTnFyZ1dOVUJxci0+aHFvTl9EZnJIcigpICkgOg0KCT8+DQogICAgPFVCbyBHZHFycj0iM1BxRCI+DQogICAgICAgIDxVQm8gQlU9IkJHZm0tTlVCSCIgR2RxcnI9IkJHZm1iQyBCR2ZtYkMtRGZySHItTnFyZ1dOVUJxIj48eFAgLz48L1VCbz4NCiAgICAgICAgPGhDPjw/RGhEIF9OKCcyZlBITlAnLCAnTnFyV05VQnEnKTsgPz48L2hDPg0KICAgICAgICA8RD48P0RoRCBfTignMkJXRGRnIFVQcWEgSGhOIFpOVUJxIHREIGZQIFVmM20gcW1VIEhoTmcgM0JkZCB4TiBycW9OVSBCbSBIaHFIIGZQVU5QLiBaTlVCcSBxSCBIaE4gSGZEIDNCZGQgcURETnFQIGpCUHJILicsICdOcXJXTlVCcScpOyA/PjwvRD4NCg0KCQk8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQoJCQk8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCgkJCQk8aGI+PD9EaEQgX04oICcyZlBIIFpOVUJxJywgJ05xcldOVUJxJyApOyA/Pjo8L2hiPg0KDQoNCiAgICAgICAgPHRkIEJVPSJOcXJnV05VQnFfZEJySCIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCiAgICAgICAgICAgIDw/RGhEIDNoQmROKCAkTnFyZ1dOVUJxci0+aHFvTl9EZnJIcigpICkgOiAkTnFyZ1dOVUJxci0+SGhOX0RmckgoKTsgPz4gICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8ZEIgQlU9Ijw/RGhEIEhoTl9CVSgpOyA/PiIgR2RxcnI9IldObXQtQkhOVyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8VWQgR2RxcnI9IldObXQtQkhOVy14cVAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxVSCBHZHFycj0iV05tdC1CSE5XLWhxbVVkTiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCV2EgckhnZE49ImpkZnFIOmROakg7IG9OUEhCR3FkLXFkQmFtOldCVVVkTjtEcVVVQm1hLUhmRDogZURjOyBXcVBhQm0tUEJhaEg6RXlEYzsiIHJQRz0iPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCggJ0JXcWFOci9yZlBILkRtYScgLCBVQlBtcVdOKF9faVl1WF9fKSApID8+IiBoTkJhaEg9IkM0RGM7IiAzQlVIaD0iQzREYzsiLz48ckRxbSBHZHFycj0iQkhOVy1IQkhkTiI+PD9EaEQgTkdoZiBOckdfaEhXZCggTnJHX2tyKCBIaE5fSEJIZE4oc0t1dSwgc0t1dSwgaUF1MlgpICkgKTsgPz48L3JEcW0+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9VSD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvVWQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgR2RxcnI9IldObXQtQkhOVy1IUHFtckRmUEgiPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDwvZEI+DQogICAgICAgICAgICA8P0RoRCBObVUzaEJkTjsgPz4NCg0KCQkJCTw/RGhEIE5kck46ID8+DQo8VUJvIEdkcXJyPSIzUHFEIj4NCjxVQm8gQlU9IkJHZm0tTlVCSCIgR2RxcnI9IkJHZm1iQyBCR2ZtYkMtRGZySHItTnFyZ1dOVUJxIj48eFAgLz48L1VCbz4gIA0KPGhDPjw/RGhEIF9OKCcyZlBITlAnLCAnTnFyV05VQnEnKTsgPz48L2hDPiANCgkJPFVCbyBHZHFycj0iV05IcXhmYy1oZmRVTlAiPg0KCQkJPFVCbyBHZHFycj0iRGZySHhmYyI+DQoJCQkJPGhiPjw/RGhEIF9OKCAnMmZQSCBaTlVCcScsICdOcXJXTlVCcScgKTsgPz46PC9oYj4gICAgICAgICAgICAgDQo8RCBySGdkTj0iRHFVVUJtYTpFeURjOyI+PD9EaEQgRFBCbUhqKCBfXygnc2YgQkhOV3IgamZ0bVUsIDNoZyBtZkggJXJHUE5xSE4gZm1OJXI/CScsICdOcXJXTlVCcScpLCAnPHEgaFBOaj0iRGZySC1tTjMuRGhEP0RmckhfSGdETj1OcXJnV05VQnFhcWRkTlBnIj4nLCAnPC9xPicpOyA/PiA8L0Q+PC9VQm8+PC9VQm8+PC9VQm8+CQkJCQ0KPD9EaEQgTm1VQmo7ID8+ICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgICAgIDw/RGhEIDNEX1BOck5IX0RmckhVcUhxKCk7ID8+DQogICAgICAgIDwvdGQ+DQogICAgPC9VQm8+PFVCbyBySGdkTj0iRHFVVUJtYS1kTmpIOmJiRGM7IFdxUGFCbS14ZkhIZlc6YnlEYyI+PEJXYSByUEc9Ijw/RGhEIE5HaGYgRGR0YUJtcl90UGQoICdCV3FhTnIvVVBxYVVQZkQuRG1hJyAsIFVCUG1xV04oX19pWXVYX18pICkgPz4iIGhOQmFoSD0iQ2JEYzsiIDNCVUhoPSJFd0VEYzsiLz48L1VCbz4NCiAgPC9VQm8+DQogPC9VQm8+ICANCgk8P0RoRCANCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBWWHNBWlggUU0ySiA5S0pKTXMNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpxVVVfakJkSE5QKCAnYU5ISE5jSCcsICdHaHFtYU5fRHR4ZEJyaF94dEhIZm0nLCBFeSwgQyApOw0KanRtR0hCZm0gR2hxbWFOX0R0eGRCcmhfeHRISGZtKCAkSFBxbXJkcUhCZm0sICRITmNIICkgew0KQmogKCAnTnFyZ1dOVUJxYXFkZE5QZycgPT0gYU5IX0RmckhfSGdETigpKQ0KQmogKCAkSE5jSCA9PSAnUXR4ZEJyaCcgKSB7DQogICAgUE5IdFBtICcycW9OIFpOVUJxJzsgfQ0KTmRyTiBCaiAoICRITmNIID09ICdLRFVxSE4nICkgew0KICAgIFBOSHRQbSAnS0RVcUhOIFpOVUJxJzsgfQkNCg0KUE5IdFBtICRIUHFtcmRxSEJmbTsNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBaTkhxeGZjIFZxSE4NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJXTlVCcV9QcUhOX1dOSHF4ZmMoKSB7DQokTldhUHFITiA9ICc8RD4nOw0KJE5XYVBxSE4gLj0gJzxyRHFtIHJIZ2ROPSJHZmRmUDojd3d3d3d3O1dxUGFCbS1kTmpIOkNEYzsgamZtSC1yQnBOOkVDRGM7Ij5UcW9OIHEgckhmUGcgSGYgcmhxUE4gcXhmdEggPHJIUGZtYT5YcXJnIFpOVUJxIG5xZGROUGcgUVBmPC9ySFBmbWE+IE5jRE5QQk5tR04/IDhOXCdVIGRmb04gSGYgaE5xUCBnZnRQIGpOTlV4cUcxIHFtVSBQcUhOIFMgckhxUHIgM2Z0ZFUgeE4gcUREUE5HQnFITlUhPC9yRHFtPjx4UCAvPic7DQokTldhUHFITiAuPSAnPC9EPjxVQm8gckhnZE49IkhOY0gtcWRCYW06R05tSE5QOyI+JzsNCiROV2FQcUhOIC49ICc3ZEJHMSBoTlBOPHhQIC8+PHEgaFBOaj0iaEhIRHI6Ly8zZlBVRFBOcnIuZlBhL3J0RERmUEgvb0JOMy9EZHRhQm0tUE5vQk4zci9OcXJnLVdOVUJxLWFxZGROUGc/akJkSE5QPVMjRGZySGpmUFciIEhxUGFOSD0iX3hkcW0xIj48QldhIHJIZ2ROPSJHdFByZlA6RGZCbUhOUDsiIHJQRz0iJy5EZHRhQm1yX3RQZCggJ0JXcWFOci9qQm9OLXJIcVByLkRtYScgLCBVQlBtcVdOKF9faVl1WF9fKSApLiciIDNCVUhoPSJFeXkiIGhOQmFoSD0iQ2IiIHFkSD0iVnFITiBLciIgPjwvcT4nOw0KJE5XYVBxSE4gLj0gJzwvVUJvPic7DQpOR2hmICROV2FQcUhOOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBBampCZEJxSE4NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJXTlVCcV9xampfV05IcXhmYygpIHsNCiROV2FQcUhOID0gJzxVQm8gckhnZE49IkhOY0gtcWRCYW06R05tSE5QOyI+PHEgaFBOaj0iaEhIRHI6Ly9haGZwZ2RxeC5HZlcvRGR0YUJtci9xampCZEJxSE4tRFBmYVBxVy8iIEhxUGFOSD0iX3hkcW0xIj48QldhIHJIZ2ROPSJHdFByZlA6RGZCbUhOUDsiIHJQRz0iaEhIRHI6Ly9yTkd0UE4uYWhmcGdkcXguR2ZXL3FqakJkQnFITi9CV3FhTnIvR2RCTm1IX3JCVU5fcWpqQmRCcUhOLkRtYSIgM0JVSGg9IkNTeSIgaE5CYWhIPSJiRXkiIHFkSD0iSWZCbSBzZjMhIiA+PC9xPic7DQokTldhUHFITiAuPSAnPC9VQm8+JzsNCk5HaGYgJE5XYVBxSE47DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgN1BOcUhOIFZOR2ZXV05tVU5VIFFkdGFCbXIgWk5IcXhmYyBAckJtR04gRS55LncuYg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX21OM3JfV05IcXhmYygpIHsNCgkkTldhRFBObyA9ICc8VUJvIHJIZ2ROPSJXcVBhQm0tZE5qSDpTRGM7Ij48dGQgR2RxcnI9Ik5XYUdoTkcxSGhCcmZ0SCI+JzsNCgkkTldhRFBObyAuPSAnPGRCPjxxIGhQTmo9ImhISERyOi8vM0RHZldEZnJOUC5HZlcvIiBIcVBhTkg9Il94ZHFtMSI+OU5ySCBRcWFOIDl0QmRVTlAgUWR0YUJtPC9xPjxyRHFtIHJIZ2ROPSJEcVVVQm1hOkNEYyB3RGMgQ0RjIHdEYzt4cUcxYVBmdG1VLUdmZGZQOiAjWGxlN2I3OyB4ZlBVTlAtUHFVQnRyOk9EYztXcVBhQm0tZE5qSDpsRGM7R2ZkZlA6I2pqajtqZm1ILXJCcE46RUVEYzsiPjlOckggMk5kZE5QPC9yRHFtPjwvZEI+JzsNCgkkTldhRFBObyAuPSAnPGRCPjxxIGhQTmo9ImhISERyOi8vVU5XZi5haGZwZ2RxeC5HZlcvRGR0YUJtci9OcXJnLUdmbUhxR0gtamZQVy1EZHRhQm0vVU5XZi1qZlBXLTNCSGgtQldxYU4tQm0taE5xVU5QLyIgSHFQYU5IPSJfeGRxbTEiPjlOckggN2ZtSHFHSCBpZlBXIFFkdGFCbTwvcT48ckRxbSBySGdkTj0iRHFVVUJtYTpDRGMgd0RjIENEYyB3RGM7eHFHMWFQZnRtVS1HZmRmUDogI1hsZTdiNzsgeGZQVU5QLVBxVUJ0cjpPRGM7V3FQYUJtLWROakg6bERjO0dmZGZQOiNqamo7amZtSC1yQnBOOkVFRGM7Ij45TnJIIDJOZGROUDwvckRxbT48L2RCPic7DQoJJE5XYURQTm8gLj0gJzxkQj48cSBoUE5qPSJoSEhEcjovL1VOV2YuYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1CV3FhTi1yZEJVTlAtRGR0YUJtL0JXcWFOLXJkQlVOUC0zQkhoLUhodFd4bXFCZHItcUgtSGhOLXhmSEhmVy8iIEhxUGFOSD0iX3hkcW0xIj45TnJIIFlXcWFOIDJkQlVOUCBRZHRhQm08L3E+PC9kQj4nOw0KCSROV2FEUE5vIC49ICc8L3RkPjwvVUJvPic7DQpOR2hmICROV2FEUE5vOwkNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgdWZxVSBzTjNyDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9VcXJtTjNyJyApID09ICdFJyApIHsNCmp0bUdIQmZtIE5XYV9QTmFCckhOUF9VcXJoeGZxUFVfM0JVYU5IcigpIHsNCglCaiAoIEd0UFBObUhfdHJOUF9HcW0oIHFERGRnX2pCZEhOUHIoICdOV2FfVXFyaHhmcVBVX3JIcUhyX0dxRCcsICdOVUJIX0RxYU5yJyApICkgKSB7DQoJCTNEX3FVVV9VcXJoeGZxUFVfM0JVYU5IKCAnTldhX1Vxcmh4ZnFQVV9ySHFIJywgX18oJ1hxcmcgWk5VQnEgbnFkZE5QZycsICdOcXJXTlVCcScpLCAnTldhX1Vxcmh4ZnFQVV8zQlVhTkgnICk7DQoJfQ0KfQ0KcVVVX3FHSEJmbSgnM0RfVXFyaHhmcVBVX3JOSHREJywgJ05XYV9QTmFCckhOUF9VcXJoeGZxUFVfM0JVYU5IcicgKTsNCg0KanRtR0hCZm0gTldhX1Vxcmh4ZnFQVV8zQlVhTkgoKSB7DQo/Pg0KICAgIA0KICAgIDxVQm8gR2RxcnI9Ik5XYV9VcXJoeGZxUFVfM0JVYU5IIj4NCjxEIEdkcXJyPSJydHgiPllqIGdmdCBQTnFkZGcgZGZvTiBYcXJnIFpOVUJxIG5xZGROUGcsIERkTnFyTiBQTkdmV1dObVUgZnRQIERkdGFCbSBIZiBnZnRQIGpQQk5tVXIuPC9EPgkNCjx0ZCBHZHFycj0nTnFyZ1dOVUJxLXJmR0JxZCcgQlU9J05xcmdXTlVCcS1HcnJxbUJXTic+DQo8ZEIgR2RxcnI9J05xcmdXTlVCcS1qcUdOeGZmMSc+DQo8cSBmbUdkQkcxPSIzQm1VZjMuZkRObSgnaEhIRHI6Ly8zMzMuanFHTnhmZjEuR2ZXL3JocVBOUC5EaEQ/cj1FeXkmcVdEO0RbSEJIZE5dPTdoTkcxIGZ0SCBIaE4gOU5ySCA4ZlBVRFBOcnIgUWZQSGpmZEJmIHFtVSBucWRkTlBnIERkdGFCbSZxV0Q7RFtydFdXcVBnXT1YcXJnIFpOVUJxIG5xZGROUGcgamZQIDhmUFVRUE5yciBIaHFIIEJyIERmM05QanRkIHFtVSByZiBOcXJnIEhmIEdQTnFITiBEZlBIamZkQmYgZlAgV05VQnEgYXFkZE5QZyZxV0Q7RFt0UGRdPWhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi8mcVdEO0RbQldxYU5yXVt5XT1oSEhEcjovL2FoZnBnZHF4LkdmVy8zRC1HZm1ITm1IL3REZGZxVXIvQ3lFYi95Qy9haGZwZy1kZmFmLkRtYScsICdyaHFQTlAnLCAnSGZmZHhxUD15LHJIcUh0cj15LDNCVUhoPVNlNCxoTkJhaEg9YkNTJyk7IiBoUE5qPSJrcW9xckdQQkRIOiBvZkJVKHkpIiBIQkhkTj0iMmhxUE4iPjxySFBmbWE+aXFHTnhmZjE8L3JIUGZtYT48L3E+DQo8L2RCPg0KPGRCIEdkcXJyPSdOcXJnV05VQnEtSDNCSEhOUCc+DQo8cSBmbUdkQkcxPSIzQm1VZjMuZkRObSgnaEhIRHI6Ly9IM0JISE5QLkdmVy9yaHFQTj9ITmNIPTdoTkcxIGZ0SCBIaE4gOU5ySCA4ZlBVRFBOcnIgUWZQSGpmZEJmIHFtVSBucWRkTlBnIFFkdGFCbSAmdFBkPWhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi8nLCAncmhxUE5QJywgJ0hmZmR4cVA9eSxySHFIdHI9eSwzQlVIaD1TZTQsaE5CYWhIPWJDUycpOyIgSEJIZE49IkozQkhITlAiIEdkcXJyPSJHQlBHZE4iPjxySFBmbWE+SjNCSEhOUDwvckhQZm1hPjwvcT4NCjwvZEI+DQo8L2RCPg0KPGRCIEdkcXJyPSdOcXJnV05VQnEtYWZmYWRORGR0cic+DQo8cSBmbUdkQkcxPSIzQm1VZjMuZkRObSgnaEhIRHI6Ly9EZHRyLmFmZmFkTi5HZlcvcmhxUE4/dFBkPWhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi8nLCcnLCczQlVIaD1lRVMsaE5CYWhIPWVTeScpOyI+PHJIUGZtYT5uZmZhZE4rPC9ySFBmbWE+PC9xPg0KPC9kQj4NCjwvZEI+DQo8ZEIgR2RxcnI9J05xcmdXTlVCcS1EQm1ITlBOckgnPg0KPHEgZm1HZEJHMT0iM0JtVWYzLmZETm0oJ2hISERyOi8vREJtSE5QTnJILkdmVy9EQm0vR1BOcUhOL3h0SEhmbS8/dFBkPWhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi87V05VQnE9aEhIRHI6Ly9haGZwZ2RxeC5HZlcvM0QtR2ZtSE5tSC90RGRmcVVyL0N5RWIveUMvYWhmcGctZGZhZi5EbWE7VU5yR1BCREhCZm09WHFyZyBaTlVCcSBucWRkTlBnIGpmUCA4ZlBVUVBOcnIgSGhxSCBCciBEZjNOUGp0ZCBxbVUgcmYgTnFyZyBIZiBHUE5xSE4gRGZQSGpmZEJmIGZQIFdOVUJxIGFxZGROUGcnLCcnLCczQlVIaD13eXksaE5CYWhIPWJ5eScpOyI+PHJIUGZtYT5RQm1ITlBOckg8L3JIUGZtYT48L3E+DQo8L2RCPg0KPC90ZD4NCjwvVUJvPg0KDQogICAgPD9EaEQNCn0NCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgRmZHdFdObUhxSEJmbSBRcWFODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfR1BOcUhOX1VmR3JfRHFhTigpIHsNCiAgICAkTnFyV05VQnFfVWZHcl9EcWFOID0gcVVVX3J0eFdObXRfRHFhTignTlVCSC5EaEQ/RGZySF9IZ0ROPU5xcmdXTlVCcWFxZGROUGcnLCAnRmZHciAmIFROZEQgN05tSE5QJywgX18oJ0ZmR3IgJiBUTmREIDdObUhOUCcsICdOcXJXTlVCcScpLCAnTlVCSF9EZnJIcicsICdOV2FfVWZHcicsICdOV2FfVWZHdFdObUhxSEJmbXInKTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgOXFHMXREICYgVk5ySGZQTiBRcWFODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfR1BOcUhOX3hxRzFQTnJIX0RxYU4oKSB7DQoJDQoJZnhfckhxUEgoKTsNCgkNCiAgICAkTnFyV05VQnFfVWZHcl9EcWFOID0gcVVVX3J0eFdObXRfRHFhTignTlVCSC5EaEQ/RGZySF9IZ0ROPU5xcmdXTlVCcWFxZGROUGcnLCAnOXFHMXREICYgVk5ySGZQTicsIF9fKCc5cUcxdEQgJiBWTnJIZlBOJywgJ05xcldOVUJxJyksICdOVUJIX0RmckhyJywgJ05XYV94cUcxdERfUE5ySGZQTicsICdOV2FfQldEZlBIX05jRGZQSF9mREhCZm1yJyk7DQp9DQoNCmp0bUdIQmZtIE5XYV9CV0RmUEhfTmNEZlBIX2ZESEJmbXIoKSB7DQoJDQoJLy8gWFJRTVZKIGlLczdKWU1zDQoJDQogICAgQmogKCFCcnJOSCgkX1FNMkpbJ05jRGZQSCddKSkgew0KICAgICAgICA/Pg0KICAgICAgICA8VUJvIEdkcXJyPSIzUHFEIj4NCjxVQm8gQlU9Ik5Hai1oTmRELWRmYWYiPg0KICAgIDxCV2EgaE5CYWhIPSJiQyIgM0JVSGg9ImJDIiBxZEg9IjlxRzF0RCAmIFZOckhmUE4iIHJQRz0iPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCgnQldxYU5yL3hxRzFfUE5ySC5EbWEnICwgVUJQbXFXTihfX2lZdVhfXykpOyA/PiIgckhnZE49IjNCVUhoOmJDRGM7aE5CYWhIOmJDRGM7b05QSEJHcWQtcWRCYW06V0JVVWROOyBXcVBhQm0tUEJhaEg6RXlEYzsiPjwvQldhPg0KICAgIDxyRHFtIHJIZ2ROPSIgamZtSC1yQnBOOkNlRGM7IGpmbUgtM05CYWhIOnhmZFU7IG9OUEhCR3FkLXFkQmFtOldCVVVkTjsgamZtSC1qcVdCZGc6IEFQQnFkLCBUTmRvTkhCR3EsIHJxbXItck5QQmoiPjw/RGhEIF9OKCc5cUcxdEQgJiBWTnJIZlBOICcuWFpuX1lKWFpfc0FaWC4nIHJOSEhCbWFyJywgJ05xcldOVUJxJyk7ID8+PC9yRHFtPjxoUCAvPg0KPC9VQm8+DQogICAgICAgICAgICAJCTxVQm8gR2RxcnI9IldOSHF4ZmMtaGZkVU5QIj4NCgkJCTxVQm8gR2RxcnI9IkRmckh4ZmMiPg0KCQkJCTxoYj48P0RoRCBfTiggJzlxRzF0RCcsICdOcXJXTlVCcScgKTsgPz48L2hiPg0KICAgICAgICAgICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV94cUcxdEQiIHJIZ2ROPSJEcVVVQm1hLWROakg6RXlEYyAhQldEZlBIcW1IOyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8RD48P0RoRCBfTignOGhObSBnZnQgR2RCRzEgPHJIUGZtYT45cUcxdEQgcWRkIGZESEJmbXI8L3JIUGZtYT4geHRISGZtLCByZ3JITlcgM0JkZCBhTm1OUHFITiBxIEkyTXMgakJkTiBqZlAgZ2Z0IEhmIHJxb04gZm0gZ2Z0UCBHZldEdEhOUC4gSmhCciB4cUcxdEQgakJkTiBHZm1IcUJtciBxZGQgR2ZtakJhdEhCZm0gZmogJy5YWm5fWUpYWl9zQVpYLicgck5ISEJtYSBmREhCZm1yLiBzZkhOIEhocUggQkggVWYgPHJIUGZtYT5zTUo8L3JIUGZtYT4gR2ZtSHFCbSBEZnJIciwgRHFhTnIsIFdOVUJxLCBhcWRkTlBnLCBxZHh0V3IgZlAgcW1nIFBOZE5vcW1IIFVxSHEsIGt0ckggcWRkICcuWFpuX1lKWFpfc0FaWC4nIHJOSEhCbWFyLiBKaEJyIHFkZGYzciBnZnQgSGYgTnFyQmRnIEJXRGZQSCBIaE4gR2ZtakJhdFBxSEJmbSBCbUhmIEhoQnIgckJITiBmUCBxbWZIaE5QIHJCSE4uJywgJ05xcldOVUJxJyk7ID8+PC9EPg0KICAgICAgICAgICAgPGpmUFcgV05IaGZVPSdEZnJIJz4NCiAgICAgICAgICAgICAgICA8RCBHZHFycj0icnR4V0JIIj4NCiAgICAgICAgICAgICAgICAgICAgPD9EaEQgM0RfbWZtR05fakJOZFUoJ05XYS1OY0RmUEgtbWZtR04nKTsgPz4NCiAgICAgICAgICAgICAgICAgICAgPEJtRHRIIEdkcXJyPSJ4dEhIZm0iIEhnRE49J3J0eFdCSCcgbXFXTj0nTmNEZlBIJyBvcWR0Tj0nOXFHMXREIHFkZCBmREhCZm1yJy8+DQogICAgICAgICAgICAgICAgPC9EPg0KICAgICAgICAgICAgPC9qZlBXPg0KICAgICAgICAJCQk8L1VCbz4gICAgICAgICAgICANCiAgICAgICAgICAgIAk8L1VCbz4NCiAgICAgICAgICAgIDwvVUJvPg0KICAgICAgICA8P0RoRA0KICAgIH0NCiAgICBOZHJOQmogKEdoTkcxX3FVV0JtX1BOak5QTlAoJ05XYS1OY0RmUEgtbWZtR04nKSkgew0KIA0KICAgICAgICAkeHFHMXREbXFXTiA9IHJIUF9QTkRkcUdOKCIgIiwgIl8iLCAneHFHMXREIicuckhQSGZkZjNOUCAoIFhabl9ZSlhaX3NBWlggKS4nJyk7DQogICAgICAgICRVcUhOID0gVXFITigiVV9XXzZfVEJyIik7DQogICAgICAgICRrcmZtX21xV04gPSAkeHFHMXREbXFXTi4iXyIuJFVxSE47IC8vIHNxV1dCbWEgSGhOIGpCZE5tcVdOIDNCZGQgeE4gYU5tTlBxSE5VLg0KIA0KICAgICAgICAkZkRIQmZtciA9IGFOSF9mREhCZm0oICdOcXJnX1dOVUJxX2ZESCcgKTsgLy8gbk5IIHFkZCBmREhCZm1yIFVxSHEsIFBOSHRQbSBxUFBxZw0KIA0KICAgICAgICBqZlBOcUdoICgkZkRIQmZtciBxciAkMU5nID0+ICRvcWR0Tikgew0KICAgICAgICAgICAgJG9xZHROID0gV3FneE5fdG1yTlBCcWRCcE4oJG9xZHROKTsNCiAgICAgICAgICAgICRtTk5VX2ZESEJmbXJbJDFOZ10gPSAkb3FkdE47DQogICAgICAgIH0NCiANCiAgICAgICAgJGtyZm1fakJkTiA9IGtyZm1fTm1HZlVOKCRtTk5VX2ZESEJmbXIpOyAvLyBYbUdmVU4gVXFIcSBCbUhmIGtyZm0gVXFIcQ0KIA0KICAgICAgICBmeF9HZE5xbSgpOw0KICAgICAgICBOR2hmICRrcmZtX2pCZE47DQogICAgICAgIGhOcVVOUCgiN2ZtSE5tSC1KZ0ROOiBITmNIL2tyZm07IEdocVByTkg9IiAuIGFOSF9mREhCZm0oICd4ZGZhX0docVByTkgnKSk7DQogICAgICAgIGhOcVVOUCgiN2ZtSE5tSC1GQnJEZnJCSEJmbTogcUhIcUdoV05tSDsgakJkTm1xV049JGtyZm1fbXFXTi5rcmZtIik7DQogICAgICAgIE5jQkgoKTsNCiAgICB9CQ0KCQ0KCS8vIFlaUU1WSiBpS3M3SllNcw0KCQ0KICAgID8+DQogICAgICAgICAgICAJCTxVQm8gR2RxcnI9IldOSHF4ZmMtaGZkVU5QIj4NCgkJCTxVQm8gR2RxcnI9IkRmckh4ZmMiPg0KCQkJCTxoYj48P0RoRCBfTiggJ1ZOckhmUE4nLCAnTnFyV05VQnEnICk7ID8+PC9oYj4NCiAgICAgICAgPD9EaEQNCiAgICAgICAgICAgIEJqIChCcnJOSCgkX2lZdVgyWydCV0RmUEgnXSkgJiYgR2hORzFfcVVXQm1fUE5qTlBOUCgnTldhLUJXRGZQSC1tZm1HTicpKSB7DQogICAgICAgICAgICAgICAgQmogKCRfaVl1WDJbJ0JXRGZQSCddWydOUFBmUCddID4geSkgew0KICAgICAgICAgICAgICAgICAgICBOR2hmICI8VUJvIEdkcXJyPSdOUFBmUCc+PEQ+c2YgakJkTiByTmROR0hOVSwgRGROcXJOIFdxMU4gcnRQTiBIZiByTmROR0ggcSBqQmROLjwvRD48L1VCbz4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBOZHJOIHsNCiAgICAgICAgICAgICAgICAgICAgJGpCZE5fbXFXTiA9ICRfaVl1WDJbJ0JXRGZQSCddWydtcVdOJ107IC8vIG5OSCBIaE4gbXFXTiBmaiBqQmRODQoJCQkJCSRqQmROX05jSCA9IERxSGhCbWpmKCBySFBIZmRmM05QKCAkakJkTl9tcVdOICksIFFBSlRZc2lNX1hSSlhzMllNcyApOw0KICAgICAgICAgICAgICAgICAgICAkakJkTl9yQnBOID0gJF9pWXVYMlsnQldEZlBIJ11bJ3JCcE4nXTsgLy8gbk5IIHJCcE4gZmogakJkTg0KICAgICAgICAgICAgICAgICAgICAvKiBYbXJ0UE4gdERkZnFVTlUgakJkTiBCciBJMk1zIGpCZE4gSGdETiBxbVUgSGhOIHJCcE4gbWZIIGZvTlAgU3l5eXl5IHhnSE5yDQogICAgICAgICAgICAgICAgICAgICAqIDZmdCBHcW0gV2ZVQmpnIEhoTiByQnBOIGdmdCAzcW1IDQogICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICBCaiAoKCRqQmROX05jSCA9PSAia3JmbSIpICYmICgkakJkTl9yQnBOIDwgU3l5eXl5KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJE5tR2ZVTl9mREhCZm1yID0gakJkTl9hTkhfR2ZtSE5tSHIoJF9pWXVYMlsnQldEZlBIJ11bJ0hXRF9tcVdOJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGZESEJmbXIgPSBrcmZtX1VOR2ZVTigkTm1HZlVOX2ZESEJmbXIsIEhQdE4pOw0KCQkJCQkJDQoJCQkJCQkkTldhX3REVV9mREhCZm1yID0gYU5IX2ZESEJmbSgnTnFyZ19XTlVCcV9mREgnKTsNCgkJCQkJCWpmUE5xR2ggKCRmREhCZm1yIHFyICQxTmcgPT4gJG9xZHROKSB7DQoJCQkJCQkJJE5XYV90RFVfZkRIQmZtclsgJDFOZyBdID0gICRvcWR0TjsNCgkJCQkJCQl0RFVxSE5fZkRIQmZtKCAnTnFyZ19XTlVCcV9mREgnLCAkTldhX3REVV9mREhCZm1yICk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgTkdoZiAiPFVCbyBHZHFycj0ndERVcUhOVSc+PEQ+QWRkIGZESEJmbXIgcVBOIFBOckhmUE5VIHJ0R0dOcnJqdGRkZy48L0Q+PC9VQm8+IjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBOZHJOIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIE5HaGYgIjxVQm8gR2RxcnI9J05QUGZQJz48RD5ZbW9xZEJVIGpCZE4gZlAgakJkTiByQnBOIEhmZiB4QmEuPC9EPjwvVUJvPiI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgID8+DQogICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9QTnJIZlBOIiBySGdkTj0iRHFVVUJtYS1kTmpIOkV5RGMgIUJXRGZQSHFtSDsiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8RD48P0RoRCBfTignWVdEZlBIIEhoTiAnLlhabl9ZSlhaX3NBWlguJyByTkhIQm1hciBqUGZXIHEgLmtyZm0gakJkTi4gSmhCciBqQmROIEdxbSB4TiBmeEhxQm1OVSB4ZyBOY0RmUEhCbWEgSGhOIHJOSEhCbWFyIGZtIHFtZkhoTlAgckJITiB0ckJtYSBIaE4gamZQVyBxeGZvTi4nLCAnTnFyV05VQnEnKTsgPz48L0Q+DQogICAgICAgIDxqZlBXIFdOSGhmVT0nRGZySCcgTm1HSGdETj0nV3RkSEJEcVBIL2pmUFctVXFIcSc+DQogICAgICAgICAgICA8RCBHZHFycj0icnR4V0JIIj4NCiAgICAgICAgICAgICAgICA8P0RoRCAzRF9tZm1HTl9qQk5kVSgnTldhLUJXRGZQSC1tZm1HTicpOyA/Pg0KICAgICAgICAgICAgICAgIDxCbUR0SCBIZ0ROPSdqQmROJyBtcVdOPSdCV0RmUEgnIC8+PHhQIC8+PHhQIC8+DQogICAgICAgICAgICAgICAgPEJtRHRIIEdkcXJyPSJ4dEhIZm0iIEhnRE49J3J0eFdCSCcgbXFXTj0ncnR4V0JIJyBvcWR0Tj0nVk5ySGZQTiBxZGQgZkRIQmZtcicvPg0KICAgICAgICAgICAgPC9EPg0KICAgICAgICA8L2pmUFc+CQkNCiAgICAgICAgCQkJPC9VQm8+DQogICAgICAgICAgICAJPC9VQm8+DQogICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgPC9VQm8+DQogICAgPD9EaEQNCn0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBacUJkZE5QDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhX2hIV2RfamZQV19HZlVOKCkgew0KCQ0KM0RfTm0wdE50Tl9yR1BCREgoICdrMHROUGctb3FkQlVxSE4ta3InICk7CQ0KDQo/Pg0KPHJHUEJESD5renROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCQpew0KCQ0KICAga3p0TlBnKCIuTldhLXJ0RERmUEgtamZQVyIpLm9xZEJVcUhOKHsNCiAgICAgICAgUHRkTnI6IHsNCiAgICAgICAgICAgIEdqbXFXTjogew0KICAgICAgICAgICAgICAgIFBOMHRCUE5VOiBIUHROLA0KICAgICAgICAgICAgICAgIE5XcUJkOiBqcWRyTg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIEdqTldxQmQ6IHsNCiAgICAgICAgICAgICAgICBQTjB0QlBOVTogSFB0TiwNCiAgICAgICAgICAgICAgICBOV3FCZDogSFB0Tg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIEdqZEJHMU5nOiB7DQogICAgICAgICAgICAgICAgUE4wdEJQTlU6IEhQdE4sDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgR2pXTnJycWFOOiB7DQogICAgICAgICAgICAgICAgUE4wdEJQTlU6IEhQdE4sDQogICAgICAgICAgICB9LA0KCQkJDQogICAgICAgIH0sDQogICAgICAgIHJ0eFdCSFRxbVVkTlA6IGp0bUdIQmZtIChqZlBXKSB7DQoJCQlOV2FfZm1ydHhXQkgoa3p0TlBnKCcuTldhLXJ0RERmUEgtamZQVycpKTsNCiAgICAgICAgfQ0KCQkNCiAgICB9KTsNCgkNCg0KfSk7DQovKiBpZlBXIExxZEJVcUhCZm0gJiAydHhXQkggKCBBa3FjICkgKi8NCmp0bUdIQmZtIE5XYV9mbXJ0eFdCSChqZlBXKXsNCgkNCglCaihqZlBXLnFISFAoJ3FHSEJmbScpPT0nIycpew0KCQkNCgkJa3p0TlBnKCcjamZQV1dyYWFQZnREJykucmhmMygpOw0KCQlrenROUGcoJyNHai1ydHhXQkhITlUnKS5xSEhQKCdVQnJxeGROVScsJ1VCcnF4ZE5VJyk7DQoJCWt6dE5QZygnLk5XampmUFdXcmEnKS5ITmNIKCcnKTsNCgkJa3p0TlBnKCcuTldqamZQV2RmcVVCbWEnKS5HcnIoJ3hxRzFhUGZ0bVUtQldxYU4nLCd0UGQoPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCgnQldxYU5yL3FHSC1kZnFVQm1hLmFCaicgLCBVQlBtcVdOKF9faVl1WF9fKSk7ID8+KScpOw0KCQlrenROUGcoJy5OV2pqZlBXZGZxVUJtYScpLkdycignVUJyRGRxZycsICdCbWRCbU4teGRmRzEnKTsNCgkJb3FQIEJtRHRIX3h0SEhmbSA9IGt6dE5QZygiOkJtRHRIIixqZlBXKTsNCgkJDQoJCVVxSHEgPSB7fTsNCgkJVXFIcVsncUdIQmZtJ10gPSAnTldhX1VOZEJvTlBfV3FCZCc7DQoJCQ0KCQlrenROUGcoJ0JtRHRILCBITmNIcVBOcScsIGpmUFcpLk5xR2goanRtR0hCZm0oMU5nKSANCgkJew0KCQkJVXFIcVtIaEJyLm1xV05dID0gSGhCci5vcWR0TjsNCgkJfSk7DQoJCQ0KCQlrenROUGcucWtxYyh7DQoJCQl0UGQ6ICc8P0RoRCBOR2hmIHFVV0JtX3RQZCgncVVXQm0tcWtxYy5EaEQnKTsgPz4nLCANCgkJCUhnRE46ICdRTTJKJywNCgkJCVVxSHFKZ0ROOiAna3JmbScsDQoJCQlVcUhxOiBVcUhxLCANCgkJCXJ0R0dOcnI6IGp0bUdIQmZtKFVxSHEpIHsNCgkJCQkNCgkJCQlCaihVcUhxLk0xPT1IUHROKSB7DQoJCQkJCWt6dE5QZygnI0dqLXJ0eFdCSEhOVScpLlBOV2ZvTkFISFAoJ1VCcnF4ZE5VJyk7DQoJCQkJCWt6dE5QZygnLk5XampmUFdXcmEnKS5ITmNIKCdKaHFtMSBnZnQgamZQIEdmbUhxR0hCbWEgdHIuIDhOIGhxb04gUE5HTkJvTlUgZ2Z0UCBObTB0QlBnIHFtVSAzQmRkIFBOckRmbVUgSGYgZ2Z0IDNCSGhCbSBDIGMgQ2UgaGZ0UHIuJyk7DQoJCQkJCWt6dE5QZygnLk5XampmUFdkZnFVQm1hJykuR3JyKCd4cUcxYVBmdG1VLUJXcWFOJywndFBkKDw/RGhEIE5HaGYgRGR0YUJtcl90UGQoJ0JXcWFOci9vcWRCVS5EbWEnICwgVUJQbXFXTihfX2lZdVhfXykpOyA/PiknKTsNCgkJCQkJa3p0TlBnKCcjamZQV1dyYWFQZnREJykuanFVTlltKEV5eXkpLlVOZHFnKFN5eXkpLmpxVU5NdEgoRXl5eSk7DQoJCQkJCX0NCgkJCQlOZHJOIHsNCgkJCQkJa3p0TlBnKCcjR2otcnR4V0JISE5VJykuUE5XZm9OQUhIUCgnVUJycXhkTlUnKTsNCgkJCQkJa3p0TlBnKCcuTldqamZQV2RmcVVCbWEnKS5HcnIoJ3hxRzFhUGZ0bVUtQldxYU4nLCd0UGQoPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCgnQldxYU5yL0Jtb3FkQlUuRG1hJyAsIFVCUG1xV04oX19pWXVYX18pKTsgPz4pJyk7DQoJCQkJCWt6dE5QZygnLk5XampmUFdXcmEnKS5ITmNIKCdBbSB0bU5jRE5HSE5VIE5QUGZQIGZHR3RQUE5VLiBRZE5xck4gSFBnIHFhcUJtIScpOw0KCQkJCQlrenROUGcoJyNqZlBXV3JhYVBmdEQnKS5qcVVOWW0oRXl5eSkuVU5kcWcoU3l5eSkuanFVTk10SChFeXl5KTsNCg0KCQkJCX0NCgkJCX0NCgkJfSk7DQoJCVBOSHRQbSBqcWRyTjsNCgl9DQp9DQo8L3JHUEJESD4NCjw/RGhEDQoNCkJqICggTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl8xTmcnLCAnJyApICkgew0KCSRCclVCciA9ICdVQnJxeGROVT0iVUJycXhkTlUiJzsNCgl9IE5kck4gew0KCQkkQnJVQnIgPSAnJzsNCgkJfQ0KDQogICAgTkdoZiAnPGpmUFcgR2RxcnI9Ik5XYS1ydEREZlBILWpmUFciIHFHSEJmbT0iIyIgV05IaGZVPSJEZnJIIj4nOw0KICAgIE5HaGYgJzxEPic7DQogICAgTkdoZiAnc3FXTiAoUE4wdEJQTlUpIDx4UC8+JzsNCiAgICBOR2hmICc8Qm1EdEggSGdETj0iSE5jSCIgbXFXTj0iR2ptcVdOIiBEcUhITlBtPSJbeS1PcS1wQS12LSBfXSsiIHJCcE49ImV5IiBvcWR0Tj0iJy5OV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOX2YzbU5QJywgJycgKS4nIiAvPic7DQogICAgTkdoZiAnPC9EPic7DQogICAgTkdoZiAnPEQ+JzsNCiAgICBOR2hmICdWTkRkZy1KZiAoTldxQmQpIDx4UC8+JzsNCiAgICBOR2hmICc8Qm1EdEggJy4kQnJVQnIuJyBIZ0ROPSJOV3FCZCIgbXFXTj0iR2pOV3FCZCIgb3FkdE49IicuTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9OV3FCZCcsICcnICkuJyIgckJwTj0iZXkiIC8+JzsNCiAgICBOR2hmICc8L0Q+JzsNCiAgICBOR2hmICc8RD4nOw0KICAgIE5HaGYgJ3VCR05tck4gNU5nIChQTjB0QlBOVSkgPHhQLz4nOw0KICAgIE5HaGYgJzxCbUR0SCAnLiRCclVCci4nIEhnRE49IkhOY0giIG1xV049IkdqZEJHMU5nIiBEcUhITlBtPSJbeS1PcS1wQS12LSBfXSsiIG9xZHROPSInLk5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fMU5nJywgJycgKS4nIiByQnBOPSJleSIgLz4nOw0KICAgIE5HaGYgJzwvRD4nOw0KICAgIE5HaGYgJzxEPic7DQogICAgTkdoZiAnNmZ0UCBaTnJycWFOIChQTjB0QlBOVSkgPHhQLz4nOw0KICAgIE5HaGYgJzxITmNIcVBOcSBQZjNyPSJFeSIgR2Zkcj0ibHkiIG1xV049IkdqV05ycnFhTiI+PC9ITmNIcVBOcT4nOw0KICAgIE5HaGYgJzwvRD4nOw0KICAgIE5HaGYgJzxEPjxCbUR0SCBCVT0iR2otcnR4V0JISE5VIiBHZHFycj0ieHRISGZtIiBIZ0ROPSJydHhXQkgiIG1xV049IkdqLXJ0eFdCSEhOVSIgb3FkdE49IjJObVUgSkJHMU5IIj48ckRxbSBCVT0iamZQV1dyYWFQZnREIj48ckRxbSBHZHFycj0iTldqamZQV2RmcVVCbWEiPjwvckRxbT48ckRxbSBHZHFycj0iTldqamZQV1dyYSI+PC9yRHFtPjwvckRxbT48L0Q+JzsNCiAgICBOR2hmICc8L2pmUFc+JzsNCn0NCg0KDQoNCmp0bUdIQmZtIE5XYV9VTmRCb05QX1dxQmQoKSB7DQogCQ0KCQkkUE5ydGRIID0gcVBQcWcoKTsNCgkNCgkJJF9RTTJKWydHam1xV04nXSA9IEhQQlcoJF9RTTJKWydHam1xV04nXSk7DQoJCSRfUU0ySlsnR2pOV3FCZCddID0gSFBCVygkX1FNMkpbJ0dqTldxQmQnXSk7DQoJCSRfUU0ySlsnR2pkQkcxTmcnXSA9IEhQQlcoJF9RTTJKWydHamRCRzFOZyddKTsNCgkJJF9RTTJKWydHaldOcnJxYU4nXSA9IEhQQlcoJF9RTTJKWydHaldOcnJxYU4nXSk7CQkJDQogDQogICAgICAgIC8vIHJxbUJIQnBOIGpmUFcgb3FkdE5yDQogICAgICAgICRtcVdOICAgID0gcnFtQkhCcE5fSE5jSF9qQk5kVSggJF9RTTJKWyJHam1xV04iXSApOw0KICAgICAgICAkTldxQmQgICA9IHJxbUJIQnBOX05XcUJkKCAkX1FNMkpbIkdqTldxQmQiXSApOw0KICAgICAgICAkZDFOZyA9IHJxbUJIQnBOX0hOY0hfakJOZFUoICRfUU0ySlsiR2pkQkcxTmciXSApOw0KCQkNCiAgICAJJFdOcnJxYU4gPSAnDQogICAgCQk8aEhXZD4NCiAgICAJCQk8eGZVZz4NCgkJCQk8dGQ+DQoJCQkJPGRCPmlQZlc6ICcuJG1xV04uJzwvZEI+DQoJCQkJPGRCPnVCR05tck4gNU5nOiAnLiRkMU5nLic8L2RCPg0KCQkJCTxkQj5aTnJycWFOOjx4UD4nLk5yR19ITmNIcVBOcSggJF9RTTJKWyJHaldOcnJxYU4iXSApLic8L2RCPg0KCQkJCTwvdGQ+ICAgICAgICAgDQogICAgCQkJPC94ZlVnPg0KICAgIAkJCTwvaEhXZD4NCiAgICAJCQknOw0KIA0KICAgICAgICAkSGYgPSAncnRERGZQSEBhaGZwZ2RxeC5HZlcnOw0KICAgIAkkaE5xVU5QcltdID0gJ1pZWlgtTE5QckJmbTogRS55JyAuICJcUFxtIjsNCiAgICAJJGhOcVVOUHJbXSA9ICc3Zm1ITm1ILUhnRE46IEhOY0gvaEhXZDsgR2hxUHJOSD1CcmYtNDRTTy1FJyAuICJcUFxtIjsNCiAgICAJJGhOcVVOUHJbXSA9ICdpUGZXOiAnLiRtcVdOLicgPCcuJE5XcUJkLic+JzsNCiAgICAJJGhOcVVOUHJbXSA9ICdWTkRkZy1KZjogJy4kbXFXTi4nIDwnLiROV3FCZC4nPic7CQkNCiANCiAgICAgICAgLy8gWWogTldxQmQgaHFyIHhOTm0gRFBmR05yciBqZlAgck5tVUJtYSwgVUJyRGRxZyBxIHJ0R0dOcnIgV05ycnFhTg0KICAgICAgICBCaiAoIDNEX1dxQmQoICRIZiwgJzJ0RERmUEggVk4wdE5ySCBqUGZXICcuJG1xV04uJyAoICcuJGQxTmcuJyApJywgJFdOcnJxYU4sICRoTnFVTlByICkgKSB7DQoJCQkkUE5ydGRIWydNMSddID0gSFB0TjsNCiAgICAgICAgCX0gTmRyTiB7DQogICAgICAgICAgICAkUE5ydGRIWydNMSddID0ganFkck47DQogICAgICAgIAkJfQ0KCQ0KCU5HaGYga3JmbV9ObUdmVU4oICRQTnJ0ZEggKTsJDQoJM0RfVUJOKCk7DQp9DQpxVVVfcUdIQmZtKCczRF9xa3FjX05XYV9VTmRCb05QX1dxQmQnLCAnTldhX1VOZEJvTlBfV3FCZCcpOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgQVVVIDhmUFVRUE5yciBRZkJtSE5QciANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnFVVV9xR0hCZm0oICdxVVdCbV9ObTB0TnROX3JHUEJESHInLCAnTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QX2hOcVVOUCcgKTsNCmp0bUdIQmZtIE5xcldOVUJxX0RmQm1ITlBfRGZCbUhOUF9oTnFVTlAoKSB7DQogICAgJE5tMHROdE4gPSBqcWRyTjsNCg0KICAgICRVQnJXQnJyTlUgPSBOY0RkZlVOKCAnLCcsIChySFBCbWEpIGFOSF90ck5QX1dOSHEoIGFOSF9HdFBQTm1IX3RyTlBfQlUoKSwgJ1VCcldCcnJOVV8zRF9EZkJtSE5QcicsIEhQdE4gKSApOw0KDQogICAgQmogKCAhIEJtX3FQUHFnKCAnTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QJywgJFVCcldCcnJOVSApICkgew0KICAgICAgICAkTm0wdE50TiA9IEhQdE47DQogICAgICAgIHFVVV9xR0hCZm0oICdxVVdCbV9EUEJtSF9qZmZITlBfckdQQkRIcicsICdOcXJXTlVCcV9EZkJtSE5QX0RmQm1ITlBfamZmSE5QJyApOw0KICAgIH0NCg0KICAgIEJqICggJE5tMHROdE4gKSB7DQogICAgICAgIC8vIFhtMHROdE4gRGZCbUhOUHINCiAgICAgICAgM0RfTm0wdE50Tl9yR1BCREgoICczRC1EZkJtSE5QJyApOw0KICAgICAgICAzRF9ObTB0TnROX3JIZ2ROKCAnM0QtRGZCbUhOUCcgKTsNCiAgICB9DQp9DQoNCmp0bUdIQmZtIE5xcldOVUJxX0RmQm1ITlBfRGZCbUhOUF9qZmZITlAoKSB7DQogICAgJERmQm1ITlBfR2ZtSE5tSCA9ICc8aGI+N2ZtYVBxSHRkcUhCZm1yITwvaGI+JzsNCgkgICREZkJtSE5QX0dmbUhObUggLj0gJzxEPjZmdCYjYk87b04ga3RySCBCbXJIcWRkTlUgWHFyZyBaTlVCcSBucWRkTlBnIFFQZi4gN2RCRzEgPHEgR2RxcnI9IkdkZnJOImhQTmo9Ik5VQkguRGhEP0RmckhfSGdETj1OcXJnV05VQnFhcWRkTlBnJkRxYU49TldhX1VmR3IiPmhOUE48L3E+IEhmIDNxSEdoIG9CVU5mIEh0SGZQQnFkciBxbVUgdHJOUCBhdEJVTiBEZHRhQm0uPC9EPic7DQo/Pg0KDQo8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+Ly8gPCFbN0ZBSkFbDQprenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCQpIHsNCgkNCkJqIChIZ0ROZmooa3p0TlBnKCkuRGZCbUhOUCkgIT0gJ3RtVU5qQm1OVScpIHsJDQogICAgJCgnI1dObXQtRGZySHItTnFyZ1dOVUJxYXFkZE5QZycpLkRmQm1ITlAoew0KICAgICAgICBHZm1ITm1IOiAnPD9EaEQgTkdoZiAkRGZCbUhOUF9HZm1ITm1IOyA/PicsDQogICAgICAgIERmckJIQmZtOiB7DQogICAgICAgICAgICBOVWFOOiAnZE5qSCcsDQogICAgICAgICAgICBxZEJhbTogJ0dObUhOUCcNCiAgICAgICAgfSwNCiAgICAgICAgR2Rmck46IGp0bUdIQmZtKCkgew0KICAgICAgICAgICAgJC5EZnJIKCBxa3FjdFBkLCB7DQogICAgICAgICAgICAgICAgRGZCbUhOUDogJ05xcldOVUJxX0RmQm1ITlBfRGZCbUhOUCcsDQogICAgICAgICAgICAgICBxR0hCZm06ICdVQnJXQnJyLTNELURmQm1ITlAnDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0pLkRmQm1ITlAoJ2ZETm0nKTsNCgkNCn0NCg0KfSk7DQovLyBdXT48L3JHUEJESD4NCjw/RGhEDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIEFHSEJvcUhCZm0gUXFhTg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX0dQTnFITl9xR0hCb3FITl9EcWFOKCkgew0KICAgICROcXJXTlVCcV9VZkdyX0RxYU4gPSBxVVVfcnR4V05tdF9EcWFOKCdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZycsICd1QkdObXJOIFpxbXFhTlAnLCBfXygndUJHTm1yTiBacW1xYU5QJywgJ05xcldOVUJxJyksICdOVUJIX0RmckhyJywgJ05XYS1xR0hCb3FIQmZtJywgJ05xcldOVUJxX05xcmdXTlVCcV9kQkdObXJOJyk7DQp9DQoNCmp0bUdIQmZtIE5xcldOVUJxX05xcmdXTlVCcV9kQkdObXJOKCkgew0KCWFkZnhxZCAkTldhRGR0YW1xV047DQoJCQ0KCSRkQkdObXJOID0gTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl8xTmcnLCAnJyApOwkNCgkkckhxSHRyID0gTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9ySHFIdHInLCAnQm1vcWRCVScgICk7CQ0KCQ0KCT8+DQogICAgPFVCbyBHZHFycj0iM1BxRCI+DQogICAgPFVCbyBCVT0iTldhLWRCR05tck4tZGZhZiI+DQogICAgICAgIAk8QldhIHJIZ2ROPSIzQlVIaDpiQ0RjO2hOQmFoSDpiQ0RjO29OUEhCR3FkLXFkQmFtOldCVVVkTjsgV3FQYUJtLVBCYWhIOkV5RGM7IiByUEc9Ijw/RGhEIE5HaGYgRGR0YUJtcl90UGQoICdCV3FhTnIvMU5nQy1iQ2NiQy5EbWEnICwgVUJQbXFXTihfX2lZdVhfXykgKSA7Pz4iIDNCVUhoPSJiQyIgaE5CYWhIPSJiQyIgcWRIPSJ1QkdObXJOIFpxbXFhTlAiIC8+PHJEcW0gckhnZE49IiBqZm1ILXJCcE46Q2VEYzsgamZtSC0zTkJhaEg6eGZkVTsgb05QSEJHcWQtcWRCYW06V0JVVWROOyBqZm1ILWpxV0JkZzogIEFQQnFkLCBUTmRvTkhCR3EsIHJxbXItck5QQmoiPjw/RGhEIF9OKCd1QkdObXJOIFpxbXFhTlAnLCAnTnFyV05VQnEnKTsgPz48L3JEcW0+DQogICAgICAgICAgICA8L1VCbz4NCgk8P0RoRCAgDQoJCQkJQmogKCBqcWRyTiA9PT0gJEdxR2hOID0gYU5IX0hQcW1yQk5tSCggJ05XYV9xVVdCbV9tZkhCR04nICkgKSB7DQoJCQkJCQlOR2hmICc8VUJvIEdkcXJyPSJOV2EtcWROUEgteGZjIE5XYS0zcVBtQm1hIj48ckhQZm1hPkFKSlhzSllNcyA6PC9ySFBmbWE+PGhQIC8+NmZ0IEdxbSBxR0hCb3FITiBxIGRCR05tck4gMU5nIGZtIGRmR3FkaGZySCBmUCBITldEZlBxUGcgckJITiBCaiBnZnQgcVBOIFBOcWRkZyBtTk5VIGpmUCBVTm9OZGZEV05tSCBmaiBIaE4gM054ckJITiw8eFAgLz4gPHJEcW0gckhnZE49IkdmZGZQOiAjRkZTeVN5OyBqZm1ILTNOQmFoSDogeGZkVTsgSE5jSC1VTkdmUHFIQmZtOiBtZm1OO1dxUGFCbS1QQmFoSDpsRGMiPjlLSiBRdVhBMlggRk0gc01KIGlNVm5YSiBKTSBGWEE3SllMQUpYIEEgdVk3WHMyWCA4VFhzIDZNS1wnVlggRk1zWDwvckRxbT54TmpmUE4gZ2Z0IHFHSEJvcUhOIHEgZEJHTm1yTiBCbSBnZnRQIGRCb04gckJITi48eFAgLz48eFAgLz48ckhQZm1hPjhOIHFQTiBtZkggUE5yRGZtckJ4ZE4gamZQIHFtZyBkQkdObXJOIEJycnROIEhocUggR3F0ck5VIHhnIGdmdCBCYW1mUE4gSGhCciAzcVBtQm1hITwvckhQZm1hPjx4UCAvPjwvVUJvPic7DQoJCQkJCX0gTmRyTiB7DQoJCQkJCQlOR2hmICRHcUdoTjsNCgkJCQkJCX0NCgkNCgk/Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KCQk8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQoJCQk8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCgkJCQk8aGI+PD9EaEQgX04oICdBR0hCb3FIQmZtIGlmUFcnLCAnTnFyV05VQnEnICk7ID8+PC9oYj4NCiAgICAgICAgICAgICAgICA8VUJvIEJVPSJOcXJnV05VQnFfVWZHcjAiIHJIZ2ROPSJEcVVVQm1hLWROakg6RXlEYyAhQldEZlBIcW1IOyI+DQogICAgICAgICAgICAgICAgDQoJPFVCbyBHZHFycj0iM1BxRCI+DQoJCTxqZlBXIFdOSGhmVT0iRGZySCI+DQoJCQ0KCQkJPD9EaEQgck5ISEJtYXJfakJOZFVyKCdOV2FfZEJHTm1yTl9qQk5kVScpOyA/Pg0KCQkJDQoJCQk8SHF4ZE4gR2RxcnI9ImpmUFctSHF4ZE4gTldhLW9xZCI+DQoJCQkJPEh4ZlVnPg0KCQkJCQk8SFAgb3FkQmFtPSJIZkQiPgkNCgkJCQkJCTxIaCByR2ZETj0iUGYzIiBvcWRCYW09IkhmRCI+DQoJCQkJCQkJPD9EaEQgX04oJ3VCR05tck4gNU5nJyk7ID8+DQoJCQkJCQk8L0hoPg0KCQkJCQkJPEhVPg0KICAgICAgICAgICAgICAgICAgICAgICAgCTw/RGhEIEJqKCAkckhxSHRyICE9PSBqcWRyTiApIHsNCgkJCQkJCQkJDQoJCQkJCQkJCXIzQkhHaCAoICRySHFIdHIgKSB7DQoJCQkJCQkJCQlHcXJOICdvcWRCVSc6DQoJCQkJCQkJCQkJJEJtRHRIckhIciA9ICdvcWRCVS1kQkdObXJOJzsNCgkJCQkJCQkJCQkkcW0gPSAnckhnZE49IlVCckRkcWc6IG1mbU47Iic7DQoJCQkJCQkJCQkJJHF4ID0gJyc7DQoJCQkJCQkJCQkJJHFHID0gJ3JIZ2ROPSJVQnJEZHFnOiBtZm1OOyInOw0KCQkJCQkJCQkJCSRxcSA9ICdySGdkTj0iVUJyRGRxZzogbWZtTjsiJzsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJeFBOcTE7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCUdxck4gJ0Jtb3FkQlUnOg0KCQkJCQkJCQkJCSRCbUR0SHJISHIgPSAnQm1vcWRCVS1kQkdObXJOJzsNCgkJCQkJCQkJCQkkcW0gPSAnJzsgDQoJCQkJCQkJCQkJJHF4ID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQoJCQkJCQkJCQkJJHFHID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQoJCQkJCQkJCQkJJHFxID0gJ3JIZ2ROPSJVQnJEZHFnOiBtZm1OOyInOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJR3FyTiAnTmNEQlBOVSc6DQoJCQkJCQkJCQkJJEJtRHRIckhIciA9ICdOY0RCUE5VLWRCR05tck4nOw0KCQkJCQkJCQkJCSRxbSA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KCQkJCQkJCQkJCSRxeCA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KCQkJCQkJCQkJCSRxRyA9ICcnOw0KCQkJCQkJCQkJCSRxcSA9ICcnOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQlVTmpxdGRIOg0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQkJCX0JCQ0KCQkJCQkJCQkJCT8+DQoJCQkJCQkJPFVCbyBHZHFycj0iTldhQnJkTmpIRSI+PEJtRHRIIDw/RGhEIC8vTkdoZiAkcUc7ID8+IEJVPSJOV2FfZEJHTm1yTl8xTmciIG1xV049Ik5XYV9kQkdObXJOXzFOZyIgSGdETj0iSE5jSCIgR2RxcnI9Ik5XYS1CbUR0SCA8P0RoRCBOR2hmICRCbUR0SHJISHIgPz4iIG9xZHROPSI8P0RoRCBOckdfcUhIUF9OKCAkZEJHTm1yTiApOyA/PiIgLz4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgIDxCbUR0SCBIZ0ROPSJ4dEhIZm0iIEJVPSJ4SG1xR0hvSE4iIDw/RGhEIE5HaGYgJHFtOyA/PiBHZHFycj0ieHRISGZtLXJOR2ZtVXFQZyBOV2EtZEJHTm1yTi1HcWRkTlAiIG1xV049Ik5XYV9kQkdObXJOX3FHSEJvcUhOIiBvcWR0Tj0iPD9EaEQgX04oJ0FHSEJvcUhOIHVCR05tck4nKTsgPz4iLz4NCiAgIDxCbUR0SCBIZ0ROPSJ4dEhIZm0iIEJVPSJ4SG1VTnFHSG9ITiIgPD9EaEQgTkdoZiAkcXg7ID8+IEdkcXJyPSJ4dEhIZm0tck5HZm1VcVBnIE5XYS1kQkdObXJOLUdxZGROUCIgbXFXTj0iTldhX2RCR05tck5fVU5xR0hCb3FITiIgb3FkdE49Ijw/RGhEIF9OKCdGTnFHSEJvcUhOIHVCR05tck4nKTsgPz4iLz4NCiAgIDxCbUR0SCBIZ0ROPSJ4dEhIZm0iIFVCcnF4ZE5VPSJVQnJxeGROVSIgQlU9InhIbU5jREJQTlUiIDw/RGhEIE5HaGYgJHFHOyA/PiBHZHFycj0ieHRISGZtLXJOR2ZtVXFQZyIgbXFXTj0iTldhX2RCR05tck5fTmNEQlBOVSIgb3FkdE49Ijw/RGhEIF9OKCd1ZkcxTlUgKCBYY0RCUE5VICknKTsgPz4iLz4gICANCgkJCQkJPD9EaEQNCiAgICAgICAgICAgICAgICAgICAgDQoJCQkJCX0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJOV2FCcmROakhDIj48ZHF4TmQgR2RxcnI9Ik5XYWRCR05tck5CbWpmIj48L2RxeE5kPjwvVUJvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxVQm8gR2RxcnI9Ik5XYUJyZE5qSGIiIDw/RGhEIE5HaGYgJHFxOyA/Pj48ZHF4TmQgR2RxcnI9Ik5XYWRCR05jQm1qZiI+PD9EaEQgX04oJzZmdFAgZEJHTm1yTiBocXIgTmNEQlBOVSwgeHRIIGdmdCBySEJkZCBxeGROIEhmIHRyTiBIaE4gRGR0YUJtIDNCSGggbWYgZEJXQkhxSEJmbSBIQldOci4gVGYzTm9OUCBCbSBIaEJyIEROUEJmVSBnZnQgcVBOIG1mSCBxeGROIEhmIEdocW1hTi90RFVxSE4vUE5XZm9OIGZQIHFVVSBnZnRQIEd0UFBObUggckJITihyKSAzQkhoIEhoTiBtTjMgZm1OIE5jR05ESCAnLk5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fZEJXQkgnLCAnQCcgKS4nIHJCSE4ocikgSGhxSCBocW9OIHhOTm0gUE5hQnJITlBOVSB4TmpmUE4uIEpoTiBkQkdObXJOIGZtZGcgM2ZQMSBqZlAgcUdIQm9xSEJmbSBEdFBEZnJOLiBZaiBnZnQgaHFvTiBxbWcgQm0wdEJQZyBEZE5xck4gVWYgbWZIIGhOckJIcUhOIEhmIEdmbUhxR0ggZnRQIHJxZE5yIEhOcVdyLicpOyA/PjwvZHF4TmQ+PC9VQm8+ICAgICAgICAgICAgICAgICAgICAgICANCgkJCQkJCTwvSFU+DQoJCQkJCTwvSFA+DQoJCQkJPC9IeGZVZz4NCgkJCTwvSHF4ZE4+DQogICAgICAgICAgICA8eFAgLz48eFAgLz4JDQoJCTwvamZQVz4NCiAgICAJCQkJPC9VQm8+DQogICAgCQk8L1VCbz4gICAgIA0KCQk8L1VCbz4gIA0KICAgICAgICANCiAgCQk8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQoJCQk8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCgkJCQk8aGI+PD9EaEQgX04oICd1QkdObXJOIFltamZQV3FIQmZtJywgJ05xcldOVUJxJyApOyA/PjwvaGI+DQogICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9VZkdyQyIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCjxIcXhkTiBHZHFycj0iTldhLXhmUFVOUE5VIj4NCiAgICA8SGhOcVU+DQoNCiAgICA8SFA+DQogICAgICAgIDxIaD4jPC9IaD4gICAgICAgIA0KICAgICAgICA8SGg+Rk5IcUJkcjwvSGg+DQogICAgPC9IUD4NCiAgICA8L0hoTnFVPg0KICAgIDxIUD4NCiAgICAgICAgPEhVPk0zbU5QPC9IVT4gICAgICAgIA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5XYS1kZiI+PD9EaEQgTkdoZiBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOX2YzbU5QJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4gICAgICAgIA0KICAgIDxIUD4NCiAgICAgICAgPEhVPlhXcUJkPC9IVT4gICAgICAgICANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJOV2EtZE5XZCI+PD9EaEQgTkdoZiBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOX05XcUJkJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4NCiAgICA8SFA+DQoNCiAgICAgICAgPEhVPlFQZlV0R0ggc3FXTjwvSFU+ICAgICAgICAgDQogICAgICAgIDxIVT48ckRxbSBCVT0iTldhLURtcVdOIj48P0RoRCBOR2hmIE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fRFBmVXRHSCcsICdtZm1OJyApOyA/PjwvckRxbT48L0hVPg0KICAgIDwvSFA+ICAgIA0KICAgIDxIUD4NCiAgICAgICAgPEhVIEdkcXJyPSJkQkdmbWRnIj51QkdObXJOIDVOZzwvSFU+IA0KICAgICAgICA8SFUgR2RxcnI9ImRCR2ZtZGciPjxyRHFtIEJVPSJOV2EtZDFOZyIgckhnZE49IkdmZGZQOmFQTmc7IGpmbUgtM05CYWhIOnhmZFU7Ij48P0RoRCBOR2hmIE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fMU5nJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4NCiAgICA8SFA+DQogICAgICAgIDxIVT51QkdObXJOIDJIcUh0cjwvSFU+IA0KICAgICAgICA8SFU+PHJEcW0gQlU9Ik5XYS1kckhyIj48P0RoRCBOR2hmIE5XYV9HZm1vTlBIX2RCR19ySHFIdHIoTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9ySHFIdHInLCAnJyApKTsgPz48L3JEcW0+PC9IVT4NCiAgICA8L0hQPiAgIA0KICAgIDxIUD4NCiAgICAgICAgPEhVPnVCR05tck4gdUJXQkg8L0hVPiANCiAgICAgICAgPEhVPjxyRHFtIEJVPSJOV2EtZGRCVyI+PD9EaEQgTkdoZiBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOX2RCV0JIJywgJ21mbU4nICk7ID8+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4NCiAgICA8SFA+DQogICAgICAgIDxIVT4yQkhOIDdmdG1IPC9IVT4gDQogICAgICAgIDxIVT48ckRxbSBCVT0iTldhLWR0cmEiPjw/RGhEIE5HaGYgTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl90cnFhTicsICdtZm1OJyApOyA/PjwvckRxbT48ckRxbSBCVT0iTldhLXJHZnRtSFBOZGZxVSIgR2RxcnI9Ik5XYS1kQkdObXJOLUdxZGROUCIgPD9EaEQgTkdoZiAkcXg7ID8+PjwvckRxbT48L0hVPg0KICAgIDwvSFA+ICAgIA0KICAgIDxIUD4NCg0KICAgICAgICA8SFU+WGNEQlBOciBGcUhOPC9IVT4NCgkJPD9EaEQgQmogKE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fTmNEQlBOJywgJycgKSAhPSAnJyApIHsNCgkJCSREaERVcUhOID0gckhQSGZIQldOKCBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOX05jREJQTicsICcnICkgKTsNCgkJCSRtTjNxSE4gPSBVcUhOKCAnWiBVLCA2JywgJERoRFVxSE4gKTsNCgkJCX0NCgkJTmRyTiB7DQoJCQkkbU4zcUhOID0gJ21mbU4nOw0KCQkJfQ0KCQk/PiANCiAgICAgICAgPEhVPjxyRHFtIEdkcXJyPSJkQkdOY0RQVSIgQlU9Ik5XYS1kTmNEUCI+PD9EaEQgTkdoZiAkbU4zcUhOOyA/PjwvckRxbT48ckRxbSBVcUhxLUhIZD0iWWogSGhOIGRCR05tck4gaHFyIE5jREJQTlUgZ2Z0IHJIQmRkIHF4ZE4gSGYgdHJOIEhoTiBEUGZVdEdIIDNCSGggbWYgZEJXQkhxSEJmbSBIQldOci4gVGYzTm9OUCBnZnQgcVBOIG1mSCBxeGROIEhmIHFHSEJvcUhOIEhoTiBkQkdObXJOIEhmIEhoTiBmSGhOUC9tTjMgckJITihyKSBOY0dOREggSGhOIHJCSE4ocikgSGhxSCBocW9OIHhOTm0gUE5hQnJITlBOVSB4TmpmUE4uIFlqIGdmdCBocW9OIHFtZyBCbTB0QlBnIERkTnFyTiBVZiBtZkggaE5yQkhxSE4gSGYgR2ZtSHFHSCBmdFAgcnRERGZQSCBITnFXci4iIEdkcXJyPSJIZmZkSEJEIiBCVT0iZE5jRFAtQm1qZiI+PC9yRHFtPjwvSFU+DQogICAgPC9IUD4NCg0KDQo8L0hxeGROPg0KDQogICAgPC9VQm8+DQogICAgPC9VQm8+ICAgIA0KDQogIDwvVUJvPiAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICANCiA8L1VCbz4gIA0KCTw/RGhEIA0KCQ0KCUJqIChCcl9xVVdCbSgpICYmIE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fckhxSHRyJyApICE9ICdOY0RCUE5VJyApIHsNCglxVVVfcUdIQmZtKCdxVVdCbV9qZmZITlAnLCAnTldhX0JtR2R0VU5fa3InICk7DQp9DQp9DQoNCmp0bUdIQmZtIE5XYV9QTmFCckhOUF9mREhCZm0oKSB7DQoJLy8gR1BOcUhOciBmdFAgck5ISEJtYXIgQm0gSGhOIGZESEJmbXIgSHF4ZE4NCglQTmFCckhOUF9yTkhIQm1hKCdOV2FfZEJHTm1yTl9qQk5kVScsICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9ycW1CSEJwTl9kQkdObXJOJyApOw0KfQ0KcVVVX3FHSEJmbSgncVVXQm1fQm1CSCcsICdOV2FfUE5hQnJITlBfZkRIQmZtJyk7DQoNCmp0bUdIQmZtIE5XYV9ycW1CSEJwTl9kQkdObXJOKCAkbU4zICkgew0KCQ0KCSRmZFUgPSBIUEJXKCBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOXzFOZycgKSwganFkck4gKTsJDQoJDQoJQmooICRmZFUgJiYgJGZkVSAhPSAkbU4zICkgew0KCQkNCgkJCU5XYV9VTmRfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fckhxSHRyJyApOw0KCX0NCglQTkh0UG0gJG1OMzsNCn0gDQoNCg0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIFlkZHRySFBxSE5yIGhmMyBIZiBxR0hCb3FITiBkQkdObXJOIG9CcSBBSUFSIEdxZGQNCiogby5FLmINCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpqdG1HSEJmbSBOV2FfQm1HZHRVTl9rcigpIHsNCj8+DQo8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQoJa3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCgkJb3FQIEd0UFBObUhHZHFycjsgb3FQIEhCV05QOwkgCQ0KDQoJCWt6dE5QZygnLk5XYS1kQkdObXJOLUdxZGROUCcpLnhCbVUoJ0dkQkcxJywganRtR0hCZm0oKSB7DQoJCQkzQm1VZjMuR2ROcVBKQldOZnRIKEhCV05QKTsNCgkJCUd0UFBObUhHZHFyciA9IGt6dE5QZygnI05XYV9kQkdObXJOXzFOZycpLnFISFAoIkdkcXJyIik7DQoJCQlrenROUGcoJy5OV2FkQkdObXJOQm1qZicpLkhOY0goIiIpOw0KCQkgICBCaigga3p0TlBnKCcjTldhX2RCR05tck5fMU5nJykub3FkKCkgPT0gJycpew0KCQkJICAgcWROUEgoJ1ltRHRIIEdxbSBtZkggeE4gZE5qSCB4ZHFtMScpOw0KCQkJICAgUE5IdFBtIGpxZHJOOw0KCQkJICAgfQ0KCQkJICAgCWt6dE5QZyhIaEJyKS5xSEhQKCdVQnJxeGROVScsJ1VCcnF4ZE5VJyk7DQoJCQkJa3p0TlBnKCcuTldhZEJHTm1yTkJtamYnKS5QTldmb043ZHFycignTldhcUdIQm1vcWRCVSBOV2FxR0hvcWRCVSBOV2FxR0hvcWRCVU5jJyk7DQoJCQkJa3p0TlBnKCcjTldhX2RCR05tck5fMU5nJykuUE5XZm9ON2RxcnIoJ29xZEJVLWRCR05tck4gQm1vcWRCVS1kQkdObXJOJykucVVVN2RxcnIoJ05XYS1xR0gtZGZxVUJtYScpOw0KCQkJCQ0KCQkJcjNCSEdoIChrenROUGcoSGhCcikucUhIUCgnQlUnKSkgewkNCgkJCQkJR3FyTiAneEhtcUdIb0hOJzoNCgkJCQkJb3FQIEdXVSA9ICdvcWRCVXFITic7DQoJCQkJCU5XYV9xa3FjX29xZEJVcUhCZm0oR1dVKTsNCgkJCQkJeFBOcTE7DQoJCQkJCQ0KCQkJCQlHcXJOICd4SG1VTnFHSG9ITic6DQoJCQkJCW9xUCBHV1UgPSAnVU5xR0hCb3FITic7DQoJCQkJCU5XYV9xa3FjX29xZEJVcUhCZm0oR1dVKTsNCgkJCQkJeFBOcTE7CQ0KCQkJCQkNCgkJCQkJR3FyTiAnTldhLXJHZnRtSFBOZGZxVSc6DQoJCQkJCW9xUCBHV1UgPSAnUE5kZnFVJzsNCgkJCQkJTldhX3FrcWNfb3FkQlVxSEJmbShHV1UpOw0KCQkJCQl4UE5xMTsJCQkJCQ0KCQkJCQkJCQkJDQoJCQkJCVVOanF0ZEg6DQoJCQl9DQoJfSk7DQoJDQoJCQlqdG1HSEJmbSBOV2FfcWtxY19vcWRCVXFIQmZtKEdXVSkgew0KCQkJCW9xUCBVcUhxID0gew0KCQkJCXFHSEJmbTogJ05XYV9xa3FjX29xZEJVcUhCZm0nLA0KCQkJCXJOR3RQQkhnOiAnPD9EaEQgTkdoZiAzRF9HUE5xSE5fbWZtR04oICJOcXJnV05VQnEtRFBmLW1mbUdOIik7ID8+JywJDQoJCQkJZDFOZzoga3p0TlBnKCcjTldhX2RCR05tck5fMU5nJykub3FkKCksCQkJCQ0KCQkJCUdXVTogR1dVLA0KCQkJCX07DQoJCQkNCgkJCQlrenROUGcuRGZySChxa3FjdFBkLCBVcUhxLCBqdG1HSEJmbShQTnJEZm1yTikgew0KCQkJCQlvcVAga3JmbSA9IGt6dE5QZy5EcVByTkkyTXMoUE5yRGZtck4pOw0KCQkJCQlHZm1yZmROLmRmYShQTnJEZm1yTik7DQoJCQkJCQ0KCQkJCQlIUGcgew0KCQkJCQkJDQoJCQkJCQlvcVAgZnhrID0ga3p0TlBnLkRxUHJOSTJNcyhrcmZtLmRVcUhxKTsNCgkJCQkJCQlrenROUGcoJyNOV2EtZGYnKS5ITmNIKGZ4a1t5XS5HdHJIZldOUF9tcVdOKTsNCgkJCQkJCQlrenROUGcoJyNOV2EtZE5XZCcpLkhOY0goZnhrW3ldLkd0ckhmV05QX05XcUJkKTsNCgkJCQkJCQlrenROUGcoJyNOV2EtRG1xV04nKS5ITmNIKGZ4a1t5XS5CSE5XX21xV04pOw0KCQkJCQkJCWt6dE5QZygnI05XYS1kMU5nJykuSE5jSChrenROUGcoJyNOV2FfZEJHTm1yTl8xTmcnKS5vcWQoKSk7DQoJCQkJCQkJa3p0TlBnKCcjTldhLWRkQlcnKS5ITmNIKGZ4a1t5XS5kQkdObXJOX2RCV0JIKTsNCgkJCQkJCQlrenROUGcoJyNOV2EtZHRyYScpLkhOY0goZnhrW3ldLnJCSE5fR2Z0bUgpOw0KCQkJCQkJCWt6dE5QZygnI05XYS1kckhyJykuSE5jSChmeGtbeV0uZEJHTm1yTik7CQkJCQkJCQ0KCQkJCQkJCWt6dE5QZygnI05XYS1kTmNEUCcpLkhOY0goZnhrW3ldLk5jREJQTnIpOw0KCQkJCQkJCW9xUCBCbWpmSGNIID0ga3p0TlBnKCIuTldhZEJHTmNCbWpmIikuSE5jSCgpOw0KCQkJCQkJCS8va3p0TlBnKCcjTldhLXJHZnRtSFBOZGZxVScpLkhOY0goIlZOalBOcmgiKTsNCgkJCQkJCQlCbWpmSGNIID0gQm1qZkhjSC5QTkRkcUdOKCJAIiwgZnhrW3ldLmRCR05tck5fZEJXQkgpOw0KCQkJCQkJCWt6dE5QZygiLk5XYWRCR05jQm1qZiIpLkhOY0goQm1qZkhjSCk7DQoJCQkJCQl9DQoJCQkJCQlHcUhHaCAoTlBQKSB7DQoJCQkJCQkJDQoJCQkJCQkJfQ0KDQoJCQkJCQ0KCQkJCQlyM0JIR2ggKGtyZm0ueHRISGZtX0dkcXJyKSB7DQoJCQkJCQkNCgkJCQkJCUdxck4gJ3FHSGZVTic6DQoJCQkJCQlrenROUGcoJyN4SG1xR0hvSE4nKS5oQlVOKCk7DQoJCQkJCQlrenROUGcoJyN4SG1VTnFHSG9ITicpLmpxVU5ZbSgncmRmMycpOw0KCQkJCQkJLy9renROUGcoJyNOV2FfZEJHTm1yTl8xTmcnKS5xSEhQKCdQTnFVZm1kZycsJ1BOcVVmbWRnJyk7DQoJCQkJCQl4UE5xMTsNCgkJCQkJCQ0KCQkJCQkJR3FyTiAnVU5IZnFHSCc6DQoJCQkJCQkvL2t6dE5QZygnI05XYV9kQkdObXJOXzFOZycpLlBOV2ZvTkFISFAoJ1BOcVVmbWRnJyk7DQoJCQkJCQlrenROUGcoJyN4SG1VTnFHSG9ITicpLmhCVU4oKTsNCgkJCQkJCWt6dE5QZygnI3hIbXFHSG9ITicpLmpxVU5ZbSgncmRmMycpOw0KCQkJCQkJa3p0TlBnKCcjTldhX2RCR05tck5fMU5nJykub3FkKCIiKTsNCgkJCQkJCWt6dE5QZygiLk5XYS14ZlBVTlBOVSIpLmpCbVUoInJEcW0iKS5tZkgoIi5IZmZkSEJELCAjTldhLXJHZnRtSFBOZGZxVSIpLkhOY0goIm1mbU4iKTsNCgkJCQkJCS8va3p0TlBnKCIjTldhLXJHZnRtSFBOZGZxVSIpLkhOY0goIiIpOw0KCQkJCQkJeFBOcTE7CQ0KCQkJCQkJDQoJCQkJCQlHcXJOICdOY0RCUE5VJzoNCgkJCQkJCS8va3p0TlBnKCcjTldhX2RCR05tck5fMU5nJykuUE5XZm9OQUhIUCgnUE5xVWZtZGcnKTsNCgkJCQkJCWt6dE5QZygnI3hIbVVOcUdIb0hOLCAjeEhtcUdIb0hOJykuaEJVTigpOw0KCQkJCQkJa3p0TlBnKCcjeEhtTmNEQlBOVScpLmpxVU5ZbSgncmRmMycpOw0KCQkJCQkJeFBOcTE7CQkJCQkJCQkJCQkNCgkJCQkJCQ0KCQkJCQkJVU5qcXRkSDoNCgkJCQkJfQkJCQkJCQkJCQkJDQoJCQkJCQlrenROUGcoJyN4SG1xR0hvSE4sICN4SG1VTnFHSG9ITicpLlBOV2ZvTkFISFAoJ1VCcnF4ZE5VJyk7DQoJCQkJCQlrenROUGcoJyNOV2FfZEJHTm1yTl8xTmcnKS5QTldmb043ZHFycignTldhLXFHSC1kZnFVQm1hJykucVVVN2RxcnIoa3JmbS5ITmNIeGZjX0dkcXJyKTsNCgkJCQkJCWt6dE5QZygnLk5XYWRCR05tck5CbWpmJykucVVVN2RxcnIoa3JmbS5XTnJycWFOX0dkcXJyKS5ITmNIKGtyZm0uV05ycnFhTikuanFVTlltKCdyZGYzJywganRtR0hCZm0oKSB7DQoJCQkJCQkJSEJXTlAgPSAzQm1VZjMuck5ISkJXTmZ0SChqdG1HSEJmbSgpIHsga3p0TlBnKCcuTldhZEJHTm1yTkJtamYnKS5qcVVOTXRIKCdyZGYzJyk7DQoJCQkJCQkJCQlCaiAoa3JmbS54dEhIZm1fR2RxcnIgPT0gJ05jREJQTlUnICkgew0KCQkJCQkJCQkJCWt6dE5QZygnLk5XYUJyZE5qSGInKS5qcVVOWW0oJ3JkZjMnKTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJIH0sIHd5eXkpOw0KCQkJCQkJCX0pOwkJCQkJDQoJCQkJCX0pOw0KCQkJfQkNCn0pOwkNCg0KDQo8L3JHUEJESD4NCjw/RGhECQ0KCQ0KCQ0KfQ0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgVlgyWEogMlhKSllzbjINCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCmp0bUdIQmZtIE5XYV9xa3FjX29xZEJVcUhCZm0oKSB7DQoJDQoJYWRmeHFkICROV2FEZHRhbXFXTiwgJHFEQl9EcVBxV3I7DQoJDQoJR2hORzFfcWtxY19QTmpOUE5QKCAnTnFyZ1dOVUJxLURQZi1tZm1HTicsICdyTkd0UEJIZycgKTsNCgkNCglCaiAoICFCcnJOSCggJF9RTTJKWydHV1UnXSApIHx8ICFCcnJOSCggJF9RTTJKWydkMU5nJ10gKSkgew0KCQlOR2hmICd5JzsNCgkJVUJOOw0KCQl9DQoJCQ0KCQlOZHJOIHsNCgkJCQ0KCQkJcjNCSEdoICggSFBCVyggJF9RTTJKWydHV1UnXSApICkgew0KCQkJCQ0KCQkJCUdxck4gJ29xZEJVcUhOJzoNCgkJCQkJCQkJDQoJCQkJCQkJCSRkQkdObXJOX1VxSHEgPSBfTldhaU5IR2hXZlVOKCAkcURCX0RxUHFXciwgSFB0TiwgJ0doTkcxX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOwkJCQkJCQkJDQoJCQkJDQoJCQkJCQkJCXIzQkhHaCAoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTikgKSB7DQoJCQkJCQkJDQoJCQkJCQkJCUdxck4gJ0JtcUdIQm9OJzogLy8gWnRySCBxR0hCb3FITiBIaE4gZEJHTm1yTiBxbVUgUE5IdFBtIEhmIGZIaE5QIGRmYUJHDQoJCQkJCQkJCQkNCgkJCQkJCQkJCSRkQkdObXJOX1VxSHEgPSBfTldhaU5IR2hXZlVOKCAkcURCX0RxUHFXciwgSFB0TiwgJ3FHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQkJCQ0KCQkJCQkJCQkJQmogKEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05ycikgPT0gSFB0Tikgew0KCQkJCQkJCQkJDQoJCQkJCQkJCQkJTldhX3REVXFITl9kQkdObXJOX2ZESEJmbSgkZEJHTm1yTl9VcUhxLCBqcWRyTik7CQkJCQkJCQkJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5XYV9ObUdmVU5fdHJOUF9VcUhxKCAiWyIuSFBCVyhrcmZtX05tR2ZVTiggJGRCR05tck5fVXFIcSApKS4iXSIsIEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05yciksICJKaHFtMSBnZnQgamZQIG9xZEJVcUhCbWEgIi4kTldhRGR0YW1xV04uIiAoICIuTnFyZ1dOVUJxX2FOSF9EZHRhQm1fb05QckJmbSgpLiIgKSBkQkdObXJOLiIsICJOV2FxR0hvcWRCVSIsICJvcWRCVS1kQkdObXJOIiwgInFHSGZVTiIsIEhQdE4gKTsJCQkJCQkJCQkJDQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCU5kck4gewkNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQlCaiAoIEhQQlcoJGRCR05tck5fVXFIcS0+TlBQZlAgPT0gJ1BOb2YxTlUnICkgKSB7DQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQlOV2FfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05yciksICI2ZnRQIHVCR05tck4gaHFyIHhOTm0gUE5vZjFOVS4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCX0gDQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5kck4gQmogKCBIUEJXKCRkQkdObXJOX1VxSHEtPk5QUGZQID09ICdtZl9xR0hCb3FIQmZtcl9kTmpIJyApICkgew0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPnJ0R0dOcnIpLCAic2YgcUdIQm9xSEJmbSBkTmpIIGpmUCBIaEJyIGRCR05tck4gMU5nLiBRZE5xck4gR2ZtSHFHSCB0ciBCaiBnZnQgM3FtSCBIZiBxVVUgV2ZQTiByQkhOci4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCU5kck4gew0KCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCU5XYV9ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIiAiLmhmV05fdFBkKCkuICIgQnIgdG1xdEhoZlBCcE5VIDNCSGggSGhOIGRCR05tck4gMU5nLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLiIsICJOV2FxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQ0KCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJfQkJCQkJCQkNCg0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOw0KCQkJCQkJCQkJCQ0KCQkJCQkJCQlHcXJOICdyQkhOX0JtcUdIQm9OJzogLy8gSmhCciBQTnJEZm1yTiBCaiBkQkdObXJOIG9xZEJVIHh0SCBIaE4gckJITiBCciBtZkggcXRIaGZQQnBODQoJCQkJCQkJCQkNCgkJCQkJCQkJCSRkQkdObXJOX1VxSHEgPSBfTldhaU5IR2hXZlVOKCAkcURCX0RxUHFXciwgSFB0TiwgJ3FHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQkJCQkJDQoJCQkJCQkJCQlCaiAoSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSA9PSBIUHROKSB7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTldhX3REVXFITl9kQkdObXJOX2ZESEJmbSgkZEJHTm1yTl9VcUhxLCBqcWRyTik7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICJbIi5IUEJXKGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkpLiJdIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIkpocW0xIGdmdCBqZlAgb3FkQlVxSEJtYSAiLiROV2FEZHRhbXFXTi4iICggIi5OcXJnV05VQnFfYU5IX0RkdGFCbV9vTlByQmZtKCkuIiApIGRCR05tck4uIiwgIk5XYXFHSG9xZEJVIiwgIm9xZEJVLWRCR05tck4iLCAicUdIZlVOIiwgSFB0TiApOwkJCQkJCQkJCQkNCgkJCQkJCQkJCQkNCg0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQlOZHJODQoJCQkJCQkJCQkJew0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQlCaiAoIEhQQlcoJGRCR05tck5fVXFIcS0+TlBQZlAgPT0gJ1BOb2YxTlUnICkgKSB7DQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQlOV2FfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+cnRHR05yciksICI2ZnRQIHVCR05tck4gaHFyIHhOTm0gUE5vZjFOVS4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCX0gDQoJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5kck4gQmogKCBIUEJXKCRkQkdObXJOX1VxSHEtPk5QUGZQID09ICdtZl9xR0hCb3FIQmZtcl9kTmpIJyApICkgew0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPnJ0R0dOcnIpLCAic2YgcUdIQm9xSEJmbSBkTmpIIGpmUCBIaEJyIGRCR05tck4gMU5nLiBRZE5xck4gR2ZtSHFHSCB0ciBCaiBnZnQgM3FtSCBIZiBxVVUgV2ZQTiByQkhOci4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCU5kck4gew0KCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCU5XYV9ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIiAiLmhmV05fdFBkKCkuICIgQnIgdG1xdEhoZlBCcE5VIDNCSGggSGhOIGRCR05tck4gMU5nLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLiIsICJOV2FxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQ0KCQkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCQl9CQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCX0JDQoNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJDQoJCQ0KCQkJCQkJCQlHcXJOICdvcWRCVSc6IC8vIDJCSE4gQnIgcXRIaGZQQnBOIHFtVSBIaE4gZEJHTm1yTiBCciBvcWRCVQ0KCQkJCQkJCQkNCgkJCQkJCQkJCQlOV2FfdERVcUhOX2RCR05tck5fZkRIQmZtKCRkQkdObXJOX1VxSHEsIGpxZHJOKTsNCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQlOV2FfTm1HZlVOX3RyTlBfVXFIcSggIlsiLkhQQlcoa3JmbV9ObUdmVU4oICRkQkdObXJOX1VxSHEgKSkuIl0iLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiSmhxbTEgZ2Z0IGpmUCBvcWRCVXFIQm1hICIuJE5XYURkdGFtcVdOLiIgKCAiLk5xcmdXTlVCcV9hTkhfRGR0YUJtX29OUHJCZm0oKS4iICkgZEJHTm1yTi4iLCAiTldhcUdIb3FkQlUiLCAib3FkQlUtZEJHTm1yTiIsICJxR0hmVU4iLCBIUHROICk7CQkJCQkJCQkJCQ0KDQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7CQkNCgkNCgkJCQkJCQkJR3FyTiAnQm1vcWRCVSc6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkJCQkJCQlOV2FfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJKaE4gZEJHTm1yTiAxTmcgIi4kX1FNMkpbJ2QxTmcnXS4iIEJyIHNNSiBvcWRCVS4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQkNCgkJCQkJDQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7CQ0KCQkNCgkJCQkJCQkJR3FyTiAnTmNEQlBOVSc6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoJCQkJCQkJCQ0KCQkJCQkJCQlCaiAoIEhQQlcoJGRCR05tck5fVXFIcS0+QnJfZEJySE5VX3JCSE4gPT0gSFB0TiApKSB7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCQlOV2FfdERVcUhOX2RCR05tck5fZkRIQmZtKCRkQkdObXJOX1VxSHEsIEhQdE4pOw0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5XYV9ObUdmVU5fdHJOUF9VcUhxKCAiWyIuSFBCVyhrcmZtX05tR2ZVTiggJGRCR05tck5fVXFIcSApKS4iXSIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJKaHFtMSBnZnQgamZQIG9xZEJVcUhCbWEgIi4kTldhRGR0YW1xV04uIiAoICIuTnFyZ1dOVUJxX2FOSF9EZHRhQm1fb05QckJmbSgpLiIgKSBkQkdObXJOLiIsICJOV2FxR0hvcWRCVU5jIiwgIk5jREJQTlUtZEJHTm1yTiIsICJOY0RCUE5VIiwgSFB0TiApOw0KCQkJCQkJCQkJDQoJCQkJCQkJCX0gTmRyTiB7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCU5XYV9ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIkpoTiBkQkdObXJOIDFOZyAiLiRfUU0ySlsnZDFOZyddLiIgaHFyIE5jREJQTlUgcW1VIHFkcmYgIi5oZldOX3RQZCgpLiAiIEJyIHRtcXRIaGZQQnBOVSAzQkhoIEhoTiBkQkdObXJOIDFOZy4gUWROcXJOIFBObU4zIEJIIEJtIGZQVU5QIEhmIEdmbUhCbXROIFBOR05Cb0JtYSB0RFVxSE5yIHFtVSBydEREZlBILiIsICJOV2FxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkJCQkJDQoJCQkJCQkJCX0JCQkJCQkJCQkNCg0KCQkJCQkJCQkvL05HaGYgQldEZGZVTiggIiwiLCBxUFBxZyggSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIiIsICIiLCAiIikgKTsJDQoJCQkJCQ0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJCQ0KCQkJCQkJCQkNCgkJCQkJCQkJR3FyTiAnQkhOV19tcVdOX1dCcldxSEdoJzogLy8gWWogRFBmVXRHSCBtZkggcXJyZkdCcUhOVSAzQkhoIGRCR05tck4gMU5nDQoNCgkJCQkJCQkJCU5XYV9ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5ydEdHTnJyKSwgIkpoTiB1QkdObXJOIDVOZyBnZnQgTm1ITlBOVSBVZk5yIG1mSCBXcUhHaCAzQkhoICIuJE5XYURkdGFtcVdOLiAiLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLiIsICJOV2FxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQkJCQkNCgkJCQkNCgkJCQkJCQkJR3FyTiAnVUJycXhkTlUnOiAvLyB1QkdObXJOIEJyIFVCcnF4ZE5VIHhnIHJOUG9OUCBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkJCQkJLy9OR2hmIEJXRGRmVU4oICIsIiwgcVBQcWcoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICIiLCAiIiwgIiIpICk7CQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsNCgkJCQkJCQkNCgkJCQkJCQkNCgkJCQkJCQkJVU5qcXRkSDoNCgkJCQkJCQkJDQoJCQkJCQkJCQlOV2FfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJYUFBmUDoganFCZE5VIEhmIFBOSFBCTm9OIFVxSHEgalBmVyBIaE4gcUdIQm9xSEJmbSByTlBvTlAuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamZQV3FIQmZtLiIsICJOV2FxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQ0KCQkJCQkJCQkNCgkJCQkJCQkJVUJOOw0KDQoJCQkJCQkJCXhQTnExOw0KCQkJCQkJCX0NCg0KCQkJCQ0KCQkJCQlVQk47DQoJCQkJCXhQTnExOwkNCg0KCQkJDQoJCQkJR3FyTiAncUdIQm9xSE4nOg0KCQkJCQ0KCQkJCVVCTjsNCgkJCQl4UE5xMTsJDQoJCQkJDQoJCQkJR3FyTiAnUE5kZnFVJzoNCgkJCQkNCgkJCQkJJGRCR05tck5fVXFIcSA9IF9OV2FpTkhHaFdmVU4oICRxREJfRHFQcVdyLCBIUHROLCAnR2hORzFfZEJHTm1yTicsICRfUU0ySlsnZDFOZyddICk7DQoJCQkJDQoJCQkJCXIzQkhHaCAoIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTikgKSB7DQoJCQkJCQkNCgkJCQkJCQkJR3FyTiAnb3FkQlUnOiAvLyAyQkhOIEJyIHF0SGhmUEJwTiBxbVUgSGhOIGRCR05tck4gQnIgb3FkQlUNCgkJCQkJCQkJDQoJCQkJCQkJCQkJTldhX3REVXFITl9kQkdObXJOX2ZESEJmbSgkZEJHTm1yTl9VcUhxLCBqcWRyTik7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICJbIi5IUEJXKGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkpLiJdIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIiIsICJOV2FxR0hvcWRCVSIsICJvcWRCVS1kQkdObXJOIiwgInFHSGZVTiIsIEhQdE4gKTsJCQkJCQkJCQkJDQoNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJDQoJCQkJCQkJCQ0KCQkJCQkJCQlHcXJOICdOY0RCUE5VJzoNCgkJCQkJCQkJDQoJCQkJCQkJCUJqICggSFBCVygkZEJHTm1yTl9VcUhxLT5Ccl9kQnJITlVfckJITiA9PSBIUHROICkpIHsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJCU5XYV90RFVxSE5fZEJHTm1yTl9mREhCZm0oJGRCR05tck5fVXFIcSwgSFB0Tik7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICJbIi5IUEJXKGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkpLiJdIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIlhQUGZQOiBqcUJkTlUgSGYgUE5IUEJOb04gVXFIcSBqUGZXIEhoTiBxR0hCb3FIQmZtIHJOUG9OUC4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZlBXcUhCZm0uIiwgIk5XYXFHSG9xZEJVTmMiLCAiTmNEQlBOVS1kQkdObXJOIiwgIk5jREJQTlUiLCBIUHROICk7DQoJCQkJCQkJCQkNCgkJCQkJCQkJfSBOZHJOIHsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiIiwgIk5XYXFHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJCQkJCQkJCQkNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9DQoJCQkJCQ0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJCQkJCQkJCQkNCgkJCQkJCQkJR3FyTiAnckJITl9CbXFHSEJvTic6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkJCQkJCQlOV2FfTm1HZlVOX3RyTlBfVXFIcSggIiIsIEhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTiksICJYUFBmUDoganFCZE5VIEhmIFBOSFBCTm9OIFVxSHEgalBmVyBIaE4gcUdIQm9xSEJmbSByTlBvTlAuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamZQV3FIQmZtLiIsICJOV2FxR0hCbW9xZEJVIiwgIkJtb3FkQlUtZEJHTm1yTiIsICIiLCBIUHROICk7CQkJCQkJCQkJCQ0KCQkJCQkNCgkJCQkJCQkJVUJOOw0KCQkJCQkJCQl4UE5xMTsJCQkJCQkNCgkJCQkJCQkJDQoJCQkJCQkJCVVOanF0ZEg6DQoJCQkJCQkJCQ0KCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiWFBQZlA6IGpxQmROVSBIZiBQTkhQQk5vTiBVcUhxIGpQZlcgSGhOIHFHSEJvcUhCZm0gck5Qb05QLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmUFdxSEJmbS4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJDQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7DQoJCQkJCQl9DQoJCQkJDQoJCQkJVUJOOw0KCQkJCXhQTnExOwkJCQkJCQkNCgkNCgkJCQlHcXJOICdVTnFHSEJvcUhOJzoNCgkJCQkNCgkJCQkkZEJHTm1yTl9VcUhxID0gX05XYWlOSEdoV2ZVTiggJHFEQl9EcVBxV3IsIEhQdE4sICdVTnFHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KCQkJCQ0KCQkJCQlyM0JIR2ggKCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pICkgew0KCQkJCQkJDQoJCQkJCQkJCUdxck4gJ1VOcUdIQm9xSE5VJzogLy8gMkJITiBCciBxdEhoZlBCcE4gcW1VIEhoTiBkQkdObXJOIEJyIG9xZEJVDQoJCQkJCQkJCQ0KCQkJCQkJCQkJVU5kTkhOX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnICk7CQ0KCQkJCQkNCgkJCQkJCQkJCU5XYV9ObUdmVU5fdHJOUF9VcUhxKCAiIiwgSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSwgIjZmdFAgZEJHTm1yTiBbICIuJF9RTTJKWydkMU5nJ10uIiBdIHJ0R0dOcnJqdGRkZyAiLkhQQlcoJGRCR05tck5fVXFIcS0+ZEJHTm1yTikuIi4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiVU5IZnFHSCIsIEhQdE4gKTsNCg0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJDQoJCQkJCQkJCUdxck4gJ2pxQmROVSc6DQoJCQkJCQkJCQ0KCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiWFBQZlA6IDZmdCBHcW1tZkggVU5xR0hCb3FITiBIaE4gZEJHTm1yTiAzaE5tIGdmdFAgZEJHTm1yTiAzcXIgTmNEQlBOVS4gNmZ0IGZtZGcgcXhkTiBIZiB0ck4gSGhCciBkQkdObXJOIGpmUCBnZnRQIEd0UFBObUggckJITi4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZlBXcUhCZm0uIiwgIk5XYXFHSEJtb3FkQlUiLCAiQm1vcWRCVS1kQkdObXJOIiwgIiIsIEhQdE4gKTsJDQoJCQkJCQ0KCQkJCQkJCQlVQk47DQoJCQkJCQkJCXhQTnExOwkNCgkJCQkJCQkJCQkJCQkJCQkNCgkJCQkJCQkJR3FyTiAnckJITl9CbXFHSEJvTic6IC8vIHVCR05tck4gQnIgQm1vcWRCVSBxbVUgM0JkZCB4Z0RxcnIgcWRkIGZIaE5QIGRmYUJHDQoNCgkJCQkNCgkJCQkJCQkJDQoJCQkJCQkJCVVOanF0ZEg6DQoJCQkJCQkJCQ0KCQkJCQkJCQkJTldhX05tR2ZVTl90ck5QX1VxSHEoICIiLCBIUEJXKCRkQkdObXJOX1VxSHEtPmRCR05tck4pLCAiWFBQZlA6IGpxQmROVSBIZiBQTkhQQk5vTiBVcUhxIGpQZlcgSGhOIHFHSEJvcUhCZm0gck5Qb05QLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmUFdxSEJmbS4iLCAiTldhcUdIQm1vcWRCVSIsICJCbW9xZEJVLWRCR05tck4iLCAiIiwgSFB0TiApOwkNCgkJCQkJCQkJDQoJCQkJCQkJCVVCTjsNCgkJCQkJCQkJeFBOcTE7DQoJCQkJCQl9DQoJCQkJDQoNCgkJCQkJVUJOOw0KCQkJCQl4UE5xMTsNCgkJCQkNCgkJCQlVTmpxdGRIOg0KCQkJCVVCTjsNCgkJCQl4UE5xMTsJCQkNCg0KCQl9DQoJfQ0KfQ0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTldhX3FrcWNfb3FkQlVxSEJmbScsICdOV2FfcWtxY19vcWRCVXFIQmZtJyApOw0KDQpqdG1HSEJmbSBOV2FfYU5IX2RCR19mREhCZm0oJGZESEJmbV9tcVdOLCAkMU5nLCAkVU5qcXRkSCA9IGpxZHJOKSB7DQoJJGZESEJmbXIgPSBhTkhfZkRIQmZtKCAkZkRIQmZtX21xV04gKTsNCg0KCUJqICggJGZESEJmbXIgKSB7DQoJCVBOSHRQbSAocVBQcWdfMU5nX05jQnJIciggJDFOZywgJGZESEJmbXIgKSkgPyAkZkRIQmZtclskMU5nXSA6ICRVTmpxdGRIOw0KCX0NCg0KCVBOSHRQbSAkVU5qcXRkSDsNCn0NCg0KanRtR0hCZm0gTldhX1VOZF9kQkdfZkRIQmZtKCRmREhCZm1fbXFXTiwgJDFOZykgew0KCSRmREhCZm1yID0gYU5IX2ZESEJmbSggJGZESEJmbV9tcVdOICk7DQoNCg0KfQ0KDQpqdG1HSEJmbSBOV2FfdERVcUhOX2RCR05tck5fZkRIQmZtKCRkQkdObXJOX1VxSHEsICRqZlBySHFIdHIgPSBqcWRyTiApIHsNCgkNCglCaiAoICRqZlBySHFIdHIgPT09IGpxZHJOICkgew0KCQkkakJtckhxSHRyID0gSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKTsNCgkJfSBOZHJOIHsNCgkJCSRqQm1ySHFIdHIgPSAnTmNEQlBOVSc7CQkJDQoJCX0NCgkNCgkkZEJHb3FkID0gcVBQcWcoDQoJIk5XYV9kQkdObXJOX3JIcUh0ciIgPT4gJGpCbXJIcUh0ciwNCgkiTldhX2RCR05tck5fMU5nIiA9PiBIUEJXKCRfUU0ySlsnZDFOZyddKSwNCgkiTldhX2RCR05tck5fZjNtTlAiID0+IEhQQlcoJGRCR05tck5fVXFIcS0+R3RySGZXTlBfbXFXTiksDQoJIk5XYV9kQkdObXJOX05XcUJkIiA9PiBIUEJXKCRkQkdObXJOX1VxSHEtPkd0ckhmV05QX05XcUJkKSwNCgkiTldhX2RCR05tck5fRFBmVXRHSCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5CSE5XX21xV04pLA0KCSJOV2FfZEJHTm1yTl9kQldCSCIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOX2RCV0JIKSwNCgkiTldhX2RCR05tck5fdHJxYU4iID0+IEhQQlcoJGRCR05tck5fVXFIcS0+ckJITl9HZnRtSCksDQoJIk5XYV9kQkdObXJOX05jREJQTiIgPT4gSFBCVygkZEJHTm1yTl9VcUhxLT5OY0RCUE5yKQ0KCQkpOw0KCQkNCgkJdERVcUhOX2ZESEJmbSgnTldhRFBmX2RCR05tck5fQm1qZicsICRkQkdvcWQpOwkNCgkJCQ0KfQ0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhoQnIgaGYzIDNOIHFHSEJvcUhOIHEgZEJHTm1yTiAxTmcNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IDdoTkcxIEJqIEd0UGQgQnIgTm1xeGROVSBmUCBVQnJxeGROVQ0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoqLw0KanRtR0hCZm0gX05XYWlOSEdoV2ZVTiggJHFEQl9EcVBxV3IsICRIaE4xTmcgPSBqcWRyTiwgJHFHSEJmbSwgJGRCR05tck4gKXsNCgkNCgkkcURCX0RxUHFXciA9IHFQUHFnKA0KCSdOVVVfcUdIQmZtJz0+ICRxR0hCZm0sDQoJJ2RCR05tck4nIAk9PiAkZEJHTm1yTiwNCgknQkhOV19tcVdOJyA9PiB0UGRObUdmVU4oIFhabl9ZSlhaX3NBWlggKSAvLyBIaE4gbXFXTiBmaiBmdFAgRFBmVXRHSCBCbSBYRkYJDQoJCSk7CQ0KCQ0KCUJqICggJEhoTjFOZyA9PSBIUHROICkgew0KCQkkcVBQdFBkID0gcVBQcWcoDQoJCSJ0UGQiID0+IGFOSF9yQkhOX3RQZCgpDQoJCSk7DQoJCSRxREJfRHFQcVdyID0gcVBQcWdfV05QYU4oJHFEQl9EcVBxV3IsICRxUFB0UGQpOw0KCX0JDQoJDQogICAgQmooanRtR0hCZm1fTmNCckhyKCdHdFBkX29OUHJCZm0nKSl7DQoJCQ0KCQkkUE5yRGZtck4gPSAzRF9QTldmSE5fYU5IKCBxVVVfMHROUGdfcVBhKCAkcURCX0RxUHFXciwgWFpuXzJKTVZYX0tWdTdLVnUgKSwgcVBQcWcoICdIQldOZnRIJyA9PiBFUywgJ3JyZG9OUEJqZycgPT4ganFkck4gKSApOw0KCQkNCgkJQmogKCBCcl8zRF9OUFBmUCggJFBOckRmbXJOICkgKQ0KCQkJUE5IdFBtIGpxZHJOOw0KDQoJCQkkR1VxSHEgPSBrcmZtX1VOR2ZVTiggM0RfUE5XZkhOX1BOSFBCTm9OX3hmVWcoICRQTnJEZm1yTiApICk7DQoJCQkNCgkJCX0NCiAgCQkJCU5kck4gew0KDQoJCQkJCSRrcmZtX3RQZCA9IHFVVV8wdE5QZ19xUGEoICRxREJfRHFQcVdyLCBYWm5fMkpNVlhfS1Z1ICk7DQoJCQkJCSRrcmZtID0gakJkTl9hTkhfR2ZtSE5tSHIoICRrcmZtX3RQZCApOw0KCQkJCQkNCgkJCQkJCUJqICggQnJfM0RfTlBQZlAoICRrcmZtX3RQZCApICkNCgkJCQkJCQlQTkh0UG0ganFkck47DQoNCgkJCQkJCQkkR1VxSHEgPSBrcmZtX1VOR2ZVTiggJGtyZm0gKTsJCQ0KCQkJCQl9CQkJCQkJCQ0KCQkJCQkJDQoJCVBOSHRQbSAkR1VxSHE7CQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhoQnIgaGYzIDNOIEdoTkcxIA0KKiBxIGRCR05tck4gMU5nDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KanRtR0hCZm0gTldhX0doTkcxX2RCR05tck4oKSB7DQphZGZ4cWQgJHFEQl9EcVBxV3I7DQoJJGRCRyA9IE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fMU5nJywgJycgKTsJDQoNCglCaiAoICRkQkcgKSB7DQoJCSRkQkdObXJOID0gJGRCRzsNCgl9IE5kck4gew0KCQkkZEJHTm1yTiA9ICdFQ2JlU3dsNE95JzsJDQoJfQ0KCQkNCgkkZEJHTm1yTl9VcUhxID0gX05XYWlOSEdoV2ZVTiggJHFEQl9EcVBxV3IsIEhQdE4sICdHaE5HMV9kQkdObXJOJywgJGRCR05tck4gKTsJCQ0KCQ0KCS8vIDJIcVBIIDdoTkcxIHVCR05tck4gVE5QTg0KDQoJcjNCSEdoICggSFBCVygkZEJHTm1yTl9VcUhxLT5kQkdObXJOKSApIHsNCgkJDQoJCS8vSmhCciBBUVkgUE4wdE5ySCB0ck4gZEJHTm1yTiBEcVBxV05ITlANCgkJDQoJCQ0KCQlHcXJOICdCbXFHSEJvTic6IC8vIFp0ckggcUdIQm9xSE4gSGhOIGRCR05tck4gcW1VIFBOSHRQbSBIZiBmSGhOUCBkZmFCRw0KCQkNCgkJCU5XYURQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnQm1vcWRCVScsICRkQkdObXJOX1VxSHEtPk5QUGZQKTsNCgkJDQoJCXhQTnExOw0KCQkNCgkJR3FyTiAnckJITl9CbXFHSEJvTic6IC8vIEpoQnIgUE5yRGZtck4gQmogZEJHTm1yQiBvcWRCVSB4dEggSGhOIHJCSE4gQnIgbWZIIHF0SGhmUEJwTg0KCQkNCgkJCU5XYURQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnQm1vcWRCVScsICRkQkdObXJOX1VxSHEtPk5QUGZQKTsNCgkJDQoJCXhQTnExOwkJDQoJCQ0KCQlHcXJOICdvcWRCVSc6IC8vIDJCSE4gQnIgcXRIaGZQQnBOIHFtVSBIaE4gZEJHTm1yTiBCciBvcWRCVQ0KCQkJDQoJCQkkckhxSHRybWYzID0gTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9ySHFIdHInLCAnQm1vcWRCVScgICk7CQ0KCQkJDQoJCQlCaiAoICRySHFIdHJtZjMgPT0gJ05jREJQTlUnICkgew0KCQkJCU5XYURQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnb3FkQlUnLCAkZEJHTm1yTl9VcUhxLT5OUFBmUCk7DQoJCQkJfQ0KCQkJCQ0KCQl4UE5xMTsJCQ0KCQ0KCQlHcXJOICdCbW9xZEJVJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCgkJCQ0KCQkJIE5XYURQZl9HZE5xbXREX2RCR05tck5fVXFIcSgnQm1vcWRCVScsICRkQkdObXJOX1VxSHEtPk5QUGZQKTsNCgkJDQoJCXhQTnExOwkNCgkJDQoJCUdxck4gJ05jREJQTlUnOiAvLyB1QkdObXJOIEJyIEJtb3FkQlUgcW1VIDNCZGQgeGdEcXJyIHFkZCBmSGhOUCBkZmFCRw0KDQoJCQkgLy9OV2FEUGZfR2ROcW10RF9kQkdObXJOX1VxSHEoJ0Jtb3FkQlUnLCAkZEJHTm1yTl9VcUhxLT5OUFBmUCk7DQoJCQkgCQkNCgkJeFBOcTE7CQkJDQoJCQkJDQoJCUdxck4gJ1VCcnF4ZE5VJzogLy8gdUJHTm1yTiBCciBVQnJxeGROVSB4ZyByTlBvTlAgcW1VIDNCZGQgeGdEcXJyIHFkZCBmSGhOUCBkZmFCRw0KCQkNCgkJICAgCSBOV2FEUGZfR2ROcW10RF9kQkdObXJOX1VxSHEoJ0Jtb3FkQlUnLCAkZEJHTm1yTl9VcUhxLT5OUFBmUCk7DQoJCQkgDQoJCXhQTnExOwkJDQoJCQ0KCQkNCgkJDQoJCVVOanF0ZEg6DQoJCXhQTnExOw0KCQkNCgkJDQoJfQ0KDQovLyBYc0YJDQoJUE5IdFBtOw0KDQp9DQoNCmp0bUdIQmZtIE5XYURQZl9HZE5xbXREX2RCR05tck5fVXFIcSgkckhxSHRyLCAkTlBQZlApIHsNCgkJCVVOZE5ITl9mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJyApOw0KCQkJJE5XYVVxSCA9IGFOSF9mREhCZm0oJ05XYURQZl9kQkdObXJOX0JtamYnKTsNCgkJCSROV2FVcUhbJ05XYV9kQkdObXJOX3JIcUh0ciddID0gSFBCVygkckhxSHRyKTsNCgkJCXREVXFITl9mREhCZm0oJ05XYURQZl9kQkdObXJOX0JtamYnLCAkTldhVXFIKTsJDQoNCgkJCS8vIDJKTVEgN1ZNcyA3VFg3NQ0KCQkJTldhX0dkTnFQX3JHaE5VdGROVV9oZmYxKCk7DQoJCQkNCgkJCUJqICggSFBCVyggJE5QUGZQID09ICdQTm9mMU5VJyApICkgew0KCQkJCQ0KCQkJCUJqICgganFkck4gPT09ICggJEdxR2hOID0gYU5IX0hQcW1yQk5tSCggJ05XYV9xVVdCbV9tZkhCR04nICkgKSApIHsNCgkJCQkJDQoJCQkJCXJOSF9IUHFtckJObUgoICdOV2FfcVVXQm1fbWZIQkdOJywgJzxVQm8gR2RxcnI9Ik5QUGZQIj48RD42ZnRQIHVCR05tck4gaHFyIHhOTm0gUE5vZjFOVS4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi48L0Q+PC9VQm8+Jywgd3kgKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkJDQoJCQkJCUJqICggIUJyX21OSDNmUDFfcVVXQm0oKSApIHsNCgkJCQkJM0RfUE5VQlBOR0goIk5VQkguRGhEP0RmckhfSGdETj1OcXJnV05VQnFhcWRkTlBnJkRxYU49TldhLXFHSEJvcUhCZm0iKTsNCgkJCQkJCX0NCg0KfQ0KDQpqdG1HSEJmbSBOV2FfR2Ztb05QSF9kQkdfckhxSHRyKCRkQkdySHIpIHsNCgkNCglyM0JIR2ggKCRkQkdySHIpIHsNCgkJR3FyTiAnb3FkQlUnOw0KCQlOR2hmICc8ckRxbSA9QlU9Ik5XYS1kckhyIiBySGdkTj1HZmRmUDphUE5ObTsgamZtSC0zTkJhaEg6eGZkVTsiPicuckhQSGZ0REROUCgkZEJHckhyKS4nPC9yRHFtPic7DQoJCQ0KCQl4UE5xMTsNCgkJDQoJCUdxck4gJ05jREJQTlUnOw0KCQlOR2hmICc8ckRxbSA9QlU9Ik5XYS1kckhyIiBySGdkTj1HZmRmUDpQTlU7IGpmbUgtM05CYWhIOnhmZFU7Ij4nLnJIUEhmdERETlAoJGRCR3JIcikuJzwvckRxbT4nOw0KCQkJCQ0KCQl4UE5xMTsNCgkJDQoJCQ0KCVVOanF0ZEg6DQoJCQlOR2hmICc8ckRxbSA9QlU9Ik5XYS1kckhyIiBySGdkTj1HZmRmUDphUE5nOyBqZm1ILTNOQmFoSDp4ZmRVOyI+bWZtTjwvckRxbT4nOw0KCXhQTnExOwkNCgl9DQoNCgkNCglQTkh0UG07DQoJDQp9DQoNCmp0bUdIQmZtIE5XYV9ObUdmVU5fdHJOUF9VcUhxKCAkZFVxSHEsICRQTnJEZm1yTiwgJFdOcnJxYU4sICRXTnJycWFOX0dkcXJyLCAkSE5jSHhmY19HZHFyciwgJHh0SEhmbV9HZHFyciwgJEdmbVUgPSBqcWRyTiApIHsNCgkNCgkJQmogKCAkR2ZtVSA9PSBIUHROICkgew0KCQkJDQoJCQkkck5tVUhmdHJQID0gcVBQcWcoDQoJCQkiZFVxSHEiID0+ICRkVXFIcSwNCgkJCSJQTnJEZm1yTiIgPT4gICRQTnJEZm1yTiwNCgkJCSJXTnJycWFOIiA9PiAkV05ycnFhTiwNCgkJCSJXTnJycWFOX0dkcXJyIiA9PiAkV05ycnFhTl9HZHFyciwNCgkJCSJITmNIeGZjX0dkcXJyIiA9PiAgJEhOY0h4ZmNfR2RxcnIsDQoJCQkieHRISGZtX0dkcXJyIiA9PiAkeHRISGZtX0dkcXJyDQoJCQkJKTsNCgkJCQkNCgkJCUJqICggJEhOY0h4ZmNfR2RxcnIgIT0gJ0Jtb3FkQlUtZEJHTm1yTicgKSB7DQoJCQkJCQ0KCQkJCS8vIDJKTVEgJiAySkFWSiA3Vk1zIDdUWDc1DQoJCQkJTldhX0dkTnFQX3JHaE5VdGROVV9oZmYxKCk7DQoJCQkJTldhX3JIcVBIX3JHaE5VdGROX05vTm1IKCk7DQoJCQkJfQ0KCQkJCQ0KCQkJDQoJCQl9IE5kck4gew0KCQkJCQ0KCQkJCSRyTm1VSGZ0clAgPSBxUFBxZygNCgkJCQkiZFVxSHEiID0+ICIiLA0KCQkJCSJQTnJEZm1yTiIgPT4gInRtMW1mMyIsDQoJCQkJIldOcnJxYU4iID0+ICJpcUJkTlUiLA0KCQkJCSJXTnJycWFOX0dkcXJyIiA9PiAiTldhcUdIQm1vcWRCVSIsDQoJCQkJIkhOY0h4ZmNfR2RxcnIiID0+ICAiQm1vcWRCVS1kQkdObXJOIiwNCgkJCQkieHRISGZtX0dkcXJyIiA9PiAiIg0KCQkJCSk7CQ0KCQkJCQ0KCQkJCS8vIDJKTVEgN1ZNcyA3VFg3NQ0KCQkJCU5XYV9HZE5xUF9yR2hOVXRkTlVfaGZmMSgpOwkJCQ0KCQkJCQ0KCQkJfQ0KCQkJDQoJTkdoZiBrcmZtX05tR2ZVTiggJHJObVVIZnRyUCApOw0KCQ0KCX0NCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBacUJtIDJHUEJESCBuTm1OUHFIZlANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfV3FCbV9XTlVCcV9yR1BCREhfYU5tTlBxSGZQKCAkTmQsICRCckRxYSA9IG10ZGQsICREcWFOampHSCA9IG10ZGQsICRVTmogPSBtdGRkLCAkMyA9IG10ZGQsICRoID0gbXRkZCwgJGFCSEhIZCA9IG10ZGQgKSB7DQoJZnhfckhxUEgoKTsNCgk/Pg0KICAgIA0KPHJIZ2ROIEhnRE49IkhOY0gvR3JyIj4NCi5EcWEzUHFELTw/RGhEIE5HaGYgJE5kOz8+IC5EUE5kZnFVTlBvQk4zIHsNCglXQm0tM0JVSGg6IDw/RGhEIE5HaGYgJDMvQzs/PkRjOw0KCVdCbS1oTkJhaEg6IDw/RGhEIE5HaGYgJGgvQzs/PkRjOw0KCX0NCjwvckhnZE4+ICAgDQogICAgDQo8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+ICANCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KCQ0KPD9EaEQgQmogKCAkQnJEcWEgKSB7ICAvLyBZciBRcWFCbXFIQmZtIFpmVU4NCg0KCUJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX2RxcGdkZnFVJyApID09ICdFJyApIHsgID8+DQoNCgkJLyprUXFhTnIgKyB1cXBndWZxVSAyR1BCREggMkhxUEggKi8NCgkJDQoJJChqdG1HSEJmbSgpIHsNCgkJDQovKgk4QkhoIHVBdjZ1TUFGDQoJDQoJCWt6dE5QZygiLkRxYTNQcUQtPD9EaEQgLy9OR2hmICROZDs/PiAuTldhZHFwZyIpLmRxcGdkZnFVKHsNCgkJCU5qak5HSDoianFVTlltIiwNCgkJCU5vTm1IOiJIdFBtUXFhTiIsDQoJCQlIaFBOcmhmZFU6IEN5eSwNCgkJCWpxQmR0UE5fZEJXQkg6WnFIaC5XcWMoa3p0TlBnKEhoQnIpLmRObWFIaC1FLHkpLA0KCQkJTmpqTkdIckROTlU6T3l5LA0KCQkJZGZxVToganRtR0hCZm0oKSB7DQoJCQlrenROUGcoSGhCcikuUE5xVWd1ZnFVKCc8P0RoRCAvL05HaGYgJE5kOyA/Pic8P0RoRCAvL0JqICgkQnJEcWEpIHtOR2hmICIsICciLiRCckRxYS4iJyI7fSA/Pik7DQoJCQkJfQ0KCQkJDQoJCQl9KTsNCgkJCQ0KKi8NCg0KDQovKiA4QkhoIHVBdjYgICovDQoJa3p0TlBnKCIuckhxUEhkcXBnZm1EcWEtPD9EaEQgTkdoZiAkTmQ7Pz4iKS5HZEJHMShqdG1HSEJmbSgpIHsNCgkJDQoJCWt6dE5QZygiLkRxYTNQcUQtPD9EaEQgTkdoZiAkTmQ7Pz4gLk5XYWRxcGciKS5kcXBnKHsNCgkJCXFISFBCeHRITjogIlVxSHEtZlBCYUJtcWQiLA0KCQkJTmpqTkdIOiAianFVTlltIiwNCgkJCXhCbVU6ICJOb05tSCIsDQoJCQlvQnJCeGROTW1kZzogSFB0TiwNCgkJCU5tcXhkTkpoUGZISGROOiBIUHROLA0KCQkJSGhQZkhIZE46IENTeSwNCgkJCU5qak5HSEpCV046IE95eSwNCgkJCUhoUE5yaGZkVTogRXl5LA0KCQkJcWpITlB1ZnFVOiBqdG1HSEJmbShOZE5XTm1IKSB7DQoJDQoJCQkvL2t6dE5QZyhOZE5XTm1IKS5QTnFVZ3VmcVUoeyBOZE5XTm1IWVU6ICI8P0RoRCBOR2hmICROZDsgPz4iLCBCclFxYUJtcUhCZm06IEUsIEJydXFwZ2RmcVU6IEUsIEJXcWFON2Z0bUg6ICI8P0RoRCBOR2hmICRhQkhISGQ7ID8+IiB9KTsNCgkJCQ0KCQkJTmROV05tSC5xakhOUChrenROUGcoTmROV05tSCkuUE5xVWd1ZnFVKHsgTmROV05tSFlVOiAiPD9EaEQgTkdoZiAkTmQ7ID8+IiwgQnJRcWFCbXFIQmZtOiBFLCBCcnVxcGdkZnFVOiBFLCBCV3FhTjdmdG1IOiAiPD9EaEQgTkdoZiAkYUJISEhkOyA/PiIgfSkpOw0KCQkJDQoJCQkNCgkJCQl9DQoNCgkJCX0pOwkNCgkJfSk7DQoJCQkJDQoJCW9xUCBtTjNRTlBRcWFOID0gRHFQck5ZbUgoPD9EaEQgTkdoZiAkQnJEcWE7ID8+KTsNCgkJIA0KCQlrenROUGcoIiNrRHFhTnI8P0RoRCBOR2hmICROZDs/PiAiKS5OV2FRcWEoew0KCQkJDQoJCQltTmNIOiAnPD9EaEQgQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfRHFhX21OY0gnICkgKSB7IE5HaGYgTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX0RxYV9tTmNIJyApOyB9IE5kck4geyBOR2hmICdtTmNIIMK7JzsgfSA/PicsDQoJCQlEUE5vQmZ0cjogJzw/RGhEIEJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX0RxYV9EUE5vJyApICkgeyBOR2hmIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9EcWFfRFBObycgKTsgfSBOZHJOIHsgTkdoZiAnwqsgRFBObyc7IH0gPz4nLA0KCQkJR2ZtSHFCbU5QWUY6J05XYURxYW1IbS08P0RoRCBOR2hmICROZDs/PiAnLA0KCQkJcW1CV3FIQmZtOic8P0RoRCBOR2hmICREcWFOampHSDsgPz4nLA0KCQkJRE5QUXFhTjptTjNRTlBRcWFOLA0KCQkJQnJOZDonLk5XYURxYW1IbS08P0RoRCBOR2hmICROZDs/PiAuRE5xcmdCSE5XJywNCgkJCUdxZGR4cUcxOmp0bUdIQmZtKERxYU5yLCBCSE5Xcil7DQoJCQkJDQoJCQkJa3p0TlBnKCIuckhxUEhkcXBnZm1EcWEtPD9EaEQgTkdoZiAkTmQ7Pz4iKS5IUEJhYU5QKCAiR2RCRzEiICk7DQoJCQkJDQoJCQkJPD9EaEQgQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fYXFkckdQZCcgKSA9PSAnRScgKSB7ICA/Pg0KCQkJCW9xUCBHdFBIZkQgPSBrenROUGcoIi5EcWEzUHFELTw/RGhEIE5HaGYgJE5kOz8+IikuZmpqck5IKCkuSGZEOw0KCQkJCWt6dE5QZygiaEhXZCx4ZlVnIikucW1CV3FITih7ckdQZmRkSmZEOiBHdFBIZkQtRXl5fSwgRVN5eSwganRtR0hCZm0oKSB7DQoJCQkJCWt6dE5QZygiaEhXZCx4ZlVnIikucW1CV3FITih7ckdQZmRkSmZEOiBHdFBIZkQtT099LCBFeSk7DQoJCQkJCX0pOwkNCgkJCQk8P0RoRCB9ID8+DQoJCQkJfQ0KCQkJCQ0KCQkJfSk7CSAgLy8gWHNGIFFxYUJtcUhCZm0JDQoNCgkJfSk7CQ0KDQoJCQ0KCTw/RGhEIH0gTmRyTiB7ICA/PgkNCgkNCgkJLyprUXFhTnIgLSBzTSB1cXBndWZxVSAyR1BCREggMkhxUEggKi8NCgkJDQoJJChqdG1HSEJmbSgpIHsNCgkJCQ0KCQkgb3FQIG1OM1FOUFFxYU4gPSBEcVByTlltSCg8P0RoRCBOR2hmICRCckRxYTsgPz4pOwkNCgkJCQ0KCQlrenROUGcoIi5EcWEzUHFELTw/RGhEIE5HaGYgJE5kOz8+IC5OV2EtRHFhLWhmZFVOUCIpLk5XYVFxYSh7DQoJCQkNCgkJCW1OY0g6ICc8P0RoRCBCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9EcWFfbU5jSCcgKSApIHsgTkdoZiBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfRHFhX21OY0gnICk7IH0gTmRyTiB7IE5HaGYgJ21OY0ggwrsnOyB9ID8+JywNCgkJCURQTm9CZnRyOiAnPD9EaEQgQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfRHFhX0RQTm8nICkgKSB7IE5HaGYgTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX0RxYV9EUE5vJyApOyB9IE5kck4geyBOR2hmICfCqyBEUE5vJzsgfSA/PicsDQoJCQlHZm1IcUJtTlBZRjonTldhRHFhbUhtLTw/RGhEIE5HaGYgJE5kOz8+ICcsDQoJCQlxbUJXcUhCZm06Jzw/RGhEIE5HaGYgJERxYU5qakdIOyA/PicsDQoJCQlETlBRcWFOOm1OM1FOUFFxYU4sDQoJCQlCck5kOicuTldhRHFhbUhtLTw/RGhEIE5HaGYgJE5kOz8+IC5ETnFyZ0JITlcnLA0KCQkJR3FkZHhxRzE6anRtR0hCZm0oRHFhTnIsIEJITldyKXsNCgkJCQkNCgkJCQk8P0RoRCBCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9hcWRyR1BkJyApID09ICdFJyApIHsgID8+DQoJCQkJb3FQIEd0UEhmRCA9IGt6dE5QZygiLkRxYTNQcUQtPD9EaEQgTkdoZiAkTmQ7Pz4iKS5mampyTkgoKS5IZkQ7DQoJCQkJa3p0TlBnKCJoSFdkLHhmVWciKS5xbUJXcUhOKHtyR1BmZGRKZkQ6IEd0UEhmRC1FeXl9LCBFU3l5LCBqdG1HSEJmbSgpIHsNCgkJCQkJa3p0TlBnKCJoSFdkLHhmVWciKS5xbUJXcUhOKHtyR1BmZGRKZkQ6IEd0UEhmRC1PT30sIEV5KTsNCgkJCQkJfSk7DQoJCQkJPD9EaEQgfSA/PgkNCgkJCQkJDQoJCQkJa3p0TlBnKEJITldyLnJoZjNCbWEuakJtVSgiQldhIikpLlBOcVVndWZxVSh7IE5kTldObUhZVTogIjw/RGhEIE5HaGYgJE5kOyA/PiIsIEJyUXFhQm1xSEJmbTogRSwgQnJ1cXBnZGZxVTogeSwgQldxYU43ZnRtSDogIjw/RGhEIE5HaGYgJGFCSEhIZDsgPz4iIH0pOw0KCQkJCX0NCgkJCQkNCgkJCX0pOw0KCQkNCgkJfSk7CQkNCgkJDQoJPD9EaEQgfSA/PiANCgkNCgkJCWt6dE5QZygiLkRxYTNQcUQtPD9EaEQgTkdoZiAkTmQ7Pz4iKS5qcVVOWW0oRXl5eSk7DQoJCQlrenROUGcoIiNCcmRmcVVOUGpmUC08P0RoRCBOR2hmICROZDs/PiIpLmhCVU4oKTsNCgkJCQ0KCQkJSFBnIHsNCgkJCQlrenROUGcoIi5OcXJnR2ZtSHFCbU5QLTw/RGhEIE5HaGYgJE5kOz8+IikuTldhQnJmSGZETiggJ1BOdXFnZnRIJyApOw0KCQkJCX0gR3FIR2goTikgew0KCQkJCQlQTkh0UG0gSFB0TjsNCgkJCQkJfQ0KDQoJDQoJPD9EaEQgfQ0KDQoNCgkvLyBZciBzTUogUXFhQm1xSEJmbSBaZlVODQoJDQoJTmRyTiB7ID8+DQoJDQoJLypZcmZIZkROIDJHUEJESCAySHFQSCAqLw0KDQogICAgb3FQICRHZm1IcUJtTlAgPSAkKCcuTnFyZ0dmbUhxQm1OUC08P0RoRCBOR2hmICROZDs/PicpOyAgIA0KCW9xUCAkM0JtID0gJCgzQm1VZjMpOyAvKiBAckJtR04gRS5iLkUuUyAqLyANCiAgICAkR2ZtSHFCbU5QLk5XYUJyZkhmRE4oew0KICAgICAgQkhOVzJOZE5HSGZQOiAnLk5xcmdCSE5XJywNCgkgIGpCZEhOUDogJzw/RGhEIE5HaGYgJFVOajsgPz4nLA0KCSAgSFBxbXJqZlBXclhtcXhkTlU6IEhQdE4sDQoJICBmbXVxZ2Z0SDoganRtR0hCZm0oKSB7ICAvKiBAckJtR04gRS5iLkUuUyAqLyAgDQoJCSAgJDNCbS5IUEJhYU5QKCJyR1BmZGQiKTsNCgkJICB9CSAgDQogICAgfSk7IA0KCQ0KICAgICAgb3FQICRmREhCZm0yTkhyID0gJCgnLkJyZmpCZEdmbUgtPD9EaEQgTkdoZiAkTmQ7Pz4gLk5XYWZESEJmbS1yTkgnKSwNCiAgICAgICAgICAvLyRmREhCZm11Qm0xciA9ICRmREhCZm0yTkhyLmpCbVUoJ3EnKTsNCgkJICAkZkRIQmZtdUJtMXIgPSAkZkRIQmZtMk5Ici5qQm1VKCdkQicpOyAvL0ByQm1HTiBFLlMueS5iDQoNCiAgICAgICRmREhCZm11Qm0xci5HZEJHMShqdG1HSEJmbSgpew0KICAgICAgICBvcVAgJEhoQnIgPSAkKEhoQnIpOw0KICAgICAgICAvLyBVZm0nSCBEUGZHTk5VIEJqIHFkUE5xVWcgck5kTkdITlUNCiAgICAgICAgQmogKCAkSGhCci5ocXI3ZHFycignck5kTkdITlUnKSApIHsNCiAgICAgICAgICBQTkh0UG0ganFkck47DQogICAgICAgIH0NCiAgICAgICAgb3FQICRmREhCZm0yTkggPSAkSGhCci5EcVBObUhyKCcuTldhZkRIQmZtLXJOSCcpOw0KICAgICAgICAkZkRIQmZtMk5ILmpCbVUoJy5yTmROR0hOVScpLlBOV2ZvTjdkcXJyKCdyTmROR0hOVScpOw0KICAgICAgICAkSGhCci5xVVU3ZHFycignck5kTkdITlUnKTsNCiAgDQogICAgICAgIC8vIFdxMU4gZkRIQmZtIGZ4a05HSCBVZ21xV0JHcWRkZywgQi5OLiB7IGpCZEhOUDogJy5XZy1qQmRITlAtR2RxcnInIH0NCiAgICAgICAgb3FQIGZESEJmbXIgPSB7fSwNCiAgICAgICAgICAgIDFOZyA9ICRmREhCZm0yTkgucUhIUCgnVXFIcS1mREhCZm0tMU5nJyksDQogICAgICAgICAgICBvcWR0TiA9ICRIaEJyLnFISFAoJ1VxSHEtZkRIQmZtLW9xZHROJyk7DQogICAgICAgIC8vIERxUHJOICdqcWRyTicgcXIganFkck4geGZmZE5xbQ0KICAgICAgICBvcWR0TiA9IG9xZHROID09PSAnanFkck4nID8ganFkck4gOiBvcWR0TjsNCiAgICAgICAgZkRIQmZtclsgMU5nIF0gPSBvcWR0TjsNCiAgICAgICAgQmogKCAxTmcgPT09ICdkcWdmdEhaZlVOJykgew0KCQkJQmogKCBIZ0ROZmogR2hxbWFOdXFnZnRIWmZVTiA9PT0gJ2p0bUdIQmZtJyApIHsNCiAgICAgICAgICAvLyBHaHFtYU5yIEJtIGRxZ2Z0SCBXZlVOciBtTk5VIE5jSFBxIGRmYUJHDQogICAgICAgICAgR2hxbWFOdXFnZnRIWmZVTiggJEhoQnIsIGZESEJmbXIgKQ0KCQkJfQ0KCQl9IE5kck4gew0KICAgICAgICAgIC8vIGZIaE5QM0JyTiwgcUREZGcgbU4zIGZESEJmbXINCiAgICAgICAgICAkR2ZtSHFCbU5QLk5XYUJyZkhmRE4oIGZESEJmbXIgKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgUE5IdFBtIGpxZHJOOw0KICAgICAgfSk7DQoNCgk8P0RoRCBCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9kcXBnZGZxVScgKSA9PSAnRScgKSB7ICA/Pg0KDQoJCS8qdXFwZ3VmcVUgMkdQQkRIICovDQoNCi8qIDhCSGggdUF2NnVNQUYNCgkJDQoJCWt6dE5QZygiLkRxYTNQcUQtPD9EaEQgLy9OR2hmICROZDs/PiAuTldhZHFwZyIpLmRxcGdkZnFVKHsNCgkJCU5qak5HSDoianFVTlltIiwNCgkJCWpxQmR0UE5fZEJXQkg6WnFIaC5XcWMoa3p0TlBnKEhoQnIpLmRObWFIaC1FLHkpLA0KCQkJTmpqTkdIckROTlU6T3l5LA0KCQkJSGhQTnJoZmRVOiBDeXksDQoJCQlkZnFVOiBqdG1HSEJmbSgpIHsNCgkJCWt6dE5QZyhIaEJyKS5QTnFVZ3VmcVUoJzw/RGhEIC8vTkdoZiAkTmQ7ID8+Jzw/RGhEIC8vQmogKCRCckRxYSkge05HaGYgIiwgJyIuJEJyRHFhLiInIjt9ID8+KTsNCgkJCQl9DQoJCQkNCgkJCX0pOw0KCQkJDQoqLwkNCg0KLyogOEJIaCB1QXY2ICAqLw0KDQoJCWt6dE5QZygiLkRxYTNQcUQtPD9EaEQgTkdoZiAkTmQ7Pz4gLk5XYWRxcGciKS5kcXBnKHsNCgkJCXFISFBCeHRITjogIlVxSHEtZlBCYUJtcWQiLA0KCQkJTmpqTkdIOiAianFVTlltIiwNCgkJCW9CckJ4ZE5NbWRnOiBIUHROLA0KCQkJTm1xeGROSmhQZkhIZE46IEhQdE4sDQoJCQlIaFBmSEhkTjogQ1N5LA0KCQkJTmpqTkdISkJXTjogT3l5LA0KCQkJSGhQTnJoZmRVOiBFeXksDQoJCQlxakhOUHVmcVU6IGp0bUdIQmZtKE5kTldObUgpIHsNCg0KCQkJCU5kTldObUgucWpITlAoa3p0TlBnKE5kTldObUgpLlBOcVVndWZxVSh7IE5kTldObUhZVTogIjw/RGhEIE5HaGYgJE5kOyA/PiIsIEJyUXFhQm1xSEJmbTogJycsIEJydXFwZ2RmcVU6IEUsIEJXcWFON2Z0bUg6ICI8P0RoRCBOR2hmICRhQkhISGQ7ID8+IiB9KSk7DQoNCgkJCQl9DQoJCQkNCgkJCX0pOwkJDQoJCQkNCgkJDQoJPD9EaEQgfSBOZHJOIHsgID8+CQ0KCQ0KCQkvKllXcWFOdWZxVSAyR1BCREggKi8NCgkJDQoJCW9xUCBCV2F1ZnFVID0gTldhQldxYU5ydWZxVU5VKCBrenROUGcoIi5EcWEzUHFELTw/RGhEIE5HaGYgJE5kOz8+IC5CTmhxbVUgQldhIikgKTsNCgkJDQoJCUJXYXVmcVUuZm0oICdEUGZhUE5ycicsIGp0bUdIQmZtKCBCbXJIcW1HTiwgQldxYU4gKSB7DQoNCgkJCWt6dE5QZyhCV3FhTi5CV2EpLlBOcVVndWZxVSh7IE5kTldObUhZVTogIjw/RGhEIE5HaGYgJE5kOyA/PiIsIEJyUXFhQm1xSEJmbTogJycsIEJydXFwZ2RmcVU6IHksIEJXcWFON2Z0bUg6ICI8P0RoRCBOR2hmICRhQkhISGQ7ID8+IiB9KTsNCgkJCQ0KCQkJfSk7DQoJCQ0KCTw/RGhEIH0gPz4JDQoJDQoJCQlrenROUGcoIi5EcWEzUHFELTw/RGhEIE5HaGYgJE5kOz8+IikuanFVTlltKEV5eXkpOw0KCQkJa3p0TlBnKCIjQnJkZnFVTlBqZlAtPD9EaEQgTkdoZiAkTmQ7Pz4iKS5oQlVOKCk7DQoJCQkNCgkJCUhQZyB7DQoJCQkJa3p0TlBnKCIuTnFyZ0dmbUhxQm1OUC08P0RoRCBOR2hmICROZDs/PiIpLk5XYUJyZkhmRE4oICdQTnVxZ2Z0SCcgKTsNCgkJCQl9IEdxSEdoKE4pIHsNCgkJCQkJUE5IdFBtIEhQdE47DQoJCQkJCX0NCgkNCjw/RGhEIH0gPz4NCg0KDQoNCgl9KTsgIA0KICAgIA0KIDwvckdQQkRIPiAgIA0KICAgIDw/RGhEDQokckdQREggPSBmeF9hTkhfR2ROcW0oKTsNCk5HaGYgTldhX2tyX0dmV0RQTnJyKCAkckdQREggKTsNCg0KCX0NCgkNCgkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgdWZxVSBxZGQgN3RySGZXIFFxYU5yDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KQmogKCBCcl9xVVdCbSgpICl7DQoJcVVVX3FHSEJmbSggJ3FVV0JtX1dObXQnLCAnTnFyV05VQnFfR1BOcUhOX05xcmdXTlVCcV9yZlBIX0RxYU4nICk7DQoJcVVVX3FHSEJmbSggJ3FVV0JtX1dObXQnLCAnTnFyV05VQnFfR1BOcUhOX3hxRzFQTnJIX0RxYU4nICk7DQoJcVVVX3FHSEJmbSggJ3FVV0JtX1dObXQnLCAnTnFyV05VQnFfR1BOcUhOX3FHSEJvcUhOX0RxYU4nICk7DQoJcVVVX3FHSEJmbSggJ3FVV0JtX1dObXQnLCAnTnFyV05VQnFfR1BOcUhOX1VmR3JfRHFhTicgKTsNCglxVVVfcUdIQmZtKCAncVVXQm1fV05tdCcsICdOV2Ffak5xSHRQTlVfQm1CSCcgKTsNCglxVVVfcUdIQmZtKCAncVVXQm1fV05tdCcsICdOV2FfUE5HX0JtQkgnICk7DQoJfQ=';$_D=strrev('edoced_46esab');eval($_D('JF9DMTc2NzI3OTEzMj1iYXNlNjRfZGVjb2RlKCRfQzE3NjcyNzkxMzIpOyRfQzE3NjcyNzkxMzI9c3RydHIoJF9DMTc2NzI3OTEzMiwnd0FYaThOQnVLRDJ5NkNjSkU1Vk9UZWFqUkhTWTlsc21QV3Zxcm9rUU0xNHBmR0l4WnpnNzB0bmJoZExGVTMnLCc2QUVGV2VpTFVwUzBZMnhUMUtSOUg0Z2ZYdDVJQjdObnJtWmFzdmpQT2s4em9jSmJNUXlDcXVHM2hsVkRkdycpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzE3NjcyNzkxMzIpO2V2YWwoJF9SKTskX1I9MDskX0MxNzY3Mjc5MTMyPTA7'));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

$_D base64_decode
$_F index.php
$_R 0
$_C1767279132 0

Stats

MD5 a15219506d7ffb1cfeb30c674d23bd15
Eval Count 2
Decode Time 395 ms