code: func ParseDeps(r io.Reader) (providedBy map[string]string, requires map[string][]string, err error) {
  	providedBy = make(map[string]string)
  	requires = make(map[string][]string)
  	scanner := bufio.NewScanner(r)
  	for scanner.Scan() {
  		l := scanner.Text()
  		if strings.HasPrefix(l, "//") {
  			continue
  		}
  		if l == "" {
  			continue
  		}
  		m := depsRx.FindStringSubmatch(l)
  		if m == nil {
  			return nil, nil, fmt.Errorf("Invalid line in deps: %q", l)
  		}
  		jsfile := m[1]
  		provides := strings.Split(m[2], ", ")
  		var required []string
  		if m[5] != "" {
  			required = strings.Split(
  				strings.Replace(strings.Replace(m[5], "'", "", -1), `"`, "", -1), ", ")
  		}
  		for _, v := range provides {
  			namespace := strings.Trim(v, `'"`)
  			if otherjs, ok := providedBy[namespace]; ok {
  				return nil, nil, fmt.Errorf("Name %v is provided by both %v and %v", namespace, jsfile, otherjs)
  			}
  			providedBy[namespace] = jsfile
  			if _, ok := requires[namespace]; ok {
  				return nil, nil, fmt.Errorf("Name %v has two sets of dependencies", namespace)
  			}
  			if required != nil {
  				requires[namespace] = required
  			}
  		}
  	}
  	if err := scanner.Err(); err != nil {
  		return nil, nil, err
  	}
  	return providedBy, requires, nil
  }
docs: // ParseDeps reads closure namespace dependency lines and
  // returns a map giving the js file provider for each namespace,
  // and a map giving the namespace dependencies for each namespace.