text: var cmd = require('node-cmd');
  var path, node_ssh, ssh, fs;
  fs = require('fs');
  path = require('path');
  node_ssh = require('node-ssh');
  ssh = new node_ssh();
  
  // the method that starts the deployment process
  function main() {
    console.log('Deployment started.');
    sshConnect();
  }
  
  // installs PM2
  function installPM2() {
    return ssh.execCommand(
      'sudo npm install pm2 -g', {
        cwd: '/home/ubuntu'
    });
  }
  
  // transfers local project to the remote server
  function transferProjectToRemote(failed, successful) {
    return ssh.putDirectory(
      '../hackathon-starter',
      '/home/ubuntu/hackathon-starter-temp',
      {
        recursive: true,
        concurrency: 1,
        validate: function(itemPath) {
          const baseName = path.basename(itemPath);
          return (
            baseName.substr(0, 1) !== '.' && baseName !== 'node_modules' // do not allow dot files
          ); // do not allow node_modules
        },
        tick: function(localPath, remotePath, error) {
          if (error) {
            failed.push(localPath);
            console.log('failed.push: ' + localPath);
          } else {
            successful.push(localPath);
            console.log('successful.push: ' + localPath);
          }
        }
      }
    );
  }
  
  // creates a temporary folder on the remote server
  function createRemoteTempFolder() {
    return ssh.execCommand(
      'rm -rf hackathon-starter-temp && mkdir hackathon-starter-temp', {
        cwd: '/home/ubuntu'
    });
  }
  
  // stops mongodb and node services on the remote server
  function stopRemoteServices() {
    return ssh.execCommand(
      'pm2 stop all && sudo service mongod stop', {
        cwd: '/home/ubuntu'
    });
  }
  
  // updates the project source on the server
  function updateRemoteApp() {
    return ssh.execCommand(
      'mkdir hackathon-starter && cp -r hackathon-starter-temp/* hackathon-starter/ && rm -rf hackathon-starter-temp', {
        cwd: '/home/ubuntu'
    });
  }
  
  // restart mongodb and node services on the remote server
  function restartRemoteServices() {
    return ssh.execCommand(
      'cd hackathon-starter && sudo service mongod start && pm2 start app.js', {
        cwd: '/home/ubuntu'
    });
  }
  
  // connect to the remote server
  function sshConnect() {
    console.log('Connecting to the server...');
  
    ssh
      .connect({
        // TODO: ADD YOUR IP ADDRESS BELOW (e.g. '12.34.5.67')
        host: '54.198.57.125',
        username: 'ubuntu',
        privateKey: 'hs-key.pem'
      })
      .then(function() {
        console.log('SSH Connection established.');
        console.log('Installing PM2...');
        return installPM2();
      })
      .then(function() {
        console.log('Creating `hackathon-starter-temp` folder.');
        return createRemoteTempFolder();
      })
      .then(function(result) {
        const failed = [];
        const successful = [];
        if (result.stdout) {
          console.log('STDOUT: ' + result.stdout);
        }
        if (result.stderr) {
          console.log('STDERR: ' + result.stderr);
          return Promise.reject(result.stderr);
        }
        console.log('Transferring files to remote server...');
        return transferProjectToRemote(failed, successful);
      })
      .then(function(status) {
        if (status) {
          console.log('Stopping remote services.');
          return stopRemoteServices();
        } else {
          return Promise.reject(failed.join(', '));
        }
      })
      .then(function(status) {
        if (status) {
          console.log('Updating remote app.');
          return updateRemoteApp();
        } else {
          return Promise.reject(failed.join(', '));
        }
      })
      .then(function(status) {
        if (status) {
          console.log('Restarting remote services...');
          return restartRemoteServices();
        } else {
          return Promise.reject(failed.join(', '));
        }
      })
      .then(function() {
        console.log('DEPLOYMENT COMPLETE!');
        process.exit(0);
      })
      .catch(e => {
        console.error(e);
        process.exit(1);
      });
  }
  
  main();