code: function forwardPass(graph, depEnds, tasks, start) {
      updateDependencies(depEnds, tasks, start);
      for(var i = 0, len = tasks.length; i < len; i++) {
        var tid = tasks[i],
            task = graph.tasks[tid],
            dependsOn = task.dependsOn,
            dep = depEnds[tid];
  
        if(!task.earlyFinish && (isEmpty(dependsOn) || (dep && dep[0] === dependsOn.length))) {
          task.earlyStart = dep[1];
          task.earlyFinish = dep[1] + task.duration;
  
          if(!isEmpty(task.requiredBy)) {
            forwardPass(graph, depEnds, task.requiredBy, task.earlyFinish);
          }
        }
      }
    }
docs: Generates an optimistic (assume all resources are available when needed)
  forward schedule for each node in the graph, respecting node dependencies.