| 
				
			 | 
			
			 | 
			@@ -1,116 +1,475 @@ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// // -------------------------------------------- | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// // Cscript | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var console = { log : function(m) {WScript.Echo(m)}, error : function(m) {WScript.Echo(m)}  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   , dir : function(o) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     for(var i in o){ console.log(i + ' : ' + o[i])} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var wait = function(cb, ms) { WScript.Sleep(ms); cb() } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var fso = new ActiveXObject('Scripting.FileSystemObject'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var shell = new ActiveXObject('shell.application');  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var existsSync = function(filepath){ return fso.FileExists(filepath) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var fs = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   writeFileSync : function(filepath, text) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     console.log(filepath)     | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     var fh = fso.CreateTextFile(filepath, true);  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     fh.WriteLine(text);  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     fh.Close();  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   , mkdirSync : function(path) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     fso.CreateFolder(path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   , readFileSync : function(filepath){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     var objFileToRead = fso.OpenTextFile(filepath,1) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     var strFileText = objFileToRead.ReadAll() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     objFileToRead.Close()     | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   , unlinkSync : function(filepath){ fso.DeleteFile(filepath) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var runtimestamp = (new Date()).getTime(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function getVersion() { return BUILD_VERSION; } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			WScript.echo(getVersion()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var path = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   resolve : function(path){ return fso.GetAbsolutePathName(path) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     , dirname : function(filepath) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       var normalized = this.normalize(filepath) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       var li = normalized.lastIndexOf("\\") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       if( li > -1) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//         return normalized.substring(0, li) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     , normalize : function(path){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       return path.replace(/\//g,'\\'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var existsSyncFolder = function(path){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       return fso.FolderExists(path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// function nodeShellExec(cmd, cargs){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   var p = new Promise(function(resolve, reject){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     var runFile = selectedinstance.root + '\\' + stampedFilePfx(new Date()) + cmd + cargs + "out.txt"; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // console.log(runFile) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			     | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     shell.ShellExecute('cmd', '/c ' + cmd + ' ' + cargs + " > " + runFile , "", "", 1); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // var WshFinished = 1 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // var WshFailed = 2 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // var strOutput = 'Did not work' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // switch(shell.Status){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     //   case WshFinished :  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     //     strOutput = oShell.StdOut.ReadAll; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     //     break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     //   case WshFailed : | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     //     strOutput = oShell.StdErr.ReadAll; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     //     break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // WScript.Echo(strOutput) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var fso = new ActiveXObject('Scripting.FileSystemObject'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var shell = new ActiveXObject('shell.application');  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function forEach(eachFn){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  for(var i=0; i<this.length; i++) eachFn(this[i]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     while(!existsSync(runFile)) { wait(500, function(){}) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     var strFileText = fs.readFileSync(runFile) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     // console.log(strFileText) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     fs.unlinkSync(runFile) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     var result = { result : 'cmd /c ' + cmd + ' ' + cargs + " > " + runFile + ' exited with code ???', messages : [].push(strFileText), code : 0, success : true   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     console.log('resolving ' + result) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     resolve(result) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var __Promise = {}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var ovrrides = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   resolve : function(v){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     if(v && v.then) return v; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     var p = new Promise(function(resolve, reject){  resolve(v) }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var console = { log : function(m) {WScript.Echo(m)}, error : function(m) {WScript.Echo(m)} } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var Promise = function(fn){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			try{ __Promise = Promise } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			catch(e){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  // __Promise = ovrrides  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  // Detect error | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var state = Promise.PENDING; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var chain = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  chain.forEach = forEach; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function createPromiseClass(overrides) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  function reject(e){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(state !== Promise.PENDING) { console.error ('Error : Promise Rejection can only be called once')} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    console.error(e) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(p.state !== PromiseClass.PENDING) { console.error ('Error : Promise Rejection can only be called once')} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var __i = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var __e = e; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    do { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      for(var i = __i; i < p.chain.length; i++, __i = i) if(p.chain[i].isCatch) break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      try { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) { chain[i](__e); break; }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for(var i = __i; i < p.chain.length; i++, __i = i) if(p.chain[i].isCatch) { p.chain[i](__e); break; }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        __i++; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        __e = null; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      catch(e){ __e = e} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      catch(e){ __i++; __e = e} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } while(__e) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    do { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      try { for(var i = __i; i < chain.length; i++, __i = i) if(!chain[i].isCatch) { p.result = chain[i](p.result); } } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      try { for(var i = __i; i < p.chain.length; i++, __i = i) if(!p.chain[i].isCatch) { p.result = p.chain[i](p.result); } } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      catch(e){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        __i ++; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        do { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          try { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) { chain[i](__e); break; }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            for(var i = __i; i < p.chain.length; i++, __i = i) if(p.chain[i].isCatch) { p.chain[i](__e); break; }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            __i ++; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            __e = null; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          catch(e){ __e = e} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          catch(e){ __i++; __e = e} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } while(__e) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } while ( __i < chain.length ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    state = Promise.REJECTED; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } while ( __i < p.chain.length ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p.state = PromiseClass.REJECTED; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  function resolve(result){    | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(state !== Promise.PENDING) { console.error ('Error : Promise Rejection can only be called once')} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // console.log('main promise resolve... ' + chain.length ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // console.log(result + ' resolve was called ' + p.chain.length ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(p.state !== PromiseClass.PENDING) { console.error ('Error : Promise Resolve can only be called once')} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p.result = result; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(PromiseClass.resolve(p.result) === p.result) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      waitForResult(p.result, processchain.bind(p)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      // p.state = PromiseClass.FULFILLED; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return processchain.bind(p)(result) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  function processchain(r){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var __i = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    do { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      try { for(var i = __i; i < chain.length; i++, __i = i) if(!chain[i].isCatch) { p.result = chain[i](p.result); } } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      catch(e){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        var __e = e; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        do { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          try { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            for(var i = __i; i < chain.length; i++, __i = i) if(chain[i].isCatch) { chain[i](__e); break; }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            __e = null; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var i = __i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var __e = null; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    function __processchain(r){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      function waitForThen(p){   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(i < p.chain.length) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          if(!p.chain[i].isCatch) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            // console.log(i + ' Executing : then ' + p.result + ' ' + p.chain[i])   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            try { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              p.result = p.chain[i](p.result) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              if(PromiseClass.resolve(p.result) === p.result) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                waitForResult(p.result, function(r){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  p.result = r; i++; __i = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  waitForThen(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                i++; __i = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                waitForThen(p)                           | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            catch(e) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              i++; __i = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              __e = e; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              console.log('failed on index ' + __i + p.chain[__i-1] ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              console.dir(e) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              waitForCatch(p); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            // console.log(i + ' Skipping catch : ' + p.result + ' ' + p.chain[i])   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            i++; __i = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            waitForThen(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          catch(e){ __e = e} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } while(__e) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } while ( __i < chain.length ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    state = Promise.FULFILLED; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else return p.state = PromiseClass.FULFILLED; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      function waitForCatch(p) {   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(i < p.chain.length) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          if(p.chain[i].isCatch) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            console.log(i + ' Executing : catch : ' + p.result + ' ' + p.chain[i])  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            try { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              p.result = p.chain[i](__e); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var p = {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    then : function(thenfn){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      thenfn.isThen = true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      chain.push(thenfn) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              if(PromiseClass.resolve(p.result) === p.result) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                waitForResult(p.result, function(r){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  p.result = r; i++; __i = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                waitForThen(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                p.result = r; i++; __i = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                waitForThen(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            catch(e){ i++; __i = i;; __e = e; waitForCatch(p) }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          }  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            i++; __i = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            waitForCatch(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else return p.state = PromiseClass.REJECTED | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      waitForThen(p); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    __processchain(r) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var create = function(fn){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      then : function(thenfn){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        thenfn.isThen = true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        p.chain.push(thenfn) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , pcatch : function(catchfn) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        catchfn.isCatch = true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        p.chain.push(catchfn) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , start : function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(this.started) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          console.error('Cannot start more than once...') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return p | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        this.started = true; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        this.fn = fn; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        try { fn(resolve.bind(p), reject.bind(p)) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        catch(e){ reject(e) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return p | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , state : PromiseClass.PENDING | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , chain : [] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , pcatch : function(catchfn) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      catchfn.isCatch = true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      chain.push(catchfn) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p.catch = p.pcatch | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p.chain.forEach = forEach; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var PromiseClass = function(fn){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = create(fn)     | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    setTimeout(p.start.bind(p), 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return p | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  PromiseClass.PENDING = 1 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  PromiseClass.FULFILLED = 2 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  PromiseClass.REJECTED = 3 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  PromiseClass.STARTED = 4 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  PromiseClass.isSETTLED = function(p){ p.state === PromiseClass.FULFILLED || p.state === PromiseClass.REJECTED } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  PromiseClass.resolve = function(v){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(v && v.then) return v; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = create(function(){}); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p.result = v; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    wait(0, function(){ processchain.bind(p)(v) }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  function waitForResult(p, cb){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(!p) return cb(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(p.state !== PromiseClass.PENDING) cb(p.result)  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(p.runFile && false) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      while(!existsSync(p.runFile) && p.state === PromiseClass.PENDING) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        console.log('Waiting for ResultFle'); wait(500, function(){})  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      cb(p.result) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , start : function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      try { fn(resolve, reject) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      catch(e){ reject(e) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      // while(p.state === PromiseClass.PENDING) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        // console.log('Waiting for Result') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        function waiter(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // console.log(p.result) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          if(p.state === PromiseClass.PENDING) wait(500, waiter); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          else return cb(p.result)             | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        wait(500, waiter) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      // } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return p | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Promise.all = function(arr){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  arr.forEach = forEach; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var results = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return new Promise(function(resolve, reject){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    arr.forEach(function(p){ results.push(waitForResult(p))} ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    resolve(results) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  PromiseClass.all = function(arr){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    arr.forEach = forEach; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var resultPs = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var results = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    console.log('All : ' + arr.length) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var pAll = new PromiseClass(function(resolve, reject){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      arr.forEach(function(p){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(!p.then) { var pfn = p; p = new PromiseClass(function(resolve, reject){ pfn() }) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // !p.start ? p.start = function(){return p} : null | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // p.start() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // .then( function(){ waitForResult(p, function(r){ results.push(r) })  }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        resultPs.push(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        // waitForResult(p, function(r){ results.push(r) }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      // PB : TODO -- This is the same as processchain!!! | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var allwaitr = function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        var allResolved = true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for(var rIdx =0; rIdx < resultPs.length; rIdx++ ){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			             | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          if(resultPs[rIdx]) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            allResolved = false | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            waitForResult(resultPs[rIdx], function(r){ results[rIdx] = r; resultPs[rIdx] = null; }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(allResolved) resolve(results); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else wait(500, allwaitr) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      wait(500, allwaitr) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			     | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // pAll.chain = arr; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return pAll | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  // PromiseClass.resolve = overrides.resolve; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  Promise = PromiseClass; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return PromiseClass; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			any = function(arr){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  arr.forEach = forEach; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var results = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return new Promise(function(resolve, reject){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    arr.forEach(function(p){ results.push(waitForResult(p))} ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    resolve(results) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			createPromiseClass(/*ovrrides*/) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// any = function(arr){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   arr.forEach = forEach; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   var results = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   console.log('Any : ' + arr.length) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   return new Promise(function(resolve, reject){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     arr.forEach(function(p){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       console.log('P is : ' + p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       if(!p.then) { var pfn = p; p = new Promise(function(resolve, reject){ try{ resolve(pfn()) } catch(e){reject(e) }  }).start() } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       else {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//         !p.start ? p.start = function(){return p} : null | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//         p.start() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       // results.push(waitForResult(p)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     } ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     resolve(results) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   }).start(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var any = function(iterable, continueOnFailure) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   var cancelsignal = Symbol() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   return iterable.reduce(  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       function(p, tasq, i ,a) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//           var handleError = function(err, pVal){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             if(err !== cancelsignal) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // Cancel only once on first failure. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               console.log('Failed : ' + err.message + ' ' + JSON.stringify(pVal)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               console.dir(p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               console.warn('Possible failure for task with result : ' + JSON.stringify(pVal)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               if(i>0 && a[i-1].info) console.dir(a[i-1].info) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               console.error('Error : ' + err.stack) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               console.error(a[i-1]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               a[i-1] ? console.log("tasq : " + a[i-1].toString()) : null; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               if(!continueOnFailure) {console.log("Cancelling remaining on any one failure ..."); throw cancelsignal} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               else return pVal; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // tasq ? console.log("tasq : " + tasq.toString()) : null; // Previous task is what failed not the one we are going to run. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//           } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//           if(Promise.resolve(p) === p ) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             if(i>0 && a[i-1].info) p.info = a[i-1].info; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             return p.then( function(pVal){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // Falsy values are no longer treated as task failure exceptions. Specially for Promises.  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // Even tasq function wrappers are required to return promises that eventually either resolve or reject.. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // Failures are known for promises on reject. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // In future if we support direct sync function execution with a result examination for failure  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // we could examine the result of the function as falsy's... or a result evaluator handler needs to be passed in...  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // if(!pVal) handleError({ error : true, message : 'Failed without result' }, pVal) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               // Truthy values are failures if obj has error=true. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               if(pVal && pVal.error) handleError(pVal, pVal) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               var trycall = function(tasq){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 try {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                   var result = tasq() // PB : TODO -- Handle scope for call  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                   if(tasq.resultHandler) return tasq.resultHandler(result) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                   // if(!result) throw result; // Default failure detection for functions is falsy values.  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                   return result  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 } catch (error) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                   console.error(error); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                   console.error('Error : ' + error ? error.stack : 'No stack') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                   if(!continueOnFailure) throw error; // PB : TODO -- Support array of results for any with or without continueonfailure. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               var handleNext = function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 console.log('Task finished with result : ' + JSON.stringify(pVal)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 if(i>0 && a[i-1].info) console.dir(a[i-1].info) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 if(!tasq && !continueOnFailure) { console.log('Error : No task specified.'); throw false;} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 else if(!tasq) { console.log('Error : No task specified.'); return false;} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 return (Promise.resolve(tasq) === tasq ) ? tasq : trycall(tasq) ; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               if(Promise.resolve(pVal) === pVal) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 // Passed in function retured a promise. We still need to wait for it. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 pVal.then(function(pVal){ return handleNext(); }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               else return handleNext() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             }).pcatch(function(error) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               if(error !== cancelsignal) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 console.log(`E3 : i = ${i} `); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 if(error.result) console.error(`error.result`) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 console.error('Error : ' + (error.message || error.messages)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 console.error('Error : ' + error.stack) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 tasq ? console.log("tasq : " + tasq.toString()) : null; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 console.log('debugData 3-------------------------'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 // handleError() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//                 throw error | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//               else throw cancelsignal; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             })   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//           } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//           else if(!p) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             handleError({ error : true, message : 'Failed without result' }, pVal) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             console.log("Bypass remaining on prior failure"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//             return false; // All remaining tasks will return false in the any results even if they are promisies still running or functions not initiated. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//           } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//           else return p; // A truthy value  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//       , Promise.resolve(true) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   ); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// -------------------------------------------- | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// -------------------------------------------- | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Node | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var wait = function(ms, cb) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return new __Promise(function(resolve){ setTimeout(resolve, ms) } ).then(function(){ cb() }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			const fs = require('fs') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			const { existsSync } = require('fs'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			const existsSyncFolder = existsSync | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			const path = require('path'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var cli = require('./cliverse') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var nodeShellExec = cli.nodeShellExec; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var utils = require('bbhverse'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var any = utils.any; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// -------------------------------------------- | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Promise.PENDING = 1 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Promise.FULFILLED = 2 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Promise.REJECTED = 3 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var callsheltask = function(args) { return function() { return nodeShellExec.apply(null, args) } } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var gitUser = 'guest'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var gitEmail = 'guest@bbh.org.in'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function waitForResult(p){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  while(p.state === Promise.PENDING) WScript.Sleep(500) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var runtimestamp = (new Date()).getTime(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function getVersion() { return BUILD_VERSION; } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			console.log(getVersion()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function forEach(eachFn){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  for(var i=0; i<this.length; i++) eachFn(this[i]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var stampedFilePfx = function(date) { | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -121,76 +480,14 @@ var stampedFilePfx = function(date) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  ('0' + date.getMinutes()).slice(-2) + | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  ('0' + date.getSeconds()).slice(-2); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function nodeShellExec(cmd, cargs){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var p = new Promise(function(resolve, reject){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var runFile = selectedinstance.root + '\\' + stampedFilePfx(new Date()) + cmd + cargs + "out.txt"; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // console.log(runFile) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    shell.ShellExecute('cmd', '/c ' + cmd + ' ' + cargs + " > " + runFile , "", "", 1); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // var WshFinished = 1 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // var WshFailed = 2 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // var strOutput = 'Did not work' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // switch(shell.Status){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //   case WshFinished :  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //     strOutput = oShell.StdOut.ReadAll; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //     break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //   case WshFailed : | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //     strOutput = oShell.StdErr.ReadAll; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //     break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // WScript.Echo(strOutput) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    while(!fso.FileExists(runFile)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      WScript.Sleep(500) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var objFileToRead = fso.OpenTextFile(runFile,1) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var strFileText = objFileToRead.ReadAll() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    objFileToRead.Close() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    fso.DeleteFile(runFile) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    resolve(strFileText) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			   | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			}  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// Detect or specify install directory. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var selectedinstance = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  root : fso.GetAbsolutePathName(".") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var selectedinstance = { root : path.resolve(".") } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var downloadsdir = selectedinstance.root + '/Downloads'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var fs = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  writeFileSync : function(filepath, text) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    WScript.echo(filepath)     | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var fh = fso.CreateTextFile(filepath, true);  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    fh.WriteLine(text);  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    fh.Close();  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  existsSync : function(path){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // fso.FileExists(path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return fso.FolderExists(path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  , mkdirSync : function(path) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    fso.CreateFolder(path) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var path = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  dirname : function(filepath) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var normalized = filepath.replace(/\//g,'\\'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var li = normalized.lastIndexOf("\\") | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if( li > -1) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return normalized.substring(0, li) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function ensureDirectoryExistence(filePath) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var dirname = path.dirname(filePath); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  if (fs.existsSync(dirname)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  if (existsSyncFolder(dirname)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return filePath; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  ensureDirectoryExistence(dirname); | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -201,12 +498,18 @@ function ensureDirectoryExistence(filePath) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var getTaskCheckExists = function(command, options) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  options = options || {} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return function() { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var runFile = path.normalize(selectedinstance.root + '/.elxr/run-' + runtimestamp + '/' + stampedFilePfx(new Date()) + command + "out.txt"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = nodeShellExec.apply(null, ['where', [command]]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p.runFile = runFile; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var catchr =  'pcatch' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(p['catch']) { catchr = 'catch' } else { catchr =  'pcatch';} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (options.ignorefailures) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return p.then(function(v) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        // WScript.Echo('firstThen ' + v); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return v }).pcatch( function(e) { // Ignore. Not a major error. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return false; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return v })[catchr]( function(e) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          console.error(e); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // Ignore. Not a major error if where command fails !!! | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          throw e; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    else return p.then(function() {  | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -218,88 +521,118 @@ var getTaskCheckExists = function(command, options) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			function verifyAndInstallPrerequisites() { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  fs.writeFileSync(ensureDirectoryExistence(downloadsdir + '/readme.txt'), getVersion() + ' Your local downloads for this instance'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var downloadbatch = | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    "::************************************************************************** \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  :Download_ <url> <File> \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    Powershell.exe ^ \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    $AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'; ^ \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    [System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols; ^ \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    (New-Object System.Net.WebClient).DownloadFile('%1','%2') \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  exit /b \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  "::************************************************************************** \r\n \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  :Download_ <url> <File> \r\n \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    Powershell.exe ^\r\n \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    $AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'; ^\r\n \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    [System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols; ^\r\n \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    (New-Object System.Net.WebClient).DownloadFile('%1','%2') \r\n \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  exit /b \r\n \ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  ::**************************************************************************"; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  fs.writeFileSync('download.bat', downloadbatch); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  ensureDirectoryExistence(path.normalize(selectedinstance.root + '/.elxr/run-' + runtimestamp + '/readme.txt')) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  fs.writeFileSync(path.normalize(selectedinstance.root + '/.elxr/run-' + runtimestamp + '/download.bat'), downloadbatch); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var downloadtasks = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  var installtasks = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  prerequisites.forEach(function(preq) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = null; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    downloadtasks.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      p = preq.exists().then(function(exists) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (exists) console.log( preq.shellcmd + ' exists'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          console.log(preq.shellcmd + ' is not installed'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return preq.preinstallsteps().then(function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            installtasks.push(task.install); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    var p = preq.exists().then(function(exists) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      if (exists && false) console.log( preq.shellcmd + ' exists'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        console.log(preq.shellcmd + ' is not installed'); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return preq.preinstallsteps().then(function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          console.log(' task.install : ' + preq.install) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          installtasks.push(preq.install.bind(preq)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    )); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    p.start() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // .then(function(res){ console.log( 'preinstallsteps ' + res)}); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    downloadtasks.push( p ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return Promise.all(downloadtasks).then(function(){ return any(installtasks) }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  return Promise.all(downloadtasks).then(function(){  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    console.log('calling install tasks') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return any(installtasks) }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// var choiceHandler = function(choices, choice) {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   console.log('chosen : ' + choice) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   var decision = choices['d']; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   if (choice && choice === 'd' || !choice) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     decision = choices['d'] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   else if (isNaN((+choice))) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//     decision = choice | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   else decision = choices[choice-1] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   if(!decision) throw 'Invalid selection : ' + decision | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   return decision | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			var prerequisites = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    shellcmd: 'git', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    url: 'https://github.com/git-for-windows/git/releases/download/v2.31.0.windows.1/Git-2.31.0-64-bit.exe' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , installer: 'Git-2.31.0-64-bit.exe' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    url: 'https://github.com/git-for-windows/git/releases/download/v2.33.0.windows.2/Git-2.33.0.2-64-bit.exe' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , installer: 'Git-2.33.0.2-64-bit.exe' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , installcmd: ['cmd', ['/c', 'start', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      '/WAIT', downloadsdir + '/' + 'Git-2.31.0-64-bit.exe' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      '/WAIT', downloadsdir + '/' + 'Git-2.33.0.2-64-bit.exe' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , '/VERYSILENT' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      // , '/MERGETASKS=!runcode' // This is required only for vscode... | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ]] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , preinstallsteps: function() { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var prompt = cli.prompter; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var steps = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var self = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      console.log('Git preinstall steps') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var steps = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      steps.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          var choices = { 0 : 'guest', 1 : 'chessdemo' } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return cli.prompt(choices, 'git user name', gitUser).then(function(choice){ gitUser = choice } ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      steps.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          var choices = { 0 : 'guest@bbh.org.in', 1 : 'chessdemo@bbh.org.in' } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return cli.prompt(choices, 'git user email', gitEmail).then(function(choice){ gitEmail = choice }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      steps.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          if (!existsSync(downloadsdir + '/' + this.installer)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return nodeShellExec(selectedinstance.root + '/.elxr/run-${runtimestamp}/download.bat', [this.url, downloadsdir + '/' + this.installer]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          if (!existsSync(downloadsdir + '/' + self.installer)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return nodeShellExec(selectedinstance.root + '/.elxr/run-' + runtimestamp + '/download.bat', [self.url, downloadsdir + '/' + self.installer]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            console.log(self.installer + ' Already exits Download skipped.')  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return Promise.resolve(true) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          else return Promise.resolve(true) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      ] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var prompts = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        function() {prompt.ask('git user name : ( <= ' + gitUser + ' )').then( function(user){ gitUser = user; })} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        , function() { prompt.ask('git email : ( <= ' + gitEmail + ' )').then(function(email) { gitEmail = email; })} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      ] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any([any(steps), any(prompts)]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any(steps) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      // return any([any(steps), any(prompts)]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , installsteps: function () { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any([this.installcmd].map(callsheltask)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var self = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any([self.installcmd].map(callsheltask)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , postinstallsteps: function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var prompt = cli.prompter; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var gitUser = 'guest'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var gitEmail = 'guest@bbh.org.in'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var prompts = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      prompts.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      // PB : TODO -- Detect failure or cancellation before attenpting postinstall steps... | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var steps = []; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      steps.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          var choices = { 0 : 'guest', 1 : 'chessdemo' } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return cli.prompt(choices, 'git user name').then(function(gituser) { gitUser = gituser}) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return cli.prompt(choices, 'git user name', gitUser).then(function(choice){ gitUser = choice } ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      prompts.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      steps.push( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          var choices = { 0 : 'guest@bbh.org.in', 1 : 'chessdemo@bbh.org.in' } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return cli.prompt(choices, 'git user email').then(function(gitemail) { gitEmail = gitemail}) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return cli.prompt(choices, 'git user email', gitEmail).then(function(choice){ gitEmail = choice }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any(prompts).then(function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any(steps).then(function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        var steps = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          ['git', ['config', '--global', '--add', 'user.name', gitUser]] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          , ['git', ['config', '--global', '--add', 'user.email', gitEmail]] | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -310,7 +643,8 @@ var prerequisites = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , install: function () { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any([ /*this.preinstallsteps,*/ this.installsteps.bind(this), this.postinstallsteps.bind(this)]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var self = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any([ /*self.preinstallsteps,*/ self.installsteps.bind(self), self.postinstallsteps.bind(self)]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , verifyAndInstall : function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var self = this; | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -321,9 +655,9 @@ var prerequisites = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , exists : function(next){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var self = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return getTaskCheckExists(this.shellcmd, { ignorefailures: true })().then(function(exists) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(exists && exists.indexOf(self.shellcmd) > -1 ) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // console.log(exists + '    git exists') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return getTaskCheckExists(self.shellcmd, { ignorefailures: true })().then(function(exists) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        console.log(exists + '    git exists') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(exists && exists.messages.join(' ').indexOf(self.shellcmd) > -1 ) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return true; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else return false | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -359,32 +693,38 @@ var prerequisites = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  , | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    shellcmd: 'node', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    url: 'https://nodejs.org/dist/v14.16.0/node-v14.16.0-x64.msi' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , installer: 'node-v14.16.0-x64.msi' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    url: 'https://nodejs.org/dist/v14.16.0/node-v14.17.3-x64.msi' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , installer: 'node-v14.17.3-x64.msi' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , installcmd: ['MSIEXEC.exe', ['/i' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , downloadsdir + '/' + 'node-v14.16.0-x64.msi' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , path.normalize(downloadsdir + '/' + 'node-v14.17.3-x64.msi') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      , 'ACCEPT=YES', '/passive']] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , install : function() { return any([this.installcmd].map(callsheltask)) } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , install : function() {  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var self = this;  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return any([self.installcmd].map(callsheltask))  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			     | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , exists : function(next){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      var self = this; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return getTaskCheckExists(this.shellcmd, { ignorefailures: true })().then(function(exists) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(exists && exists.indexOf(self.shellcmd) > -1 ) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // console.log(self.shellcmd + ' ' + exists + '    node exists') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          // console.log(self.shellcmd + ' ' + exists + '    node doesnt exist') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          return false | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return getTaskCheckExists(self.shellcmd, { ignorefailures: true })().then(function(exists) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        console.log(self.shellcmd + ' ' + exists + '    node exists') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        // if(exists && exists.messages.join(' ').indexOf(self.shellcmd) > -1 ) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        //   return true | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        // } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        // else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        //   // console.log(self.shellcmd + ' ' + exists + '    node doesnt exist') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        //   return false | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        // } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    , preinstallsteps : function(){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return true; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      return Promise.resolve(true); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			prerequisites.forEach = forEach; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			verifyAndInstallPrerequisites() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// nodeShellExec(selectedinstance.root + '/.elxr/run-' + '1629889572461' + '/download.bat' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   , ['https://github.com/git-for-windows/git/releases/download/v2.31.0.windows.1/Git-2.32.0.2-64-bit.exe' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//   , downloadsdir + '/' + 'Git-2.32.0.2-64-bit.exe']).start() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			verifyAndInstallPrerequisites() |