| Index: lib/core/core_patch.dart | 
| diff --git a/lib/core/core_patch.dart b/lib/core/core_patch.dart | 
| index e9bd06128e0971b90600888de29a19ef38858147..32e2faec900d20442c0e7e989b2074ab0dca898e 100644 | 
| --- a/lib/core/core_patch.dart | 
| +++ b/lib/core/core_patch.dart | 
| @@ -5,6 +5,8 @@ | 
| library dart.core_patch; | 
|  | 
| import 'dart:fletch._system' as fletch; | 
| +import 'dart:fletch._system' show patch; | 
| +import 'dart:collection' show LinkedHashMap, UnmodifiableMapView; | 
|  | 
| part 'bigint.dart'; | 
| part 'case.dart'; | 
| @@ -13,8 +15,6 @@ part 'int.dart'; | 
| part 'regexp.dart'; | 
| part 'string.dart'; | 
|  | 
| -const patch = "patch"; | 
| - | 
| @patch external bool identical(Object a, Object b); | 
|  | 
| @patch int identityHashCode(Object object) { | 
| @@ -236,6 +236,18 @@ const patch = "patch"; | 
| } | 
| return list; | 
| } | 
| + | 
| +  @patch factory List.unmodifiable(Iterable elements) { | 
| +    return new UnmodifiableListView(new List.from(elements)); | 
| +  } | 
| +} | 
| + | 
| +@patch class Map<K, V> { | 
| +  @patch factory Map() = LinkedHashMap<K, V>; | 
| + | 
| +  @patch factory Map.unmodifiable(Map other) { | 
| +    return new UnmodifiableMapView<K, V>(new Map<K, V>.from(other)); | 
| +  } | 
| } | 
|  | 
| @patch class NoSuchMethodError { | 
| @@ -658,4 +670,36 @@ const patch = "patch"; | 
| @fletch.native static String _base() { | 
| throw new RangeError("The Uri.base path is too large"); | 
| } | 
| + | 
| +  /// Encodes all characters in the string [text] except for those | 
| +  /// that appear in [canonicalTable], and returns the escaped string. | 
| +  @patch static String _uriEncode( | 
| +      List<int> canonicalTable, | 
| +      String text, | 
| +      Encoding encoding, | 
| +      bool spaceToPlus) { | 
| +    byteToHex(byte, buffer) { | 
| +      const String hex = '0123456789ABCDEF'; | 
| +      buffer.writeCharCode(hex.codeUnitAt(byte >> 4)); | 
| +      buffer.writeCharCode(hex.codeUnitAt(byte & 0x0f)); | 
| +    } | 
| + | 
| +    // Encode the string into bytes then generate an ASCII only string | 
| +    // by percent encoding selected bytes. | 
| +    StringBuffer result = new StringBuffer(); | 
| +    var bytes = encoding.encode(text); | 
| +    for (int i = 0; i < bytes.length; i++) { | 
| +      int byte = bytes[i]; | 
| +      if (byte < 128 && | 
| +          ((canonicalTable[byte >> 4] & (1 << (byte & 0x0f))) != 0)) { | 
| +        result.writeCharCode(byte); | 
| +      } else if (spaceToPlus && byte == _SPACE) { | 
| +        result.writeCharCode(_PLUS); | 
| +      } else { | 
| +        result.writeCharCode(_PERCENT); | 
| +        byteToHex(byte, result); | 
| +      } | 
| +    } | 
| +    return result.toString(); | 
| +  } | 
| } | 
|  |