anchor.diff:  
   /// Uses a [Memache] to set/get/invalidate metadata for packages.
   class AppEnginePackageMemcache implements PackageCache, UIPackageCache {
  -  static const Duration EXPIRATION = const Duration(minutes: 10);
  -  static const String INDEX_PAGE_KEY = 'pub_index';
  -  static const String KEY_PREFIX = 'dart_package_json';
  -  static const String UI_KEY_PREFIX = 'dart_package_ui';
  +  static const Duration _cacheExpiration = const Duration(minutes: 10);
   
  -  final Memcache memcache;
  -  final String keyPrefix;
  -  final String uiKeyPrefix;
  +  final Memcache _memcache;
  +  final String _indexKey;
  +  final String _keyPrefix;
  +  final String _uiKeyPrefix;
   
  -  AppEnginePackageMemcache(this.memcache, String namespace)
  -      : keyPrefix = (namespace == null || namespace.isEmpty)
  -            ? KEY_PREFIX
  -            : 'ns_${namespace}_$KEY_PREFIX',
  -        uiKeyPrefix = (namespace == null || namespace.isEmpty)
  -            ? UI_KEY_PREFIX
  -            : 'ns_${namespace}_$UI_KEY_PREFIX';
  +  static String _prefixWithNamespace(String prefix, String namespace) =>
  +      (namespace == null || namespace.isEmpty)
  +          ? prefix
  +          : 'ns_${namespace}_${prefix}';
  +
  +  AppEnginePackageMemcache(this._memcache, String namespace)
  +      : _keyPrefix = _prefixWithNamespace('package_json_', namespace),
  +        _uiKeyPrefix = _prefixWithNamespace('package_ui_', namespace),
  +        _indexKey = _prefixWithNamespace('pub_index', namespace);
   
     @override
     Future<List<int>> getPackageData(String package) async {
  -    final result =
  -        await _ignoreErrors(memcache.get(_packageKey(package), asBinary: true));
  +    final result = await _ignoreErrors(
  +        _memcache.get(_packageKey(package), asBinary: true));
   
       if (result != null)
         _logger.info('memcache["$package"] found');
  
positive.code:   Future invalidatePackageData(String package) {
      _logger.info('memcache["$package"] invalidate entry');
      return _ignoreErrors(Future.wait([
        memcache.remove(_packageKey(package)),
        memcache.remove(_packageUIKey(package, null)),
        memcache.remove(INDEX_PAGE_KEY),
      ]));
    }
  
    @override
    Future<String> getUIIndexPage() async {
      final result = await _ignoreErrors(memcache.get(INDEX_PAGE_KEY));
      if (result != null) {
        _logger.info('memcache[index-page] found rendered UI data');
      } else {
  
negative.code:   Future setUIIndexPage(String content) async {
      _logger.info('memcache[index-page] setting to new rendered UI data');
      await _ignoreErrors(
          _memcache.set(_indexKey, content, expiration: _cacheExpiration));
    }
  
    String _packageKey(String package) => '$_keyPrefix$package';
  
    String _packageUIKey(String package, String version) {
      if (version == null) return '$_uiKeyPrefix$package';
      return '$_uiKeyPrefix$package**$version';
    }
  
    // We are ignoring any memcache errors and just return `null` in this case.
  