anchor.diff:      });
     }
   
  +  Future<List<Map<String, dynamic>>> _fetchTags() {
  +    return util.downloadFileViaXhr(getTagsUrl()).then((String tagsStr) {
  +      return JSON.decode(tagsStr);
  +    });
  +  }
  +
     Future<_Resolution> _resolveWith(_Resolution resolution) {
       _resolution = resolution;
       _resolutionCompleter.complete(resolution);
       return _resolutionCompleter.future;
     }
   
  -  Future<List<Map<String, dynamic>>> _fetchTags() {
  -    return util.downloadFileViaXhr(getTagsUrl()).then((String tagsStr) {
  -      return JSON.decode(tagsStr);
  -    });
  -  }
  -
     bool operator ==(_Package another) =>
         path == another.path && hash == another.hash;
   
  -  String getCloneUrl() =>
  -      '$_GITHUB_ROOT_URL/$path/$resolvedTag';
  -
  -  String getZipUrl() =>
  -      //'$_GITHUB_API_ROOT_URL/$path/zipball/$resolvedTag';
  -      '$_GITHUB_ROOT_URL/$path/archive/$resolvedTag.zip';
  -
  -  String getTagsUrl() =>
  -      '$_GITHUB_API_ROOT_URL/$path/tags';
  +  String getCloneUrl() => '$_GITHUB_ROOT_URL/$path/$resolvedTag';
  +
  +  String getZipUrl() => '$_GITHUB_ROOT_URL/$path/archive/$resolvedTag.zip';
  +
  +  String getRegistryInfoUrl() => '$_BOWER_REGISTRY_URL/$name';
  +
  +  String getTagsUrl() => '$_GITHUB_API_ROOT_URL/$path/tags';
   
     String getSingleFileUrl(String remoteFilePath) =>
         '$_GITHUB_USER_CONTENT_URL/$path/$resolvedTag/$remoteFilePath';
  
positive.code: 
    static const MALFORMED_SPEC = const _Unresolved._(
        'unrecognized dependency specification; replace with a supported one');
    static const STAR_PATH = const _Unresolved._(
        'replace "*" path with an explicit one');
    static const VERSION_RANGE_UNRESOLVED = const _Unresolved._(
        'replace the version range with a pinned version in "dependencies" key '
        'or override it in "resolutions" key in top-level "bower.json"');
  
negative.code:       return _resolveWith(_Ignored.PER_CONFIG_DIRECTIVE);
      }
  
      if (hash == 'master') {
        _resolvedDirectTag = 'master';
        return _resolveWith(_Resolved.USED_AS_IS);
      }
  
      return _resolvePath().then((_) => _resolveTag());
    }
  
    Future _resolvePath() {
      // TODO(ussuri): See above. This, too, allows only either a "*" path,
      // or a non-* path with a hash, but not a direct version/tag without a path.
      if (path != null && path != '*') {
        return new Future.value();
      } else {
        return util.downloadFileViaXhr(getRegistryInfoUrl()).then(
            (String regResponse) {
          Map<String, dynamic> regInfo;
          try {
            regInfo = JSON.decode(regResponse);
          } on FormatException catch (e) {
            // Also handles registryResponse=='Package not found'.
            return _resolveWith(_Unresolved.STAR_PATH_FOR_UNKNOWN_PACKAGE);
          }
  
          Match m = _BOWER_REGISTRY_INFO_URL_REGEXP.matchAsPrefix(regInfo['url']);
          if (m == null) {
            return _resolveWith(_Unresolved.MALFORMED_BOWER_REGISTRY_INFO);
          }
          path = m.group(1);
          if (path == null) {
            return _resolveWith(_Unresolved.MALFORMED_BOWER_REGISTRY_INFO);
          }
          path = path.replaceFirst(new RegExp(r'.git$'), '');
          return new Future.value();
        });
      }
    }
  
    Future _resolveTag() {
      semver.VersionConstraint constraint;
  
      if (hash == null || hash == 'latest') {
  