diff --git a/include/regex b/include/regex
index c4c58a4..9eef160 100644
--- a/include/regex
+++ b/include/regex
@@ -1280,7 +1280,7 @@
     __node(const __node&);
     __node& operator=(const __node&);
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __node() {}
@@ -1300,7 +1300,7 @@
     : public __node<_CharT>
 {
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __end_state() {}
@@ -1365,7 +1365,7 @@
     typedef __owns_one_state<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __empty_state(__node<_CharT>* __s)
@@ -1391,7 +1391,7 @@
     typedef __has_one_state<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __empty_non_own_state(__node<_CharT>* __s)
@@ -1417,7 +1417,7 @@
     typedef __has_one_state<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __repeat_one_loop(__node<_CharT>* __s)
@@ -1479,7 +1479,7 @@
     bool __greedy_;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __loop(unsigned __loop_id,
@@ -1578,7 +1578,7 @@
     typedef __owns_two_states<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __alternate(__owns_one_state<_CharT>* __s1,
@@ -1617,7 +1617,7 @@
 
     unsigned __mexp_;
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
@@ -1645,7 +1645,7 @@
 
     unsigned __mexp_;
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
@@ -1674,7 +1674,7 @@
 
     unsigned __mexp_;
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
@@ -1692,7 +1692,7 @@
     {
         ptrdiff_t __len = __sm.second - __sm.first;
         if (__s.__last_ - __s.__current_ >= __len &&
-            _STD::equal(__sm.first, __sm.second, __s.__current_))
+            _VSTD::equal(__sm.first, __sm.second, __s.__current_))
         {
             __s.__do_ = __state::__accept_but_not_consume;
             __s.__current_ += __len;
@@ -1722,7 +1722,7 @@
     _Traits __traits_;
     unsigned __mexp_;
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
@@ -1777,7 +1777,7 @@
     _Traits __traits_;
     unsigned __mexp_;
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
@@ -1832,7 +1832,7 @@
     _Traits __traits_;
     bool __invert_;
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     explicit __word_boundary(const _Traits& __traits, bool __invert,
@@ -1900,7 +1900,7 @@
     typedef __owns_one_state<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __l_anchor(__node<_CharT>* __s)
@@ -1934,7 +1934,7 @@
     typedef __owns_one_state<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __r_anchor(__node<_CharT>* __s)
@@ -1968,7 +1968,7 @@
     typedef __owns_one_state<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __match_any(__node<_CharT>* __s)
@@ -2003,7 +2003,7 @@
     typedef __owns_one_state<_CharT> base;
 
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __match_any_but_newline(__node<_CharT>* __s)
@@ -2025,7 +2025,7 @@
     __match_char(const __match_char&);
     __match_char& operator=(const __match_char&);
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __match_char(_CharT __c, __node<_CharT>* __s)
@@ -2065,7 +2065,7 @@
     __match_char_icase(const __match_char_icase&);
     __match_char_icase& operator=(const __match_char_icase&);
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
@@ -2106,7 +2106,7 @@
     __match_char_collate(const __match_char_collate&);
     __match_char_collate& operator=(const __match_char_collate&);
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
@@ -2158,7 +2158,7 @@
     __bracket_expression(const __bracket_expression&);
     __bracket_expression& operator=(const __bracket_expression&);
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
@@ -2226,7 +2226,7 @@
                     __b[0] = __traits_.translate_nocase(__b[0]);
                     __e[0] = __traits_.translate_nocase(__e[0]);
                 }
-                __ranges_.push_back(make_pair(_STD::move(__b), _STD::move(__e)));
+                __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
             }
         }
     _LIBCPP_INLINE_VISIBILITY
@@ -2263,7 +2263,7 @@
         ++__consumed;
         if (__might_have_digraph_)
         {
-            const _CharT* __next = _STD::next(__s.__current_);
+            const _CharT* __next = _VSTD::next(__s.__current_);
             if (__next != __s.__last_)
             {
                 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
@@ -2430,8 +2430,8 @@
     shared_ptr<__empty_state<_CharT> > __start_;
     __owns_one_state<_CharT>* __end_;
 
-    typedef _STD::__state<_CharT> __state;
-    typedef _STD::__node<_CharT> __node;
+    typedef _VSTD::__state<_CharT> __state;
+    typedef _VSTD::__node<_CharT> __node;
 
 public:
     // constants:
@@ -2834,7 +2834,7 @@
 void
 basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
 {
-    using _STD::swap;
+    using _VSTD::swap;
     swap(__traits_, __r.__traits_);
     swap(__flags_, __r.__flags_);
     swap(__marked_count_, __r.__marked_count_);
@@ -2866,7 +2866,7 @@
     __lookahead(const __lookahead&);
     __lookahead& operator=(const __lookahead&);
 public:
-    typedef _STD::__state<_CharT> __state;
+    typedef _VSTD::__state<_CharT> __state;
 
     _LIBCPP_INLINE_VISIBILITY
     __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s)
@@ -2953,7 +2953,7 @@
             __first = __parse_RE_expression(__first, __last);
             if (__first != __last)
             {
-                _ForwardIterator __temp = _STD::next(__first);
+                _ForwardIterator __temp = _VSTD::next(__first);
                 if (__temp == __last && *__first == '$')
                 {
                     __push_r_anchor();
@@ -3182,7 +3182,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp != __last)
         {
             if (*__first == '\\' && *__temp == '(')
@@ -3200,7 +3200,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp != __last)
         {
             if (*__first == '\\' && *__temp == ')')
@@ -3218,7 +3218,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp != __last)
         {
             if (*__first == '\\' && *__temp == '{')
@@ -3236,7 +3236,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp != __last)
         {
             if (*__first == '\\' && *__temp == '}')
@@ -3254,7 +3254,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp != __last)
         {
             if (*__first == '\\' && '1' <= *__temp && *__temp <= '9')
@@ -3275,7 +3275,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp == __last && *__first == '$')
             return __first;
         // Not called inside a bracket
@@ -3333,7 +3333,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp != __last)
         {
             if (*__first == '\\')
@@ -3364,7 +3364,7 @@
 {
     if (__first != __last)
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         if (__temp != __last)
         {
             if (*__first == '\\')
@@ -3674,7 +3674,7 @@
 {
     if (__first != __last && *__first != ']')
     {
-        _ForwardIterator __temp = _STD::next(__first);
+        _ForwardIterator __temp = _VSTD::next(__first);
         basic_string<_CharT> __start_range;
         if (__temp != __last && *__first == '[')
         {
@@ -3703,7 +3703,7 @@
         }
         if (__first != __last && *__first != ']')
         {
-            __temp = _STD::next(__first);
+            __temp = _VSTD::next(__first);
             if (__temp != __last && *__first == '-' && *__temp != ']')
             {
                 // parse a range
@@ -3729,7 +3729,7 @@
                         ++__first;
                     }
                 }
-                __ml->__add_range(_STD::move(__start_range), _STD::move(__end_range));
+                __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
             }
             else
             {
@@ -3890,7 +3890,7 @@
     // Found [=
     //   This means =] must exist
     value_type _Equal_close[2] = {'=', ']'};
-    _ForwardIterator __temp = _STD::search(__first, __last, _Equal_close,
+    _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
                                                             _Equal_close+2);
 #ifndef _LIBCPP_NO_EXCEPTIONS
     if (__temp == __last)
@@ -3925,7 +3925,7 @@
 #endif  // _LIBCPP_NO_EXCEPTIONS
         }
     }
-    __first = _STD::next(__temp, 2);
+    __first = _VSTD::next(__temp, 2);
     return __first;
 }
 
@@ -3939,7 +3939,7 @@
     // Found [:
     //   This means :] must exist
     value_type _Colon_close[2] = {':', ']'};
-    _ForwardIterator __temp = _STD::search(__first, __last, _Colon_close,
+    _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
                                                             _Colon_close+2);
 #ifndef _LIBCPP_NO_EXCEPTIONS
     if (__temp == __last)
@@ -3954,7 +3954,7 @@
         throw regex_error(regex_constants::error_brack);
 #endif  // _LIBCPP_NO_EXCEPTIONS
     __ml->__add_class(__class_type);
-    __first = _STD::next(__temp, 2);
+    __first = _VSTD::next(__temp, 2);
     return __first;
 }
 
@@ -3968,7 +3968,7 @@
     // Found [.
     //   This means .] must exist
     value_type _Dot_close[2] = {'.', ']'};
-    _ForwardIterator __temp = _STD::search(__first, __last, _Dot_close,
+    _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
                                                             _Dot_close+2);
 #ifndef _LIBCPP_NO_EXCEPTIONS
     if (__temp == __last)
@@ -3987,7 +3987,7 @@
         throw regex_error(regex_constants::error_collate);
 #endif  // _LIBCPP_NO_EXCEPTIONS
     }
-    __first = _STD::next(__temp, 2);
+    __first = _VSTD::next(__temp, 2);
     return __first;
 }
 
@@ -4091,7 +4091,7 @@
             break;
         case '\\':
             {
-                _ForwardIterator __temp = _STD::next(__first);
+                _ForwardIterator __temp = _VSTD::next(__first);
                 if (__temp != __last)
                 {
                     if (*__temp == 'b')
@@ -4109,7 +4109,7 @@
             break;
         case '(':
             {
-                _ForwardIterator __temp = _STD::next(__first);
+                _ForwardIterator __temp = _VSTD::next(__first);
                 if (__temp != __last && *__temp == '?')
                 {
                     if (++__temp != __last)
@@ -4121,7 +4121,7 @@
                                 basic_regex __exp;
                                 __exp.__flags_ = __flags_;
                                 __temp = __exp.__parse(++__temp, __last);
-                                __push_lookahead(_STD::move(__exp), false);
+                                __push_lookahead(_VSTD::move(__exp), false);
 #ifndef _LIBCPP_NO_EXCEPTIONS
                                 if (__temp == __last || *__temp != ')')
                                     throw regex_error(regex_constants::error_paren);
@@ -4134,7 +4134,7 @@
                                 basic_regex __exp;
                                 __exp.__flags_ = __flags_;
                                 __temp = __exp.__parse(++__temp, __last);
-                                __push_lookahead(_STD::move(__exp), true);
+                                __push_lookahead(_VSTD::move(__exp), true);
 #ifndef _LIBCPP_NO_EXCEPTIONS
                                 if (__temp == __last || *__temp != ')')
                                     throw regex_error(regex_constants::error_paren);
@@ -4179,7 +4179,7 @@
                 if (__first == __last)
                     throw regex_error(regex_constants::error_paren);
 #endif  // _LIBCPP_NO_EXCEPTIONS
-                _ForwardIterator __temp = _STD::next(__first);
+                _ForwardIterator __temp = _VSTD::next(__first);
                 if (__temp != __last && *__first == '?' && *__temp == ':')
                 {
                     ++__open_count_;
@@ -4223,7 +4223,7 @@
 {
     if (__first != __last && *__first == '\\')
     {
-        _ForwardIterator __t1 = _STD::next(__first);
+        _ForwardIterator __t1 = _VSTD::next(__first);
         _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
         if (__t2 != __t1)
             __first = __t2;
@@ -4369,7 +4369,7 @@
             ++__first;
             break;
         case 'c':
-            if ((__t = _STD::next(__first)) != __last)
+            if ((__t = _VSTD::next(__first)) != __last)
             {
                 if ('A' <= *__t <= 'Z' || 'a' <= *__t <= 'z')
                 {
@@ -4494,7 +4494,7 @@
                                            _ForwardIterator __last)
 {
     __owns_one_state<_CharT>* __sa = __end_;
-    _ForwardIterator __t1 = _STD::find(__first, __last, _CharT('\n'));
+    _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
     if (__t1 != __first)
         __parse_basic_reg_exp(__first, __t1);
     else
@@ -4504,7 +4504,7 @@
         ++__first;
     while (__first != __last)
     {
-        __t1 = _STD::find(__first, __last, _CharT('\n'));
+        __t1 = _VSTD::find(__first, __last, _CharT('\n'));
         __owns_one_state<_CharT>* __sb = __end_;
         if (__t1 != __first)
             __parse_basic_reg_exp(__first, __t1);
@@ -4525,7 +4525,7 @@
                                             _ForwardIterator __last)
 {
     __owns_one_state<_CharT>* __sa = __end_;
-    _ForwardIterator __t1 = _STD::find(__first, __last, _CharT('\n'));
+    _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
     if (__t1 != __first)
         __parse_extended_reg_exp(__first, __t1);
     else
@@ -4535,7 +4535,7 @@
         ++__first;
     while (__first != __last)
     {
-        __t1 = _STD::find(__first, __last, _CharT('\n'));
+        __t1 = _VSTD::find(__first, __last, _CharT('\n'));
         __owns_one_state<_CharT>* __sb = __end_;
         if (__t1 != __first)
             __parse_extended_reg_exp(__first, __t1);
@@ -4732,7 +4732,7 @@
 
     _LIBCPP_INLINE_VISIBILITY
     difference_type length() const
-        {return matched ? _STD::distance(this->first, this->second) : 0;}
+        {return matched ? _VSTD::distance(this->first, this->second) : 0;}
     _LIBCPP_INLINE_VISIBILITY
     string_type str() const
         {return matched ? string_type(this->first, this->second) : string_type();}
@@ -5188,7 +5188,7 @@
         {return (*this)[__sub].length();}
     _LIBCPP_INLINE_VISIBILITY
     difference_type position(size_type __sub = 0) const
-        {return _STD::distance(__position_start_, (*this)[__sub].first);}
+        {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
     _LIBCPP_INLINE_VISIBILITY
     string_type str(size_type __sub = 0) const
         {return (*this)[__sub].str();}
@@ -5260,18 +5260,18 @@
         __matches_.resize(__m.size());
         for (size_type __i = 0; __i < __matches_.size(); ++__i)
         {
-            __matches_[__i].first = _STD::next(__f, _STD::distance(__mf, __m[__i].first));
-            __matches_[__i].second = _STD::next(__f, _STD::distance(__mf, __m[__i].second));
+            __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
+            __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
             __matches_[__i].matched = __m[__i].matched;
         }
         __unmatched_.first   = __l;
         __unmatched_.second  = __l;
         __unmatched_.matched = false;
-        __prefix_.first = _STD::next(__f, _STD::distance(__mf, __m.prefix().first));
-        __prefix_.second = _STD::next(__f, _STD::distance(__mf, __m.prefix().second));
+        __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
+        __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
         __prefix_.matched = __m.prefix().matched;
-        __suffix_.first = _STD::next(__f, _STD::distance(__mf, __m.suffix().first));
-        __suffix_.second = _STD::next(__f, _STD::distance(__mf, __m.suffix().second));
+        __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
+        __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
         __suffix_.matched = __m.suffix().matched;
         if (!__no_update_pos)
             __position_start_ = __prefix_.first;
@@ -5342,7 +5342,7 @@
         for (; __fmt_first != __fmt_last; ++__fmt_first)
         {
             if (*__fmt_first == '&')
-                __out = _STD::copy(__matches_[0].first, __matches_[0].second,
+                __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
                                    __out);
             else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
             {
@@ -5350,7 +5350,7 @@
                 if ('0' <= *__fmt_first && *__fmt_first <= '9')
                 {
                     size_t __i = *__fmt_first - '0';
-                    __out = _STD::copy(__matches_[__i].first,
+                    __out = _VSTD::copy(__matches_[__i].first,
                                        __matches_[__i].second, __out);
                 }
                 else
@@ -5380,16 +5380,16 @@
                     break;
                 case '&':
                     ++__fmt_first;
-                    __out = _STD::copy(__matches_[0].first, __matches_[0].second,
+                    __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
                                        __out);
                     break;
                 case '`':
                     ++__fmt_first;
-                    __out = _STD::copy(__prefix_.first, __prefix_.second, __out);
+                    __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
                     break;
                 case '\'':
                     ++__fmt_first;
-                    __out = _STD::copy(__suffix_.first, __suffix_.second, __out);
+                    __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
                     break;
                 default:
                     if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
@@ -5402,7 +5402,7 @@
                             ++__fmt_first;
                             __i = 10 * __i + *__fmt_first - '0';
                         }
-                        __out = _STD::copy(__matches_[__i].first,
+                        __out = _VSTD::copy(__matches_[__i].first,
                                            __matches_[__i].second, __out);
                     }
                     else
@@ -5427,7 +5427,7 @@
 void
 match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
 {
-    using _STD::swap;
+    using _VSTD::swap;
     swap(__matches_, __m.__matches_);
     swap(__unmatched_, __m.__unmatched_);
     swap(__prefix_, __m.__prefix_);
@@ -5485,7 +5485,7 @@
 {
     vector<__state> __states;
     ptrdiff_t __j = 0;
-    ptrdiff_t _N = _STD::distance(__first, __last);
+    ptrdiff_t _N = _VSTD::distance(__first, __last);
     __node* __st = __start_.get();
     if (__st)
     {
@@ -5509,7 +5509,7 @@
             {
             case __state::__end_state:
                 __m.__matches_[0].first = __first;
-                __m.__matches_[0].second = _STD::next(__first, __s.__current_ - __first);
+                __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
                 __m.__matches_[0].matched = true;
                 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
                     __m.__matches_[__i+1] = __s.__sub_matches_[__i];
@@ -5523,7 +5523,7 @@
                 __state __snext = __s;
                 __s.__node_->__exec_split(true, __s);
                 __snext.__node_->__exec_split(false, __snext);
-                __states.push_back(_STD::move(__snext));
+                __states.push_back(_VSTD::move(__snext));
                 }
                 break;
             case __state::__reject:
@@ -5551,7 +5551,7 @@
 {
     deque<__state> __states;
     ptrdiff_t __highest_j = 0;
-    ptrdiff_t _N = _STD::distance(__first, __last);
+    ptrdiff_t _N = _VSTD::distance(__first, __last);
     __node* __st = __start_.get();
     if (__st)
     {
@@ -5584,7 +5584,7 @@
             case __state::__consume_input:
                 break;
             case __state::__accept_and_consume:
-                __states.push_front(_STD::move(__s));
+                __states.push_front(_VSTD::move(__s));
                 __states.pop_back();
                 break;
             case __state::__repeat:
@@ -5595,7 +5595,7 @@
                 __state __snext = __s;
                 __s.__node_->__exec_split(true, __s);
                 __snext.__node_->__exec_split(false, __snext);
-                __states.push_back(_STD::move(__snext));
+                __states.push_back(_VSTD::move(__snext));
                 }
                 break;
             case __state::__reject:
@@ -5611,7 +5611,7 @@
         if (__matched)
         {
             __m.__matches_[0].first = __first;
-            __m.__matches_[0].second = _STD::next(__first, __highest_j);
+            __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
             __m.__matches_[0].matched = true;
             return true;
         }
@@ -5631,7 +5631,7 @@
     __state __best_state;
     ptrdiff_t __j = 0;
     ptrdiff_t __highest_j = 0;
-    ptrdiff_t _N = _STD::distance(__first, __last);
+    ptrdiff_t _N = _VSTD::distance(__first, __last);
     __node* __st = __start_.get();
     if (__st)
     {
@@ -5678,7 +5678,7 @@
                 __state __snext = __s;
                 __s.__node_->__exec_split(true, __s);
                 __snext.__node_->__exec_split(false, __snext);
-                __states.push_back(_STD::move(__snext));
+                __states.push_back(_VSTD::move(__snext));
                 }
                 break;
             case __state::__reject:
@@ -5694,7 +5694,7 @@
         if (__matched)
         {
             __m.__matches_[0].first = __first;
-            __m.__matches_[0].second = _STD::next(__first, __highest_j);
+            __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
             __m.__matches_[0].matched = true;
             for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
                 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
@@ -5824,7 +5824,7 @@
              regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
     match_results<const _CharT*> __m;
-    return _STD::regex_search(__str, __m, __e, __flags);
+    return _VSTD::regex_search(__str, __m, __e, __flags);
 }
 
 template <class _ST, class _SA, class _CharT, class _Traits>
@@ -5861,7 +5861,7 @@
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
-    bool __r = _STD::regex_search(__first, __last, __m, __e,
+    bool __r = _VSTD::regex_search(__first, __last, __m, __e,
                             __flags | regex_constants::match_continuous);
     if (__r)
     {
@@ -5880,7 +5880,7 @@
             regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
     match_results<_BidirectionalIterator> __m;
-    return _STD::regex_match(__first, __last, __m, __e, __flags);
+    return _VSTD::regex_match(__first, __last, __m, __e, __flags);
 }
 
 template <class _CharT, class _Allocator, class _Traits>
@@ -5890,7 +5890,7 @@
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
-    return _STD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
+    return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
 }
 
 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
@@ -5901,7 +5901,7 @@
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
-    return _STD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
+    return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
 }
 
 template <class _CharT, class _Traits>
@@ -5910,7 +5910,7 @@
 regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
-    return _STD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
+    return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
 }
 
 template <class _ST, class _SA, class _CharT, class _Traits>
@@ -5920,7 +5920,7 @@
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
-    return _STD::regex_match(__s.begin(), __s.end(), __e, __flags);
+    return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
 }
 
 // regex_iterator
@@ -5985,7 +5985,7 @@
       __pregex_(&__re),
       __flags_(__m)
 {
-    _STD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
+    _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
 }
 
 template <class _BidirectionalIterator, class _CharT, class _Traits>
@@ -6017,7 +6017,7 @@
             __match_ = value_type();
             return *this;
         }
-        else if (_STD::regex_search(__start, __end_, __match_, *__pregex_,
+        else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
                                     __flags_ | regex_constants::match_not_null |
                                     regex_constants::match_continuous))
             return *this;
@@ -6025,7 +6025,7 @@
             ++__start;
     }
     __flags_ |= regex_constants::match_prev_avail;
-    if (!_STD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
+    if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
         __match_ = value_type();
     return *this;
 }
@@ -6267,7 +6267,7 @@
         }
         else
         {
-            if (_STD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
+            if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
                 && __prev->suffix().length() != 0)
             {
                 __suffix_.matched = true;
@@ -6303,7 +6303,7 @@
     if (__i == __eof)
     {
         if (!(__flags & regex_constants::format_no_copy))
-            __out = _STD::copy(__first, __last, __out);
+            __out = _VSTD::copy(__first, __last, __out);
     }
     else
     {
@@ -6311,14 +6311,14 @@
         for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
         {
             if (!(__flags & regex_constants::format_no_copy))
-                __out = _STD::copy(__i->prefix().first, __i->prefix().second, __out);
+                __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
             __out = __i->format(__out, __fmt, __fmt + __len, __flags);
             __lm = __i->suffix();
             if (__flags & regex_constants::format_first_only)
                 break;
         }
         if (!(__flags & regex_constants::format_no_copy))
-            __out = _STD::copy(__lm.first, __lm.second, __out);
+            __out = _VSTD::copy(__lm.first, __lm.second, __out);
     }
     return __out;
 }
@@ -6333,7 +6333,7 @@
               const basic_string<_CharT, _ST, _SA>& __fmt,
               regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
-    return _STD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
+    return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
 }
 
 template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
@@ -6346,7 +6346,7 @@
               regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
     basic_string<_CharT, _ST, _SA> __r;
-    _STD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
+    _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
                         __fmt.c_str(), __flags);
     return __r;
 }
@@ -6359,7 +6359,7 @@
               regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
     basic_string<_CharT, _ST, _SA> __r;
-    _STD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
+    _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
                         __fmt, __flags);
     return __r;
 }
@@ -6373,7 +6373,7 @@
               regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
     basic_string<_CharT> __r;
-    _STD::regex_replace(back_inserter(__r), __s,
+    _VSTD::regex_replace(back_inserter(__r), __s,
                         __s + char_traits<_CharT>::length(__s), __e,
                         __fmt.c_str(), __flags);
     return __r;
@@ -6388,7 +6388,7 @@
               regex_constants::match_flag_type __flags = regex_constants::match_default)
 {
     basic_string<_CharT> __r;
-    _STD::regex_replace(back_inserter(__r), __s,
+    _VSTD::regex_replace(back_inserter(__r), __s,
                         __s + char_traits<_CharT>::length(__s), __e,
                         __fmt, __flags);
     return __r;
